ERC-20
Overview
Max Total Supply
1,314.255000844647974991 VLP
Holders
4
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Filtered by Token Holder
Value Defi: WETH/SNTVT Pool 98/2Balance
1,314.047384981691331975 VLPValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x7df0B0DB...5d2E5D5B0 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
FaaSPoolLite
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // 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/>. library BConst { uint public constant BONE = 10**18; uint public constant MIN_BOUND_TOKENS = 2; uint public constant MAX_BOUND_TOKENS = 8; uint public constant DEFAULT_FEE = BONE * 3 / 1000; // 0.3% uint public constant MIN_FEE = BONE / 10**6; uint public constant MAX_FEE = BONE / 10; uint public constant DEFAULT_COLLECTED_FEE = BONE / 2000; // 0.05% uint public constant MAX_COLLECTED_FEE = BONE / 200; // 0.5% uint public constant DEFAULT_EXIT_FEE = 0; uint public constant MAX_EXIT_FEE = BONE / 1000; // 0.1% uint public constant MIN_WEIGHT = BONE; uint public constant MAX_WEIGHT = BONE * 50; uint public constant MAX_TOTAL_WEIGHT = BONE * 50; uint public constant MIN_BALANCE = BONE / 10**12; uint public constant DEFAULT_INIT_POOL_SUPPLY = BONE * 100; uint public constant MIN_INIT_POOL_SUPPLY = BONE / 1000; uint public constant MAX_INIT_POOL_SUPPLY = BONE * 10**18; uint public constant MIN_BPOW_BASE = 1 wei; uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint public constant BPOW_PRECISION = BONE / 10**10; uint public constant MAX_IN_RATIO = BONE / 2; uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; } // 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/>. contract BNum { function btoi(uint a) internal pure returns (uint) { return a / BConst.BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BConst.BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "add overflow"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "sub underflow"); return c; } function bsubSign(uint a, uint b) internal pure returns (uint, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint a, uint b) internal pure returns (uint) { uint c0 = a * b; require(a == 0 || c0 / a == b, "mul overflow"); uint c1 = c0 + (BConst.BONE / 2); require(c1 >= c0, "mul overflow"); uint c2 = c1 / BConst.BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "div by 0"); uint c0 = a * BConst.BONE; require(a == 0 || c0 / a == BConst.BONE, "div internal"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "div internal"); // badd require uint c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint a, uint n) internal pure returns (uint) { uint z = n % 2 != 0 ? a : BConst.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(uint base, uint exp) internal pure returns (uint) { require(base >= BConst.MIN_BPOW_BASE, "base too low"); require(base <= BConst.MAX_BPOW_BASE, "base too high"); uint whole = bfloor(exp); uint remain = bsub(exp, whole); uint wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint partialResult = bpowApprox(base, remain, BConst.BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox(uint base, uint exp, uint precision) internal pure returns (uint) { // term 0: uint a = exp; (uint x, bool xneg) = bsubSign(base, BConst.BONE); uint term = BConst.BONE; uint 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 (uint i = 1; term >= precision; i++) { uint bigK = i * BConst.BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BConst.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; } } // 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/>. // Highly opinionated token implementation interface IERC20 { event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function totalSupply() external view returns (uint); function balanceOf(address whom) external view returns (uint); function allowance(address src, address dst) external view returns (uint); function approve(address dst, uint amt) external returns (bool); function transfer(address dst, uint amt) external returns (bool); function transferFrom( address src, address dst, uint amt ) external returns (bool); } contract BTokenBase is BNum { mapping(address => uint) internal _balance; mapping(address => mapping(address=>uint)) internal _allowance; uint internal _totalSupply; event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function _mint(uint amt) internal { _balance[address(this)] = badd(_balance[address(this)], amt); _totalSupply = badd(_totalSupply, amt); emit Transfer(address(0), address(this), amt); } function _burn(uint amt) internal { require(_balance[address(this)] >= amt, "!bal"); _balance[address(this)] = bsub(_balance[address(this)], amt); _totalSupply = bsub(_totalSupply, amt); emit Transfer(address(this), address(0), amt); } function _move(address src, address dst, uint amt) internal { require(_balance[src] >= amt, "!bal"); _balance[src] = bsub(_balance[src], amt); _balance[dst] = badd(_balance[dst], amt); emit Transfer(src, dst, amt); } function _push(address to, uint amt) internal { _move(address(this), to, amt); } function _pull(address from, uint amt) internal { _move(from, address(this), amt); } } contract BToken is BTokenBase, IERC20 { string private _name = "Value Liquidity Provider"; string private _symbol = "VLP"; uint8 private _decimals = 18; function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns(uint8) { return _decimals; } function allowance(address src, address dst) external override view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) public override view returns (uint) { return _balance[whom]; } function totalSupply() public override view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external override returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function increaseApproval(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt); emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function decreaseApproval(address dst, uint amt) external returns (bool) { uint oldValue = _allowance[msg.sender][dst]; if (amt > oldValue) { _allowance[msg.sender][dst] = 0; } else { _allowance[msg.sender][dst] = bsub(oldValue, amt); } emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function transfer(address dst, uint amt) external override returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external override returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender], "!spender"); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } } // 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/>. contract BMathLite is BNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee (+ collectedFee) // **********************************************************************************************/ function calcSpotPrice( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint swapFee ) public pure returns (uint spotPrice) { uint numer = bdiv(tokenBalanceIn, tokenWeightIn); uint denom = bdiv(tokenBalanceOut, tokenWeightOut); uint ratio = bdiv(numer, denom); uint scale = bdiv(BConst.BONE, bsub(BConst.BONE, swapFee)); return (spotPrice = bmul(ratio, 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 (+ collectedFee) // **********************************************************************************************/ function calcOutGivenIn( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut); uint adjustedIn = bsub(BConst.BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BConst.BONE, foo); tokenAmountOut = bmul(tokenBalanceOut, 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 (+ collectedFee) // **********************************************************************************************/ function calcInGivenOut( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn); uint diff = bsub(tokenBalanceOut, tokenAmountOut); uint y = bdiv(tokenBalanceOut, diff); uint foo = bpow(y, weightRatio); foo = bsub(foo, BConst.BONE); tokenAmountIn = bsub(BConst.BONE, swapFee); tokenAmountIn = bdiv(bmul(tokenBalanceIn, foo), 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 (+ collectedFee)\ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) public pure returns (uint poolAmountOut) { // @dev 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); uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint zaz = bmul(bsub(BConst.BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BConst.BONE, zaz)); uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee); uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn); // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply; uint poolRatio = bpow(tokenInRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); poolAmountOut = bsub(newPoolSupply, 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 (+ collectedFee) * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee, uint exitFee ) public pure returns (uint tokenAmountOut) { uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BConst.BONE, exitFee)); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BConst.BONE, normalizedWeight)); uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut); uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint zaz = bmul(bsub(BConst.BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BConst.BONE, zaz)); return tokenAmountOut; } } interface IBFactory { function collectedToken() external view returns (address); } contract BPoolLite is BToken, BMathLite { struct Record { bool bound; // is token bound to pool uint index; // private uint denorm; // denormalized weight uint balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_COLLECTED_FUND( address indexed collectedToken, uint256 collectedAmount ); event LOG_FINALIZE( uint swapFee, uint initPoolSupply, uint version, address[] bindTokens, uint[] bindDenorms, uint[] balances ); modifier _lock_() { require(!_mutex, "reentry"); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex, "reentry"); _; } bool private _mutex; uint public version = 2001; address public factory; // BFactory address to push token exitFee to address public controller; // has CONTROL role // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint public swapFee; uint public collectedFee; // 0.05% | https://yfv.finance/vip-vote/vip_5 uint public exitFee; bool public finalized; address[] internal _tokens; mapping(address => Record) internal _records; uint private _totalWeight; constructor(address _factory) public { controller = _factory; factory = _factory; swapFee = BConst.DEFAULT_FEE; collectedFee = BConst.DEFAULT_COLLECTED_FEE; exitFee = BConst.DEFAULT_EXIT_FEE; finalized = false; } function setCollectedFee(uint _collectedFee) public { require(msg.sender == factory, "!fctr"); require(_collectedFee <= BConst.MAX_COLLECTED_FEE, ">maxCoFee"); require(bmul(_collectedFee, 2) <= swapFee, ">sFee/2"); collectedFee = _collectedFee; } function setExitFee(uint _exitFee) public { require(!finalized, "fnl"); require(msg.sender == factory, "!fctr"); require(_exitFee <= BConst.MAX_EXIT_FEE, ">maxExitFee"); exitFee = _exitFee; } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint) { return _tokens.length; } function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) { return _tokens; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(finalized, "!fnl"); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "!bound"); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "!bound"); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound, "!bound"); return _records[token].balance; } function setController(address _controller) external _lock_ { require(msg.sender == controller, "!cntler"); controller = _controller; } function finalize( uint _swapFee, uint _initPoolSupply, address[] calldata _bindTokens, uint[] calldata _bindDenorms ) external _lock_ { require(msg.sender == controller, "!cntler"); require(!finalized, "fnl"); require(_swapFee >= BConst.MIN_FEE, "<minFee"); require(_swapFee <= BConst.MAX_FEE, ">maxFee"); require(bmul(collectedFee, 2) <= _swapFee, "<Fee*2"); swapFee = _swapFee; require(_initPoolSupply >= BConst.MIN_INIT_POOL_SUPPLY, "<minInitPSup"); require(_initPoolSupply <= BConst.MAX_INIT_POOL_SUPPLY, ">maxInitPSup"); require(_bindTokens.length >= BConst.MIN_BOUND_TOKENS, "<minTokens"); require(_bindTokens.length < BConst.MAX_BOUND_TOKENS, ">maxTokens"); require(_bindTokens.length == _bindDenorms.length, "erLengMism"); uint totalWeight = 0; uint256[] memory balances = new uint[](_bindTokens.length); for (uint i = 0; i < _bindTokens.length; i++) { address token = _bindTokens[i]; uint denorm = _bindDenorms[i]; uint balance = BToken(token).balanceOf(address(this)); balances[i] = balance; require(!_records[token].bound, "bound"); require(denorm >= BConst.MIN_WEIGHT, "<minWeight"); require(denorm <= BConst.MAX_WEIGHT, ">maxWeight"); require(balance >= BConst.MIN_BALANCE, "<minBal"); _records[token] = Record({ bound : true, index : i, denorm : denorm, balance : balance }); totalWeight = badd(totalWeight, denorm); } require(totalWeight <= BConst.MAX_TOTAL_WEIGHT, ">maxTWeight"); _totalWeight = totalWeight; _tokens = _bindTokens; finalized = true; _mintPoolShare(_initPoolSupply); _pushPoolShare(msg.sender, _initPoolSupply); emit LOG_FINALIZE(swapFee, _initPoolSupply, version, _bindTokens, _bindDenorms, balances); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _lock_ { require(_records[token].bound, "!bound"); _records[token].balance = IERC20(token).balanceOf(address(this)); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee); } function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external virtual _lock_ { require(finalized, "!fnl"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "erMApr"); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountIn = bmul(ratio, bal); require(tokenAmountIn != 0, "erMApr"); require(tokenAmountIn <= maxAmountsIn[i], "<limIn"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external virtual _lock_ { require(finalized, "!fnl"); uint poolTotal = totalSupply(); uint _exitFee = bmul(poolAmountIn, exitFee); uint pAiAfterExitFee = bsub(poolAmountIn, _exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0, "erMApr"); _pullPoolShare(msg.sender, poolAmountIn); if (_exitFee > 0) { _pushPoolShare(factory, _exitFee); } _burnPoolShare(pAiAfterExitFee); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountOut = bmul(ratio, bal); require(tokenAmountOut != 0, "erMApr"); require(tokenAmountOut >= minAmountsOut[i], "<limO"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external _lock_ returns (uint tokenAmountOut, uint spotPriceAfter) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, BConst.MAX_IN_RATIO), ">maxIRat"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "badLimPrice"); tokenAmountOut = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, swapFee ); require(tokenAmountOut >= minAmountOut, "<limO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "erMApr"); require(spotPriceAfter <= maxPrice, ">limPrice"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "erMApr"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint _subTokenAmountIn; (_subTokenAmountIn, tokenAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, tokenOut, tokenAmountOut); if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, uint maxPrice ) external _lock_ returns (uint tokenAmountIn, uint spotPriceAfter) { require(_records[tokenIn].bound, "!bound"); require(_records[tokenOut].bound, "!bound"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, BConst.MAX_OUT_RATIO), ">maxORat"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceBefore <= maxPrice, "badLimPrice"); tokenAmountIn = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, swapFee ); require(tokenAmountIn <= maxAmountIn, "<limIn"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, swapFee ); require(spotPriceAfter >= spotPriceBefore, "erMApr"); require(spotPriceAfter <= maxPrice, ">limPrice"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "erMApr"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); uint _collectedFeeAmount = _pushCollectedFundGivenIn(tokenIn, tokenAmountIn); if (_collectedFeeAmount > 0) inRecord.balance = bsub(inRecord.balance, _collectedFeeAmount); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _lock_ returns (uint poolAmountOut) { require(finalized, "!fnl"); require(_records[tokenIn].bound, "!bound"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, BConst.MAX_IN_RATIO), ">maxIRat"); Record storage inRecord = _records[tokenIn]; poolAmountOut = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, swapFee ); require(poolAmountOut >= minPoolAmountOut, "<limO"); inRecord.balance = badd(inRecord.balance, tokenAmountIn); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn); _mintPoolShare(poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); uint _subTokenAmountIn; (_subTokenAmountIn, poolAmountOut) = _pushCollectedFundGivenOut(tokenIn, tokenAmountIn, address(this), poolAmountOut); if (_subTokenAmountIn > 0) inRecord.balance = bsub(inRecord.balance, _subTokenAmountIn); _pushPoolShare(msg.sender, poolAmountOut); return poolAmountOut; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _lock_ returns (uint tokenAmountOut) { require(finalized, "!fnl"); require(_records[tokenOut].bound, "!bound"); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, swapFee, exitFee ); require(tokenAmountOut >= minAmountOut, "<limO"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, BConst.MAX_OUT_RATIO), ">maxORat"); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); uint _exitFee = bmul(poolAmountIn, exitFee); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, _exitFee)); if (_exitFee > 0) { _pushPoolShare(factory, _exitFee); } (, tokenAmountOut) = _pushCollectedFundGivenOut(address(this), poolAmountIn, tokenOut, tokenAmountOut); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return tokenAmountOut; } // == // '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, uint 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))), '!_pullU'); } function _pushUnderlying(address erc20, address to, uint 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))), '!_pushU'); } function _pullPoolShare(address from, uint amount) internal { _pull(from, amount); } function _pushPoolShare(address to, uint amount) internal { _push(to, amount); } function _mintPoolShare(uint amount) internal { _mint(amount); } function _burnPoolShare(uint amount) internal { _burn(amount); } function _pushCollectedFundGivenOut(address _tokenIn, uint _tokenAmountIn, address _tokenOut, uint _tokenAmountOut) internal returns (uint subTokenAmountIn, uint tokenAmountOut) { subTokenAmountIn = 0; tokenAmountOut = _tokenAmountOut; if (collectedFee > 0) { address _collectedToken = IBFactory(factory).collectedToken(); if (_collectedToken == _tokenIn) { subTokenAmountIn = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE); _pushUnderlying(_tokenIn, factory, subTokenAmountIn); emit LOG_COLLECTED_FUND(_tokenIn, subTokenAmountIn); } else { uint _collectedFeeAmount = bdiv(bmul(_tokenAmountOut, collectedFee), BConst.BONE); _pushUnderlying(_tokenOut, factory, _collectedFeeAmount); tokenAmountOut = bsub(_tokenAmountOut, _collectedFeeAmount); emit LOG_COLLECTED_FUND(_tokenOut, _collectedFeeAmount); } } } // always push out _tokenIn (already have) function _pushCollectedFundGivenIn(address _tokenIn, uint _tokenAmountIn) internal returns (uint collectedFeeAmount) { collectedFeeAmount = 0; if (collectedFee > 0) { address _collectedToken = IBFactory(factory).collectedToken(); if (_collectedToken != address(0)) { collectedFeeAmount = bdiv(bmul(_tokenAmountIn, collectedFee), BConst.BONE); _pushUnderlying(_tokenIn, factory, collectedFeeAmount); emit LOG_COLLECTED_FUND(_tokenIn, collectedFeeAmount); } } } } interface IFaaSPool { function stake(uint) external; function withdraw(uint) external; function getReward(uint8 _pid, address _account) external; function getAllRewards(address _account) external; function pendingReward(uint8 _pid, address _account) external view returns (uint); function emergencyWithdraw() external; } interface IFaaSRewardFund { function balance(IERC20 _token) external view returns (uint); function safeTransfer(IERC20 _token, address _to, uint _value) external; } // This implements BPool contract, and allows for generalized staking, yield farming, and token distribution. contract FaaSPoolLite is BPoolLite, IFaaSPool { using SafeMath for uint; // Info of each user. struct UserInfo { uint amount; mapping(uint8 => uint) rewardDebt; mapping(uint8 => uint) accumulatedEarned; // will accumulate every time user harvest mapping(uint8 => uint) lockReward; mapping(uint8 => uint) lockRewardReleased; uint lastStakeTime; } // Info of each rewardPool funding. struct RewardPoolInfo { IERC20 rewardToken; // Address of rewardPool token contract. uint lastRewardBlock; // Last block number that rewardPool distribution occurs. uint endRewardBlock; // Block number which rewardPool distribution ends. uint rewardPerBlock; // Reward token amount to distribute per block. uint accRewardPerShare; // Accumulated rewardPool per share, times 1e18. uint lockRewardPercent; // Lock reward percent - 0 to disable lock & vesting uint startVestingBlock; // Block number which vesting starts. uint endVestingBlock; // Block number which vesting ends. uint numOfVestingBlocks; uint totalPaidRewards; } mapping(address => UserInfo) private userInfo; RewardPoolInfo[] public rewardPoolInfo; IFaaSRewardFund public rewardFund; address public exchangeProxy; uint public unstakingFrozenTime = 3 days; event Deposit(address indexed account, uint256 amount); event Withdraw(address indexed account, uint256 amount); event RewardPaid(uint8 pid, address indexed account, uint256 amount); constructor(address _factory) public BPoolLite(_factory) { } modifier onlyController() { require(msg.sender == controller, "!cntler"); _; } function setRewardFund(IFaaSRewardFund _rewardFund) public onlyController { rewardFund = _rewardFund; } function setExchangeProxy(address _exchangeProxy) public onlyController { exchangeProxy = _exchangeProxy; } function setUnstakingFrozenTime(uint _unstakingFrozenTime) public onlyController { assert(unstakingFrozenTime <= 30 days); // do not lock fund for too long, please! unstakingFrozenTime = _unstakingFrozenTime; } function addRewardPool(IERC20 _rewardToken, uint256 _startBlock, uint256 _endRewardBlock, uint256 _rewardPerBlock, uint256 _lockRewardPercent, uint256 _startVestingBlock, uint256 _endVestingBlock) public onlyController { require(rewardPoolInfo.length < 8, "exceed rwdPoolLim"); require(_startVestingBlock <= _endVestingBlock, "sVB>eVB"); _startBlock = (block.number > _startBlock) ? block.number : _startBlock; require(_startBlock < _endRewardBlock, "sB>=eB"); updateReward(); rewardPoolInfo.push(RewardPoolInfo({ rewardToken : _rewardToken, lastRewardBlock : _startBlock, endRewardBlock : _endRewardBlock, rewardPerBlock : _rewardPerBlock, accRewardPerShare : 0, lockRewardPercent : _lockRewardPercent, startVestingBlock : _startVestingBlock, endVestingBlock : _endVestingBlock, numOfVestingBlocks: _endVestingBlock - _startVestingBlock, totalPaidRewards: 0 })); } function updateRewardPool(uint8 _pid, uint256 _endRewardBlock, uint256 _rewardPerBlock) public onlyController { updateReward(_pid); RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; require(block.number <= rewardPool.endRewardBlock, "late"); rewardPool.endRewardBlock = _endRewardBlock; rewardPool.rewardPerBlock = _rewardPerBlock; } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external override { joinPoolFor(msg.sender, poolAmountOut, maxAmountsIn); } function joinPoolFor(address account, uint poolAmountOut, uint[] calldata maxAmountsIn) public _lock_ { require(msg.sender == account || msg.sender == exchangeProxy, "!(prx||own)"); _joinPool(account, poolAmountOut, maxAmountsIn); _stakePoolShare(account, poolAmountOut); } function joinPoolNotStake(uint poolAmountOut, uint[] calldata maxAmountsIn) external _lock_ { _joinPool(msg.sender, poolAmountOut, maxAmountsIn); _pushPoolShare(msg.sender, poolAmountOut); } function _joinPool(address account, uint poolAmountOut, uint[] calldata maxAmountsIn) internal { require(finalized, "!fnl"); uint rewardTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, rewardTotal); require(ratio != 0, "erMApr"); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountIn = bmul(ratio, bal); require(tokenAmountIn != 0 && tokenAmountIn <= maxAmountsIn[i], "erMApr||<limIn"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(account, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); } function stake(uint _shares) external override { uint _before = balanceOf(address(this)); _pullPoolShare(msg.sender, _shares); uint _after = balanceOf(address(this)); _shares = bsub(_after, _before); // Additional check for deflationary tokens _stakePoolShare(msg.sender, _shares); } function _stakePoolShare(address _account, uint _shares) internal { UserInfo storage user = userInfo[_account]; getAllRewards(_account); user.amount = user.amount.add(_shares); uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18); } user.lastStakeTime = block.timestamp; emit Deposit(_account, _shares); } function unfrozenStakeTime(address _account) public view returns (uint) { return userInfo[_account].lastStakeTime + unstakingFrozenTime; } function withdraw(uint _amount) public override { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "am>us.am"); require(block.timestamp >= user.lastStakeTime.add(unstakingFrozenTime), "frozen"); getAllRewards(msg.sender); user.amount = bsub(user.amount, _amount); uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18); } _pushPoolShare(msg.sender, _amount); emit Withdraw(msg.sender, _amount); } // using PUSH pattern for using by Proxy if needed function getAllRewards(address _account) public override { uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { getReward(_pid, _account); } } function getReward(uint8 _pid, address _account) public override { updateReward(_pid); UserInfo storage user = userInfo[_account]; RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint _pendingReward = user.amount.mul(rewardPool.accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]); uint _lockRewardPercent = rewardPool.lockRewardPercent; if (_lockRewardPercent > 0) { if (block.number > rewardPool.endVestingBlock) { uint _unlockReward = user.lockReward[_pid].sub(user.lockRewardReleased[_pid]); if (_unlockReward > 0) { _pendingReward = _pendingReward.add(_unlockReward); user.lockRewardReleased[_pid] = user.lockRewardReleased[_pid].add(_unlockReward); } } else { if (_pendingReward > 0) { uint _toLocked = _pendingReward.mul(_lockRewardPercent).div(100); _pendingReward = _pendingReward.sub(_toLocked); user.lockReward[_pid] = user.lockReward[_pid].add(_toLocked); } if (block.number > rewardPool.startVestingBlock) { uint _toReleased = user.lockReward[_pid].mul(block.number.sub(rewardPool.startVestingBlock)).div(rewardPool.numOfVestingBlocks); uint _lockRewardReleased = user.lockRewardReleased[_pid]; if (_toReleased > _lockRewardReleased) { uint _unlockReward = _toReleased.sub(_lockRewardReleased); user.lockRewardReleased[_pid] = _lockRewardReleased.add(_unlockReward); _pendingReward = _pendingReward.add(_unlockReward); } } } } if (_pendingReward > 0) { user.accumulatedEarned[_pid] = user.accumulatedEarned[_pid].add(_pendingReward); rewardPool.totalPaidRewards = rewardPool.totalPaidRewards.add(_pendingReward); rewardFund.safeTransfer(rewardPool.rewardToken, _account, _pendingReward); emit RewardPaid(_pid, _account, _pendingReward); user.rewardDebt[_pid] = user.amount.mul(rewardPoolInfo[_pid].accRewardPerShare).div(1e18); } } function pendingReward(uint8 _pid, address _account) public override view returns (uint _pending) { UserInfo storage user = userInfo[_account]; RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint _accRewardPerShare = rewardPool.accRewardPerShare; uint lpSupply = balanceOf(address(this)); uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number; if (_endRewardBlockApplicable > rewardPool.lastRewardBlock && lpSupply != 0) { uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock); uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); _accRewardPerShare = _accRewardPerShare.add(_incRewardPerShare); } _pending = user.amount.mul(_accRewardPerShare).div(1e18).sub(user.rewardDebt[_pid]); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external override { UserInfo storage user = userInfo[msg.sender]; uint _amount = user.amount; _pushPoolShare(msg.sender, _amount); user.amount = 0; uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { user.rewardDebt[_pid] = 0; } emit Withdraw(msg.sender, _amount); } function getUserInfo(uint8 _pid, address _account) public view returns (uint amount, uint rewardDebt, uint accumulatedEarned, uint lockReward, uint lockRewardReleased) { UserInfo storage user = userInfo[_account]; amount = user.amount; rewardDebt = user.rewardDebt[_pid]; accumulatedEarned = user.accumulatedEarned[_pid]; lockReward = user.lockReward[_pid]; lockRewardReleased = user.lockRewardReleased[_pid]; } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external override _lock_ { require(finalized, "!fnl"); uint rewardTotal = totalSupply(); uint _exitFee = bmul(poolAmountIn, exitFee); uint pAiAfterExitFee = bsub(poolAmountIn, _exitFee); uint ratio = bdiv(pAiAfterExitFee, rewardTotal); require(ratio != 0, "erMApr"); uint _externalShares = balanceOf(msg.sender); if (_externalShares < poolAmountIn) { uint _withdrawShares = bsub(poolAmountIn, _externalShares); uint _stakedShares = userInfo[msg.sender].amount; require(_stakedShares >= _withdrawShares, "stk<wdr"); withdraw(_withdrawShares); } _pullPoolShare(msg.sender, poolAmountIn); if (_exitFee > 0) { _pushPoolShare(factory, _exitFee); } _burnPoolShare(pAiAfterExitFee); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountOut = bmul(ratio, bal); require(tokenAmountOut != 0, "erMApr"); require(tokenAmountOut >= minAmountsOut[i], "<limO"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function updateReward() public { uint8 rewardPoolLength = uint8(rewardPoolInfo.length); for (uint8 _pid = 0; _pid < rewardPoolLength; ++_pid) { updateReward(_pid); } } function updateReward(uint8 _pid) public { RewardPoolInfo storage rewardPool = rewardPoolInfo[_pid]; uint _endRewardBlockApplicable = block.number > rewardPool.endRewardBlock ? rewardPool.endRewardBlock : block.number; if (_endRewardBlockApplicable > rewardPool.lastRewardBlock) { uint lpSupply = balanceOf(address(this)); if (lpSupply > 0) { uint _numBlocks = _endRewardBlockApplicable.sub(rewardPool.lastRewardBlock); uint _incRewardPerShare = _numBlocks.mul(rewardPool.rewardPerBlock).mul(1e18).div(lpSupply); rewardPool.accRewardPerShare = rewardPool.accRewardPerShare.add(_incRewardPerShare); } rewardPool.lastRewardBlock = _endRewardBlockApplicable; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collectedToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"collectedAmount","type":"uint256"}],"name":"LOG_COLLECTED_FUND","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":"swapFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initPoolSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"bindTokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"bindDenorms","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"name":"LOG_FINALIZE","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":"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":false,"internalType":"uint8","name":"pid","type":"uint8"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"_startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"_endVestingBlock","type":"uint256"}],"name":"addRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"tokenAmountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"exitFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"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":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"collectedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exchangeProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"},{"internalType":"uint256","name":"_initPoolSupply","type":"uint256"},{"internalType":"address[]","name":"_bindTokens","type":"address[]"},{"internalType":"uint256[]","name":"_bindDenorms","type":"uint256[]"}],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getAllRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"accumulatedEarned","type":"uint256"},{"internalType":"uint256","name":"lockReward","type":"uint256"},{"internalType":"uint256","name":"lockRewardReleased","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPoolFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPoolNotStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"address","name":"_account","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"_pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardFund","outputs":[{"internalType":"contract IFaaSRewardFund","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPoolInfo","outputs":[{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lockRewardPercent","type":"uint256"},{"internalType":"uint256","name":"startVestingBlock","type":"uint256"},{"internalType":"uint256","name":"endVestingBlock","type":"uint256"},{"internalType":"uint256","name":"numOfVestingBlocks","type":"uint256"},{"internalType":"uint256","name":"totalPaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectedFee","type":"uint256"}],"name":"setCollectedFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_exchangeProxy","type":"address"}],"name":"setExchangeProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exitFee","type":"uint256"}],"name":"setExitFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IFaaSRewardFund","name":"_rewardFund","type":"address"}],"name":"setRewardFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_unstakingFrozenTime","type":"uint256"}],"name":"setUnstakingFrozenTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"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"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"unfrozenStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unstakingFrozenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint256","name":"_endRewardBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052601860808190527f56616c7565204c69717569646974792050726f7669646572000000000000000060a090815262000040916003919062000112565b50604080518082019091526003808252620564c560ec1b60209092019182526200006d9160049162000112565b506005805460ff191660121790556107d16006556203f4806014553480156200009557600080fd5b5060405162005d2038038062005d2083398181016040526020811015620000bb57600080fd5b5051600880546001600160a01b039092166001600160a01b0319928316811790915560078054909216179055660aa87bee5380006009556601c6bf52634000600a556000600b55600c805460ff19169055620001ae565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200015557805160ff191683800117855562000185565b8280016001018555821562000185579182015b828111156200018557825182559160200191906001019062000168565b506200019392915062000197565b5090565b5b8082111562000193576000815560010162000198565b615b6280620001be6000396000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c80638656b6531161020a578063c45a015511610125578063e653bf3a116100b8578063f36c0a7211610087578063f36c0a7214610ef1578063f77c479114610ef9578063f863b96114610f01578063f8b2cb4f14610f76578063f8d6aed414610f9c576103db565b8063e653bf3a14610e95578063e811f50a14610ebb578063efe2226614610ec3578063f1b8a9b714610ecb576103db565b8063d73dd623116100f4578063d73dd62314610e16578063db2e21bc14610e42578063dd62ed3e14610e4a578063e5a583a914610e78576103db565b8063c45a015514610dda578063c7c30be114610dfe578063cc77828d14610e06578063cd2ed8fb14610e0e576103db565b8063a221ee491161019d578063b3f05b971161016c578063b3f05b9714610d10578063ba9530a614610d18578063be3bbd2e14610d53578063be61533514610dab576103db565b8063a221ee4914610c1d578063a694fc3a14610c52578063a9059cbb14610c6f578063b02f0b7314610c9b576103db565b8063936c3477116101d9578063936c347714610bca578063948d8ce614610bd257806395d89b4114610bf85780639da9532614610c00576103db565b80638656b65314610b1d578063884f6f7f14610b585780638c28cbe814610b7e57806392eefe9b14610ba4576103db565b806354cf2aeb116102fa5780636d3c6d921161028d57806379104ea61161025c57806379104ea614610a235780637c5e9ea414610a645780638201aa3f14610abd57806385cc179e14610afd576103db565b80636d3c6d921461092b57806370a082311461095a57806372aa0a601461098057806376d743fe146109f7576103db565b80636284ae41116102c95780636284ae41146107e3578063650e872c146107eb57806366188463146108b55780636d142e5b146108e1576103db565b806354cf2aeb1461077b57806354fd4d50146107835780635db342771461078b57806360d47088146107bd576103db565b80632e1a7d4d11610372578063429b4ae611610341578063429b4ae61461063457806346ab38f1146106515780634d950c74146106835780634f69c0d414610706576103db565b80632e1a7d4d146105ab5780632f37b624146105ca578063313ce567146105f0578063362a3fad1461060e576103db565b806317837baa116103ae57806317837baa1461050b57806318160ddd1461051357806323b872dd1461051b57806329d7958814610551576103db565b806306fdde03146103e0578063095ea7b31461045d5780631446a7ff1461049d57806315e84af9146104dd575b600080fd5b6103e8610fd7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042257818101518382015260200161040a565b50505050905090810190601f16801561044f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104896004803603604081101561047357600080fd5b506001600160a01b03813516906020013561106d565b604080519115158252519081900360200190f35b6104cb600480360360408110156104b357600080fd5b506001600160a01b03813581169160200135166110c2565b60408051918252519081900360200190f35b6104cb600480360360408110156104f357600080fd5b506001600160a01b0381358116916020013516611205565b6104cb61133f565b6104cb611345565b6104896004803603606081101561053157600080fd5b506001600160a01b0381358116916020810135909116906040013561134b565b6105806004803603604081101561056757600080fd5b50803560ff1690602001356001600160a01b0316611498565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105c8600480360360208110156105c157600080fd5b50356114f0565b005b610489600480360360208110156105e057600080fd5b50356001600160a01b0316611660565b6105f861167e565b6040805160ff9092168252519081900360200190f35b6105c86004803603602081101561062457600080fd5b50356001600160a01b0316611687565b6105c86004803603602081101561064a57600080fd5b50356116b2565b6104cb6004803603606081101561066757600080fd5b506001600160a01b038135169060208101359060400135611791565b6105c86004803603606081101561069957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460208302840111600160201b831117156106fb57600080fd5b509092509050611a3f565b6105c86004803603604081101561071c57600080fd5b81359190810190604081016020820135600160201b81111561073d57600080fd5b82018360208201111561074f57600080fd5b803590602001918460208302840111600160201b8311171561077057600080fd5b509092509050611b1c565b6104cb611b28565b6104cb611b2e565b6104cb600480360360608110156107a157600080fd5b506001600160a01b038135169060208101359060400135611b34565b6104cb600480360360208110156107d357600080fd5b50356001600160a01b0316611daa565b6104cb611dcf565b6105c86004803603608081101561080157600080fd5b813591602081013591810190606081016040820135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460208302840111600160201b8311171561085a57600080fd5b919390929091602081019035600160201b81111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111600160201b831117156108aa57600080fd5b509092509050611dd5565b610489600480360360408110156108cb57600080fd5b506001600160a01b03813516906020013561254a565b6105c8600480360360e08110156108f757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c00135612622565b6105c86004803603604081101561094157600080fd5b50803560ff1690602001356001600160a01b031661294c565b6104cb6004803603602081101561097057600080fd5b50356001600160a01b0316612cd1565b61099d6004803603602081101561099657600080fd5b5035612cec565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6105c860048036036060811015610a0d57600080fd5b5060ff8135169060208101359060400135612d57565b6104cb600480360360e0811015610a3957600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612e1e565b610aa4600480360360a0811015610a7a57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eed565b6040805192835260208301919091528051918290030190f35b610aa4600480360360a0811015610ad357600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356132f7565b6105c860048036036020811015610b1357600080fd5b503560ff166136ea565b6104cb600480360360c0811015610b3357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356137b5565b6105c860048036036020811015610b6e57600080fd5b50356001600160a01b0316613851565b6105c860048036036020811015610b9457600080fd5b50356001600160a01b03166138bc565b6105c860048036036020811015610bba57600080fd5b50356001600160a01b0316613a04565b6104cb613ad2565b6104cb60048036036020811015610be857600080fd5b50356001600160a01b0316613b23565b6103e8613be2565b6105c860048036036020811015610c1657600080fd5b5035613c43565b6104cb600480360360a0811015610c3357600080fd5b5080359060208101359060408101359060608101359060800135613ca0565b6105c860048036036020811015610c6857600080fd5b5035613d0a565b61048960048036036040811015610c8557600080fd5b506001600160a01b038135169060200135613d44565b6105c860048036036040811015610cb157600080fd5b81359190810190604081016020820135600160201b811115610cd257600080fd5b820183602082011115610ce457600080fd5b803590602001918460208302840111600160201b83111715610d0557600080fd5b509092509050613d5a565b610489614098565b6104cb600480360360c0811015610d2e57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356140a1565b610d5b614122565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d97578181015183820152602001610d7f565b505050509050019250505060405180910390f35b6104cb60048036036040811015610dc157600080fd5b50803560ff1690602001356001600160a01b031661420b565b610de2614324565b604080516001600160a01b039092168252519081900360200190f35b610de2614333565b610d5b614342565b6104cb61438c565b61048960048036036040811015610e2c57600080fd5b506001600160a01b038135169060200135614392565b6105c8614413565b6104cb60048036036040811015610e6057600080fd5b506001600160a01b03813581169160200135166144a3565b6105c860048036036020811015610e8e57600080fd5b50356144ce565b6105c860048036036020811015610eab57600080fd5b50356001600160a01b03166145a2565b6104cb61460d565b610de2614613565b6104cb60048036036020811015610ee157600080fd5b50356001600160a01b0316614622565b6105c86146f3565b610de261471c565b6105c860048036036040811015610f1757600080fd5b81359190810190604081016020820135600160201b811115610f3857600080fd5b820183602082011115610f4a57600080fd5b803590602001918460208302840111600160201b83111715610f6b57600080fd5b50909250905061472b565b6104cb60048036036020811015610f8c57600080fd5b50356001600160a01b03166147a7565b6104cb600480360360c0811015610fb257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614866565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615b0d833981519152928290030190a35060015b92915050565b600554600090610100900460ff161561110c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611162576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166111b8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e602052604080822092851682528120600380840154600280860154928401549084015493946111fc9492939290613ca0565b95945050505050565b600554600090610100900460ff161561124f576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff166112a5576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166112fb576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e60205260408082209285168252902060038083015460028085015492840154908401546009546111fc94929190613ca0565b60145481565b60025490565b6000336001600160a01b038516148061138757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113c3576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6113ce8484846148e9565b336001600160a01b0385161480159061140c57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b1561148e576001600160a01b038416600090815260016020908152604080832033845290915290205461143f90836149eb565b6001600160a01b0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615b0d8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152601060209081526040808320805460ff9095168452600181018352818420546002820184528285205460038301855283862054600490930190945291909320549394909391929190565b3360009081526010602052604090208054821115611540576040805162461bcd60e51b8152602060048201526008602482015267616d3e75732e616d60c01b604482015290519081900360640190fd5b601454600582015461155191614a49565b42101561158e576040805162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b604482015290519081900360640190fd5b61159733611687565b80546115a390836149eb565b815560115460005b8160ff168160ff16101561161a576115fa670de0b6b3a76400006115f460118460ff16815481106115d857fe5b600091825260209091206004600a909202010154865490614aa3565b90614afc565b60ff821660009081526001808601602052604090912091909155016115ab565b506116253384614b3e565b60408051848152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03166000908152600e602052604090205460ff1690565b60055460ff1690565b60115460005b8160ff168160ff1610156116ad576116a5818461294c565b60010161168d565b505050565b6007546001600160a01b031633146116f9576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b6611c37937e08000811115611741576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b60095461174f826002614b48565b111561178c576040805162461bcd60e51b81526020600482015260076024820152661f39a332b2979960c91b604482015290519081900360640190fd5b600a55565b600554600090610100900460ff16156117db576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff1661182a576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611880576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954600b546118bd95949392918a91612e1e565b9150828210156118fc576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e6020526040902060039081015461193191670de0b6b3a76400005b04600101614b48565b821115611970576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b61197e8160030154836149eb565b8160030181905550600061199485600b54614b48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36119e23386614c09565b6119f46119ef86836149eb565b614c13565b8015611a1057600754611a10906001600160a01b031682614b3e565b611a1c30868886614c1f565b9350611a2b9050863385614db3565b50506005805461ff00191690559392505050565b600554610100900460ff1615611a86576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055336001600160a01b0385161480611ab657506013546001600160a01b031633145b611af5576040805162461bcd60e51b815260206004820152600b60248201526a21287072787c7c6f776e2960a81b604482015290519081900360640190fd5b611b0184848484614f07565b611b0b84846150f2565b50506005805461ff00191690555050565b6116ad33848484611a3f565b60095481565b60065481565b600554600090610100900460ff1615611b7e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611bcd576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611c23576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060030154611c55906002670de0b6b3a76400005b04614b48565b831115611c94576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954611cce949392919089906137b5565b915082821015611d0d576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b611d1b8160030154856151c0565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3611d6982615209565b611d74853386615212565b6000611d8286863086614c1f565b935090508015611da057611d9a8260030154826149eb565b60038301555b611a2b3384614b3e565b6014546001600160a01b03821660009081526010602052604090206005015401919050565b600b5481565b600554610100900460ff1615611e1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614611e76576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600c5460ff1615611eb4576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b64e8d4a51000861015611ef8576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000861115611f3f576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b85611f4d600a546002614b48565b1115611f89576040805162461bcd60e51b81526020600482015260066024820152651e2332b2951960d11b604482015290519081900360640190fd5b600986905566038d7ea4c68000851015611fd9576040805162461bcd60e51b815260206004820152600c60248201526b03c6d696e496e6974505375760a41b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f100000000085111561202c576040805162461bcd60e51b815260206004820152600c60248201526b03e6d6178496e6974505375760a41b604482015290519081900360640190fd5b600283101561206f576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600883106120b1576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b8281146120f2576040805162461bcd60e51b815260206004820152600a60248201526965724c656e674d69736d60b01b604482015290519081900360640190fd5b600060608467ffffffffffffffff8111801561210d57600080fd5b50604051908082528060200260200182016040528015612137578160200160208202803683370190505b50905060005b858110156123c157600087878381811061215357fe5b905060200201356001600160a01b03169050600086868481811061217357fe5b9050602002013590506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b50518551909150819086908690811061220a57fe5b6020908102919091018101919091526001600160a01b0384166000908152600e909152604090205460ff161561226f576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b670de0b6b3a76400008210156122b9576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000821115612304576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240811015612346576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6040805160808101825260018082526020808301888152838501878152606085018781526001600160a01b038a166000908152600e909452959092209351845460ff1916901515178455519183019190915551600282015590516003909101556123b086836151c0565b9550506001909201915061213d9050565b506802b5e3af16b188000082111561240e576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b600f82905561241f600d8787615a69565b50600c805460ff1916600117905561243687615209565b6124403388614b3e565b7f84544fec6632b8b4c691c6d5d5288102f47b6d448e731f535b38767d2bfd2662600954886006548989898988604051808981526020018881526020018781526020018060200180602001806020018481038452898982818152602001925060200280828437600083820152601f01601f191690910185810384528781526020908101915088908802808284376000838201819052601f909101601f19169092018681038452875181528751602091820193828a0193509102908190849084905b83811015612519578181015183820152602001612501565b505050509050019b50505050505050505050505060405180910390a150506005805461ff0019169055505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561259f573360009081526001602090815260408083206001600160a01b03881684529091528120556125ce565b6125a981846149eb565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615b0d833981519152929181900390910190a35060019392505050565b6008546001600160a01b0316331461266b576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b6011546008116126b6576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b808211156126f5576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b8543116127025785612704565b435b9550848610612743576040805162461bcd60e51b815260206004820152600660248201526539a11f1eb2a160d11b604482015290519081900360640190fd5b61274b6146f3565b60408051610140810182526001600160a01b039889168152602081019788529081019586526060810194855260006080820181815260a0830195865260c0830185815260e08401858152959094036101008401908152610120840183815260118054600181018255945293517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600a90940293840180546001600160a01b03191691909c1617909a5597517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6982015595517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a87015593517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b86015594517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c85015590517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d84015592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e83015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f82015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c70830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7190910155565b612955826136ea565b6001600160a01b03811660009081526010602052604081206011805491929160ff861690811061298157fe5b6000918252602080832060ff88168452600186019091526040832054600a9290920201600481015485549194506129d092916129ca91670de0b6b3a7640000916115f491614aa3565b90615365565b60058301549091508015612b6a578260070154431115612a655760ff8616600090815260048501602090815260408083205460038801909252822054612a1591615365565b90508015612a5f57612a278382614a49565b60ff88166000908152600487016020526040902054909350612a499082614a49565b60ff881660009081526004870160205260409020555b50612b6a565b8115612ac1576000612a7c60646115f48585614aa3565b9050612a888382615365565b60ff88166000908152600387016020526040902054909350612aaa9082614a49565b60ff88166000908152600387016020526040902055505b8260060154431115612b6a576000612b0c84600801546115f4612af187600601544361536590919063ffffffff16565b60ff8b16600090815260038a01602052604090205490614aa3565b60ff8816600090815260048701602052604090205490915080821115612b67576000612b388383615365565b9050612b448282614a49565b60ff8a166000908152600489016020526040902055612b638582614a49565b9450505b50505b8115612cc95760ff86166000908152600285016020526040902054612b8f9083614a49565b60ff871660009081526002860160205260409020556009830154612bb39083614a49565b600984015560125483546040805163d1660f9960e01b81526001600160a01b0392831660048201528883166024820152604481018690529051919092169163d1660f9991606480830192600092919082900301818387803b158015612c1757600080fd5b505af1158015612c2b573d6000803e3d6000fd5b50506040805160ff8a1681526020810186905281516001600160a01b038a1694507f636c8a1a63bdbdbe782bbd46665206ecd64f1d1f745ed547cc9dd708864fd2b093509081900390910190a2612cb3670de0b6b3a76400006115f460118960ff1681548110612c9757fe5b600091825260209091206004600a909202010154875490614aa3565b60ff871660009081526001860160205260409020555b505050505050565b6001600160a01b031660009081526020819052604090205490565b60118181548110612cf957fe5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b03909816995095979496939592949193909291908a565b6008546001600160a01b03163314612da0576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b612da9836136ea565b600060118460ff1681548110612dbb57fe5b90600052602060002090600a020190508060020154431115612e0d576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b600281019290925560039091015550565b600080612e2b88876153a7565b90506000612e4a86612e45670de0b6b3a7640000876149eb565b614b48565b90506000612e5889836149eb565b90506000612e66828b6153a7565b90506000612e8582612e80670de0b6b3a7640000886153a7565b6154a3565b90506000612e93828f614b48565b90506000612ea18f836149eb565b90506000612ec0612eba670de0b6b3a76400008a6149eb565b8c614b48565b9050612ed882612e45670de0b6b3a7640000846149eb565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615612f39576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff16612f9e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff16612ff4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e60205260408082209288168252902060038082015461302d91670de0b6b3a7640000611928565b86111561306c576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b600061308d8360030154846002015484600301548560020154600954613ca0565b9050858111156130d2576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6130f283600301548460020154846003015485600201548b600954614866565b945088851115613132576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6131408360030154866151c0565b83600301819055506131568260030154886149eb565b600380840182905584015460028086015490850154600954613179949190613ca0565b9350808410156131b9576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156131fa576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61320485886153a7565b811115613241576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46132a98a3387615212565b6132b4883389614db3565b60006132c08b8761559f565b905080156132dc576132d68460030154826149eb565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff1615613343576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff166133a8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166133fe576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003820154613438906002670de0b6b3a7640000611c4f565b881115613477576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006134988360030154846002015484600301548560020154600954613ca0565b9050858111156134dd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6134fd83600301548460020154846003015485600201548d6009546140a1565b94508685101561353c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61354a83600301548a6151c0565b83600301819055506135608260030154866149eb565b600380840182905584015460028086015490850154600954613583949190613ca0565b9350808410156135c3576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b85841115613604576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61360e89866153a7565b81111561364b576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136b38a338b615212565b60006136c18b8b8b89614c1f565b9650905080156136df576136d98460030154826149eb565b60038501555b6132dc893388614db3565b600060118260ff16815481106136fc57fe5b90600052602060002090600a0201905060008160020154431161371f5743613725565b81600201545b905081600101548111156116ad57600061373e30612cd1565b905080156137aa57600061375f84600101548461536590919063ffffffff16565b90506000613790836115f4670de0b6b3a764000061378a896003015487614aa390919063ffffffff16565b90614aa3565b60048601549091506137a29082614a49565b600486015550505b506001919091015550565b6000806137c287866153a7565b905060006137e16137db670de0b6b3a7640000846149eb565b85614b48565b905060006137fb86612e45670de0b6b3a7640000856149eb565b905060006138098b836151c0565b90506000613817828d6153a7565b9050600061382582876154a3565b90506000613833828d614b48565b905061383f818d6149eb565b9e9d5050505050505050505050505050565b6008546001600160a01b0316331461389a576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff1615613903576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600e602052604090205460ff16613968576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156139ae57600080fd5b505afa1580156139c2573d6000803e3d6000fd5b505050506040513d60208110156139d857600080fd5b50516001600160a01b039091166000908152600e60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613a4b576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614613aa5576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613b1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b50600f5490565b600554600090610100900460ff1615613b6d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16613bc3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b6008546001600160a01b03163314613c8c576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b62278d006014541115613c9b57fe5b601455565b600080613cad87876153a7565b90506000613cbb86866153a7565b90506000613cc983836153a7565b90506000613cf0670de0b6b3a7640000613ceb670de0b6b3a7640000896149eb565b6153a7565b9050613cfc8282614b48565b9a9950505050505050505050565b6000613d1530612cd1565b9050613d213383614c09565b6000613d2c30612cd1565b9050613d3881836149eb565b92506116ad33846150f2565b6000613d513384846148e9565b50600192915050565b600554610100900460ff1615613da1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16613df0576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000613dfa611345565b90506000613e0a85600b54614b48565b90506000613e1886836149eb565b90506000613e2682856153a7565b905080613e63576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b6000613e6e33612cd1565b905087811015613ee2576000613e8489836149eb565b3360009081526010602052604090205490915081811015613ed6576040805162461bcd60e51b815260206004820152600760248201526639ba359e3bb23960c91b604482015290519081900360640190fd5b613edf826114f0565b50505b613eec3389614c09565b8315613f0857600754613f08906001600160a01b031685614b3e565b613f1183614c13565b60005b600d54811015614082576000600d8281548110613f2d57fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090613f628683614b48565b905080613f9f576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b8a8a85818110613fab57fe5b90506020020135811015613fee576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461401490826149eb565b6001600160a01b0384166000818152600e60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614077833383614db3565b505050600101613f14565b50506005805461ff001916905550505050505050565b600c5460ff1681565b6000806140ae87866153a7565b905060006140c4670de0b6b3a7640000856149eb565b90506140d08582614b48565b905060006140e28a613ceb8c856151c0565b905060006140f082856154a3565b90506000614106670de0b6b3a7640000836149eb565b90506141128a82614b48565b9c9b505050505050505050505050565b600554606090610100900460ff161561416c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600c5460ff166141ac576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600d80548060200260200160405190810160405280929190818152602001828054801561106357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141e4575050505050905090565b6001600160a01b03811660009081526010602052604081206011805483919060ff871690811061423757fe5b90600052602060002090600a02019050600081600401549050600061425b30612cd1565b90506000836002015443116142705743614276565b83600201545b905083600101548111801561428a57508115155b156142e45760006142a885600101548361536590919063ffffffff16565b905060006142d3846115f4670de0b6b3a764000061378a8a6003015487614aa390919063ffffffff16565b90506142df8582614a49565b945050505b60ff88166000908152600186016020526040902054855461431891906129ca90670de0b6b3a7640000906115f49088614aa3565b98975050505050505050565b6007546001600160a01b031681565b6013546001600160a01b031681565b600554606090610100900460ff16156141ac576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143c090836151c0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615b0d833981519152929081900390910190a350600192915050565b336000818152601060205260409020805490916144309082614b3e565b6000808355601154905b8160ff168160ff1610156144675760ff81166000908152600180860160205260408220919091550161443a565b5060408051838152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5460ff161561450c576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b6007546001600160a01b03163314614553576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b66038d7ea4c6800081111561459d576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600b55565b6008546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b6012546001600160a01b031681565b600554600090610100900460ff161561466c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166146c2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e6020526040902060020154600f546146ec9082906153a7565b9392505050565b60115460005b8160ff168160ff16101561471857614710816136ea565b6001016146f9565b5050565b6008546001600160a01b031681565b600554610100900460ff1615614772576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561478d33848484614f07565b6147973384614b3e565b50506005805461ff001916905550565b600554600090610100900460ff16156147f1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16614847576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206003015490565b60008061487385886153a7565b9050600061488187866149eb565b9050600061488f88836153a7565b9050600061489d82856154a3565b90506148b181670de0b6b3a76400006149eb565b90506148c5670de0b6b3a7640000876149eb565b94506148da6148d48c83614b48565b866153a7565b9b9a5050505050505050505050565b6001600160a01b03831660009081526020819052604090205481111561493f576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461496290826149eb565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461499190826151c0565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006149fa858561569d565b915091508015614a41576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ab2575060006110bc565b82820282848281614abf57fe5b04146146ec5760405162461bcd60e51b8152600401808060200182810382526021815260200180615aec6021913960400191505060405180910390fd5b60006146ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506156c2565b6147188282615764565b6000828202831580614b62575082848281614b5f57fe5b04145b614ba2576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614bf1576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b614718828261576f565b614c1c8161577a565b50565b600a54600090829015614daa57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b158015614c7157600080fd5b505afa158015614c85573d6000803e3d6000fd5b505050506040513d6020811015614c9b57600080fd5b505190506001600160a01b038082169088161415614d2f57614cd0614cc287600a54614b48565b670de0b6b3a76400006153a7565b600754909350614ceb9088906001600160a01b031685614db3565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2614da8565b6000614d40614cc286600a54614b48565b600754909150614d5b9087906001600160a01b031683614db3565b614d6585826149eb565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310614e305780518252601f199092019160209182019101614e11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614e92576040519150601f19603f3d011682016040523d82523d6000602084013e614e97565b606091505b5091509150818015614ec5575080511580614ec55750808060200190516020811015614ec257600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f707573685560c81b604482015290519081900360640190fd5b5050505050565b600c5460ff16614f47576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000614f51611345565b90506000614f5f85836153a7565b905080614f9c576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b60005b600d548110156150e8576000600d8281548110614fb857fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090614fed8583614b48565b90508015801590615010575087878581811061500557fe5b905060200201358111155b615052576040805162461bcd60e51b815260206004820152600e60248201526d32b926a0b8393e3e1e3634b6a4b760911b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461507890826151c0565b6001600160a01b038085166000818152600e602090815260409182902060030194909455805185815290519193928e16927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a92918290030190a36150dd833383615212565b505050600101614f9f565b50612cc985615209565b6001600160a01b038216600090815260106020526040902061511383611687565b805461511f9083614a49565b815560115460005b8160ff168160ff16101561517457615154670de0b6b3a76400006115f460118460ff16815481106115d857fe5b60ff82166000908152600180860160205260409091209190915501615127565b504260058301556040805184815290516001600160a01b038616917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b614c1c8161583c565b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106152955780518252601f199092019160209182019101615276565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146152f7576040519150601f19603f3d011682016040523d82523d6000602084013e6152fc565b606091505b509150915081801561532a57508051158061532a575080806020019051602081101561532757600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f70756c6c5560c81b604482015290519081900360640190fd5b60006146ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506158b1565b6000816153e6576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a7640000830283158061540e5750670de0b6b3a764000084828161540b57fe5b04145b61544e576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015615498576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614bfe57fe5b600060018310156154ea576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115615537576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b60006155428361590b565b9050600061555084836149eb565b905060006155668661556185615926565b615934565b9050816155775792506110bc915050565b600061558887846305f5e10061598b565b90506155948282614b48565b979650505050505050565b600a54600090156110bc57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b1580156155ef57600080fd5b505afa158015615603573d6000803e3d6000fd5b505050506040513d602081101561561957600080fd5b505190506001600160a01b038116156156965761563b614cc284600a54614b48565b6007549092506156569085906001600160a01b031684614db3565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b6000808284106156b357505080820360006156bb565b505081810360015b9250929050565b6000818361574e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156157135781810151838201526020016156fb565b50505050905090810190601f1680156157405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161575a57fe5b0495945050505050565b6147183083836148e9565b6147188230836148e9565b306000908152602081905260409020548111156157c7576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b306000908152602081905260409020546157e190826149eb565b306000908152602081905260409020556002546157fe90826149eb565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b3060009081526020819052604090205461585690826151c0565b3060009081526020819052604090205560025461587390826151c0565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600081848411156159035760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156157135781810151838201526020016156fb565b505050900390565b6000670de0b6b3a764000061591f83615926565b0292915050565b670de0b6b3a7640000900490565b6000806002830661594d57670de0b6b3a764000061594f565b835b90506002830492505b82156146ec576159688485614b48565b935060028306156159805761597d8185614b48565b90505b600283049250615958565b60008281806159a287670de0b6b3a764000061569d565b9092509050670de0b6b3a764000080600060015b888410615a5a576000670de0b6b3a7640000820290506000806159ea8a6159e585670de0b6b3a76400006149eb565b61569d565b915091506159fc87612e45848c614b48565b9650615a0887846153a7565b965086615a1757505050615a5a565b8715615a21579315935b8015615a2b579315935b8415615a4257615a3b86886149eb565b9550615a4f565b615a4c86886151c0565b95505b5050506001016159b6565b50909998505050505050505050565b828054828255906000526020600020908101928215615abc579160200282015b82811115615abc5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615a89565b50615ac8929150615acc565b5090565b5b80821115615ac85780546001600160a01b0319168155600101615acd56fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f778c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212205244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e264736f6c634300060c0033000000000000000000000000ebc44681c125d63210a33d30c55fd3d37762675b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103db5760003560e01c80638656b6531161020a578063c45a015511610125578063e653bf3a116100b8578063f36c0a7211610087578063f36c0a7214610ef1578063f77c479114610ef9578063f863b96114610f01578063f8b2cb4f14610f76578063f8d6aed414610f9c576103db565b8063e653bf3a14610e95578063e811f50a14610ebb578063efe2226614610ec3578063f1b8a9b714610ecb576103db565b8063d73dd623116100f4578063d73dd62314610e16578063db2e21bc14610e42578063dd62ed3e14610e4a578063e5a583a914610e78576103db565b8063c45a015514610dda578063c7c30be114610dfe578063cc77828d14610e06578063cd2ed8fb14610e0e576103db565b8063a221ee491161019d578063b3f05b971161016c578063b3f05b9714610d10578063ba9530a614610d18578063be3bbd2e14610d53578063be61533514610dab576103db565b8063a221ee4914610c1d578063a694fc3a14610c52578063a9059cbb14610c6f578063b02f0b7314610c9b576103db565b8063936c3477116101d9578063936c347714610bca578063948d8ce614610bd257806395d89b4114610bf85780639da9532614610c00576103db565b80638656b65314610b1d578063884f6f7f14610b585780638c28cbe814610b7e57806392eefe9b14610ba4576103db565b806354cf2aeb116102fa5780636d3c6d921161028d57806379104ea61161025c57806379104ea614610a235780637c5e9ea414610a645780638201aa3f14610abd57806385cc179e14610afd576103db565b80636d3c6d921461092b57806370a082311461095a57806372aa0a601461098057806376d743fe146109f7576103db565b80636284ae41116102c95780636284ae41146107e3578063650e872c146107eb57806366188463146108b55780636d142e5b146108e1576103db565b806354cf2aeb1461077b57806354fd4d50146107835780635db342771461078b57806360d47088146107bd576103db565b80632e1a7d4d11610372578063429b4ae611610341578063429b4ae61461063457806346ab38f1146106515780634d950c74146106835780634f69c0d414610706576103db565b80632e1a7d4d146105ab5780632f37b624146105ca578063313ce567146105f0578063362a3fad1461060e576103db565b806317837baa116103ae57806317837baa1461050b57806318160ddd1461051357806323b872dd1461051b57806329d7958814610551576103db565b806306fdde03146103e0578063095ea7b31461045d5780631446a7ff1461049d57806315e84af9146104dd575b600080fd5b6103e8610fd7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042257818101518382015260200161040a565b50505050905090810190601f16801561044f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104896004803603604081101561047357600080fd5b506001600160a01b03813516906020013561106d565b604080519115158252519081900360200190f35b6104cb600480360360408110156104b357600080fd5b506001600160a01b03813581169160200135166110c2565b60408051918252519081900360200190f35b6104cb600480360360408110156104f357600080fd5b506001600160a01b0381358116916020013516611205565b6104cb61133f565b6104cb611345565b6104896004803603606081101561053157600080fd5b506001600160a01b0381358116916020810135909116906040013561134b565b6105806004803603604081101561056757600080fd5b50803560ff1690602001356001600160a01b0316611498565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6105c8600480360360208110156105c157600080fd5b50356114f0565b005b610489600480360360208110156105e057600080fd5b50356001600160a01b0316611660565b6105f861167e565b6040805160ff9092168252519081900360200190f35b6105c86004803603602081101561062457600080fd5b50356001600160a01b0316611687565b6105c86004803603602081101561064a57600080fd5b50356116b2565b6104cb6004803603606081101561066757600080fd5b506001600160a01b038135169060208101359060400135611791565b6105c86004803603606081101561069957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156106c857600080fd5b8201836020820111156106da57600080fd5b803590602001918460208302840111600160201b831117156106fb57600080fd5b509092509050611a3f565b6105c86004803603604081101561071c57600080fd5b81359190810190604081016020820135600160201b81111561073d57600080fd5b82018360208201111561074f57600080fd5b803590602001918460208302840111600160201b8311171561077057600080fd5b509092509050611b1c565b6104cb611b28565b6104cb611b2e565b6104cb600480360360608110156107a157600080fd5b506001600160a01b038135169060208101359060400135611b34565b6104cb600480360360208110156107d357600080fd5b50356001600160a01b0316611daa565b6104cb611dcf565b6105c86004803603608081101561080157600080fd5b813591602081013591810190606081016040820135600160201b81111561082757600080fd5b82018360208201111561083957600080fd5b803590602001918460208302840111600160201b8311171561085a57600080fd5b919390929091602081019035600160201b81111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111600160201b831117156108aa57600080fd5b509092509050611dd5565b610489600480360360408110156108cb57600080fd5b506001600160a01b03813516906020013561254a565b6105c8600480360360e08110156108f757600080fd5b506001600160a01b038135169060208101359060408101359060608101359060808101359060a08101359060c00135612622565b6105c86004803603604081101561094157600080fd5b50803560ff1690602001356001600160a01b031661294c565b6104cb6004803603602081101561097057600080fd5b50356001600160a01b0316612cd1565b61099d6004803603602081101561099657600080fd5b5035612cec565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083015251908190036101400190f35b6105c860048036036060811015610a0d57600080fd5b5060ff8135169060208101359060400135612d57565b6104cb600480360360e0811015610a3957600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135612e1e565b610aa4600480360360a0811015610a7a57600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612eed565b6040805192835260208301919091528051918290030190f35b610aa4600480360360a0811015610ad357600080fd5b506001600160a01b03813581169160208101359160408201351690606081013590608001356132f7565b6105c860048036036020811015610b1357600080fd5b503560ff166136ea565b6104cb600480360360c0811015610b3357600080fd5b5080359060208101359060408101359060608101359060808101359060a001356137b5565b6105c860048036036020811015610b6e57600080fd5b50356001600160a01b0316613851565b6105c860048036036020811015610b9457600080fd5b50356001600160a01b03166138bc565b6105c860048036036020811015610bba57600080fd5b50356001600160a01b0316613a04565b6104cb613ad2565b6104cb60048036036020811015610be857600080fd5b50356001600160a01b0316613b23565b6103e8613be2565b6105c860048036036020811015610c1657600080fd5b5035613c43565b6104cb600480360360a0811015610c3357600080fd5b5080359060208101359060408101359060608101359060800135613ca0565b6105c860048036036020811015610c6857600080fd5b5035613d0a565b61048960048036036040811015610c8557600080fd5b506001600160a01b038135169060200135613d44565b6105c860048036036040811015610cb157600080fd5b81359190810190604081016020820135600160201b811115610cd257600080fd5b820183602082011115610ce457600080fd5b803590602001918460208302840111600160201b83111715610d0557600080fd5b509092509050613d5a565b610489614098565b6104cb600480360360c0811015610d2e57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356140a1565b610d5b614122565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610d97578181015183820152602001610d7f565b505050509050019250505060405180910390f35b6104cb60048036036040811015610dc157600080fd5b50803560ff1690602001356001600160a01b031661420b565b610de2614324565b604080516001600160a01b039092168252519081900360200190f35b610de2614333565b610d5b614342565b6104cb61438c565b61048960048036036040811015610e2c57600080fd5b506001600160a01b038135169060200135614392565b6105c8614413565b6104cb60048036036040811015610e6057600080fd5b506001600160a01b03813581169160200135166144a3565b6105c860048036036020811015610e8e57600080fd5b50356144ce565b6105c860048036036020811015610eab57600080fd5b50356001600160a01b03166145a2565b6104cb61460d565b610de2614613565b6104cb60048036036020811015610ee157600080fd5b50356001600160a01b0316614622565b6105c86146f3565b610de261471c565b6105c860048036036040811015610f1757600080fd5b81359190810190604081016020820135600160201b811115610f3857600080fd5b820183602082011115610f4a57600080fd5b803590602001918460208302840111600160201b83111715610f6b57600080fd5b50909250905061472b565b6104cb60048036036020811015610f8c57600080fd5b50356001600160a01b03166147a7565b6104cb600480360360c0811015610fb257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614866565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b820191906000526020600020905b81548152906001019060200180831161104657829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b03871680855290835281842086905581518681529151939490939092600080516020615b0d833981519152928290030190a35060015b92915050565b600554600090610100900460ff161561110c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff16611162576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166111b8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e602052604080822092851682528120600380840154600280860154928401549084015493946111fc9492939290613ca0565b95945050505050565b600554600090610100900460ff161561124f576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090205460ff166112a5576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166112fb576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038084166000908152600e60205260408082209285168252902060038083015460028085015492840154908401546009546111fc94929190613ca0565b60145481565b60025490565b6000336001600160a01b038516148061138757506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b6113c3576040805162461bcd60e51b815260206004820152600860248201526710b9b832b73232b960c11b604482015290519081900360640190fd5b6113ce8484846148e9565b336001600160a01b0385161480159061140c57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b1561148e576001600160a01b038416600090815260016020908152604080832033845290915290205461143f90836149eb565b6001600160a01b0385811660009081526001602090815260408083203380855290835292819020859055805194855251928716939192600080516020615b0d8339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152601060209081526040808320805460ff9095168452600181018352818420546002820184528285205460038301855283862054600490930190945291909320549394909391929190565b3360009081526010602052604090208054821115611540576040805162461bcd60e51b8152602060048201526008602482015267616d3e75732e616d60c01b604482015290519081900360640190fd5b601454600582015461155191614a49565b42101561158e576040805162461bcd60e51b8152602060048201526006602482015265333937bd32b760d11b604482015290519081900360640190fd5b61159733611687565b80546115a390836149eb565b815560115460005b8160ff168160ff16101561161a576115fa670de0b6b3a76400006115f460118460ff16815481106115d857fe5b600091825260209091206004600a909202010154865490614aa3565b90614afc565b60ff821660009081526001808601602052604090912091909155016115ab565b506116253384614b3e565b60408051848152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03166000908152600e602052604090205460ff1690565b60055460ff1690565b60115460005b8160ff168160ff1610156116ad576116a5818461294c565b60010161168d565b505050565b6007546001600160a01b031633146116f9576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b6611c37937e08000811115611741576040805162461bcd60e51b81526020600482015260096024820152683e6d6178436f46656560b81b604482015290519081900360640190fd5b60095461174f826002614b48565b111561178c576040805162461bcd60e51b81526020600482015260076024820152661f39a332b2979960c91b604482015290519081900360640190fd5b600a55565b600554600090610100900460ff16156117db576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff1661182a576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611880576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954600b546118bd95949392918a91612e1e565b9150828210156118fc576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e6020526040902060039081015461193191670de0b6b3a76400005b04600101614b48565b821115611970576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b61197e8160030154836149eb565b8160030181905550600061199485600b54614b48565b6040805185815290519192506001600160a01b0388169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a36119e23386614c09565b6119f46119ef86836149eb565b614c13565b8015611a1057600754611a10906001600160a01b031682614b3e565b611a1c30868886614c1f565b9350611a2b9050863385614db3565b50506005805461ff00191690559392505050565b600554610100900460ff1615611a86576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055336001600160a01b0385161480611ab657506013546001600160a01b031633145b611af5576040805162461bcd60e51b815260206004820152600b60248201526a21287072787c7c6f776e2960a81b604482015290519081900360640190fd5b611b0184848484614f07565b611b0b84846150f2565b50506005805461ff00191690555050565b6116ad33848484611a3f565b60095481565b60065481565b600554600090610100900460ff1615611b7e576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16611bcd576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e602052604090205460ff16611c23576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060030154611c55906002670de0b6b3a76400005b04614b48565b831115611c94576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b6001600160a01b0384166000908152600e6020526040902060038101546002808301549054600f54600954611cce949392919089906137b5565b915082821015611d0d576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b611d1b8160030154856151c0565b60038201556040805185815290516001600160a01b0387169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a9181900360200190a3611d6982615209565b611d74853386615212565b6000611d8286863086614c1f565b935090508015611da057611d9a8260030154826149eb565b60038301555b611a2b3384614b3e565b6014546001600160a01b03821660009081526010602052604090206005015401919050565b600b5481565b600554610100900460ff1615611e1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614611e76576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600c5460ff1615611eb4576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b64e8d4a51000861015611ef8576040805162461bcd60e51b81526020600482015260076024820152663c6d696e46656560c81b604482015290519081900360640190fd5b67016345785d8a0000861115611f3f576040805162461bcd60e51b81526020600482015260076024820152663e6d617846656560c81b604482015290519081900360640190fd5b85611f4d600a546002614b48565b1115611f89576040805162461bcd60e51b81526020600482015260066024820152651e2332b2951960d11b604482015290519081900360640190fd5b600986905566038d7ea4c68000851015611fd9576040805162461bcd60e51b815260206004820152600c60248201526b03c6d696e496e6974505375760a41b604482015290519081900360640190fd5b6ec097ce7bc90715b34b9f100000000085111561202c576040805162461bcd60e51b815260206004820152600c60248201526b03e6d6178496e6974505375760a41b604482015290519081900360640190fd5b600283101561206f576040805162461bcd60e51b815260206004820152600a6024820152693c6d696e546f6b656e7360b01b604482015290519081900360640190fd5b600883106120b1576040805162461bcd60e51b815260206004820152600a6024820152693e6d6178546f6b656e7360b01b604482015290519081900360640190fd5b8281146120f2576040805162461bcd60e51b815260206004820152600a60248201526965724c656e674d69736d60b01b604482015290519081900360640190fd5b600060608467ffffffffffffffff8111801561210d57600080fd5b50604051908082528060200260200182016040528015612137578160200160208202803683370190505b50905060005b858110156123c157600087878381811061215357fe5b905060200201356001600160a01b03169050600086868481811061217357fe5b9050602002013590506000826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156121cb57600080fd5b505afa1580156121df573d6000803e3d6000fd5b505050506040513d60208110156121f557600080fd5b50518551909150819086908690811061220a57fe5b6020908102919091018101919091526001600160a01b0384166000908152600e909152604090205460ff161561226f576040805162461bcd60e51b8152602060048201526005602482015264189bdd5b9960da1b604482015290519081900360640190fd5b670de0b6b3a76400008210156122b9576040805162461bcd60e51b815260206004820152600a6024820152690f1b5a5b95d95a59da1d60b21b604482015290519081900360640190fd5b6802b5e3af16b1880000821115612304576040805162461bcd60e51b815260206004820152600a6024820152690f9b585e15d95a59da1d60b21b604482015290519081900360640190fd5b620f4240811015612346576040805162461bcd60e51b81526020600482015260076024820152660f1b5a5b90985b60ca1b604482015290519081900360640190fd5b6040805160808101825260018082526020808301888152838501878152606085018781526001600160a01b038a166000908152600e909452959092209351845460ff1916901515178455519183019190915551600282015590516003909101556123b086836151c0565b9550506001909201915061213d9050565b506802b5e3af16b188000082111561240e576040805162461bcd60e51b815260206004820152600b60248201526a0f9b585e1515d95a59da1d60aa1b604482015290519081900360640190fd5b600f82905561241f600d8787615a69565b50600c805460ff1916600117905561243687615209565b6124403388614b3e565b7f84544fec6632b8b4c691c6d5d5288102f47b6d448e731f535b38767d2bfd2662600954886006548989898988604051808981526020018881526020018781526020018060200180602001806020018481038452898982818152602001925060200280828437600083820152601f01601f191690910185810384528781526020908101915088908802808284376000838201819052601f909101601f19169092018681038452875181528751602091820193828a0193509102908190849084905b83811015612519578181015183820152602001612501565b505050509050019b50505050505050505050505060405180910390a150506005805461ff0019169055505050505050565b3360009081526001602090815260408083206001600160a01b03861684529091528120548083111561259f573360009081526001602090815260408083206001600160a01b03881684529091528120556125ce565b6125a981846149eb565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b038916808552908352928190205481519081529051929392600080516020615b0d833981519152929181900390910190a35060019392505050565b6008546001600160a01b0316331461266b576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b6011546008116126b6576040805162461bcd60e51b815260206004820152601160248201527065786365656420727764506f6f6c4c696d60781b604482015290519081900360640190fd5b808211156126f5576040805162461bcd60e51b815260206004820152600760248201526639ab211f32ab2160c91b604482015290519081900360640190fd5b8543116127025785612704565b435b9550848610612743576040805162461bcd60e51b815260206004820152600660248201526539a11f1eb2a160d11b604482015290519081900360640190fd5b61274b6146f3565b60408051610140810182526001600160a01b039889168152602081019788529081019586526060810194855260006080820181815260a0830195865260c0830185815260e08401858152959094036101008401908152610120840183815260118054600181018255945293517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c68600a90940293840180546001600160a01b03191691909c1617909a5597517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6982015595517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6a87015593517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6b86015594517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6c85015590517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6d84015592517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6e83015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c6f82015591517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c70830155517f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c7190910155565b612955826136ea565b6001600160a01b03811660009081526010602052604081206011805491929160ff861690811061298157fe5b6000918252602080832060ff88168452600186019091526040832054600a9290920201600481015485549194506129d092916129ca91670de0b6b3a7640000916115f491614aa3565b90615365565b60058301549091508015612b6a578260070154431115612a655760ff8616600090815260048501602090815260408083205460038801909252822054612a1591615365565b90508015612a5f57612a278382614a49565b60ff88166000908152600487016020526040902054909350612a499082614a49565b60ff881660009081526004870160205260409020555b50612b6a565b8115612ac1576000612a7c60646115f48585614aa3565b9050612a888382615365565b60ff88166000908152600387016020526040902054909350612aaa9082614a49565b60ff88166000908152600387016020526040902055505b8260060154431115612b6a576000612b0c84600801546115f4612af187600601544361536590919063ffffffff16565b60ff8b16600090815260038a01602052604090205490614aa3565b60ff8816600090815260048701602052604090205490915080821115612b67576000612b388383615365565b9050612b448282614a49565b60ff8a166000908152600489016020526040902055612b638582614a49565b9450505b50505b8115612cc95760ff86166000908152600285016020526040902054612b8f9083614a49565b60ff871660009081526002860160205260409020556009830154612bb39083614a49565b600984015560125483546040805163d1660f9960e01b81526001600160a01b0392831660048201528883166024820152604481018690529051919092169163d1660f9991606480830192600092919082900301818387803b158015612c1757600080fd5b505af1158015612c2b573d6000803e3d6000fd5b50506040805160ff8a1681526020810186905281516001600160a01b038a1694507f636c8a1a63bdbdbe782bbd46665206ecd64f1d1f745ed547cc9dd708864fd2b093509081900390910190a2612cb3670de0b6b3a76400006115f460118960ff1681548110612c9757fe5b600091825260209091206004600a909202010154875490614aa3565b60ff871660009081526001860160205260409020555b505050505050565b6001600160a01b031660009081526020819052604090205490565b60118181548110612cf957fe5b60009182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b03909816995095979496939592949193909291908a565b6008546001600160a01b03163314612da0576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b612da9836136ea565b600060118460ff1681548110612dbb57fe5b90600052602060002090600a020190508060020154431115612e0d576040805162461bcd60e51b815260206004808301919091526024820152636c61746560e01b604482015290519081900360640190fd5b600281019290925560039091015550565b600080612e2b88876153a7565b90506000612e4a86612e45670de0b6b3a7640000876149eb565b614b48565b90506000612e5889836149eb565b90506000612e66828b6153a7565b90506000612e8582612e80670de0b6b3a7640000886153a7565b6154a3565b90506000612e93828f614b48565b90506000612ea18f836149eb565b90506000612ec0612eba670de0b6b3a76400008a6149eb565b8c614b48565b9050612ed882612e45670de0b6b3a7640000846149eb565b98505050505050505050979650505050505050565b6005546000908190610100900460ff1615612f39576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff16612f9e576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff16612ff4576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e60205260408082209288168252902060038082015461302d91670de0b6b3a7640000611928565b86111561306c576040805162461bcd60e51b81526020600482015260086024820152670f9b585e13d4985d60c21b604482015290519081900360640190fd5b600061308d8360030154846002015484600301548560020154600954613ca0565b9050858111156130d2576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6130f283600301548460020154846003015485600201548b600954614866565b945088851115613132576040805162461bcd60e51b81526020600482015260066024820152651e3634b6a4b760d11b604482015290519081900360640190fd5b6131408360030154866151c0565b83600301819055506131568260030154886149eb565b600380840182905584015460028086015490850154600954613179949190613ca0565b9350808410156131b9576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b858411156131fa576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61320485886153a7565b811115613241576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d43378888b604051808381526020018281526020019250505060405180910390a46132a98a3387615212565b6132b4883389614db3565b60006132c08b8761559f565b905080156132dc576132d68460030154826149eb565b60038501555b505050506005805461ff001916905590969095509350505050565b6005546000908190610100900460ff1615613343576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600e602052604090205460ff166133a8576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0385166000908152600e602052604090205460ff166133fe576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b038088166000908152600e6020526040808220928816825290206003820154613438906002670de0b6b3a7640000611c4f565b881115613477576040805162461bcd60e51b81526020600482015260086024820152670f9b585e1254985d60c21b604482015290519081900360640190fd5b60006134988360030154846002015484600301548560020154600954613ca0565b9050858111156134dd576040805162461bcd60e51b815260206004820152600b60248201526a6261644c696d507269636560a81b604482015290519081900360640190fd5b6134fd83600301548460020154846003015485600201548d6009546140a1565b94508685101561353c576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b61354a83600301548a6151c0565b83600301819055506135608260030154866149eb565b600380840182905584015460028086015490850154600954613583949190613ca0565b9350808410156135c3576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b85841115613604576040805162461bcd60e51b81526020600482015260096024820152683e6c696d507269636560b81b604482015290519081900360640190fd5b61360e89866153a7565b81111561364b576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b876001600160a01b03168a6001600160a01b0316336001600160a01b03167f908fb5ee8f16c6bc9bc3690973819f32a4d4b10188134543c88706e0e1d433788c89604051808381526020018281526020019250505060405180910390a46136b38a338b615212565b60006136c18b8b8b89614c1f565b9650905080156136df576136d98460030154826149eb565b60038501555b6132dc893388614db3565b600060118260ff16815481106136fc57fe5b90600052602060002090600a0201905060008160020154431161371f5743613725565b81600201545b905081600101548111156116ad57600061373e30612cd1565b905080156137aa57600061375f84600101548461536590919063ffffffff16565b90506000613790836115f4670de0b6b3a764000061378a896003015487614aa390919063ffffffff16565b90614aa3565b60048601549091506137a29082614a49565b600486015550505b506001919091015550565b6000806137c287866153a7565b905060006137e16137db670de0b6b3a7640000846149eb565b85614b48565b905060006137fb86612e45670de0b6b3a7640000856149eb565b905060006138098b836151c0565b90506000613817828d6153a7565b9050600061382582876154a3565b90506000613833828d614b48565b905061383f818d6149eb565b9e9d5050505050505050505050505050565b6008546001600160a01b0316331461389a576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601280546001600160a01b0319166001600160a01b0392909216919091179055565b600554610100900460ff1615613903576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600e602052604090205460ff16613968576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516001600160a01b038316916370a08231916024808301926020929190829003018186803b1580156139ae57600080fd5b505afa1580156139c2573d6000803e3d6000fd5b505050506040513d60208110156139d857600080fd5b50516001600160a01b039091166000908152600e60205260409020600301556005805461ff0019169055565b600554610100900460ff1615613a4b576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600854336001600160a01b0390911614613aa5576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff1615613b1c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b50600f5490565b600554600090610100900460ff1615613b6d576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16613bc3576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206002015490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110635780601f1061103857610100808354040283529160200191611063565b6008546001600160a01b03163314613c8c576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b62278d006014541115613c9b57fe5b601455565b600080613cad87876153a7565b90506000613cbb86866153a7565b90506000613cc983836153a7565b90506000613cf0670de0b6b3a7640000613ceb670de0b6b3a7640000896149eb565b6153a7565b9050613cfc8282614b48565b9a9950505050505050505050565b6000613d1530612cd1565b9050613d213383614c09565b6000613d2c30612cd1565b9050613d3881836149eb565b92506116ad33846150f2565b6000613d513384846148e9565b50600192915050565b600554610100900460ff1615613da1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff001916610100179055600c5460ff16613df0576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000613dfa611345565b90506000613e0a85600b54614b48565b90506000613e1886836149eb565b90506000613e2682856153a7565b905080613e63576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b6000613e6e33612cd1565b905087811015613ee2576000613e8489836149eb565b3360009081526010602052604090205490915081811015613ed6576040805162461bcd60e51b815260206004820152600760248201526639ba359e3bb23960c91b604482015290519081900360640190fd5b613edf826114f0565b50505b613eec3389614c09565b8315613f0857600754613f08906001600160a01b031685614b3e565b613f1183614c13565b60005b600d54811015614082576000600d8281548110613f2d57fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090613f628683614b48565b905080613f9f576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b8a8a85818110613fab57fe5b90506020020135811015613fee576040805162461bcd60e51b81526020600482015260056024820152643c6c696d4f60d81b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461401490826149eb565b6001600160a01b0384166000818152600e60209081526040918290206003019390935580518481529051919233927fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed9281900390910190a3614077833383614db3565b505050600101613f14565b50506005805461ff001916905550505050505050565b600c5460ff1681565b6000806140ae87866153a7565b905060006140c4670de0b6b3a7640000856149eb565b90506140d08582614b48565b905060006140e28a613ceb8c856151c0565b905060006140f082856154a3565b90506000614106670de0b6b3a7640000836149eb565b90506141128a82614b48565b9c9b505050505050505050505050565b600554606090610100900460ff161561416c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600c5460ff166141ac576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b600d80548060200260200160405190810160405280929190818152602001828054801561106357602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116141e4575050505050905090565b6001600160a01b03811660009081526010602052604081206011805483919060ff871690811061423757fe5b90600052602060002090600a02019050600081600401549050600061425b30612cd1565b90506000836002015443116142705743614276565b83600201545b905083600101548111801561428a57508115155b156142e45760006142a885600101548361536590919063ffffffff16565b905060006142d3846115f4670de0b6b3a764000061378a8a6003015487614aa390919063ffffffff16565b90506142df8582614a49565b945050505b60ff88166000908152600186016020526040902054855461431891906129ca90670de0b6b3a7640000906115f49088614aa3565b98975050505050505050565b6007546001600160a01b031681565b6013546001600160a01b031681565b600554606090610100900460ff16156141ac576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b600d5490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143c090836151c0565b3360008181526001602090815260408083206001600160a01b038916808552908352928190208590558051948552519193600080516020615b0d833981519152929081900390910190a350600192915050565b336000818152601060205260409020805490916144309082614b3e565b6000808355601154905b8160ff168160ff1610156144675760ff81166000908152600180860160205260408220919091550161443a565b5060408051838152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a2505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5460ff161561450c576040805162461bcd60e51b8152602060048201526003602482015262199b9b60ea1b604482015290519081900360640190fd5b6007546001600160a01b03163314614553576040805162461bcd60e51b815260206004820152600560248201526410b331ba3960d91b604482015290519081900360640190fd5b66038d7ea4c6800081111561459d576040805162461bcd60e51b815260206004820152600b60248201526a3e6d61784578697446656560a81b604482015290519081900360640190fd5b600b55565b6008546001600160a01b031633146145eb576040805162461bcd60e51b815260206004820152600760248201526610b1b73a3632b960c91b604482015290519081900360640190fd5b601380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b6012546001600160a01b031681565b600554600090610100900460ff161561466c576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff166146c2576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e6020526040902060020154600f546146ec9082906153a7565b9392505050565b60115460005b8160ff168160ff16101561471857614710816136ea565b6001016146f9565b5050565b6008546001600160a01b031681565b600554610100900460ff1615614772576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6005805461ff00191661010017905561478d33848484614f07565b6147973384614b3e565b50506005805461ff001916905550565b600554600090610100900460ff16156147f1576040805162461bcd60e51b81526020600482015260076024820152667265656e74727960c81b604482015290519081900360640190fd5b6001600160a01b0382166000908152600e602052604090205460ff16614847576040805162461bcd60e51b815260206004820152600660248201526508589bdd5b9960d21b604482015290519081900360640190fd5b506001600160a01b03166000908152600e602052604090206003015490565b60008061487385886153a7565b9050600061488187866149eb565b9050600061488f88836153a7565b9050600061489d82856154a3565b90506148b181670de0b6b3a76400006149eb565b90506148c5670de0b6b3a7640000876149eb565b94506148da6148d48c83614b48565b866153a7565b9b9a5050505050505050505050565b6001600160a01b03831660009081526020819052604090205481111561493f576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b6001600160a01b03831660009081526020819052604090205461496290826149eb565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461499190826151c0565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008060006149fa858561569d565b915091508015614a41576040805162461bcd60e51b815260206004820152600d60248201526c73756220756e646572666c6f7760981b604482015290519081900360640190fd5b509392505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ab2575060006110bc565b82820282848281614abf57fe5b04146146ec5760405162461bcd60e51b8152600401808060200182810382526021815260200180615aec6021913960400191505060405180910390fd5b60006146ec83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506156c2565b6147188282615764565b6000828202831580614b62575082848281614b5f57fe5b04145b614ba2576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614bf1576040805162461bcd60e51b815260206004820152600c60248201526b6d756c206f766572666c6f7760a01b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b614718828261576f565b614c1c8161577a565b50565b600a54600090829015614daa57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b158015614c7157600080fd5b505afa158015614c85573d6000803e3d6000fd5b505050506040513d6020811015614c9b57600080fd5b505190506001600160a01b038082169088161415614d2f57614cd0614cc287600a54614b48565b670de0b6b3a76400006153a7565b600754909350614ceb9088906001600160a01b031685614db3565b6040805184815290516001600160a01b038916917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a2614da8565b6000614d40614cc286600a54614b48565b600754909150614d5b9087906001600160a01b031683614db3565b614d6585826149eb565b6040805183815290519194506001600160a01b038816917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd9181900360200190a2505b505b94509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310614e305780518252601f199092019160209182019101614e11565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614e92576040519150601f19603f3d011682016040523d82523d6000602084013e614e97565b606091505b5091509150818015614ec5575080511580614ec55750808060200190516020811015614ec257600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f707573685560c81b604482015290519081900360640190fd5b5050505050565b600c5460ff16614f47576040805162461bcd60e51b8152602060048083019190915260248201526308599b9b60e21b604482015290519081900360640190fd5b6000614f51611345565b90506000614f5f85836153a7565b905080614f9c576040805162461bcd60e51b815260206004820152600660248201526532b926a0b83960d11b604482015290519081900360640190fd5b60005b600d548110156150e8576000600d8281548110614fb857fe5b60009182526020808320909101546001600160a01b0316808352600e909152604082206003015490925090614fed8583614b48565b90508015801590615010575087878581811061500557fe5b905060200201358111155b615052576040805162461bcd60e51b815260206004820152600e60248201526d32b926a0b8393e3e1e3634b6a4b760911b604482015290519081900360640190fd5b6001600160a01b0383166000908152600e602052604090206003015461507890826151c0565b6001600160a01b038085166000818152600e602090815260409182902060030194909455805185815290519193928e16927f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a92918290030190a36150dd833383615212565b505050600101614f9f565b50612cc985615209565b6001600160a01b038216600090815260106020526040902061511383611687565b805461511f9083614a49565b815560115460005b8160ff168160ff16101561517457615154670de0b6b3a76400006115f460118460ff16815481106115d857fe5b60ff82166000908152600180860160205260409091209190915501615127565b504260058301556040805184815290516001600160a01b038616917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a250505050565b6000828201838110156146ec576040805162461bcd60e51b815260206004820152600c60248201526b616464206f766572666c6f7760a01b604482015290519081900360640190fd5b614c1c8161583c565b604080516001600160a01b038481166024830152306044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000946060949389169392918291908083835b602083106152955780518252601f199092019160209182019101615276565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146152f7576040519150601f19603f3d011682016040523d82523d6000602084013e6152fc565b606091505b509150915081801561532a57508051158061532a575080806020019051602081101561532757600080fd5b50515b614f00576040805162461bcd60e51b8152602060048201526007602482015266215f70756c6c5560c81b604482015290519081900360640190fd5b60006146ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506158b1565b6000816153e6576040805162461bcd60e51b8152602060048201526008602482015267064697620627920360c41b604482015290519081900360640190fd5b670de0b6b3a7640000830283158061540e5750670de0b6b3a764000084828161540b57fe5b04145b61544e576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b60028304810181811015615498576040805162461bcd60e51b815260206004820152600c60248201526b191a5d881a5b9d195c9b985b60a21b604482015290519081900360640190fd5b6000848281614bfe57fe5b600060018310156154ea576040805162461bcd60e51b815260206004820152600c60248201526b6261736520746f6f206c6f7760a01b604482015290519081900360640190fd5b671bc16d674ec7ffff831115615537576040805162461bcd60e51b815260206004820152600d60248201526c0c4c2e6ca40e8dede40d0d2ced609b1b604482015290519081900360640190fd5b60006155428361590b565b9050600061555084836149eb565b905060006155668661556185615926565b615934565b9050816155775792506110bc915050565b600061558887846305f5e10061598b565b90506155948282614b48565b979650505050505050565b600a54600090156110bc57600754604080516374b1330b60e11b815290516000926001600160a01b03169163e9626616916004808301926020929190829003018186803b1580156155ef57600080fd5b505afa158015615603573d6000803e3d6000fd5b505050506040513d602081101561561957600080fd5b505190506001600160a01b038116156156965761563b614cc284600a54614b48565b6007549092506156569085906001600160a01b031684614db3565b6040805183815290516001600160a01b038616917faa299fc96f84481838321cf4ac49861748dc206dd9101e1b8ed3f34bb88cadbd919081900360200190a25b5092915050565b6000808284106156b357505080820360006156bb565b505081810360015b9250929050565b6000818361574e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156157135781810151838201526020016156fb565b50505050905090810190601f1680156157405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161575a57fe5b0495945050505050565b6147183083836148e9565b6147188230836148e9565b306000908152602081905260409020548111156157c7576040805162461bcd60e51b815260206004808301919091526024820152630858985b60e21b604482015290519081900360640190fd5b306000908152602081905260409020546157e190826149eb565b306000908152602081905260409020556002546157fe90826149eb565b60025560408051828152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b3060009081526020819052604090205461585690826151c0565b3060009081526020819052604090205560025461587390826151c0565b60025560408051828152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350565b600081848411156159035760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156157135781810151838201526020016156fb565b505050900390565b6000670de0b6b3a764000061591f83615926565b0292915050565b670de0b6b3a7640000900490565b6000806002830661594d57670de0b6b3a764000061594f565b835b90506002830492505b82156146ec576159688485614b48565b935060028306156159805761597d8185614b48565b90505b600283049250615958565b60008281806159a287670de0b6b3a764000061569d565b9092509050670de0b6b3a764000080600060015b888410615a5a576000670de0b6b3a7640000820290506000806159ea8a6159e585670de0b6b3a76400006149eb565b61569d565b915091506159fc87612e45848c614b48565b9650615a0887846153a7565b965086615a1757505050615a5a565b8715615a21579315935b8015615a2b579315935b8415615a4257615a3b86886149eb565b9550615a4f565b615a4c86886151c0565b95505b5050506001016159b6565b50909998505050505050505050565b828054828255906000526020600020908101928215615abc579160200282015b82811115615abc5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190615a89565b50615ac8929150615acc565b5090565b5b80821115615ac85780546001600160a01b0319168155600101615acd56fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f778c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a26469706673582212205244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e264736f6c634300060c0033
Deployed Bytecode Sourcemap
47491:14130:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14801:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15436:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15436:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34268:465;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34268:465:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33796:464;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33796:464:0;;;;;;;;;;:::i;48882:40::-;;;:::i;15331:97::-;;;:::i;16452:487::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16452:487:0;;;;;;;;;;;;;;;;;:::i;58652:470::-;;;;;;;;;;;;;;;;-1:-1:-1;58652:470:0;;;;;;;;-1:-1:-1;;;;;58652:470:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53859:679;;;;;;;;;;;;;;;;-1:-1:-1;53859:679:0;;:::i;:::-;;29831:115;;;;;;;;;;;;;;;;-1:-1:-1;29831:115:0;-1:-1:-1;;;;;29831:115:0;;:::i;14987:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;54602:245;;;;;;;;;;;;;;;;-1:-1:-1;54602:245:0;-1:-1:-1;;;;;54602:245:0;;:::i;29296:287::-;;;;;;;;;;;;;;;;-1:-1:-1;29296:287:0;;:::i;42444:1328::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42444:1328:0;;;;;;;;;;;;;:::i;51456:305::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51456:305:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51456:305:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51456:305:0;;;;;;;;;;-1:-1:-1;51456:305:0;;-1:-1:-1;51456:305:0;-1:-1:-1;51456:305:0;:::i;51291:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51291:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51291:157:0;;;;;;;;;;-1:-1:-1;51291:157:0;;-1:-1:-1;51291:157:0;-1:-1:-1;51291:157:0;:::i;28740:19::-;;;:::i;28463:26::-;;;:::i;41150:1286::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41150:1286:0;;;;;;;;;;;;;:::i;53699:152::-;;;;;;;;;;;;;;;;-1:-1:-1;53699:152:0;-1:-1:-1;;;;;53699:152:0;;:::i;28843:19::-;;;:::i;31405:2104::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31405:2104:0;;;;;;;;;;-1:-1:-1;31405:2104:0;;-1:-1:-1;31405:2104:0;-1:-1:-1;31405:2104:0;:::i;15897:397::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15897:397:0;;;;;;;;:::i;49808:1076::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;49808:1076:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54855:2330::-;;;;;;;;;;;;;;;;-1:-1:-1;54855:2330:0;;;;;;;;-1:-1:-1;;;;;54855:2330:0;;:::i;15214:109::-;;;;;;;;;;;;;;;;-1:-1:-1;15214:109:0;-1:-1:-1;;;;;15214:109:0;;:::i;48760:38::-;;;;;;;;;;;;;;;;-1:-1:-1;48760:38:0;;:::i;:::-;;;;-1:-1:-1;;;;;48760:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50892:391;;;;;;;;;;;;;;;;-1:-1:-1;50892:391:0;;;;;;;;;;;;;;:::i;25802:1312::-;;;;;;;;;;;;;;;;-1:-1:-1;25802:1312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;38989:2153::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38989:2153:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36760:2221;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36760:2221:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;60815:803::-;;;;;;;;;;;;;;;;-1:-1:-1;60815:803:0;;;;:::i;23500:1183::-;;;;;;;;;;;;;;;;-1:-1:-1;23500:1183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49313:117::-;;;;;;;;;;;;;;;;-1:-1:-1;49313:117:0;-1:-1:-1;;;;;49313:117:0;;:::i;33594:194::-;;;;;;;;;;;;;;;;-1:-1:-1;33594:194:0;-1:-1:-1;;;;;33594:194:0;;:::i;31224:173::-;;;;;;;;;;;;;;;;-1:-1:-1;31224:173:0;-1:-1:-1;;;;;31224:173:0;;:::i;30611:136::-;;;:::i;30396:207::-;;;;;;;;;;;;;;;;-1:-1:-1;30396:207:0;-1:-1:-1;;;;;30396:207:0;;:::i;14892:87::-;;;:::i;49567:233::-;;;;;;;;;;;;;;;;-1:-1:-1;49567:233:0;;:::i;18539:523::-;;;;;;;;;;;;;;;;-1:-1:-1;18539:523:0;;;;;;;;;;;;;;;;;;;;;;:::i;52807:333::-;;;;;;;;;;;;;;;;-1:-1:-1;52807:333:0;;:::i;16302:142::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16302:142:0;;;;;;;;:::i;59130:1457::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59130:1457:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;59130:1457:0;;;;;;;;;;-1:-1:-1;59130:1457:0;;-1:-1:-1;59130:1457:0;-1:-1:-1;59130:1457:0;:::i;28869:21::-;;;:::i;20080:697::-;;;;;;;;;;;;;;;;-1:-1:-1;20080:697:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30213:175::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57193:936;;;;;;;;;;;;;;;;-1:-1:-1;57193:936:0;;;;;;;;-1:-1:-1;;;;;57193:936:0;;:::i;28496:22::-;;;:::i;:::-;;;;-1:-1:-1;;;;;28496:22:0;;;;;;;;;;;;;;48847:28;;;:::i;30070:135::-;;;:::i;29954:108::-;;;:::i;15637:252::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15637:252:0;;;;;;;;:::i;58200:444::-;;;:::i;15077:129::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15077:129:0;;;;;;;;;;:::i;29591:232::-;;;;;;;;;;;;;;;;-1:-1:-1;29591:232:0;;:::i;49438:121::-;;;;;;;;;;;;;;;;-1:-1:-1;49438:121:0;-1:-1:-1;;;;;49438:121:0;;:::i;28766:24::-;;;:::i;48807:33::-;;;:::i;30755:256::-;;;;;;;;;;;;;;;;-1:-1:-1;30755:256:0;-1:-1:-1;;;;;30755:256:0;;:::i;60595:212::-;;;:::i;28573:25::-;;;:::i;51769:213::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51769:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51769:213:0;;;;;;;;;;-1:-1:-1;51769:213:0;;-1:-1:-1;51769:213:0;-1:-1:-1;51769:213:0;:::i;31019:197::-;;;;;;;;;;;;;;;;-1:-1:-1;31019:197:0;-1:-1:-1;;;;;31019:197:0;;:::i;21795:686::-;;;;;;;;;;;;;;;;-1:-1:-1;21795:686:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14801:83::-;14871:5;14864:12;;;;;;;;-1:-1:-1;;14864:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14838:13;;14864:12;;14871:5;;14864:12;;14871:5;14864:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14801:83;:::o;15436:193::-;15531:10;15503:4;15520:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15520:27:0;;;;;;;;;;;:33;;;15569:30;;;;;;;15503:4;;15520:27;;15531:10;;-1:-1:-1;;;;;;;;;;;15569:30:0;;;;;;;-1:-1:-1;15617:4:0;15436:193;;;;;:::o;34268:465::-;28389:6;;34381:14;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34421:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;34413:42;;;::::0;;-1:-1:-1;;;34413:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34413:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34474:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;34466:43;;;::::0;;-1:-1:-1;;;34466:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34466:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34546:17:0;;::::1;34520:23;34546:17:::0;;;:8:::1;:17;::::0;;;;;34601:18;;::::1;::::0;;;;34651:16:::1;::::0;;::::1;::::0;34669:15:::1;::::0;;::::1;::::0;34686:17;;::::1;::::0;34705:16;;::::1;::::0;34601:18;;34637:88:::1;::::0;34651:16;;34669:15;34705:16;34637:13:::1;:88::i;:::-;34630:95:::0;34268:465;-1:-1:-1;;;;;34268:465:0:o;33796:464::-;28389:6;;33902:14;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;33942:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;33934:42;;;::::0;;-1:-1:-1;;;33934:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33934:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;33995:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;33987:43;;;::::0;;-1:-1:-1;;;33987:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33987:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34067:17:0;;::::1;34041:23;34067:17:::0;;;:8:::1;:17;::::0;;;;;34122:18;;::::1;::::0;;;;34172:16:::1;::::0;;::::1;::::0;34190:15:::1;::::0;;::::1;::::0;34207:17;;::::1;::::0;34226:16;;::::1;::::0;34244:7:::1;::::0;34158:94:::1;::::0;34190:15;34207:17;34226:16;34158:13:::1;:94::i;48882:40::-:0;;;;:::o;15331:97::-;15408:12;;15331:97;:::o;16452:487::-;16537:4;16562:10;-1:-1:-1;;;;;16562:17:0;;;;:55;;-1:-1:-1;;;;;;16590:15:0;;;;;;:10;:15;;;;;;;;16606:10;16590:27;;;;;;;;16583:34;;;16562:55;16554:76;;;;;-1:-1:-1;;;16554:76:0;;;;;;;;;;;;-1:-1:-1;;;16554:76:0;;;;;;;;;;;;;;;16641:20;16647:3;16652;16657;16641:5;:20::i;:::-;16676:10;-1:-1:-1;;;;;16676:17:0;;;;;;:63;;-1:-1:-1;;;;;;16697:15:0;;;;;;:10;:15;;;;;;;;16713:10;16697:27;;;;;;;;-1:-1:-1;;16697:42:0;;16676:63;16672:238;;;-1:-1:-1;;;;;16791:15:0;;;;;;:10;:15;;;;;;;;16807:10;16791:27;;;;;;;;16786:38;;16820:3;16786:4;:38::i;:::-;-1:-1:-1;;;;;16756:15:0;;;;;;;:10;:15;;;;;;;;16772:10;16756:27;;;;;;;;;;:68;;;16844:54;;;;;;;;;;16772:10;;-1:-1:-1;;;;;;;;;;;16844:54:0;;;;;;;;;16672:238;-1:-1:-1;16927:4:0;16452:487;;;;;:::o;58652:470::-;-1:-1:-1;;;;;58855:18:0;58724:11;58855:18;;;:8;:18;;;;;;;;58893:11;;58928:21;;;;;;:15;;;:21;;;;;;58980:22;;;:28;;;;;;59032:15;;;:21;;;;;;59085:23;;;;:29;;;;;;;;58893:11;;58928:21;;58980:28;;59032:21;59085:29;58652:470::o;53859:679::-;53951:10;53918:21;53942:20;;;:8;:20;;;;;53981:11;;:22;-1:-1:-1;53981:22:0;53973:43;;;;;-1:-1:-1;;;53973:43:0;;;;;;;;;;;;-1:-1:-1;;;53973:43:0;;;;;;;;;;;;;;;54077:19;;54054:18;;;;:43;;:22;:43::i;:::-;54035:15;:62;;54027:81;;;;;-1:-1:-1;;;54027:81:0;;;;;;;;;;;;-1:-1:-1;;;54027:81:0;;;;;;;;;;;;;;;54119:25;54133:10;54119:13;:25::i;:::-;54174:11;;54169:26;;54187:7;54169:4;:26::i;:::-;54155:40;;54237:14;:21;54155:11;54270:170;54298:16;54291:23;;:4;:23;;;54270:170;;;54363:65;54423:4;54363:55;54379:14;54394:4;54379:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;54363:11;;;:15;:55::i;:::-;:59;;:65::i;:::-;54339:21;;;;;;;:15;;;;:21;;;;;;:89;;;;54316:6;54270:170;;;;54450:35;54465:10;54477:7;54450:14;:35::i;:::-;54501:29;;;;;;;;54510:10;;54501:29;;;;;;;;;;53859:679;;;:::o;29831:115::-;-1:-1:-1;;;;;29921:11:0;29892:4;29921:11;;;:8;:11;;;;;:17;;;;29831:115::o;14987:82::-;15052:9;;;;14987:82;:::o;54602:245::-;54701:14;:21;54670:22;54734:106;54762:16;54755:23;;:4;:23;;;54734:106;;;54803:25;54813:4;54819:8;54803:9;:25::i;:::-;54780:6;;54734:106;;;;54602:245;;:::o;29296:287::-;29381:7;;-1:-1:-1;;;;;29381:7:0;29367:10;:21;29359:39;;;;;-1:-1:-1;;;29359:39:0;;;;;;;;;;;;-1:-1:-1;;;29359:39:0;;;;;;;;;;;;;;;6545:10;29417:41;;;29409:63;;;;;-1:-1:-1;;;29409:63:0;;;;;;;;;;;;-1:-1:-1;;;29409:63:0;;;;;;;;;;;;;;;29517:7;;29491:22;29496:13;29511:1;29491:4;:22::i;:::-;:33;;29483:53;;;;;-1:-1:-1;;;29483:53:0;;;;;;;;;;;;-1:-1:-1;;;29483:53:0;;;;;;;;;;;;;;;29547:12;:28;29296:287::o;42444:1328::-;28252:6;;42570:19;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;42615:9:::1;::::0;28281:13;42615:9:::1;42607:26;;;::::0;;-1:-1:-1;;;42607:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;42607:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42652:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;42644:43;;;::::0;;-1:-1:-1;;;42644:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42644:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;42727:18:0;::::1;42700:24;42727:18:::0;;;:8:::1;:18;::::0;;;;42814:17:::1;::::0;::::1;::::0;42846:16:::1;::::0;;::::1;::::0;42877:12;;42904::::1;::::0;42958:7:::1;::::0;42980::::1;::::0;42775:223:::1;::::0;42814:17;42846:16;42877:12;42904;42931;;42775:24:::1;:223::i;:::-;42758:240;;43037:12;43019:14;:30;;43011:48;;;::::0;;-1:-1:-1;;;43011:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43011:48:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;43103:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:26:::1;::::0;;::::1;::::0;43098:54:::1;::::0;6082:6:::1;7477:8;;7489:5;7476:18;43098:4;:54::i;:::-;43080:14;:72;;43072:93;;;::::0;;-1:-1:-1;;;43072:93:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43072:93:0;;;;;;;;;;;;;::::1;;43198:39;43203:9;:17;;;43222:14;43198:4;:39::i;:::-;43178:9;:17;;:59;;;;43250:13;43266:27;43271:12;43285:7;;43266:4;:27::i;:::-;43311:46;::::0;;;;;;;43250:43;;-1:-1:-1;;;;;;43311:46:0;::::1;::::0;43320:10:::1;::::0;43311:46:::1;::::0;;;;;::::1;::::0;;::::1;43370:40;43385:10;43397:12;43370:14;:40::i;:::-;43421:44;43436:28;43441:12;43455:8;43436:4;:28::i;:::-;43421:14;:44::i;:::-;43480:12:::0;;43476:78:::1;;43524:7;::::0;43509:33:::1;::::0;-1:-1:-1;;;;;43524:7:0::1;43533:8:::0;43509:14:::1;:33::i;:::-;43585:81;43620:4;43627:12;43641:8;43651:14;43585:26;:81::i;:::-;43564:102:::0;-1:-1:-1;43677:53:0::1;::::0;-1:-1:-1;43693:8:0;43703:10:::1;43564:102:::0;43677:15:::1;:53::i;:::-;43743:21;;28317:6:::0;:14;;-1:-1:-1;;28317:14:0;;;42444:1328;;-1:-1:-1;;;42444:1328:0:o;51456:305::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;51577:10:::1;-1:-1:-1::0;;;;;51577:21:0;::::1;;::::0;:52:::1;;-1:-1:-1::0;51616:13:0::1;::::0;-1:-1:-1;;;;;51616:13:0::1;51602:10;:27;51577:52;51569:76;;;::::0;;-1:-1:-1;;;51569:76:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;51569:76:0;;;;;;;;;;;;;::::1;;51656:47;51666:7;51675:13;51690:12;;51656:9;:47::i;:::-;51714:39;51730:7;51739:13;51714:15;:39::i;:::-;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;51456:305:0:o;51291:157::-;51388:52;51400:10;51412:13;51427:12;;51388:11;:52::i;28740:19::-;;;;:::o;28463:26::-;;;;:::o;41150:1286::-;28252:6;;41282:18;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;41328:9:::1;::::0;28281:13;41328:9:::1;41320:26;;;::::0;;-1:-1:-1;;;41320:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;41320:26:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41365:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:23;::::1;;41357:42;;;::::0;;-1:-1:-1;;;41357:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41357:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41440:17:0;::::1;;::::0;;;:8:::1;:17;::::0;;;;:25:::1;;::::0;41435:52:::1;::::0;7420:1:::1;6082:6;7413:8;;41435:4;:52::i;:::-;41418:13;:69;;41410:90;;;::::0;;-1:-1:-1;;;41410:90:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41410:90:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41539:17:0;::::1;41513:23;41539:17:::0;;;:8:::1;:17;::::0;;;;41624:16:::1;::::0;::::1;::::0;41655:15:::1;::::0;;::::1;::::0;41685:12;;41712::::1;::::0;41767:7:::1;::::0;41585:200:::1;::::0;41624:16;41655:15;41685:12;41712;41739:13;;41585:24:::1;:200::i;:::-;41569:216;;41823:16;41806:13;:33;;41798:51;;;::::0;;-1:-1:-1;;;41798:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41798:51:0;;;;;;;;;;;;;::::1;;41881:37;41886:8;:16;;;41904:13;41881:4;:37::i;:::-;41862:16;::::0;::::1;:56:::0;41936:44:::1;::::0;;;;;;;-1:-1:-1;;;;;41936:44:0;::::1;::::0;41945:10:::1;::::0;41936:44:::1;::::0;;;;::::1;::::0;;::::1;41993:29;42008:13;41993:14;:29::i;:::-;42033:51;42049:7;42058:10;42070:13;42033:15;:51::i;:::-;42095:22;42165:80;42192:7;42201:13;42224:4;42231:13;42165:26;:80::i;:::-;42128:117:::0;-1:-1:-1;42128:117:0;-1:-1:-1;42260:21:0;;42256:87:::1;;42302:41;42307:8;:16;;;42325:17;42302:4;:41::i;:::-;42283:16;::::0;::::1;:60:::0;42256:87:::1;42354:41;42369:10;42381:13;42354:14;:41::i;53699:152::-:0;53824:19;;-1:-1:-1;;;;;53789:18:0;;53765:4;53789:18;;;:8;:18;;;;;:32;;;:54;53699:152;;;:::o;28843:19::-;;;;:::o;31405:2104::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;31614:10:::1;::::0;31600::::1;-1:-1:-1::0;;;;;31614:10:0;;::::1;31600:24;31592:44;;;::::0;;-1:-1:-1;;;31592:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31592:44:0;;;;;;;;;;;;;::::1;;31656:9;::::0;::::1;;31655:10;31647:26;;;::::0;;-1:-1:-1;;;31647:26:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31647:26:0;;;;;;;;;;;;;::::1;;6337:12:::0;31694:26;::::1;;31686:46;;;::::0;;-1:-1:-1;;;31686:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31686:46:0;;;;;;;;;;;;;::::1;;6404:9:::0;31751:26;::::1;;31743:46;;;::::0;;-1:-1:-1;;;31743:46:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31743:46:0;;;;;;;;;;;;;::::1;;31833:8;31808:21;31813:12;;31827:1;31808:4;:21::i;:::-;:33;;31800:52;;;::::0;;-1:-1:-1;;;31800:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31800:52:0;;;;;;;;;;;;;::::1;;31863:7;:18:::0;;;7074:11;31902:46;::::1;;31894:71;;;::::0;;-1:-1:-1;;;31894:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31894:71:0;;;;;;;;;;;;;::::1;;7140:13:::0;31984:46;::::1;;31976:71;;;::::0;;-1:-1:-1;;;31976:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31976:71:0;;;;;;;;;;;;;::::1;;6145:1;32068:45:::0;::::1;;32060:68;;;::::0;;-1:-1:-1;;;32060:68:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32060:68:0;;;;;;;;;;;;;::::1;;6201:1;32147:44:::0;::::1;32139:67;;;::::0;;-1:-1:-1;;;32139:67:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32139:67:0;;;;;;;;;;;;;::::1;;32225:41:::0;;::::1;32217:64;;;::::0;;-1:-1:-1;;;32217:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32217:64:0;;;;;;;;;;;;;::::1;;32294:16;32325:25;32364:11:::0;32353:30:::1;::::0;::::1;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;32353:30:0::1;;32325:58;;32399:6;32394:743;32411:22:::0;;::::1;32394:743;;;32455:13;32471:11;;32483:1;32471:14;;;;;;;;;;;;;-1:-1:-1::0;;;;;32471:14:0::1;32455:30;;32500:11;32514:12;;32527:1;32514:15;;;;;;;;;;;;;32500:29;;32544:12;32566:5;-1:-1:-1::0;;;;;32559:23:0::1;;32591:4;32559:38;;;;;;;;;;;;;-1:-1:-1::0;;;;;32559:38:0::1;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;32559:38:0;32612:11;;32559:38;;-1:-1:-1;32559:38:0;;32612:8;;32621:1;;32612:11;::::1;;;;;;::::0;;::::1;::::0;;;;;;:21;;;;-1:-1:-1;;;;;32657:15:0;::::1;;::::0;;;:8:::1;:15:::0;;;;;;:21;::::1;;32656:22;32648:40;;;::::0;;-1:-1:-1;;;32648:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32648:40:0;;;;;;;;;;;;;::::1;;6082:6;32711;:27;;32703:50;;;::::0;;-1:-1:-1;;;32703:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32703:50:0;;;;;;;;;;;;;::::1;;6811:9:::0;32776:27;::::1;;32768:50;;;::::0;;-1:-1:-1;;;32768:50:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32768:50:0;;;;;;;;;;;;;::::1;;6939:13:::0;32841:29;::::1;;32833:49;;;::::0;;-1:-1:-1;;;32833:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;32833:49:0;;;;;;;;;;;;;::::1;;32915:156;::::0;;::::1;::::0;::::1;::::0;;32949:4:::1;32915:156:::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32897:15:0;::::1;-1:-1:-1::0;32897:15:0;;;:8:::1;:15:::0;;;;;;;:174;;;;-1:-1:-1;;32897:174:0::1;::::0;::::1;;;::::0;;;;;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;33100:25:::1;33105:11:::0;32915:156;33100:4:::1;:25::i;:::-;33086:39:::0;-1:-1:-1;;32435:3:0::1;::::0;;::::1;::::0;-1:-1:-1;32394:743:0::1;::::0;-1:-1:-1;32394:743:0::1;;-1:-1:-1::0;6875:9:0;33155:38;::::1;;33147:62;;;::::0;;-1:-1:-1;;;33147:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33147:62:0;;;;;;;;;;;;;::::1;;33220:12;:26:::0;;;33257:21:::1;:7;33267:11:::0;;33257:21:::1;:::i;:::-;-1:-1:-1::0;33289:9:0::1;:16:::0;;-1:-1:-1;;33289:16:0::1;33301:4;33289:16;::::0;;33316:31:::1;33331:15:::0;33316:14:::1;:31::i;:::-;33358:43;33373:10;33385:15;33358:14;:43::i;:::-;33417:84;33430:7;;33439:15;33456:7;;33465:11;;33478:12;;33492:8;33417:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;33417:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33417:84:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;33417:84:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;-1:-1:-1;33417:84:0;::::1;::::0;;;;;;;::::1;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;;;;;31405:2104:0:o;15897:397::-;16008:10;15964:4;15997:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15997:27:0;;;;;;;;;;16039:14;;;16035:160;;;16081:10;16100:1;16070:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16070:27:0;;;;;;;;;:31;16035:160;;;16164:19;16169:8;16179:3;16164:4;:19::i;:::-;16145:10;16134:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16134:27:0;;;;;;;;;:49;16035:160;16219:10;16236:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;16210:54:0;;16236:27;;;;;;;;;;;16210:54;;;;;;;;;16219:10;-1:-1:-1;;;;;;;;;;;16210:54:0;;;;;;;;;;-1:-1:-1;16282:4:0;;15897:397;-1:-1:-1;;;15897:397:0:o;49808:1076::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;50055:14:::1;:21:::0;50079:1:::1;-1:-1:-1::0;50047:55:0::1;;;::::0;;-1:-1:-1;;;50047:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50047:55:0;;;;;;;;;;;;;::::1;;50143:16;50121:18;:38;;50113:58;;;::::0;;-1:-1:-1;;;50113:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50113:58:0;;;;;;;;;;;;;::::1;;50212:11;50197:12;:26;50196:57;;50242:11;50196:57;;;50227:12;50196:57;50182:71;;50286:15;50272:11;:29;50264:48;;;::::0;;-1:-1:-1;;;50264:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50264:48:0;;;;;;;;;;;;;::::1;;50323:14;:12;:14::i;:::-;50368:507;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;50368:507:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;-1:-1:-1;50368:507:0;;;;;;;;;;;;;;;;;;;;;;;;50788:37;;;::::1;50368:507:::0;;;;;;;;;;;;50348:14:::1;:528:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;50348:528:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49808:1076::o;54855:2330::-;54931:18;54944:4;54931:12;:18::i;:::-;-1:-1:-1;;;;;54984:18:0;;54960:21;54984:18;;;:8;:18;;;;;55049:14;:20;;54984:18;;54960:21;55049:20;;;;;;;;;;;;;;;;;;55162:21;;;;;:15;;;:21;;;;;;;55049:20;;;;;;55118:28;;;;55102:11;;55049:20;;-1:-1:-1;55102:82:0;;55162:21;55102:55;;55152:4;;55102:45;;:15;:45::i;:55::-;:59;;:82::i;:::-;55221:28;;;;55080:104;;-1:-1:-1;55264:22:0;;55260:1432;;55322:10;:26;;;55307:12;:41;55303:1378;;;55416:29;;;55369:18;55416:29;;;:23;;;:29;;;;;;;;;55390:15;;;:21;;;;;;:56;;:25;:56::i;:::-;55369:77;-1:-1:-1;55469:17:0;;55465:219;;55528:33;:14;55547:13;55528:18;:33::i;:::-;55616:29;;;;;;;:23;;;:29;;;;;;55511:50;;-1:-1:-1;55616:48:0;;55650:13;55616:33;:48::i;:::-;55584:29;;;;;;;:23;;;:29;;;;;:80;55465:219;55303:1378;;;;55728:18;;55724:283;;55771:14;55788:47;55831:3;55788:38;:14;55807:18;55788;:38::i;:47::-;55771:64;-1:-1:-1;55875:29:0;:14;55771:64;55875:18;:29::i;:::-;55951:21;;;;;;;:15;;;:21;;;;;;55858:46;;-1:-1:-1;55951:36:0;;55977:9;55951:25;:36::i;:::-;55927:21;;;;;;;:15;;;:21;;;;;:60;-1:-1:-1;55724:283:0;56044:10;:28;;;56029:12;:43;56025:641;;;56097:16;56116:108;56194:10;:29;;;56116:73;56142:46;56159:10;:28;;;56142:12;:16;;:46;;;;:::i;:::-;56116:21;;;;;;;:15;;;:21;;;;;;;:25;:73::i;:108::-;56274:29;;;56247:24;56274:29;;;:23;;;:29;;;;;;56097:127;;-1:-1:-1;56330:33:0;;;56326:321;;;56392:18;56413:36;:11;56429:19;56413:15;:36::i;:::-;56392:57;-1:-1:-1;56508:38:0;:19;56392:57;56508:23;:38::i;:::-;56476:29;;;;;;;:23;;;:29;;;;;:70;56590:33;:14;56609:13;56590:18;:33::i;:::-;56573:50;;56326:321;;56025:641;;;56706:18;;56702:476;;56772:28;;;;;;;:22;;;:28;;;;;;:48;;56805:14;56772:32;:48::i;:::-;56741:28;;;;;;;:22;;;:28;;;;;:79;56865:27;;;;:47;;56897:14;56865:31;:47::i;:::-;56835:27;;;:77;56927:10;;56951:22;;56927:73;;;-1:-1:-1;;;56927:73:0;;-1:-1:-1;;;;;56951:22:0;;;56927:73;;;;;;;;;;;;;;;;;;;:10;;;;;:23;;:73;;;;;:10;;:73;;;;;;;:10;;:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;57020:42:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57020:42:0;;;-1:-1:-1;57020:42:0;;-1:-1:-1;57020:42:0;;;;;;;;;57101:65;57161:4;57101:55;57117:14;57132:4;57117:20;;;;;;;;;;;;;;;;;;:38;:20;;;;;:38;;57101:11;;;:15;:55::i;:65::-;57077:21;;;;;;;:15;;;:21;;;;;:89;56702:476;54855:2330;;;;;;:::o;15214:109::-;-1:-1:-1;;;;;15301:14:0;15277:4;15301:14;;;;;;;;;;;;15214:109::o;48760:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48760:38:0;;;;-1:-1:-1;48760:38:0;;;;;;;;;;;;;;;:::o;50892:391::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;51013:18:::1;51026:4;51013:12;:18::i;:::-;51042:33;51078:14;51093:4;51078:20;;;;;;;;;;;;;;;;;;;;51042:56;;51133:10;:25;;;51117:12;:41;;51109:58;;;::::0;;-1:-1:-1;;;51109:58:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;51109:58:0;;;;;;;;;;;;;::::1;;51178:25;::::0;::::1;:43:::0;;;;51232:25:::1;::::0;;::::1;:43:::0;-1:-1:-1;50892:391:0:o;25802:1312::-;26070:19;26107:21;26131:33;26136:14;26152:11;26131:4;:33::i;:::-;26107:57;;26272:29;26304:46;26309:12;26323:26;6082:6;26341:7;26323:4;:26::i;:::-;26304:4;:46::i;:::-;26272:78;;26361:18;26382:42;26387:10;26399:24;26382:4;:42::i;:::-;26361:63;;26435:14;26452:31;26457:13;26472:10;26452:4;:31::i;:::-;26435:48;;26556:18;26577:52;26582:9;26593:35;6082:6;26611:16;26593:4;:35::i;:::-;26577:4;:52::i;:::-;26556:73;;26640:23;26666:36;26671:13;26686:15;26666:4;:36::i;:::-;26640:62;;26715:32;26750:41;26755:15;26772:18;26750:4;:41::i;:::-;26715:76;;26928:8;26939:50;26944:35;6082:6;26962:16;26944:4;:35::i;:::-;26981:7;26939:4;:50::i;:::-;26928:61;;27017:57;27022:27;27051:22;6082:6;27069:3;27051:4;:22::i;27017:57::-;27000:74;;27085:21;;;;;;;;25802:1312;;;;;;;;;:::o;38989:2153::-;28252:6;;39198:18;;;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;39263:17:0;::::1;28281:13:::0;39263:17;;;:8:::1;:17;::::0;;;;:23;28281:13;39263:23:::1;39255:42;;;::::0;;-1:-1:-1;;;39255:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39255:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39316:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;39308:43;;;::::0;;-1:-1:-1;;;39308:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39308:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39390:26:0;;::::1;39364:23;39390:26:::0;;;:8:::1;:26;::::0;;;;;39454:27;;::::1;::::0;;;;39525:17:::1;::::0;;::::1;::::0;39520:45:::1;::::0;6082:6:::1;7477:8;::::0;39520:45:::1;39502:14;:63;;39494:84;;;::::0;;-1:-1:-1;;;39494:84:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39494:84:0;;;;;;;;;;;;;::::1;;39591:20;39614:170;39642:8;:16;;;39673:8;:15;;;39703:9;:17;;;39735:9;:16;;;39766:7;;39614:13;:170::i;:::-;39591:193;;39822:8;39803:15;:27;;39795:51;;;::::0;;-1:-1:-1;;;39795:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39795:51:0;;;;;;;;;;;;;::::1;;39875:200;39904:8;:16;;;39935:8;:15;;;39965:9;:17;;;39997:9;:16;;;40028:14;40057:7;;39875:14;:200::i;:::-;39859:216;;40111:11;40094:13;:28;;40086:47;;;::::0;;-1:-1:-1;;;40086:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40086:47:0;;;;;;;;;;;;;::::1;;40165:37;40170:8;:16;;;40188:13;40165:4;:37::i;:::-;40146:8;:16;;:56;;;;40233:39;40238:9;:17;;;40257:14;40233:4;:39::i;:::-;40213:17;::::0;;::::1;:59:::0;;;40330:16;::::1;::::0;40361:15:::1;::::0;;::::1;::::0;40423:16;;::::1;::::0;40454:7:::1;::::0;40302:170:::1;::::0;40213:59;40423:16;40302:13:::1;:170::i;:::-;40285:187;;40509:15;40491:14;:33;;40483:52;;;::::0;;-1:-1:-1;;;40483:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40483:52:0;;;;;;;;;;;;;::::1;;40572:8;40554:14;:26;;40546:48;;;::::0;;-1:-1:-1;;;40546:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40546:48:0;;;;;;;;;;;;;::::1;;40632:35;40637:13;40652:14;40632:4;:35::i;:::-;40613:15;:54;;40605:73;;;::::0;;-1:-1:-1;;;40605:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40605:73:0;;;;;;;;;;;;;::::1;;40726:8;-1:-1:-1::0;;;;;40696:70:0::1;40717:7;-1:-1:-1::0;;;;;40696:70:0::1;40705:10;-1:-1:-1::0;;;;;40696:70:0::1;;40736:13;40751:14;40696:70;;;;;;;;;;;;;;;;;;;;;;;;40779:51;40795:7;40804:10;40816:13;40779:15;:51::i;:::-;40841:53;40857:8;40867:10;40879:14;40841:15;:53::i;:::-;40905:24;40932:49;40958:7;40967:13;40932:25;:49::i;:::-;40905:76:::0;-1:-1:-1;40996:23:0;;40992:91:::1;;41040:43;41045:8;:16;;;41063:19;41040:4;:43::i;:::-;41021:16;::::0;::::1;:62:::0;40992:91:::1;41096:38;;;;28317:6:::0;:14;;-1:-1:-1;;28317:14:0;;;38989:2153;;;;-1:-1:-1;38989:2153:0;-1:-1:-1;;;;38989:2153:0:o;36760:2221::-;28252:6;;36968:19;;;;28252:6;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;37036:17:0;::::1;28281:13:::0;37036:17;;;:8:::1;:17;::::0;;;;:23;28281:13;37036:23:::1;37028:42;;;::::0;;-1:-1:-1;;;37028:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37028:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37089:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;:24;::::1;;37081:43;;;::::0;;-1:-1:-1;;;37081:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37081:43:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37163:26:0;;::::1;37137:23;37163:26:::0;;;:8:::1;:26;::::0;;;;;37227:27;;::::1;::::0;;;;37297:16:::1;::::0;::::1;::::0;37292:43:::1;::::0;7420:1:::1;6082:6;7413:8;::::0;37292:43:::1;37275:13;:60;;37267:81;;;::::0;;-1:-1:-1;;;37267:81:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37267:81:0;;;;;;;;;;;;;::::1;;37361:20;37384:170;37412:8;:16;;;37443:8;:15;;;37473:9;:17;;;37505:9;:16;;;37536:7;;37384:13;:170::i;:::-;37361:193;;37592:8;37573:15;:27;;37565:51;;;::::0;;-1:-1:-1;;;37565:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37565:51:0;;;;;;;;;;;;;::::1;;37646:199;37675:8;:16;;;37706:8;:15;;;37736:9;:17;;;37768:9;:16;;;37799:13;37827:7;;37646:14;:199::i;:::-;37629:216;;37882:12;37864:14;:30;;37856:48;;;::::0;;-1:-1:-1;;;37856:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37856:48:0;;;;;;;;;;;;;::::1;;37936:37;37941:8;:16;;;37959:13;37936:4;:37::i;:::-;37917:8;:16;;:56;;;;38004:39;38009:9;:17;;;38028:14;38004:4;:39::i;:::-;37984:17;::::0;;::::1;:59:::0;;;38101:16;::::1;::::0;38132:15:::1;::::0;;::::1;::::0;38194:16;;::::1;::::0;38225:7:::1;::::0;38073:170:::1;::::0;37984:59;38194:16;38073:13:::1;:170::i;:::-;38056:187;;38280:15;38262:14;:33;;38254:52;;;::::0;;-1:-1:-1;;;38254:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38254:52:0;;;;;;;;;;;;;::::1;;38343:8;38325:14;:26;;38317:48;;;::::0;;-1:-1:-1;;;38317:48:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38317:48:0;;;;;;;;;;;;;::::1;;38403:35;38408:13;38423:14;38403:4;:35::i;:::-;38384:15;:54;;38376:73;;;::::0;;-1:-1:-1;;;38376:73:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38376:73:0;;;;;;;;;;;;;::::1;;38497:8;-1:-1:-1::0;;;;;38467:70:0::1;38488:7;-1:-1:-1::0;;;;;38467:70:0::1;38476:10;-1:-1:-1::0;;;;;38467:70:0::1;;38507:13;38522:14;38467:70;;;;;;;;;;;;;;;;;;;;;;;;38550:51;38566:7;38575:10;38587:13;38550:15;:51::i;:::-;38612:22;38683:76;38710:7;38719:13;38734:8;38744:14;38683:26;:76::i;:::-;38645:114:::0;-1:-1:-1;38645:114:0;-1:-1:-1;38774:21:0;;38770:87:::1;;38816:41;38821:8;:16;;;38839:17;38816:4;:41::i;:::-;38797:16;::::0;::::1;:60:::0;38770:87:::1;38868:53;38884:8;38894:10;38906:14;38868:15;:53::i;60815:803::-:0;60867:33;60903:14;60918:4;60903:20;;;;;;;;;;;;;;;;;;;;60867:56;;60934:30;60982:10;:25;;;60967:12;:40;:83;;61038:12;60967:83;;;61010:10;:25;;;60967:83;60934:116;;61093:10;:26;;;61065:25;:54;61061:550;;;61136:13;61152:24;61170:4;61152:9;:24::i;:::-;61136:40;-1:-1:-1;61195:12:0;;61191:340;;61228:15;61246:57;61276:10;:26;;;61246:25;:29;;:57;;;;:::i;:::-;61228:75;;61322:23;61348:65;61404:8;61348:51;61394:4;61348:41;61363:10;:25;;;61348:10;:14;;:41;;;;:::i;:::-;:45;;:51::i;:65::-;61463:28;;;;61322:91;;-1:-1:-1;61463:52:0;;61322:91;61463:32;:52::i;:::-;61432:28;;;:83;-1:-1:-1;;61191:340:0;-1:-1:-1;61545:26:0;;;;;:54;-1:-1:-1;60815:803:0:o;23500:1183::-;23744:18;24031:21;24055:32;24060:13;24075:11;24055:4;:32::i;:::-;24031:56;;24098:8;24109:50;24114:35;6082:6;24132:16;24114:4;:35::i;:::-;24151:7;24109:4;:50::i;:::-;24098:61;;24170:26;24199:43;24204:13;24219:22;6082:6;24237:3;24219:4;:22::i;24199:43::-;24170:72;;24255:22;24280:43;24285:14;24301:21;24280:4;:43::i;:::-;24255:68;;24334:17;24354:39;24359:17;24378:14;24354:4;:39::i;:::-;24334:59;;24474:14;24491:36;24496:12;24510:16;24491:4;:36::i;:::-;24474:53;;24538:18;24559:27;24564:9;24575:10;24559:4;:27::i;:::-;24538:48;;24613:31;24618:13;24633:10;24613:4;:31::i;:::-;24597:47;23500:1183;-1:-1:-1;;;;;;;;;;;;;;23500:1183:0:o;49313:117::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49398:10:::1;:24:::0;;-1:-1:-1;;;;;;49398:24:0::1;-1:-1:-1::0;;;;;49398:24:0;;;::::1;::::0;;;::::1;::::0;;49313:117::o;33594:194::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;-1:-1:-1;;;;;33673:15:0;::::1;28281:13:::0;33673:15;;;:8:::1;:15;::::0;;;;:21;28281:13;33673:21:::1;33665:40;;;::::0;;-1:-1:-1;;;33665:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33665:40:0;;;;;;;;;;;;;::::1;;33742:38;::::0;;-1:-1:-1;;;33742:38:0;;33774:4:::1;33742:38;::::0;::::1;::::0;;;-1:-1:-1;;;;;33742:23:0;::::1;::::0;::::1;::::0;:38;;;;;::::1;::::0;;;;;;;;:23;:38;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;33742:38:0;-1:-1:-1;;;;;33716:15:0;;::::1;;::::0;;;:8:::1;33742:38;33716:15:::0;;;;:23:::1;;:64:::0;28317:6;:14;;-1:-1:-1;;28317:14:0;;;33594:194::o;31224:173::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;31332:10:::1;::::0;31318::::1;-1:-1:-1::0;;;;;31332:10:0;;::::1;31318:24;31310:44;;;::::0;;-1:-1:-1;;;31310:44:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31310:44:0;;;;;;;;;;;;;::::1;;31365:10;:24:::0;;-1:-1:-1;;;;;;31365:24:0::1;-1:-1:-1::0;;;;;31365:24:0;;;::::1;::::0;;;::::1;::::0;;28317:6;:14;;-1:-1:-1;;28317:14:0;;;31224:173::o;30611:136::-;28389:6;;30698:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;30727:12:0::1;::::0;30611:136;:::o;30396:207::-;28389:6;;30491:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30523:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30515:40;;;::::0;;-1:-1:-1;;;30515:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30515:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;30573:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;;30396:207::o;14892:87::-;14964:7;14957:14;;;;;;;;-1:-1:-1;;14957:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14931:13;;14957:14;;14964:7;;14957:14;;14964:7;14957:14;;;;;;;;;;;;;;;;;;;;;;;;49567:233;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49689:7:::1;49666:19;;:30;;49659:38;;;;49750:19;:42:::0;49567:233::o;18539:523::-;18751:14;18783:10;18796:35;18801:14;18817:13;18796:4;:35::i;:::-;18783:48;;18842:10;18855:37;18860:15;18877:14;18855:4;:37::i;:::-;18842:50;;18903:10;18916:18;18921:5;18928;18916:4;:18::i;:::-;18903:31;;18945:10;18958:45;6082:6;18976:26;6082:6;18994:7;18976:4;:26::i;:::-;18958:4;:45::i;:::-;18945:58;;19035:18;19040:5;19047;19035:4;:18::i;:::-;19023:30;18539:523;-1:-1:-1;;;;;;;;;;18539:523:0:o;52807:333::-;52865:12;52880:24;52898:4;52880:9;:24::i;:::-;52865:39;;52915:35;52930:10;52942:7;52915:14;:35::i;:::-;52961:11;52975:24;52993:4;52975:9;:24::i;:::-;52961:38;;53020:21;53025:6;53033:7;53020:4;:21::i;:::-;53010:31;;53096:36;53112:10;53124:7;53096:15;:36::i;16302:142::-;16370:4;16387:27;16393:10;16405:3;16410;16387:5;:27::i;:::-;-1:-1:-1;16432:4:0;16302:142;;;;:::o;59130:1457::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;59242:9:::1;::::0;28281:13;59242:9:::1;59234:26;;;::::0;;-1:-1:-1;;;59234:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;59234:26:0;;;;;;;;;;;;;::::1;;59273:16;59292:13;:11;:13::i;:::-;59273:32;;59316:13;59332:27;59337:12;59351:7;;59332:4;:27::i;:::-;59316:43;;59370:20;59393:28;59398:12;59412:8;59393:4;:28::i;:::-;59370:51;;59432:10;59445:34;59450:15;59467:11;59445:4;:34::i;:::-;59432:47:::0;-1:-1:-1;59498:10:0;59490:29:::1;;;::::0;;-1:-1:-1;;;59490:29:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59490:29:0;;;;;;;;;;;;;::::1;;59532:20;59555:21;59565:10;59555:9;:21::i;:::-;59532:44;;59609:12;59591:15;:30;59587:291;;;59638:20;59661:35;59666:12;59680:15;59661:4;:35::i;:::-;59741:10;59711:18;59732:20:::0;;;:8:::1;:20;::::0;;;;:27;59638:58;;-1:-1:-1;59782:32:0;;::::1;;59774:52;;;::::0;;-1:-1:-1;;;59774:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59774:52:0;;;;;;;;;;;;;::::1;;59841:25;59850:15;59841:8;:25::i;:::-;59587:291;;;59890:40;59905:10;59917:12;59890:14;:40::i;:::-;59945:12:::0;;59941:78:::1;;59989:7;::::0;59974:33:::1;::::0;-1:-1:-1;;;;;59989:7:0::1;59998:8:::0;59974:14:::1;:33::i;:::-;60029:31;60044:15;60029:14;:31::i;:::-;60078:6;60073:507;60094:7;:14:::0;60090:18;::::1;60073:507;;;60130:9;60142:7;60150:1;60142:10;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;60142:10:0::1;60178:11:::0;;;:8:::1;:11:::0;;;;;;:19:::1;;::::0;60142:10;;-1:-1:-1;60178:19:0;60234:16:::1;60239:5:::0;60178:19;60234:4:::1;:16::i;:::-;60212:38:::0;-1:-1:-1;60273:19:0;60265:38:::1;;;::::0;;-1:-1:-1;;;60265:38:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60265:38:0;;;;;;;;;;;;;::::1;;60344:13;;60358:1;60344:16;;;;;;;;;;;;;60326:14;:34;;60318:52;;;::::0;;-1:-1:-1;;;60318:52:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;60318:52:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;60412:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;:19:::1;;::::0;60407:41:::1;::::0;60433:14;60407:4:::1;:41::i;:::-;-1:-1:-1::0;;;;;60385:11:0;::::1;;::::0;;;:8:::1;:11;::::0;;;;;;;;:19:::1;;:63:::0;;;;60468:39;;;;;;;60385:11;;60477:10:::1;::::0;60468:39:::1;::::0;;;;;;;;::::1;60522:46;60538:1;60541:10;60553:14;60522:15;:46::i;:::-;-1:-1:-1::0;;;60110:3:0::1;;60073:507;;;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;;;;;;;59130:1457:0:o;28869:21::-;;;;;;:::o;20080:697::-;20322:19;20359:16;20378:35;20383:13;20398:14;20378:4;:35::i;:::-;20359:54;;20424:15;20442:26;6082:6;20460:7;20442:4;:26::i;:::-;20424:44;;20492:31;20497:13;20512:10;20492:4;:31::i;:::-;20479:44;;20534:6;20543:54;20548:14;20564:32;20569:14;20585:10;20564:4;:32::i;20543:54::-;20534:63;;20608:8;20619:20;20624:1;20627:11;20619:4;:20::i;:::-;20608:31;;20650:8;20661:22;6082:6;20679:3;20661:4;:22::i;:::-;20650:33;;20711:26;20716:15;20733:3;20711:4;:26::i;:::-;20694:43;20080:697;-1:-1:-1;;;;;;;;;;;;20080:697:0:o;30213:175::-;28389:6;;30288:23;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;30337:9:::1;::::0;::::1;;30329:26;;;::::0;;-1:-1:-1;;;30329:26:0;;::::1;;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;;;30329:26:0;;;;;;;;;;;;;::::1;;30373:7;30366:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;30366:14:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;30213:175:::0;:::o;57193:936::-;-1:-1:-1;;;;;57326:18:0;;57276:13;57326:18;;;:8;:18;;;;;57391:14;:20;;57276:13;;57391:14;:20;;;;;;;;;;;;;;;;;;;;57355:56;;57422:23;57448:10;:28;;;57422:54;;57487:13;57503:24;57521:4;57503:9;:24::i;:::-;57487:40;;57538:30;57586:10;:25;;;57571:12;:40;:83;;57642:12;57571:83;;;57614:10;:25;;;57571:83;57538:116;;57697:10;:26;;;57669:25;:54;:71;;;;-1:-1:-1;57727:13:0;;;57669:71;57665:363;;;57757:15;57775:57;57805:10;:26;;;57775:25;:29;;:57;;;;:::i;:::-;57757:75;;57847:23;57873:65;57929:8;57873:51;57919:4;57873:41;57888:10;:25;;;57873:10;:14;;:41;;;;:::i;:65::-;57847:91;-1:-1:-1;57974:42:0;:18;57847:91;57974:22;:42::i;:::-;57953:63;;57665:363;;;58099:21;;;;;;;:15;;;:21;;;;;;58049:11;;:72;;58099:21;58049:45;;58089:4;;58049:35;;58065:18;58049:15;:35::i;:72::-;58038:83;57193:936;-1:-1:-1;;;;;;;;57193:936:0:o;28496:22::-;;;-1:-1:-1;;;;;28496:22:0;;:::o;48847:28::-;;;-1:-1:-1;;;;;48847:28:0;;:::o;30070:135::-;28389:6;;30142:23;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;29954:108;30040:7;:14;29954:108;:::o;15637:252::-;15767:10;15704:4;15756:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15756:27:0;;;;;;;;;;15751:38;;15785:3;15751:4;:38::i;:::-;15732:10;15721:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;15721:27:0;;;;;;;;;;;;:68;;;15805:54;;;;;;15721:27;;-1:-1:-1;;;;;;;;;;;15805:54:0;;;;;;;;;;-1:-1:-1;15877:4:0;15637:252;;;;:::o;58200:444::-;58291:10;58258:21;58282:20;;;:8;:20;;;;;58328:11;;58282:20;;58350:35;;58328:11;58350:14;:35::i;:::-;58410:1;58396:15;;;58453:14;:21;;58486:106;58514:16;58507:23;;:4;:23;;;58486:106;;;58555:21;;;58579:1;58555:21;;;:15;;;;:21;;;;;:25;;;;58532:6;58486:106;;;-1:-1:-1;58607:29:0;;;;;;;;58616:10;;58607:29;;;;;;;;;;58200:444;;;:::o;15077:129::-;-1:-1:-1;;;;;15178:15:0;;;15154:4;15178:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;15077:129::o;29591:232::-;29653:9;;;;29652:10;29644:26;;;;;-1:-1:-1;;;29644:26:0;;;;;;;;;;;;-1:-1:-1;;;29644:26:0;;;;;;;;;;;;;;;29703:7;;-1:-1:-1;;;;;29703:7:0;29689:10;:21;29681:39;;;;;-1:-1:-1;;;29681:39:0;;;;;;;;;;;;-1:-1:-1;;;29681:39:0;;;;;;;;;;;;;;;6676:11;29739:31;;;29731:55;;;;;-1:-1:-1;;;29731:55:0;;;;;;;;;;;;-1:-1:-1;;;29731:55:0;;;;;;;;;;;;;;;29797:7;:18;29591:232::o;49438:121::-;49263:10;;-1:-1:-1;;;;;49263:10:0;49249;:24;49241:44;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;-1:-1:-1;;;49241:44:0;;;;;;;;;;;;;;;49521:13:::1;:30:::0;;-1:-1:-1;;;;;;49521:30:0::1;-1:-1:-1::0;;;;;49521:30:0;;;::::1;::::0;;;::::1;::::0;;49438:121::o;28766:24::-;;;;:::o;48807:33::-;;;-1:-1:-1;;;;;48807:33:0;;:::o;30755:256::-;28389:6;;30848:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30880:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;30872:40;;;::::0;;-1:-1:-1;;;30872:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;30872:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;30937:15:0;::::1;30923:11;30937:15:::0;;;:8:::1;:15;::::0;;;;:22:::1;;::::0;30990:12:::1;::::0;30977:26:::1;::::0;30937:22;;30977:4:::1;:26::i;:::-;30970:33:::0;30755:256;-1:-1:-1;;;30755:256:0:o;60595:212::-;60668:14;:21;60637:22;60701:99;60729:16;60722:23;;:4;:23;;;60701:99;;;60770:18;60783:4;60770:12;:18::i;:::-;60747:6;;60701:99;;;;60595:212;:::o;28573:25::-;;;-1:-1:-1;;;;;28573:25:0;;:::o;51769:213::-;28252:6;;;;;;;28251:7;28243:27;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;-1:-1:-1;;;28243:27:0;;;;;;;;;;;;;;;28281:6;:13;;-1:-1:-1;;28281:13:0;;;;;51872:50:::1;51882:10;51894:13:::0;51909:12;;51872:9:::1;:50::i;:::-;51933:41;51948:10;51960:13;51933:14;:41::i;:::-;-1:-1:-1::0;;28317:6:0;:14;;-1:-1:-1;;28317:14:0;;;-1:-1:-1;51769:213:0:o;31019:197::-;28389:6;;31103:4;;28389:6;;;;;28388:7;28380:27;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;-1:-1:-1;;;28380:27:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31135:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:21;::::1;;31127:40;;;::::0;;-1:-1:-1;;;31127:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;31127:40:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;;31185:15:0::1;;::::0;;;:8:::1;:15;::::0;;;;:23:::1;;::::0;;31019:197::o;21795:686::-;22038:18;22074:16;22093:35;22098:14;22114:13;22093:4;:35::i;:::-;22074:54;;22139:9;22151:37;22156:15;22173:14;22151:4;:37::i;:::-;22139:49;;22199:6;22208:27;22213:15;22230:4;22208;:27::i;:::-;22199:36;;22246:8;22257:20;22262:1;22265:11;22257:4;:20::i;:::-;22246:31;;22294:22;22299:3;6082:6;22294:4;:22::i;:::-;22288:28;;22343:26;6082:6;22361:7;22343:4;:26::i;:::-;22327:42;;22396:46;22401:25;22406:14;22422:3;22401:4;:25::i;:::-;22428:13;22396:4;:46::i;:::-;22380:62;21795:686;-1:-1:-1;;;;;;;;;;;21795:686:0:o;14144:257::-;-1:-1:-1;;;;;14223:13:0;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;14223:20:0;14215:37;;;;;-1:-1:-1;;;14215:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;14215:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;14284:13:0;;:8;:13;;;;;;;;;;;14279:24;;14299:3;14279:4;:24::i;:::-;-1:-1:-1;;;;;14263:13:0;;;:8;:13;;;;;;;;;;;:40;;;;14335:13;;;;;;;14330:24;;14350:3;14330:4;:24::i;:::-;-1:-1:-1;;;;;14314:13:0;;;:8;:13;;;;;;;;;;;;:40;;;;14370:23;;;;;;;14314:13;;14370:23;;;;;;;;;;;;;14144:257;;;:::o;8614:198::-;8685:4;8708:6;8716:9;8729:14;8738:1;8741;8729:8;:14::i;:::-;8707:36;;;;8763:4;8762:5;8754:31;;;;;-1:-1:-1;;;8754:31:0;;;;;;;;;;;;-1:-1:-1;;;8754:31:0;;;;;;;;;;;;;;;-1:-1:-1;8803:1:0;8614:198;-1:-1:-1;;;8614:198:0:o;902:181::-;960:7;992:5;;;1016:6;;;;1008:46;;;;;-1:-1:-1;;;1008:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2256:471;2314:7;2559:6;2555:47;;-1:-1:-1;2589:1:0;2582:8;;2555:47;2626:5;;;2630:1;2626;:5;:1;2650:5;;;;;:10;2642:56;;;;-1:-1:-1;;;2642:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3203:132;3261:7;3288:39;3292:1;3295;3288:39;;;;;;;;;;;;;;;;;:3;:39::i;44874:104::-;44953:17;44959:2;44963:6;44953:5;:17::i;9051:317::-;9122:4;9154:5;;;9178:6;;;:21;;;9198:1;9193;9188:2;:6;;;;;;:11;9178:21;9170:46;;;;;-1:-1:-1;;;9170:46:0;;;;;;;;;;;;-1:-1:-1;;;9170:46:0;;;;;;;;;;;;;;;9243:15;9237:22;;9278:8;;;;9270:33;;;;;-1:-1:-1;;;9270:33:0;;;;;;;;;;;;-1:-1:-1;;;9270:33:0;;;;;;;;;;;;;;;9314:7;6082:6;9324:2;:16;;;9051:317;-1:-1:-1;;;;;;9051:317:0:o;44758:108::-;44839:19;44845:4;44851:6;44839:5;:19::i;45082:88::-;45149:13;45155:6;45149:5;:13::i;:::-;45082:88;:::o;45178:1024::-;45445:12;;45312:21;;45415:15;;45445:16;45441:754;;45514:7;;45504:35;;;-1:-1:-1;;;45504:35:0;;;;45478:23;;-1:-1:-1;;;;;45514:7:0;;45504:33;;:35;;;;;;;;;;;;;;45514:7;45504:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45504:35:0;;-1:-1:-1;;;;;;45558:27:0;;;;;;;45554:630;;;45625:53;45630:34;45635:14;45651:12;;45630:4;:34::i;:::-;6082:6;45625:4;:53::i;:::-;45723:7;;45606:72;;-1:-1:-1;45697:52:0;;45713:8;;-1:-1:-1;;;;;45723:7:0;45606:72;45697:15;:52::i;:::-;45773:46;;;;;;;;-1:-1:-1;;;;;45773:46:0;;;;;;;;;;;;;45554:630;;;45860:24;45887:54;45892:35;45897:15;45914:12;;45892:4;:35::i;45887:54::-;45987:7;;45860:81;;-1:-1:-1;45960:56:0;;45976:9;;-1:-1:-1;;;;;45987:7:0;45860:81;45960:15;:56::i;:::-;46052:42;46057:15;46074:19;46052:4;:42::i;:::-;46118:50;;;;;;;;46035:59;;-1:-1:-1;;;;;;46118:50:0;;;;;;;;;;;;45554:630;;45441:754;;45178:1024;;;;;;;:::o;44403:347::-;44607:46;;;-1:-1:-1;;;;;44607:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44607:46:0;-1:-1:-1;;;44607:46:0;;;44596:58;;;;44561:12;;44575:17;;44596:10;;;;44607:46;44596:58;;;44607:46;44596:58;;44607:46;44596:58;;;;;;;;;;-1:-1:-1;;44596:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44560:94;;;;44673:7;:57;;;;-1:-1:-1;44685:11:0;;:16;;:44;;;44716:4;44705:24;;;;;;;;;;;;;;;-1:-1:-1;44705:24:0;44685:44;44665:77;;;;;-1:-1:-1;;;44665:77:0;;;;;;;;;;;;-1:-1:-1;;;44665:77:0;;;;;;;;;;;;;;;44403:347;;;;;:::o;51990:809::-;52104:9;;;;52096:26;;;;;-1:-1:-1;;;52096:26:0;;;;;;;;;;;;;;;-1:-1:-1;;;52096:26:0;;;;;;;;;;;;;;;52135:16;52154:13;:11;:13::i;:::-;52135:32;;52178:10;52191:32;52196:13;52211:11;52191:4;:32::i;:::-;52178:45;-1:-1:-1;52242:10:0;52234:29;;;;;-1:-1:-1;;;52234:29:0;;;;;;;;;;;;-1:-1:-1;;;52234:29:0;;;;;;;;;;;;;;;52281:6;52276:476;52297:7;:14;52293:18;;52276:476;;;52333:9;52345:7;52353:1;52345:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52345:10:0;52381:11;;;:8;:11;;;;;;:19;;;52345:10;;-1:-1:-1;52381:19:0;52436:16;52441:5;52381:19;52436:4;:16::i;:::-;52415:37;-1:-1:-1;52475:18:0;;;;;:54;;;52514:12;;52527:1;52514:15;;;;;;;;;;;;;52497:13;:32;;52475:54;52467:81;;;;;-1:-1:-1;;;52467:81:0;;;;;;;;;;;;-1:-1:-1;;;52467:81:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;52590:11:0;;;;;;:8;:11;;;;;:19;;;52585:40;;52611:13;52585:4;:40::i;:::-;-1:-1:-1;;;;;52563:11:0;;;;;;;:8;:11;;;;;;;;;:19;;:62;;;;52645:35;;;;;;;52563:11;;52645:35;;;;;;;;;;;;;52695:45;52711:1;52714:10;52726:13;52695:15;:45::i;:::-;-1:-1:-1;;;52313:3:0;;52276:476;;;;52762:29;52777:13;52762:14;:29::i;53148:543::-;-1:-1:-1;;;;;53249:18:0;;53225:21;53249:18;;;:8;:18;;;;;53278:23;53258:8;53278:13;:23::i;:::-;53326:11;;:24;;53342:7;53326:15;:24::i;:::-;53312:38;;53392:14;:21;53312:11;53425:170;53453:16;53446:23;;:4;:23;;;53425:170;;;53518:65;53578:4;53518:55;53534:14;53549:4;53534:20;;;;;;;;;53518:65;53494:21;;;;;;;:15;;;;:21;;;;;;:89;;;;53471:6;53425:170;;;-1:-1:-1;53626:15:0;53605:18;;;:36;53657:26;;;;;;;;-1:-1:-1;;;;;53657:26:0;;;;;;;;;;;;;53148:543;;;;:::o;8430:176::-;8501:4;8532:5;;;8556:6;;;;8548:31;;;;;-1:-1:-1;;;8548:31:0;;;;;;;;;;;;-1:-1:-1;;;8548:31:0;;;;;;;;;;;;;;44986:88;45053:13;45059:6;45053:5;:13::i;44022:373::-;44235:63;;;-1:-1:-1;;;;;44235:63:0;;;;;;;44284:4;44235:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44235:63:0;-1:-1:-1;;;44235:63:0;;;44224:75;;;;44189:12;;44203:17;;44224:10;;;;44235:63;44224:75;;;44235:63;44224:75;;44235:63;44224:75;;;;;;;;;;-1:-1:-1;;44224:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44188:111;;;;44318:7;:57;;;;-1:-1:-1;44330:11:0;;:16;;:44;;;44361:4;44350:24;;;;;;;;;;;;;;;-1:-1:-1;44350:24:0;44330:44;44310:77;;;;;-1:-1:-1;;;44310:77:0;;;;;;;;;;;;-1:-1:-1;;;44310:77:0;;;;;;;;;;;;;;1366:136;1424:7;1451:43;1455:1;1458;1451:43;;;;;;;;;;;;;;;;;:3;:43::i;9376:389::-;9447:4;9477:6;9469:27;;;;;-1:-1:-1;;;9469:27:0;;;;;;;;;;;;-1:-1:-1;;;9469:27:0;;;;;;;;;;;;;;;6082:6;9517:15;;9551:6;;;:31;;;6082:6;9566:1;9561:2;:6;;;;;;:21;9551:31;9543:56;;;;;-1:-1:-1;;;9543:56:0;;;;;;;;;;;;-1:-1:-1;;;9543:56:0;;;;;;;;;;;;;;;9647:1;9643:5;;9637:12;;9668:8;;;;9660:33;;;;;-1:-1:-1;;;9660:33:0;;;;;;;;;;;;-1:-1:-1;;;9660:33:0;;;;;;;;;;;;;;;9721:7;9736:1;9731:2;:6;;;;10275:558;10351:4;7210:5;10381:4;:28;;10373:53;;;;;-1:-1:-1;;;10373:53:0;;;;;;;;;;;;-1:-1:-1;;;10373:53:0;;;;;;;;;;;;;;;7270:18;10445:28;;;10437:54;;;;;-1:-1:-1;;;10437:54:0;;;;;;;;;;;;-1:-1:-1;;;10437:54:0;;;;;;;;;;;;;;;10504:10;10518:11;10525:3;10518:6;:11::i;:::-;10504:25;;10543:11;10557:16;10562:3;10567:5;10557:4;:16::i;:::-;10543:30;;10586:13;10602:24;10608:4;10614:11;10619:5;10614:4;:11::i;:::-;10602:5;:24::i;:::-;10586:40;-1:-1:-1;10643:11:0;10639:59;;10678:8;-1:-1:-1;10671:15:0;;-1:-1:-1;;10671:15:0;10639:59;10710:18;10731:47;10742:4;10748:6;7343:13;10731:10;:47::i;:::-;10710:68;;10796:29;10801:8;10811:13;10796:4;:29::i;:::-;10789:36;10275:558;-1:-1:-1;;;;;;;10275:558:0:o;46258:581::-;46423:12;;46350:23;;46423:16;46419:413;;46492:7;;46482:35;;;-1:-1:-1;;;46482:35:0;;;;46456:23;;-1:-1:-1;;;;;46492:7:0;;46482:33;;:35;;;;;;;;;;;;;;46492:7;46482:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46482:35:0;;-1:-1:-1;;;;;;46536:29:0;;;46532:289;;46607:53;46612:34;46617:14;46633:12;;46612:4;:34::i;46607:53::-;46705:7;;46586:74;;-1:-1:-1;46679:54:0;;46695:8;;-1:-1:-1;;;;;46705:7:0;46586:74;46679:15;:54::i;:::-;46757:48;;;;;;;;-1:-1:-1;;;;;46757:48:0;;;;;;;;;;;;;46532:289;46419:413;46258:581;;;;:::o;8820:223::-;8895:4;8901;8932:1;8927;:6;8923:113;;-1:-1:-1;;8958:5:0;;;8965;8950:21;;8923:113;-1:-1:-1;;9012:5:0;;;9019:4;8923:113;8820:223;;;;;:::o;3831:278::-;3917:7;3952:12;3945:5;3937:28;;;;-1:-1:-1;;;3937:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3976:9;3992:1;3988;:5;;;;;;;3831:278;-1:-1:-1;;;;;3831:278:0:o;14409:94::-;14466:29;14480:4;14487:2;14491:3;14466:5;:29::i;14511:98::-;14570:31;14576:4;14590;14597:3;14570:5;:31::i;13860:276::-;13930:4;13913:8;:23;;;;;;;;;;;:30;-1:-1:-1;13913:30:0;13905:47;;;;;-1:-1:-1;;;13905:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;13905:47:0;;;;;;;;;;;;;;;14011:4;13994:8;:23;;;;;;;;;;;13989:34;;14019:3;13989:4;:34::i;:::-;13980:4;13963:8;:23;;;;;;;;;;:60;14054:12;;14049:23;;14068:3;14049:4;:23::i;:::-;14034:12;:38;14088:40;;;;;;;;14120:1;;14105:4;;14088:40;;;;;;;;;13860:276;:::o;13634:218::-;13727:4;13710:8;:23;;;;;;;;;;;13705:34;;13735:3;13705:4;:34::i;:::-;13696:4;13679:8;:23;;;;;;;;;;:60;13770:12;;13765:23;;13784:3;13765:4;:23::i;:::-;13750:12;:38;13804:40;;;;;;;;13833:4;;13821:1;;13804:40;;;;;;;;;13634:218;:::o;1805:192::-;1891:7;1927:12;1919:6;;;;1911:29;;;;-1:-1:-1;;;1911:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1963:5:0;;;1805:192::o;8299:123::-;8364:4;6082:6;8393:7;8398:1;8393:4;:7::i;:::-;:21;;8299:123;-1:-1:-1;;8299:123:0:o;8175:116::-;6082:6;8268:15;;;8175:116::o;9793:321::-;9865:4;;9900:1;9896;:5;:28;;6082:6;9896:28;;;9909:1;9896:28;9887:37;-1:-1:-1;9947:1:0;9942:6;;;;9937:151;9950:6;;9937:151;;9985:10;9990:1;9993;9985:4;:10::i;:::-;9981:14;-1:-1:-1;10020:1:0;10016;:5;:10;10012:65;;10051:10;10056:1;10059;10051:4;:10::i;:::-;10047:14;;10012:65;9963:1;9958:6;;;;9937:151;;10841:1108;10939:4;10994:3;10939:4;;11031:27;11040:4;6082:6;11031:8;:27::i;:::-;11008:50;;-1:-1:-1;11008:50:0;-1:-1:-1;6082:6:0;;11069:9;11410:1;11396:523;11421:9;11413:4;:17;11396:523;;11452:9;6082:6;11464:1;:15;11452:27;;11495:6;11503:9;11516:36;11525:1;11528:23;11533:4;6082:6;11528:4;:23::i;:::-;11516:8;:36::i;:::-;11494:58;;;;11574:22;11579:4;11585:10;11590:1;11593;11585:4;:10::i;11574:22::-;11567:29;;11618:16;11623:4;11629;11618;:16::i;:::-;11611:23;-1:-1:-1;11653:9:0;11649:20;;11664:5;;;;;11649:20;11690:4;11686:30;;;11707:9;;;11686:30;11735:4;11731:30;;;11752:9;;;11731:30;11780:8;11776:132;;;11815:15;11820:3;11825:4;11815;:15::i;:::-;11809:21;;11776:132;;;11877:15;11882:3;11887:4;11877;:15::i;:::-;11871:21;;11776:132;-1:-1:-1;;;11432:3:0;;11396:523;;;-1:-1:-1;11938:3:0;;10841:1108;-1:-1:-1;;;;;;;;;10841:1108:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://5244d561ab957f642811181d4738e42d8fc500e51540cee56676d02270a132e2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.