Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PCappedSmartPool
Compiler Version
v0.6.4+commit.1dca32f3
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-30 */ // Sources flattened with buidler v1.2.0 https://buidler.dev // File @pie-dao/proxy/contracts/[email protected] pragma solidity ^0.6.2; contract PProxyStorage { function readString(bytes32 _key) public view returns(string memory) { return bytes32ToString(storageRead(_key)); } function setString(bytes32 _key, string memory _value) internal { storageSet(_key, stringToBytes32(_value)); } function readBool(bytes32 _key) public view returns(bool) { return storageRead(_key) == bytes32(uint256(1)); } function setBool(bytes32 _key, bool _value) internal { if(_value) { storageSet(_key, bytes32(uint256(1))); } else { storageSet(_key, bytes32(uint256(0))); } } function readAddress(bytes32 _key) public view returns(address) { return bytes32ToAddress(storageRead(_key)); } function setAddress(bytes32 _key, address _value) internal { storageSet(_key, addressToBytes32(_value)); } function storageRead(bytes32 _key) public view returns(bytes32) { bytes32 value; //solium-disable-next-line security/no-inline-assembly assembly { value := sload(_key) } return value; } function storageSet(bytes32 _key, bytes32 _value) internal { // targetAddress = _address; // No! bytes32 implAddressStorageKey = _key; //solium-disable-next-line security/no-inline-assembly assembly { sstore(implAddressStorageKey, _value) } } function bytes32ToAddress(bytes32 _value) public pure returns(address) { return address(uint160(uint256(_value))); } function addressToBytes32(address _value) public pure returns(bytes32) { return bytes32(uint256(_value)); } function stringToBytes32(string memory _value) public pure returns (bytes32 result) { bytes memory tempEmptyStringTest = bytes(_value); if (tempEmptyStringTest.length == 0) { return 0x0; } assembly { result := mload(add(_value, 32)) } } function bytes32ToString(bytes32 _value) public pure returns (string memory) { bytes memory bytesString = new bytes(32); uint charCount = 0; for (uint256 j = 0; j < 32; j++) { byte char = byte(bytes32(uint(_value) * 2 ** (8 * j))); if (char != 0) { bytesString[charCount] = char; charCount++; } } bytes memory bytesStringTrimmed = new bytes(charCount); for (uint256 j = 0; j < charCount; j++) { bytesStringTrimmed[j] = bytesString[j]; } return string(bytesStringTrimmed); } } // File @pie-dao/proxy/contracts/[email protected] pragma solidity ^0.6.2; contract PProxy is PProxyStorage { bytes32 constant IMPLEMENTATION_SLOT = keccak256(abi.encodePacked("IMPLEMENTATION_SLOT")); bytes32 constant OWNER_SLOT = keccak256(abi.encodePacked("OWNER_SLOT")); modifier onlyProxyOwner() { require(msg.sender == readAddress(OWNER_SLOT), "PProxy.onlyProxyOwner: msg sender not owner"); _; } constructor () public { setAddress(OWNER_SLOT, msg.sender); } function getProxyOwner() public view returns (address) { return readAddress(OWNER_SLOT); } function setProxyOwner(address _newOwner) onlyProxyOwner public { setAddress(OWNER_SLOT, _newOwner); } function getImplementation() public view returns (address) { return readAddress(IMPLEMENTATION_SLOT); } function setImplementation(address _newImplementation) onlyProxyOwner public { setAddress(IMPLEMENTATION_SLOT, _newImplementation); } fallback () external payable { return internalFallback(); } function internalFallback() internal virtual { address contractAddr = readAddress(IMPLEMENTATION_SLOT); assembly { let ptr := mload(0x40) calldatacopy(ptr, 0, calldatasize()) let result := delegatecall(gas(), contractAddr, ptr, calldatasize(), 0, 0) let size := returndatasize() returndatacopy(ptr, 0, size) switch result case 0 { revert(ptr, size) } default { return(ptr, size) } } } } // File @pie-dao/proxy/contracts/[email protected] pragma solidity ^0.6.2; contract PProxyPausable is PProxy { bytes32 constant PAUSED_SLOT = keccak256(abi.encodePacked("PAUSED_SLOT")); bytes32 constant PAUZER_SLOT = keccak256(abi.encodePacked("PAUZER_SLOT")); constructor() PProxy() public { setAddress(PAUZER_SLOT, msg.sender); } modifier onlyPauzer() { require(msg.sender == readAddress(PAUZER_SLOT), "PProxyPausable.onlyPauzer: msg sender not pauzer"); _; } modifier notPaused() { require(!readBool(PAUSED_SLOT), "PProxyPausable.notPaused: contract is paused"); _; } function getPauzer() public view returns (address) { return readAddress(PAUZER_SLOT); } function setPauzer(address _newPauzer) public onlyProxyOwner{ setAddress(PAUZER_SLOT, _newPauzer); } function renouncePauzer() public onlyPauzer { setAddress(PAUZER_SLOT, address(0)); } function getPaused() public view returns (bool) { return readBool(PAUSED_SLOT); } function setPaused(bool _value) public onlyPauzer { setBool(PAUSED_SLOT, _value); } function internalFallback() internal virtual override notPaused { super.internalFallback(); } } // File contracts/interfaces/IBFactory.sol pragma solidity ^0.6.4; interface IBFactory { function newBPool() external returns (address); } // File contracts/interfaces/IBPool.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is disstributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.4; interface IBPool { function isBound(address token) external view returns(bool); function getBalance(address token) external view returns (uint); function rebind(address token, uint balance, uint denorm) external; function setSwapFee(uint swapFee) external; function setPublicSwap(bool _public) external; function bind(address token, uint balance, uint denorm) external; function unbind(address token) external; function getDenormalizedWeight(address token) external view returns (uint); function getTotalDenormalizedWeight() external view returns (uint); function getCurrentTokens() external view returns(address[] memory); function setController(address manager) external; function isPublicSwap() external view returns(bool); function getSwapFee() external view returns (uint256); function gulp(address token) external; function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee ) external pure returns (uint poolAmountOut); function calcSingleInGivenPoolOut( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint poolAmountOut, uint swapFee ) external pure returns (uint tokenAmountIn); function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee ) external pure returns (uint tokenAmountOut); function calcPoolInGivenSingleOut( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint tokenAmountOut, uint swapFee ) external pure returns (uint poolAmountIn); } // File contracts/interfaces/IERC20.sol pragma solidity ^0.6.4; interface IERC20 { event Approval(address indexed _src, address indexed _dst, uint _amount); event Transfer(address indexed _src, address indexed _dst, uint _amount); 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 _amount) external returns (bool); function transfer(address _dst, uint _amount) external returns (bool); function transferFrom( address _src, address _dst, uint _amount ) external returns (bool); } // File contracts/Ownable.sol pragma solidity 0.6.4; // TODO move this generic contract to a seperate repo with all generic smart contracts contract Ownable { bytes32 constant public oSlot = keccak256("Ownable.storage.location"); event OwnerChanged(address indexed previousOwner, address indexed newOwner); // Ownable struct struct os { address owner; } modifier onlyOwner(){ require(msg.sender == los().owner, "Ownable.onlyOwner: msg.sender not owner"); _; } /** @notice Transfer ownership to a new address @param _newOwner Address of the new owner */ function transferOwnership(address _newOwner) onlyOwner external { _setOwner(_newOwner); } /** @notice Internal method to set the owner @param _newOwner Address of the new owner */ function _setOwner(address _newOwner) internal { emit OwnerChanged(los().owner, _newOwner); los().owner = _newOwner; } /** @notice Load ownable storage @return s Storage pointer to the Ownable storage struct */ function los() internal pure returns (os storage s) { bytes32 loc = oSlot; assembly { s_slot := loc } } } // File contracts/interfaces/IPSmartPool.sol pragma solidity ^0.6.4; interface IPSmartPool is IERC20 { function joinPool(uint256 _amount) external; function exitPool(uint256 _amount) external; function getController() external view returns(address); function getTokens() external view returns(address[] memory); function calcTokensForAmount(uint256 _amount) external view returns(address[] memory tokens, uint256[] memory amounts); } // File contracts/PCTokenStorage.sol pragma solidity 0.6.4; contract PCTokenStorage { bytes32 constant public ptSlot = keccak256("PCToken.storage.location"); struct pts { string name; string symbol; uint256 totalSupply; mapping(address => uint256) balance; mapping(address => mapping(address=>uint256)) allowance; } /** @notice Load pool token storage @return s Storage pointer to the pool token struct */ function lpts() internal pure returns (pts storage s) { bytes32 loc = ptSlot; assembly { s_slot := loc } } } // File contracts/Math.sol library Math { uint internal constant BONE = 10**18; // Add two numbers together checking for overflows function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } // subtract two numbers and return diffecerence when it underflows function bsubSign(uint a, uint b) internal pure returns (uint, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } // Subtract two numbers checking for underflows function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } // Multiply two 18 decimals numbers function bmul(uint a, uint b) internal pure returns (uint) { uint c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint c2 = c1 / BONE; return c2; } // Divide two 18 decimals numbers function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "ERR_DIV_ZERO"); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint c2 = c1 / b; return c2; } } // File contracts/PCToken.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.6.4; // Highly opinionated token implementation // Based on the balancer Implementation contract PCToken is IERC20, PCTokenStorage { using Math for uint256; event Approval(address indexed _src, address indexed _dst, uint _amount); event Transfer(address indexed _src, address indexed _dst, uint _amount); uint8 public constant decimals = 18; function _mint(uint _amount) internal { pts storage s = lpts(); s.balance[address(this)] = s.balance[address(this)].badd(_amount); s.totalSupply = s.totalSupply.badd(_amount); emit Transfer(address(0), address(this), _amount); } function _burn(uint _amount) internal { pts storage s = lpts(); require(s.balance[address(this)] >= _amount, "ERR_INSUFFICIENT_BAL"); s.balance[address(this)] = s.balance[address(this)].bsub(_amount); s.totalSupply = s.totalSupply.bsub(_amount); emit Transfer(address(this), address(0), _amount); } function _move(address _src, address _dst, uint _amount) internal { pts storage s = lpts(); require(s.balance[_src] >= _amount, "ERR_INSUFFICIENT_BAL"); s.balance[_src] = s.balance[_src].bsub(_amount); s.balance[_dst] = s.balance[_dst].badd(_amount); emit Transfer(_src, _dst, _amount); } function _push(address _to, uint _amount) internal { _move(address(this), _to, _amount); } function _pull(address _from, uint _amount) internal { _move(_from, address(this), _amount); } function allowance(address _src, address _dst) external view override returns (uint) { return lpts().allowance[_src][_dst]; } function balanceOf(address _whom) external view override returns (uint) { return lpts().balance[_whom]; } function totalSupply() public view override returns (uint) { return lpts().totalSupply; } function name() external view returns (string memory) { return lpts().name; } function symbol() external view returns (string memory) { return lpts().symbol; } function approve(address _dst, uint _amount) external override returns (bool) { lpts().allowance[msg.sender][_dst] = _amount; emit Approval(msg.sender, _dst, _amount); return true; } function increaseApproval(address _dst, uint _amount) external returns (bool) { pts storage s = lpts(); s.allowance[msg.sender][_dst] = s.allowance[msg.sender][_dst].badd(_amount); emit Approval(msg.sender, _dst, s.allowance[msg.sender][_dst]); return true; } function decreaseApproval(address _dst, uint _amount) external returns (bool) { pts storage s = lpts(); uint oldValue = s.allowance[msg.sender][_dst]; if (_amount > oldValue) { s.allowance[msg.sender][_dst] = 0; } else { s.allowance[msg.sender][_dst] = oldValue.bsub(_amount); } emit Approval(msg.sender, _dst, s.allowance[msg.sender][_dst]); return true; } function transfer(address _dst, uint _amount) external override returns (bool) { _move(msg.sender, _dst, _amount); return true; } function transferFrom(address _src, address _dst, uint _amount) external override returns (bool) { pts storage s = lpts(); require(msg.sender == _src || _amount <= s.allowance[_src][msg.sender], "ERR_PCTOKEN_BAD_CALLER"); _move(_src, _dst, _amount); if (msg.sender != _src && s.allowance[_src][msg.sender] != uint256(-1)) { s.allowance[_src][msg.sender] = s.allowance[_src][msg.sender].bsub(_amount); emit Approval(msg.sender, _dst, s.allowance[_src][msg.sender]); } return true; } } // File contracts/ReentryProtection.sol pragma solidity 0.6.4; // TODO move this generic contract to a seperate repo with all generic smart contracts contract ReentryProtection { bytes32 constant public rpSlot = keccak256("ReentryProtection.storage.location"); // reentry protection storage struct rps { uint256 lockCounter; } modifier noReentry { // Use counter to only write to storage once lrps().lockCounter ++; uint256 lockValue = lrps().lockCounter; _; require(lockValue == lrps().lockCounter, "ReentryProtection.noReentry: reentry detected"); } /** @notice Load reentry protection storage @return s Pointer to the reentry protection storage struct */ function lrps() internal pure returns (rps storage s) { bytes32 loc = rpSlot; assembly { s_slot := loc } } } // File contracts/smart-pools/PBasicSmartPool.sol pragma solidity 0.6.4; contract PBasicSmartPool is IPSmartPool, PCToken, ReentryProtection { // P Basic Smart Struct bytes32 constant public pbsSlot = keccak256("PBasicSmartPool.storage.location"); struct pbs { IBPool bPool; address controller; address publicSwapSetter; address tokenBinder; } modifier ready() { require(address(lpbs().bPool) != address(0), "PBasicSmartPool.ready: not ready"); _; } event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event TokensApproved(); event ControllerChanged(address indexed previousController, address indexed newController); event PublicSwapSetterChanged(address indexed previousSetter, address indexed newSetter); event TokenBinderChanged(address indexed previousTokenBinder, address indexed newTokenBinder); event PublicSwapSet(address indexed setter, bool indexed value); event SwapFeeSet(address indexed setter, uint256 newFee); event PoolJoined(address indexed from, uint256 amount); event PoolExited(address indexed from, uint256 amount); event PoolExitedWithLoss(address indexed from, uint256 amount, address[] lossTokens); modifier onlyController() { require(msg.sender == lpbs().controller, "PBasicSmartPool.onlyController: not controller"); _; } modifier onlyPublicSwapSetter() { require(msg.sender == lpbs().publicSwapSetter, "PBasicSmartPool.onlyPublicSwapSetter: not public swap setter"); _; } modifier onlyTokenBinder() { require(msg.sender == lpbs().tokenBinder, "PBasicSmartPool.onlyTokenBinder: not token binder"); _; } /** @notice Initialises the contract @param _bPool Address of the underlying balancer pool @param _name Name for the smart pool token @param _symbol Symbol for the smart pool token @param _initialSupply Initial token supply to mint */ function init(address _bPool, string calldata _name, string calldata _symbol, uint256 _initialSupply) external { pbs storage s = lpbs(); require(address(s.bPool) == address(0), "PBasicSmartPool.init: already initialised"); require(_bPool != address(0), "PBasicSmartPool.init: _bPool cannot be 0x00....000"); require(_initialSupply != 0, "PBasicSmartPool.init: _initialSupply can not zero"); s.bPool = IBPool(_bPool); s.controller = msg.sender; s.publicSwapSetter = msg.sender; s.tokenBinder = msg.sender; lpts().name = _name; lpts().symbol = _symbol; _mintPoolShare(_initialSupply); _pushPoolShare(msg.sender, _initialSupply); } /** @notice Sets approval to all tokens to the underlying balancer pool @dev It uses this function to save on gas in joinPool */ function approveTokens() public noReentry { IBPool bPool = lpbs().bPool; address[] memory tokens = bPool.getCurrentTokens(); for(uint256 i = 0; i < tokens.length; i ++) { IERC20(tokens[i]).approve(address(bPool), uint256(-1)); } emit TokensApproved(); } /** @notice Sets the controller address. Can only be set by the current controller @param _controller Address of the new controller */ function setController(address _controller) onlyController noReentry external { emit ControllerChanged(lpbs().controller, _controller); lpbs().controller = _controller; } /** @notice Sets public swap setter address. Can only be set by the controller @param _newPublicSwapSetter Address of the new public swap setter */ function setPublicSwapSetter(address _newPublicSwapSetter) onlyController noReentry external { emit PublicSwapSetterChanged(lpbs().publicSwapSetter, _newPublicSwapSetter); lpbs().publicSwapSetter = _newPublicSwapSetter; } /** @notice Sets the token binder address. Can only be set by the controller @param _newTokenBinder Address of the new token binder */ function setTokenBinder(address _newTokenBinder) onlyController noReentry external { emit TokenBinderChanged(lpbs().tokenBinder, _newTokenBinder); lpbs().tokenBinder = _newTokenBinder; } /** @notice Enables or disables public swapping on the underlying balancer pool. Can only be set by the controller @param _public Public or not */ function setPublicSwap(bool _public) onlyPublicSwapSetter noReentry external { emit PublicSwapSet(msg.sender, _public); lpbs().bPool.setPublicSwap(_public); } /** @notice Set the swap fee on the underlying balancer pool. Can only be called by the controller @param _swapFee The new swap fee */ function setSwapFee(uint256 _swapFee) onlyController noReentry external { emit SwapFeeSet(msg.sender, _swapFee); lpbs().bPool.setSwapFee(_swapFee); } /** @notice Mints pool shares in exchange for underlying assets @param _amount Amount of pool shares to mint */ function joinPool(uint256 _amount) external override virtual ready noReentry { _joinPool(_amount); } /** @notice Internal join pool function. See joinPool for more info @param _amount Amount of pool shares to mint */ function _joinPool(uint256 _amount) internal virtual ready { IBPool bPool = lpbs().bPool; uint poolTotal = totalSupply(); uint ratio = _amount.bdiv(poolTotal); require(ratio != 0); address[] memory tokens = bPool.getCurrentTokens(); for (uint i = 0; i < tokens.length; i++) { address t = tokens[i]; uint bal = bPool.getBalance(t); uint tokenAmountIn = ratio.bmul(bal); emit LOG_JOIN(msg.sender, t, tokenAmountIn); _pullUnderlying(t, msg.sender, tokenAmountIn, bal); } _mintPoolShare(_amount); _pushPoolShare(msg.sender, _amount); emit PoolJoined(msg.sender, _amount); } /** @notice Burns pool shares and sends back the underlying assets @param _amount Amount of pool tokens to burn */ function exitPool(uint256 _amount) external override ready noReentry { IBPool bPool = lpbs().bPool; uint poolTotal = totalSupply(); uint ratio = _amount.bdiv(poolTotal); require(ratio != 0); _pullPoolShare(msg.sender, _amount); _burnPoolShare(_amount); address[] memory tokens = bPool.getCurrentTokens(); for (uint i = 0; i < tokens.length; i++) { address t = tokens[i]; uint bal = bPool.getBalance(t); uint tAo = ratio.bmul(bal); emit LOG_EXIT(msg.sender, t, tAo); _pushUnderlying(t, msg.sender, tAo, bal); } emit PoolExited(msg.sender, _amount); } /** @notice Burns pool shares and sends back the underlying assets leaving some in the pool @param _amount Amount of pool tokens to burn @param _lossTokens Tokens skipped on redemption */ function exitPoolTakingloss(uint256 _amount, address[] calldata _lossTokens) external ready noReentry { IBPool bPool = lpbs().bPool; uint poolTotal = totalSupply(); uint ratio = _amount.bdiv(poolTotal); require(ratio != 0); _pullPoolShare(msg.sender, _amount); _burnPoolShare(_amount); address[] memory tokens = bPool.getCurrentTokens(); for (uint i = 0; i < tokens.length; i++) { // If taking loss on token skip one iteration of the loop if(_contains(tokens[i], _lossTokens)){ continue; } address t = tokens[i]; uint bal = bPool.getBalance(t); uint tAo = ratio.bmul(bal); emit LOG_EXIT(msg.sender, t, tAo); _pushUnderlying(t, msg.sender, tAo, bal); } emit PoolExitedWithLoss(msg.sender, _amount, _lossTokens); } /** @notice Bind a token to the underlying balancer pool. Can only be called by the token binder @param _token Token to bind @param _balance Amount to bind @param _denorm Denormalised weight */ function bind(address _token, uint256 _balance, uint256 _denorm) external onlyTokenBinder noReentry { IBPool bPool = lpbs().bPool; IERC20 token = IERC20(_token); require(token.transferFrom(msg.sender, address(this), _balance), "PBasicSmartPool.bind: transferFrom failed"); token.approve(address(bPool), uint256(-1)); bPool.bind(_token, _balance, _denorm); } /** @notice Rebind a token to the pool @param _token Token to bind @param _balance Amount to bind @param _denorm Denormalised weight */ function rebind(address _token, uint256 _balance, uint256 _denorm) external onlyTokenBinder noReentry { IBPool bPool = lpbs().bPool; IERC20 token = IERC20(_token); // gulp old non acounted for token balance in the contract bPool.gulp(_token); uint256 oldBalance = token.balanceOf(address(bPool)); // If tokens need to be pulled from msg.sender if(_balance > oldBalance) { require(token.transferFrom(msg.sender, address(this), _balance.bsub(oldBalance)), "PBasicSmartPool.rebind: transferFrom failed"); token.approve(address(bPool), uint256(-1)); } bPool.rebind(_token, _balance, _denorm); // If any tokens are in this contract send them to msg.sender uint256 tokenBalance = token.balanceOf(address(this)); if(tokenBalance > 0) { require(token.transfer(msg.sender, tokenBalance), "PBasicSmartPool.rebind: transfer failed"); } } /** @notice Unbind a token @param _token Token to unbind */ function unbind(address _token) external onlyTokenBinder noReentry { IBPool bPool = lpbs().bPool; IERC20 token = IERC20(_token); // unbind the token in the bPool bPool.unbind(_token); // If any tokens are in this contract send them to msg.sender uint256 tokenBalance = token.balanceOf(address(this)); if(tokenBalance > 0) { require(token.transfer(msg.sender, tokenBalance), "PBasicSmartPool.unbind: transfer failed"); } } function getTokens() external view override returns(address[] memory) { return lpbs().bPool.getCurrentTokens(); } /** @notice Gets the underlying assets and amounts to mint specific pool shares. @param _amount Amount of pool shares to calculate the values for @return tokens The addresses of the tokens @return amounts The amounts of tokens needed to mint that amount of pool shares */ function calcTokensForAmount(uint256 _amount) external view override returns(address[] memory tokens, uint256[] memory amounts) { tokens = lpbs().bPool.getCurrentTokens(); amounts = new uint256[](tokens.length); uint256 ratio = _amount.bdiv(totalSupply()); for(uint256 i = 0; i < tokens.length; i ++) { address t = tokens[i]; uint256 bal = lpbs().bPool.getBalance(t); uint256 amount = ratio.bmul(bal); amounts[i] = amount; } } /** @notice Get the address of the controller @return The address of the pool */ function getController() external view override returns(address) { return lpbs().controller; } /** @notice Get the address of the public swap setter @return The public swap setter address */ function getPublicSwapSetter() external view returns(address) { return lpbs().publicSwapSetter; } /** @notice Get the address of the token binder @return The token binder address */ function getTokenBinder() external view returns(address) { return lpbs().tokenBinder; } /** @notice Get if public swapping is enabled @return If public swapping is enabled */ function isPublicSwap() external view returns (bool) { return lpbs().bPool.isPublicSwap(); } /** @notice Get the current swap fee @return The current swap fee */ function getSwapFee() external view returns (uint256) { return lpbs().bPool.getSwapFee(); } /** @notice Get the address of the underlying Balancer pool @return The address of the underlying balancer pool */ function getBPool() external view returns(address) { return address(lpbs().bPool); } /** @notice Pull the underlying token from an address and rebind it to the balancer pool @param _token Address of the token to pull @param _from Address to pull the token from @param _amount Amount of token to pull @param _tokenBalance Balance of the token already in the balancer pool */ function _pullUnderlying(address _token, address _from, uint256 _amount, uint256 _tokenBalance) internal { IBPool bPool = lpbs().bPool; // Gets current Balance of token i, Bi, and weight of token i, Wi, from BPool. uint tokenWeight = bPool.getDenormalizedWeight(_token); require(IERC20(_token).transferFrom(_from, address(this), _amount), "PBasicSmartPool._pullUnderlying: transferFrom failed"); bPool.rebind(_token, _tokenBalance.badd(_amount), tokenWeight); } /** @notice Push a underlying token and rebind the token to the balancer pool @param _token Address of the token to push @param _to Address to pull the token to @param _amount Amount of token to push @param _tokenBalance Balance of the token already in the balancer pool */ function _pushUnderlying(address _token, address _to, uint256 _amount, uint256 _tokenBalance) internal { IBPool bPool = lpbs().bPool; // Gets current Balance of token i, Bi, and weight of token i, Wi, from BPool. uint tokenWeight = bPool.getDenormalizedWeight(_token); bPool.rebind(_token, _tokenBalance.bsub(_amount), tokenWeight); require(IERC20(_token).transfer(_to, _amount), "PBasicSmartPool._pushUnderlying: transfer failed"); } /** @notice Pull pool shares @param _from Address to pull pool shares from @param _amount Amount of pool shares to pull */ function _pullPoolShare(address _from, uint256 _amount) internal { _pull(_from, _amount); } /** @notice Burn pool shares @param _amount Amount of pool shares to burn */ function _burnPoolShare(uint256 _amount) internal { _burn(_amount); } /** @notice Mint pool shares @param _amount Amount of pool shares to mint */ function _mintPoolShare(uint256 _amount) internal { _mint(_amount); } /** @notice Push pool shares to account @param _to Address to push the pool shares to @param _amount Amount of pool shares to push */ function _pushPoolShare(address _to, uint256 _amount) internal { _push(_to, _amount); } /** @notice searches for an address in an array of addresses and returns if it contains the address @param _needle Address to look for @param _haystack Array to search @return If value is found */ function _contains(address _needle, address[] memory _haystack) internal pure returns(bool) { for(uint256 i = 0; i < _haystack.length; i ++) { if(_haystack[i] == _needle) { return true; } } return false; } /** @notice Load PBasicPool storage @return s Pointer to the storage struct */ function lpbs() internal pure returns (pbs storage s) { bytes32 loc = pbsSlot; assembly { s_slot := loc } } } // File contracts/smart-pools/PCappedSmartPool.sol pragma solidity 0.6.4; contract PCappedSmartPool is PBasicSmartPool { bytes32 constant public pcsSlot = keccak256("PCappedSmartPool.storage.location"); event CapChanged(address indexed setter, uint256 oldCap, uint256 newCap); struct pcs { uint256 cap; } modifier withinCap() { _; require(totalSupply() < lpcs().cap, "PCappedSmartPool.withinCap: Cap limit reached"); } /** @notice Set the maximum cap of the contract @param _cap New cap in wei */ function setCap(uint256 _cap) onlyController noReentry external { emit CapChanged(msg.sender, lpcs().cap, _cap); lpcs().cap = _cap; } /** @notice Takes underlying assets and mints smart pool tokens. Enforces the cap @param _amount Amount of pool tokens to mint */ function joinPool(uint256 _amount) external override withinCap noReentry { super._joinPool(_amount); } /** @notice Get the current cap @return The current cap in wei */ function getCap() external view returns(uint256) { return lpcs().cap; } /** @notice Load the PCappedSmartPool storage @return s Pointer to the storage struct */ function lpcs() internal pure returns (pcs storage s) { bytes32 loc = pcsSlot; assembly { s_slot := loc } } } // File contracts/factory/PProxiedFactory.sol pragma solidity ^0.6.4; contract PProxiedFactory is Ownable { IBFactory public balancerFactory; address public smartPoolImplementation; mapping(address => bool) public isPool; address[] public pools; event SmartPoolCreated(address indexed poolAddress, string name, string symbol); function init(address _balancerFactory) public { require(smartPoolImplementation == address(0), "Already initialised"); _setOwner(msg.sender); balancerFactory = IBFactory(_balancerFactory); PCappedSmartPool implementation = new PCappedSmartPool(); // function init(address _bPool, string calldata _name, string calldata _symbol, uint256 _initialSupply) external { implementation.init(address(1), "IMPL", "IMPL", 1 ether); smartPoolImplementation = address(implementation); } function newProxiedSmartPool( string memory _name, string memory _symbol, uint256 _initialSupply, address[] memory _tokens, uint256[] memory _amounts, uint256[] memory _weights, uint256 _cap ) public onlyOwner returns(address) { // Deploy proxy contract PProxyPausable proxy = new PProxyPausable(); // Setup proxy proxy.setImplementation(smartPoolImplementation); proxy.setPauzer(msg.sender); proxy.setProxyOwner(msg.sender); // Setup balancer pool address balancerPoolAddress = balancerFactory.newBPool(); IBPool bPool = IBPool(balancerPoolAddress); for(uint256 i = 0; i < _tokens.length; i ++) { IERC20 token = IERC20(_tokens[i]); // Transfer tokens to this contract token.transferFrom(msg.sender, address(this), _amounts[i]); // Approve the balancer pool token.approve(balancerPoolAddress, uint256(-1)); // Bind tokens bPool.bind(_tokens[i], _amounts[i], _weights[i]); } bPool.setController(address(proxy)); // Setup smart pool PCappedSmartPool smartPool = PCappedSmartPool(address(proxy)); smartPool.init(balancerPoolAddress, _name, _symbol, _initialSupply); smartPool.setCap(_cap); smartPool.setPublicSwapSetter(msg.sender); smartPool.setTokenBinder(msg.sender); smartPool.setController(msg.sender); smartPool.approveTokens(); isPool[address(smartPool)] = true; pools.push(address(smartPool)); emit SmartPoolCreated(address(smartPool), _name, _symbol); smartPool.transfer(msg.sender, _initialSupply); return address(smartPool); } } // File contracts/test/TestPCToken.sol pragma solidity 0.6.4; contract TestPCToken is PCToken { constructor(string memory _name, string memory _symbol) public { lpts().name = _name; lpts().symbol = _symbol; } function mint(address _to, uint256 _amount) external { _mint(_amount); _push(_to, _amount); } function burn(address _from, uint256 _amount) external { _pull(_from, _amount); _burn(_amount); } } // File contracts/test/TestReentryProtection.sol pragma solidity 0.6.4; contract TestReentryProtection is ReentryProtection { // This should fail function test() external noReentry { reenter(); } function reenter() public noReentry { // Do nothing } } // File contracts/interfaces/IKyberNetwork.sol pragma solidity ^0.6.4; interface IKyberNetwork { function trade( address src, uint srcAmount, address dest, address payable destAddress, uint maxDestAmount, uint minConversionRate, address walletId ) external payable returns(uint256); } // File contracts/interfaces/IUniswapExchange.sol pragma solidity ^0.6.4; interface IUniswapExchange { // Address of ERC20 token sold on this exchange function tokenAddress() external view returns (address token); // Address of Uniswap Factory function factoryAddress() external view returns (address factory); // Provide Liquidity function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256); function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256); // Get Prices function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold); function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold); // Trade ETH to ERC20 function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256 eth_sold); function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); // Trade ERC20 to ETH function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256 eth_bought); function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256 eth_bought); function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256 tokens_sold); function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); // Trade ERC20 to ERC20 function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256 tokens_sold); function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_sold); // Trade ERC20 to Custom Pool function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256 tokens_sold); function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_sold); // ERC20 comaptibility for liquidity tokens // bytes32 public name; // bytes32 public symbol; // uint256 public decimals; function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); function allowance(address _owner, address _spender) external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); function totalSupply() external view returns (uint256); // Never use function setup(address token_addr) external; } // File contracts/interfaces/IUniswapFactory.sol pragma solidity ^0.6.4; interface IUniswapFactory { // Create Exchange function createExchange(address token) external returns (address exchange); // Get Exchange and Token Info function getExchange(address token) external view returns (address exchange); function getToken(address exchange) external view returns (address token); function getTokenWithId(uint256 tokenId) external view returns (address token); // Never use function initializeFactory(address template) external; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_src","type":"address"},{"indexed":true,"internalType":"address","name":"_dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"}],"name":"CapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousController","type":"address"},{"indexed":true,"internalType":"address","name":"newController","type":"address"}],"name":"ControllerChanged","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":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":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolExited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"lossTokens","type":"address[]"}],"name":"PoolExitedWithLoss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PoolJoined","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"PublicSwapSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousSetter","type":"address"},{"indexed":true,"internalType":"address","name":"newSetter","type":"address"}],"name":"PublicSwapSetterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"SwapFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousTokenBinder","type":"address"},{"indexed":true,"internalType":"address","name":"newTokenBinder","type":"address"}],"name":"TokenBinderChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"TokensApproved","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":"_amount","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveTokens","outputs":[],"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":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_denorm","type":"uint256"}],"name":"bind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calcTokensForAmount","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"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":"_amount","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address[]","name":"_lossTokens","type":"address[]"}],"name":"exitPoolTakingloss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSwapSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenBinder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bPool","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"joinPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pbsSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pcsSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ptSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_denorm","type":"uint256"}],"name":"rebind","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rpSlot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_public","type":"bool"}],"name":"setPublicSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPublicSwapSetter","type":"address"}],"name":"setPublicSwapSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTokenBinder","type":"address"}],"name":"setTokenBinder","outputs":[],"stateMutability":"nonpayable","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":"_amount","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":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unbind","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613ea6806100206000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063652062c511610130578063be1d24ad116100b8578063dd62ed3e1161007c578063dd62ed3e14610828578063e4e1e53814610856578063ec565ffe14610888578063fd68f22314610890578063fde924f71461089857610232565b8063be1d24ad146106e3578063cf5e7bd314610700578063d2209ad914610726578063d4cadf68146107f4578063d73dd623146107fc57610232565b806392eefe9b116100ff57806392eefe9b1461060b57806395d89b4114610631578063a9059cbb14610639578063aa6ca80814610665578063bd5437e8146106bd57610232565b8063652062c5146105a957806366188463146105b157806370a08231146105dd578063830df8521461060357610232565b806334e19907116101be57806347786d371161018257806347786d371461053757806349b59552146105545780634cde1618146105735780634eee8d151461057b578063554d578d146105a157610232565b806334e199071461040d57806334e7a19f1461042a578063371babdc146104475780633fdddaa2146104fd57806344b250521461052f57610232565b806323b872dd1161020557806323b872dd146103165780632c500bc81461034c5780632fecc529146103705780633018205f146103e7578063313ce567146103ef57610232565b806306fdde0314610237578063095ea7b3146102b4578063099e9e2a146102f457806318160ddd1461030e575b600080fd5b61023f6108a0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360408110156102ca57600080fd5b506001600160a01b038135169060200135610939565b604080519115158252519081900360200190f35b6102fc61099f565b60408051918252519081900360200190f35b6102fc6109d4565b6102e06004803603606081101561032c57600080fd5b506001600160a01b038135811691602081013590911690604001356109e7565b610354610b5c565b604080516001600160a01b039092168252519081900360200190f35b6103e56004803603604081101561038657600080fd5b81359190810190604081016020820135600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460208302840111600160201b831117156103da57600080fd5b509092509050610b75565b005b610354610f8a565b6103f7610fa6565b6040805160ff9092168252519081900360200190f35b6103e56004803603602081101561042357600080fd5b5035610fab565b6103e56004803603602081101561044057600080fd5b5035611104565b6104646004803603602081101561045d57600080fd5b50356111c0565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156104a8578181015183820152602001610490565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104e75781810151838201526020016104cf565b5050505090500194505050505060405180910390f35b6103e56004803603606081101561051357600080fd5b506001600160a01b038135169060208101359060400135611406565b610354611898565b6103e56004803603602081101561054d57600080fd5b50356118b4565b6103e56004803603602081101561056a57600080fd5b50351515611976565b610354611a68565b6103e56004803603602081101561059157600080fd5b50356001600160a01b0316611a84565b6102fc611b6f565b6102fc611b7f565b6102e0600480360360408110156105c757600080fd5b506001600160a01b038135169060200135611b9a565b6102fc600480360360208110156105f357600080fd5b50356001600160a01b0316611c8f565b6102fc611cbb565b6103e56004803603602081101561062157600080fd5b50356001600160a01b0316611cd6565b61023f611dc1565b6102e06004803603604081101561064f57600080fd5b506001600160a01b038135169060200135611e27565b61066d611e3d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a9578181015183820152602001610691565b505050509050019250505060405180910390f35b6103e5600480360360208110156106d357600080fd5b50356001600160a01b0316611f56565b6103e5600480360360208110156106f957600080fd5b5035612041565b6103e56004803603602081101561071657600080fd5b50356001600160a01b0316612378565b6103e56004803603608081101561073c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561076657600080fd5b82018360208201111561077857600080fd5b803590602001918460018302840111600160201b8311171561079957600080fd5b919390929091602081019035600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b919350915035612599565b6102fc6126fd565b6102e06004803603604081101561081257600080fd5b506001600160a01b03813516906020013561277b565b6102fc6004803603604081101561083e57600080fd5b506001600160a01b0381358116916020013516612815565b6103e56004803603606081101561086c57600080fd5b506001600160a01b03813516906020810135906040013561284f565b6102fc612a86565b6103e5612ab6565b6102e0612d17565b60606108aa612d64565b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505090505b90565b600081610944612d64565b336000818152600492909201602090815260408084206001600160a01b03891680865290835293819020949094558351868152935192939192600080516020613d5c8339815191529281900390910190a35060015b92915050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902081565b60006109de612d64565b60020154905090565b6000806109f2612d64565b9050336001600160a01b0386161480610a3057506001600160a01b038516600090815260048201602090815260408083203384529091529020548311155b610a7a576040805162461bcd60e51b815260206004820152601660248201527522a9292fa821aa27a5a2a72fa120a22fa1a0a62622a960511b604482015290519081900360640190fd5b610a85858585612d94565b336001600160a01b03861614801590610ac557506001600160a01b0385166000908152600482016020908152604080832033845290915290205460001914155b15610b51576001600160a01b03851660009081526004820160209081526040808320338452909152902054610b00908463ffffffff612ec816565b6001600160a01b03868116600090815260048401602090815260408083203380855290835292819020859055805194855251928816939192600080516020613d5c8339815191529281900390910190a35b506001949350505050565b6000610b66612f2a565b546001600160a01b0316905090565b6000610b7f612f2a565b546001600160a01b03161415610bdc576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b610be4612f5f565b805460010190556000610bf5612f5f565b5490506000610c02612f2a565b546001600160a01b031690506000610c186109d4565b90506000610c2c878363ffffffff612f8116565b905080610c3857600080fd5b610c423388613094565b610c4b8761309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c8657600080fd5b505afa158015610c9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cc357600080fd5b8101908080516040519392919084600160201b821115610ce257600080fd5b908301906020820185811115610cf757600080fd5b82518660208202830111600160201b82111715610d1357600080fd5b82525081516020918201928201910280838360005b83811015610d40578181015183820152602001610d28565b50505050905001604052505050905060008090505b8151811015610ec457610dae828281518110610d6d57fe5b60200260200101518989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130a792505050565b15610db857610ebc565b6000828281518110610dc657fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b505190506000610e68868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3610eb8833383856131bf565b5050505b600101610d55565b50336001600160a01b03167fe27d877155575efc81398b13b114bbbbfd49b156eb72e9f6c691f3b72b8adf9489898960405180848152602001806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a250505050610f46612f5f565b548114610f845760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b50505050565b6000610f94612f2a565b600101546001600160a01b0316905090565b601281565b610fb3612f2a565b600101546001600160a01b03163314610ffd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611005612f5f565b805460010190556000611016612f5f565b5460408051848152905191925033917f44ef267e747417ef6614a0ab5bee304ba1a35d76759d34170d1b74a850a9d0339181900360200190a2611057612f2a565b54604080516334e1990760e01b81526004810185905290516001600160a01b03909216916334e199079160248082019260009290919082900301818387803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505050506110c2612f5f565b5481146111005760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b5050565b61110c612f5f565b80546001019055600061111d612f5f565b549050611129826133a7565b611131612f5f565b54811461116f5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b506111786136bd565b546111816109d4565b106111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c5a602d913960400191505060405180910390fd5b50565b6060806111cb612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561124b57600080fd5b8101908080516040519392919084600160201b82111561126a57600080fd5b90830190602082018581111561127f57600080fd5b82518660208202830111600160201b8211171561129b57600080fd5b82525081516020918201928201910280838360005b838110156112c85781810151838201526020016112b0565b5050505090500160405250505091508151604051908082528060200260200182016040528015611302578160200160208202803683370190505b509050600061131f6113126109d4565b859063ffffffff612f8116565b905060005b83518110156113ff57600084828151811061133b57fe5b60200260200101519050600061134f612f2a565b546040805163f8b2cb4f60e01b81526001600160a01b0385811660048301529151919092169163f8b2cb4f916024808301926020929190829003018186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d60208110156113c457600080fd5b5051905060006113da858363ffffffff6130fd16565b9050808685815181106113e957fe5b6020908102919091010152505050600101611324565b5050915091565b61140e612f2a565b600301546001600160a01b031633146114585760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b611460612f5f565b805460010190556000611471612f5f565b549050600061147e612f2a565b5460408051631185197d60e31b81526001600160a01b038881166004830152915191909216925086918391638c28cbe89160248082019260009290919082900301818387803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505050506000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50519050808611156116e7576001600160a01b0382166323b872dd33306115978a8663ffffffff612ec816565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506040513d602081101561162957600080fd5b50516116665760405162461bcd60e51b815260040180806020018281038252602b815260200180613cb4602b913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038581166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b505050506040513d60208110156116e457600080fd5b50505b60408051631feeed5160e11b81526001600160a01b0389811660048301526024820189905260448201889052915191851691633fdddaa29160648082019260009290919082900301818387803b15801561174057600080fd5b505af1158015611754573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03861692506370a0823191602480820192602092909190829003018186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d60208110156117cc57600080fd5b50519050801561188c576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561182557600080fd5b505af1158015611839573d6000803e3d6000fd5b505050506040513d602081101561184f57600080fd5b505161188c5760405162461bcd60e51b8152600401808060200182810382526027815260200180613d136027913960400191505060405180910390fd5b50505050610f46612f5f565b60006118a2612f2a565b600301546001600160a01b0316905090565b6118bc612f2a565b600101546001600160a01b031633146119065760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b61190e612f5f565b80546001019055600061191f612f5f565b549050337f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f561194c6136bd565b5460408051918252602082018690528051918290030190a28161196d6136bd565b556110c2612f5f565b61197e612f2a565b600201546001600160a01b031633146119c85760405162461bcd60e51b815260040180806020018281038252603c815260200180613e35603c913960400191505060405180910390fd5b6119d0612f5f565b8054600101905560006119e1612f5f565b546040519091508215159033907feda6fce4059a79def1a5550dd645183dbd84a324dde2aba020658eb3d7f84a8790600090a3611a1c612f2a565b54604080516324dacaa960e11b8152841515600482015290516001600160a01b03909216916349b595529160248082019260009290919082900301818387803b1580156110a257600080fd5b6000611a72612f2a565b600201546001600160a01b0316905090565b611a8c612f2a565b600101546001600160a01b03163314611ad65760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611ade612f5f565b805460010190556000611aef612f5f565b5490506001600160a01b038216611b04612f2a565b600201546040516001600160a01b03909116907fc2f50b6bc4bd45505f1557a7d4b19c5177d334181ae1179d335020424d3736c490600090a381611b46612f2a565b60020180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6000611b796136bd565b54905090565b604051806021613c3982396021019050604051809103902081565b600080611ba5612d64565b33600090815260048201602090815260408083206001600160a01b038916845290915290205490915080841115611c015733600090815260048301602090815260408083206001600160a01b0389168452909152812055611c38565b611c11818563ffffffff612ec816565b33600090815260048401602090815260408083206001600160a01b038a1684529091529020555b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190205481519081529051929392600080516020613d5c833981519152929181900390910190a3506001949350505050565b6000611c99612d64565b6001600160a01b03929092166000908152600390920160205250604090205490565b604051806022613d3a82396022019050604051809103902081565b611cde612f2a565b600101546001600160a01b03163314611d285760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611d30612f5f565b805460010190556000611d41612f5f565b5490506001600160a01b038216611d56612f2a565b600101546040516001600160a01b03909116907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f790600090a381611d98612f2a565b60010180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6060611dcb612d64565b60019081018054604080516020600295841615610100026000190190931694909404601f81018390048302850183019091528084529083018282801561092e5780601f106109035761010080835404028352916020019161092e565b6000611e34338484612d94565b50600192915050565b6060611e47612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec757600080fd5b8101908080516040519392919084600160201b821115611ee657600080fd5b908301906020820185811115611efb57600080fd5b82518660208202830111600160201b82111715611f1757600080fd5b82525081516020918201928201910280838360005b83811015611f44578181015183820152602001611f2c565b50505050905001604052505050905090565b611f5e612f2a565b600101546001600160a01b03163314611fa85760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611fb0612f5f565b805460010190556000611fc1612f5f565b5490506001600160a01b038216611fd6612f2a565b600301546040516001600160a01b03909116907fcbca212b561161352cbd1ef8956a916a93bee0f84bb6a3af9118af675266a96390600090a381612018612f2a565b60030180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b600061204b612f2a565b546001600160a01b031614156120a8576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6120b0612f5f565b8054600101905560006120c1612f5f565b54905060006120ce612f2a565b546001600160a01b0316905060006120e46109d4565b905060006120f8858363ffffffff612f8116565b90508061210457600080fd5b61210e3386613094565b6121178561309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561215257600080fd5b505afa158015612166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218f57600080fd5b8101908080516040519392919084600160201b8211156121ae57600080fd5b9083019060208201858111156121c357600080fd5b82518660208202830111600160201b821117156121df57600080fd5b82525081516020918201928201910280838360005b8381101561220c5781810151838201526020016121f4565b50505050905001604052505050905060008090505b815181101561233557600082828151811061223857fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561229a57600080fd5b505afa1580156122ae573d6000803e3d6000fd5b505050506040513d60208110156122c457600080fd5b5051905060006122da868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a361232a833383856131bf565b505050600101612221565b5060408051878152905133917fbc865856a1e9f1dfe2abde98edc2eefe87b6c391a47032388ef36d8c2474aad3919081900360200190a2505050506110c2612f5f565b612380612f2a565b600301546001600160a01b031633146123ca5760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6123d2612f5f565b8054600101905560006123e3612f5f565b54905060006123f0612f2a565b546040805163cf5e7bd360e01b81526001600160a01b03868116600483015291519190921692508491839163cf5e7bd39160248082019260009290919082900301818387803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03851692506370a0823191602480820192602092909190829003018186803b1580156124a457600080fd5b505afa1580156124b8573d6000803e3d6000fd5b505050506040513d60208110156124ce57600080fd5b50519050801561258e576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b505050506040513d602081101561255157600080fd5b505161258e5760405162461bcd60e51b8152600401808060200182810382526027815260200180613c126027913960400191505060405180910390fd5b5050506110c2612f5f565b60006125a3612f2a565b80549091506001600160a01b0316156125ed5760405162461bcd60e51b8152600401808060200182810382526029815260200180613d7c6029913960400191505060405180910390fd5b6001600160a01b0387166126325760405162461bcd60e51b8152600401808060200182810382526032815260200180613e036032913960400191505060405180910390fd5b8161266e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613be16031913960400191505060405180910390fd5b80546001600160a01b0388166001600160a01b031991821617825560018201805482163390811790915560028301805483168217905560038301805490921617905585856126ba612d64565b6126c5929091613aee565b5083836126d0612d64565b60010191906126e0929190613aee565b506126ea826136df565b6126f433836136e8565b50505050505050565b6000612707612f2a565b5460408051631a995bed60e31b815290516001600160a01b039092169163d4cadf6891600480820192602092909190829003018186803b15801561274a57600080fd5b505afa15801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b5051905090565b600080612786612d64565b33600090815260048201602090815260408083206001600160a01b03891684529091529020549091506127bf908463ffffffff6136f216565b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190208590558051948552519193600080516020613d5c833981519152929081900390910190a35060019392505050565b600061281f612d64565b6001600160a01b039384166000908152600491909101602090815260408083209490951682529290925250205490565b612857612f2a565b600301546001600160a01b031633146128a15760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6128a9612f5f565b8054600101905560006128ba612f5f565b54905060006128c7612f2a565b54604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03928316935087928316916323b872dd9160648083019260209291908290030181600087803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b505050506040513d602081101561294e57600080fd5b505161298b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b876029913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038481166004830152600019602483015291519183169163095ea7b3916044808201926020929091908290030181600087803b1580156129df57600080fd5b505af11580156129f3573d6000803e3d6000fd5b505050506040513d6020811015612a0957600080fd5b505060408051631c9c3ca760e31b81526001600160a01b038881166004830152602482018890526044820187905291519184169163e4e1e5389160648082019260009290919082900301818387803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050505050610f46612f5f565b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902081565b612abe612f5f565b805460010190556000612acf612f5f565b5490506000612adc612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169250606091839163cc77828d916004808301926000929190829003018186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b6157600080fd5b8101908080516040519392919084600160201b821115612b8057600080fd5b908301906020820185811115612b9557600080fd5b82518660208202830111600160201b82111715612bb157600080fd5b82525081516020918201928201910280838360005b83811015612bde578181015183820152602001612bc6565b50505050905001604052505050905060008090505b8151811015612ca557818181518110612c0857fe5b60200260200101516001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c7157600080fd5b505af1158015612c85573d6000803e3d6000fd5b505050506040513d6020811015612c9b57600080fd5b5050600101612bf3565b506040517f198f462153295cccb18f8ac2ae01bf2fc81f948daad29b15c5a9ad53370b07e590600090a15050612cd9612f5f565b5481146111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b6000612d21612f2a565b546040805163fde924f760e01b815290516001600160a01b039092169163fde924f791600480820192602092909190829003018186803b15801561274a57600080fd5b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902090565b6000612d9e612d64565b6001600160a01b0385166000908152600382016020526040902054909150821115612e07576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0384166000908152600382016020526040902054612e32908363ffffffff612ec816565b6001600160a01b0380861660009081526003840160205260408082209390935590851681522054612e69908363ffffffff6136f216565b6001600160a01b03808516600081815260038501602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b6000806000612ed78585613746565b915091508015612f22576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902090565b6000806040518080613d3a602291396040519081900360220190209392505050565b600081612fc4576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612fec5750670de0b6b3a7640000848281612fe957fe5b04145b613030576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561307e576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161308957fe5b049695505050505050565b611100828261376b565b6111bd81613776565b6000805b82518110156130f357836001600160a01b03168382815181106130ca57fe5b60200260200101516001600160a01b031614156130eb576001915050610999565b6001016130ab565b5060009392505050565b600082820283158061311757508284828161311457fe5b04145b61315b576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b200008101818110156131ae576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a764000082613089565b60006131c9612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b15801561321b57600080fd5b505afa15801561322f573d6000803e3d6000fd5b505050506040513d602081101561324557600080fd5b505190506001600160a01b038216633fdddaa287613269868863ffffffff612ec816565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b50505050856001600160a01b031663a9059cbb86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561333857600080fd5b505af115801561334c573d6000803e3d6000fd5b505050506040513d602081101561336257600080fd5b505161339f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613da56030913960400191505060405180910390fd5b505050505050565b60006133b1612f2a565b546001600160a01b0316141561340e576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6000613418612f2a565b546001600160a01b03169050600061342e6109d4565b90506000613442848363ffffffff612f8116565b90508061344e57600080fd5b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156134c657600080fd5b8101908080516040519392919084600160201b8211156134e557600080fd5b9083019060208201858111156134fa57600080fd5b82518660208202830111600160201b8211171561351657600080fd5b82525081516020918201928201910280838360005b8381101561354357818101518382015260200161352b565b50505050905001604052505050905060008090505b815181101561366c57600082828151811061356f57fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505190506000613611868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a919081900360200190a36136618333838561386a565b505050600101613558565b50613676856136df565b61368033866136e8565b60408051868152905133917f7a011ddbb8da163de89faccb018bb75c616e6ac270738b8bf1785f08ae1b2d6f919081900360200190a25050505050565b6000806040518080613c39602191396040519081900360210190209392505050565b6111bd81613a4c565b6111008282613ae3565b60008282018381101561373f576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b60008082841061375c5750508082036000613764565b505081810360015b9250929050565b611100823083612d94565b6000613780612d64565b3060009081526003820160205260409020549091508211156137e0576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152600382016020526040902054613802908363ffffffff612ec816565b3060009081526003830160205260409020556002810154613829908363ffffffff612ec816565b600282015560408051838152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613874612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516323b872dd60e01b81526001600160a01b038881166004830152306024830152604482018890529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50516139b55760405162461bcd60e51b8152600401808060200182810382526034815260200180613cdf6034913960400191505060405180910390fd5b6001600160a01b038216633fdddaa2876139d5868863ffffffff6136f216565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b50505050505050505050565b6000613a56612d64565b306000908152600382016020526040902054909150613a7b908363ffffffff6136f216565b3060009081526003830160205260409020556002810154613aa2908363ffffffff6136f216565b600282015560408051838152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b611100308383612d94565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b2f5782800160ff19823516178555613b5c565b82800160010185558215613b5c579182015b82811115613b5c578235825591602001919060010190613b41565b50613b68929150613b6c565b5090565b61093691905b80821115613b685760008155600101613b7256fe504261736963536d617274506f6f6c2e62696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e6f6e6c79546f6b656e42696e6465723a206e6f7420746f6b656e2062696e646572504261736963536d617274506f6f6c2e696e69743a205f696e697469616c537570706c792063616e206e6f74207a65726f504261736963536d617274506f6f6c2e756e62696e643a207472616e73666572206661696c656450436170706564536d617274506f6f6c2e73746f726167652e6c6f636174696f6e50436170706564536d617274506f6f6c2e77697468696e4361703a20436170206c696d697420726561636865645265656e74727950726f74656374696f6e2e6e6f5265656e7472793a207265656e747279206465746563746564504261736963536d617274506f6f6c2e726562696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e5f70756c6c556e6465726c79696e673a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e726562696e643a207472616e73666572206661696c65645265656e74727950726f74656374696f6e2e73746f726167652e6c6f636174696f6e8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925504261736963536d617274506f6f6c2e696e69743a20616c726561647920696e697469616c69736564504261736963536d617274506f6f6c2e5f70757368556e6465726c79696e673a207472616e73666572206661696c6564504261736963536d617274506f6f6c2e6f6e6c79436f6e74726f6c6c65723a206e6f7420636f6e74726f6c6c6572504261736963536d617274506f6f6c2e696e69743a205f62506f6f6c2063616e6e6f7420626520307830302e2e2e2e303030504261736963536d617274506f6f6c2e6f6e6c795075626c6963537761705365747465723a206e6f74207075626c6963207377617020736574746572a2646970667358221220921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e564736f6c63430006040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063652062c511610130578063be1d24ad116100b8578063dd62ed3e1161007c578063dd62ed3e14610828578063e4e1e53814610856578063ec565ffe14610888578063fd68f22314610890578063fde924f71461089857610232565b8063be1d24ad146106e3578063cf5e7bd314610700578063d2209ad914610726578063d4cadf68146107f4578063d73dd623146107fc57610232565b806392eefe9b116100ff57806392eefe9b1461060b57806395d89b4114610631578063a9059cbb14610639578063aa6ca80814610665578063bd5437e8146106bd57610232565b8063652062c5146105a957806366188463146105b157806370a08231146105dd578063830df8521461060357610232565b806334e19907116101be57806347786d371161018257806347786d371461053757806349b59552146105545780634cde1618146105735780634eee8d151461057b578063554d578d146105a157610232565b806334e199071461040d57806334e7a19f1461042a578063371babdc146104475780633fdddaa2146104fd57806344b250521461052f57610232565b806323b872dd1161020557806323b872dd146103165780632c500bc81461034c5780632fecc529146103705780633018205f146103e7578063313ce567146103ef57610232565b806306fdde0314610237578063095ea7b3146102b4578063099e9e2a146102f457806318160ddd1461030e575b600080fd5b61023f6108a0565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610279578181015183820152602001610261565b50505050905090810190601f1680156102a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e0600480360360408110156102ca57600080fd5b506001600160a01b038135169060200135610939565b604080519115158252519081900360200190f35b6102fc61099f565b60408051918252519081900360200190f35b6102fc6109d4565b6102e06004803603606081101561032c57600080fd5b506001600160a01b038135811691602081013590911690604001356109e7565b610354610b5c565b604080516001600160a01b039092168252519081900360200190f35b6103e56004803603604081101561038657600080fd5b81359190810190604081016020820135600160201b8111156103a757600080fd5b8201836020820111156103b957600080fd5b803590602001918460208302840111600160201b831117156103da57600080fd5b509092509050610b75565b005b610354610f8a565b6103f7610fa6565b6040805160ff9092168252519081900360200190f35b6103e56004803603602081101561042357600080fd5b5035610fab565b6103e56004803603602081101561044057600080fd5b5035611104565b6104646004803603602081101561045d57600080fd5b50356111c0565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156104a8578181015183820152602001610490565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104e75781810151838201526020016104cf565b5050505090500194505050505060405180910390f35b6103e56004803603606081101561051357600080fd5b506001600160a01b038135169060208101359060400135611406565b610354611898565b6103e56004803603602081101561054d57600080fd5b50356118b4565b6103e56004803603602081101561056a57600080fd5b50351515611976565b610354611a68565b6103e56004803603602081101561059157600080fd5b50356001600160a01b0316611a84565b6102fc611b6f565b6102fc611b7f565b6102e0600480360360408110156105c757600080fd5b506001600160a01b038135169060200135611b9a565b6102fc600480360360208110156105f357600080fd5b50356001600160a01b0316611c8f565b6102fc611cbb565b6103e56004803603602081101561062157600080fd5b50356001600160a01b0316611cd6565b61023f611dc1565b6102e06004803603604081101561064f57600080fd5b506001600160a01b038135169060200135611e27565b61066d611e3d565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a9578181015183820152602001610691565b505050509050019250505060405180910390f35b6103e5600480360360208110156106d357600080fd5b50356001600160a01b0316611f56565b6103e5600480360360208110156106f957600080fd5b5035612041565b6103e56004803603602081101561071657600080fd5b50356001600160a01b0316612378565b6103e56004803603608081101561073c57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561076657600080fd5b82018360208201111561077857600080fd5b803590602001918460018302840111600160201b8311171561079957600080fd5b919390929091602081019035600160201b8111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111600160201b831117156107e957600080fd5b919350915035612599565b6102fc6126fd565b6102e06004803603604081101561081257600080fd5b506001600160a01b03813516906020013561277b565b6102fc6004803603604081101561083e57600080fd5b506001600160a01b0381358116916020013516612815565b6103e56004803603606081101561086c57600080fd5b506001600160a01b03813516906020810135906040013561284f565b6102fc612a86565b6103e5612ab6565b6102e0612d17565b60606108aa612d64565b805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b505050505090505b90565b600081610944612d64565b336000818152600492909201602090815260408084206001600160a01b03891680865290835293819020949094558351868152935192939192600080516020613d5c8339815191529281900390910190a35060015b92915050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902081565b60006109de612d64565b60020154905090565b6000806109f2612d64565b9050336001600160a01b0386161480610a3057506001600160a01b038516600090815260048201602090815260408083203384529091529020548311155b610a7a576040805162461bcd60e51b815260206004820152601660248201527522a9292fa821aa27a5a2a72fa120a22fa1a0a62622a960511b604482015290519081900360640190fd5b610a85858585612d94565b336001600160a01b03861614801590610ac557506001600160a01b0385166000908152600482016020908152604080832033845290915290205460001914155b15610b51576001600160a01b03851660009081526004820160209081526040808320338452909152902054610b00908463ffffffff612ec816565b6001600160a01b03868116600090815260048401602090815260408083203380855290835292819020859055805194855251928816939192600080516020613d5c8339815191529281900390910190a35b506001949350505050565b6000610b66612f2a565b546001600160a01b0316905090565b6000610b7f612f2a565b546001600160a01b03161415610bdc576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b610be4612f5f565b805460010190556000610bf5612f5f565b5490506000610c02612f2a565b546001600160a01b031690506000610c186109d4565b90506000610c2c878363ffffffff612f8116565b905080610c3857600080fd5b610c423388613094565b610c4b8761309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c8657600080fd5b505afa158015610c9a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610cc357600080fd5b8101908080516040519392919084600160201b821115610ce257600080fd5b908301906020820185811115610cf757600080fd5b82518660208202830111600160201b82111715610d1357600080fd5b82525081516020918201928201910280838360005b83811015610d40578181015183820152602001610d28565b50505050905001604052505050905060008090505b8151811015610ec457610dae828281518110610d6d57fe5b60200260200101518989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130a792505050565b15610db857610ebc565b6000828281518110610dc657fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e2857600080fd5b505afa158015610e3c573d6000803e3d6000fd5b505050506040513d6020811015610e5257600080fd5b505190506000610e68868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a3610eb8833383856131bf565b5050505b600101610d55565b50336001600160a01b03167fe27d877155575efc81398b13b114bbbbfd49b156eb72e9f6c691f3b72b8adf9489898960405180848152602001806020018281038252848482818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a250505050610f46612f5f565b548114610f845760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b50505050565b6000610f94612f2a565b600101546001600160a01b0316905090565b601281565b610fb3612f2a565b600101546001600160a01b03163314610ffd5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611005612f5f565b805460010190556000611016612f5f565b5460408051848152905191925033917f44ef267e747417ef6614a0ab5bee304ba1a35d76759d34170d1b74a850a9d0339181900360200190a2611057612f2a565b54604080516334e1990760e01b81526004810185905290516001600160a01b03909216916334e199079160248082019260009290919082900301818387803b1580156110a257600080fd5b505af11580156110b6573d6000803e3d6000fd5b505050506110c2612f5f565b5481146111005760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b5050565b61110c612f5f565b80546001019055600061111d612f5f565b549050611129826133a7565b611131612f5f565b54811461116f5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b506111786136bd565b546111816109d4565b106111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c5a602d913960400191505060405180910390fd5b50565b6060806111cb612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b15801561120e57600080fd5b505afa158015611222573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561124b57600080fd5b8101908080516040519392919084600160201b82111561126a57600080fd5b90830190602082018581111561127f57600080fd5b82518660208202830111600160201b8211171561129b57600080fd5b82525081516020918201928201910280838360005b838110156112c85781810151838201526020016112b0565b5050505090500160405250505091508151604051908082528060200260200182016040528015611302578160200160208202803683370190505b509050600061131f6113126109d4565b859063ffffffff612f8116565b905060005b83518110156113ff57600084828151811061133b57fe5b60200260200101519050600061134f612f2a565b546040805163f8b2cb4f60e01b81526001600160a01b0385811660048301529151919092169163f8b2cb4f916024808301926020929190829003018186803b15801561139a57600080fd5b505afa1580156113ae573d6000803e3d6000fd5b505050506040513d60208110156113c457600080fd5b5051905060006113da858363ffffffff6130fd16565b9050808685815181106113e957fe5b6020908102919091010152505050600101611324565b5050915091565b61140e612f2a565b600301546001600160a01b031633146114585760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b611460612f5f565b805460010190556000611471612f5f565b549050600061147e612f2a565b5460408051631185197d60e31b81526001600160a01b038881166004830152915191909216925086918391638c28cbe89160248082019260009290919082900301818387803b1580156114d057600080fd5b505af11580156114e4573d6000803e3d6000fd5b505050506000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d602081101561156a57600080fd5b50519050808611156116e7576001600160a01b0382166323b872dd33306115978a8663ffffffff612ec816565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156115ff57600080fd5b505af1158015611613573d6000803e3d6000fd5b505050506040513d602081101561162957600080fd5b50516116665760405162461bcd60e51b815260040180806020018281038252602b815260200180613cb4602b913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038581166004830152600019602483015291519184169163095ea7b3916044808201926020929091908290030181600087803b1580156116ba57600080fd5b505af11580156116ce573d6000803e3d6000fd5b505050506040513d60208110156116e457600080fd5b50505b60408051631feeed5160e11b81526001600160a01b0389811660048301526024820189905260448201889052915191851691633fdddaa29160648082019260009290919082900301818387803b15801561174057600080fd5b505af1158015611754573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03861692506370a0823191602480820192602092909190829003018186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d60208110156117cc57600080fd5b50519050801561188c576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b15801561182557600080fd5b505af1158015611839573d6000803e3d6000fd5b505050506040513d602081101561184f57600080fd5b505161188c5760405162461bcd60e51b8152600401808060200182810382526027815260200180613d136027913960400191505060405180910390fd5b50505050610f46612f5f565b60006118a2612f2a565b600301546001600160a01b0316905090565b6118bc612f2a565b600101546001600160a01b031633146119065760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b61190e612f5f565b80546001019055600061191f612f5f565b549050337f6bc200110c7794738d401810b22ef824a2044a8ccb022d4ad8769840370331f561194c6136bd565b5460408051918252602082018690528051918290030190a28161196d6136bd565b556110c2612f5f565b61197e612f2a565b600201546001600160a01b031633146119c85760405162461bcd60e51b815260040180806020018281038252603c815260200180613e35603c913960400191505060405180910390fd5b6119d0612f5f565b8054600101905560006119e1612f5f565b546040519091508215159033907feda6fce4059a79def1a5550dd645183dbd84a324dde2aba020658eb3d7f84a8790600090a3611a1c612f2a565b54604080516324dacaa960e11b8152841515600482015290516001600160a01b03909216916349b595529160248082019260009290919082900301818387803b1580156110a257600080fd5b6000611a72612f2a565b600201546001600160a01b0316905090565b611a8c612f2a565b600101546001600160a01b03163314611ad65760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611ade612f5f565b805460010190556000611aef612f5f565b5490506001600160a01b038216611b04612f2a565b600201546040516001600160a01b03909116907fc2f50b6bc4bd45505f1557a7d4b19c5177d334181ae1179d335020424d3736c490600090a381611b46612f2a565b60020180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6000611b796136bd565b54905090565b604051806021613c3982396021019050604051809103902081565b600080611ba5612d64565b33600090815260048201602090815260408083206001600160a01b038916845290915290205490915080841115611c015733600090815260048301602090815260408083206001600160a01b0389168452909152812055611c38565b611c11818563ffffffff612ec816565b33600090815260048401602090815260408083206001600160a01b038a1684529091529020555b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190205481519081529051929392600080516020613d5c833981519152929181900390910190a3506001949350505050565b6000611c99612d64565b6001600160a01b03929092166000908152600390920160205250604090205490565b604051806022613d3a82396022019050604051809103902081565b611cde612f2a565b600101546001600160a01b03163314611d285760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611d30612f5f565b805460010190556000611d41612f5f565b5490506001600160a01b038216611d56612f2a565b600101546040516001600160a01b03909116907f6aef1fb5b23d0e109fc7f2b0601019e1edbacd177e31a441ec8548e8dd14f0f790600090a381611d98612f2a565b60010180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b6060611dcb612d64565b60019081018054604080516020600295841615610100026000190190931694909404601f81018390048302850183019091528084529083018282801561092e5780601f106109035761010080835404028352916020019161092e565b6000611e34338484612d94565b50600192915050565b6060611e47612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169163cc77828d91600480820192600092909190829003018186803b158015611e8a57600080fd5b505afa158015611e9e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015611ec757600080fd5b8101908080516040519392919084600160201b821115611ee657600080fd5b908301906020820185811115611efb57600080fd5b82518660208202830111600160201b82111715611f1757600080fd5b82525081516020918201928201910280838360005b83811015611f44578181015183820152602001611f2c565b50505050905001604052505050905090565b611f5e612f2a565b600101546001600160a01b03163314611fa85760405162461bcd60e51b815260040180806020018281038252602e815260200180613dd5602e913960400191505060405180910390fd5b611fb0612f5f565b805460010190556000611fc1612f5f565b5490506001600160a01b038216611fd6612f2a565b600301546040516001600160a01b03909116907fcbca212b561161352cbd1ef8956a916a93bee0f84bb6a3af9118af675266a96390600090a381612018612f2a565b60030180546001600160a01b0319166001600160a01b03929092169190911790556110c2612f5f565b600061204b612f2a565b546001600160a01b031614156120a8576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6120b0612f5f565b8054600101905560006120c1612f5f565b54905060006120ce612f2a565b546001600160a01b0316905060006120e46109d4565b905060006120f8858363ffffffff612f8116565b90508061210457600080fd5b61210e3386613094565b6121178561309e565b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561215257600080fd5b505afa158015612166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561218f57600080fd5b8101908080516040519392919084600160201b8211156121ae57600080fd5b9083019060208201858111156121c357600080fd5b82518660208202830111600160201b821117156121df57600080fd5b82525081516020918201928201910280838360005b8381101561220c5781810151838201526020016121f4565b50505050905001604052505050905060008090505b815181101561233557600082828151811061223857fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561229a57600080fd5b505afa1580156122ae573d6000803e3d6000fd5b505050506040513d60208110156122c457600080fd5b5051905060006122da868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917fe74c91552b64c2e2e7bd255639e004e693bd3e1d01cc33e65610b86afcc1ffed919081900360200190a361232a833383856131bf565b505050600101612221565b5060408051878152905133917fbc865856a1e9f1dfe2abde98edc2eefe87b6c391a47032388ef36d8c2474aad3919081900360200190a2505050506110c2612f5f565b612380612f2a565b600301546001600160a01b031633146123ca5760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6123d2612f5f565b8054600101905560006123e3612f5f565b54905060006123f0612f2a565b546040805163cf5e7bd360e01b81526001600160a01b03868116600483015291519190921692508491839163cf5e7bd39160248082019260009290919082900301818387803b15801561244257600080fd5b505af1158015612456573d6000803e3d6000fd5b5050604080516370a0823160e01b81523060048201529051600093506001600160a01b03851692506370a0823191602480820192602092909190829003018186803b1580156124a457600080fd5b505afa1580156124b8573d6000803e3d6000fd5b505050506040513d60208110156124ce57600080fd5b50519050801561258e576040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0384169163a9059cbb9160448083019260209291908290030181600087803b15801561252757600080fd5b505af115801561253b573d6000803e3d6000fd5b505050506040513d602081101561255157600080fd5b505161258e5760405162461bcd60e51b8152600401808060200182810382526027815260200180613c126027913960400191505060405180910390fd5b5050506110c2612f5f565b60006125a3612f2a565b80549091506001600160a01b0316156125ed5760405162461bcd60e51b8152600401808060200182810382526029815260200180613d7c6029913960400191505060405180910390fd5b6001600160a01b0387166126325760405162461bcd60e51b8152600401808060200182810382526032815260200180613e036032913960400191505060405180910390fd5b8161266e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613be16031913960400191505060405180910390fd5b80546001600160a01b0388166001600160a01b031991821617825560018201805482163390811790915560028301805483168217905560038301805490921617905585856126ba612d64565b6126c5929091613aee565b5083836126d0612d64565b60010191906126e0929190613aee565b506126ea826136df565b6126f433836136e8565b50505050505050565b6000612707612f2a565b5460408051631a995bed60e31b815290516001600160a01b039092169163d4cadf6891600480820192602092909190829003018186803b15801561274a57600080fd5b505afa15801561275e573d6000803e3d6000fd5b505050506040513d602081101561277457600080fd5b5051905090565b600080612786612d64565b33600090815260048201602090815260408083206001600160a01b03891684529091529020549091506127bf908463ffffffff6136f216565b33600081815260048401602090815260408083206001600160a01b038a16808552908352928190208590558051948552519193600080516020613d5c833981519152929081900390910190a35060019392505050565b600061281f612d64565b6001600160a01b039384166000908152600491909101602090815260408083209490951682529290925250205490565b612857612f2a565b600301546001600160a01b031633146128a15760405162461bcd60e51b8152600401808060200182810382526031815260200180613bb06031913960400191505060405180910390fd5b6128a9612f5f565b8054600101905560006128ba612f5f565b54905060006128c7612f2a565b54604080516323b872dd60e01b81523360048201523060248201526044810187905290516001600160a01b03928316935087928316916323b872dd9160648083019260209291908290030181600087803b15801561292457600080fd5b505af1158015612938573d6000803e3d6000fd5b505050506040513d602081101561294e57600080fd5b505161298b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b876029913960400191505060405180910390fd5b6040805163095ea7b360e01b81526001600160a01b038481166004830152600019602483015291519183169163095ea7b3916044808201926020929091908290030181600087803b1580156129df57600080fd5b505af11580156129f3573d6000803e3d6000fd5b505050506040513d6020811015612a0957600080fd5b505060408051631c9c3ca760e31b81526001600160a01b038881166004830152602482018890526044820187905291519184169163e4e1e5389160648082019260009290919082900301818387803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050505050610f46612f5f565b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902081565b612abe612f5f565b805460010190556000612acf612f5f565b5490506000612adc612f2a565b546040805163cc77828d60e01b815290516001600160a01b039092169250606091839163cc77828d916004808301926000929190829003018186803b158015612b2457600080fd5b505afa158015612b38573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612b6157600080fd5b8101908080516040519392919084600160201b821115612b8057600080fd5b908301906020820185811115612b9557600080fd5b82518660208202830111600160201b82111715612bb157600080fd5b82525081516020918201928201910280838360005b83811015612bde578181015183820152602001612bc6565b50505050905001604052505050905060008090505b8151811015612ca557818181518110612c0857fe5b60200260200101516001600160a01b031663095ea7b3846000196040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c7157600080fd5b505af1158015612c85573d6000803e3d6000fd5b505050506040513d6020811015612c9b57600080fd5b5050600101612bf3565b506040517f198f462153295cccb18f8ac2ae01bf2fc81f948daad29b15c5a9ad53370b07e590600090a15050612cd9612f5f565b5481146111bd5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c87602d913960400191505060405180910390fd5b6000612d21612f2a565b546040805163fde924f760e01b815290516001600160a01b039092169163fde924f791600480820192602092909190829003018186803b15801561274a57600080fd5b60408051772821aa37b5b2b71739ba37b930b3b2973637b1b0ba34b7b760411b8152905190819003601801902090565b6000612d9e612d64565b6001600160a01b0385166000908152600382016020526040902054909150821115612e07576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b6001600160a01b0384166000908152600382016020526040902054612e32908363ffffffff612ec816565b6001600160a01b0380861660009081526003840160205260408082209390935590851681522054612e69908363ffffffff6136f216565b6001600160a01b03808516600081815260038501602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505050565b6000806000612ed78585613746565b915091508015612f22576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b604080517f504261736963536d617274506f6f6c2e73746f726167652e6c6f636174696f6e8152905190819003602001902090565b6000806040518080613d3a602291396040519081900360220190209392505050565b600081612fc4576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612fec5750670de0b6b3a7640000848281612fe957fe5b04145b613030576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6002830481018181101561307e576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600084828161308957fe5b049695505050505050565b611100828261376b565b6111bd81613776565b6000805b82518110156130f357836001600160a01b03168382815181106130ca57fe5b60200260200101516001600160a01b031614156130eb576001915050610999565b6001016130ab565b5060009392505050565b600082820283158061311757508284828161311457fe5b04145b61315b576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b200008101818110156131ae576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a764000082613089565b60006131c9612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b15801561321b57600080fd5b505afa15801561322f573d6000803e3d6000fd5b505050506040513d602081101561324557600080fd5b505190506001600160a01b038216633fdddaa287613269868863ffffffff612ec816565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b1580156132c057600080fd5b505af11580156132d4573d6000803e3d6000fd5b50505050856001600160a01b031663a9059cbb86866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561333857600080fd5b505af115801561334c573d6000803e3d6000fd5b505050506040513d602081101561336257600080fd5b505161339f5760405162461bcd60e51b8152600401808060200182810382526030815260200180613da56030913960400191505060405180910390fd5b505050505050565b60006133b1612f2a565b546001600160a01b0316141561340e576040805162461bcd60e51b815260206004820181905260248201527f504261736963536d617274506f6f6c2e72656164793a206e6f74207265616479604482015290519081900360640190fd5b6000613418612f2a565b546001600160a01b03169050600061342e6109d4565b90506000613442848363ffffffff612f8116565b90508061344e57600080fd5b6060836001600160a01b031663cc77828d6040518163ffffffff1660e01b815260040160006040518083038186803b15801561348957600080fd5b505afa15801561349d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156134c657600080fd5b8101908080516040519392919084600160201b8211156134e557600080fd5b9083019060208201858111156134fa57600080fd5b82518660208202830111600160201b8211171561351657600080fd5b82525081516020918201928201910280838360005b8381101561354357818101518382015260200161352b565b50505050905001604052505050905060008090505b815181101561366c57600082828151811061356f57fe5b602002602001015190506000866001600160a01b031663f8b2cb4f836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156135d157600080fd5b505afa1580156135e5573d6000803e3d6000fd5b505050506040513d60208110156135fb57600080fd5b505190506000613611868363ffffffff6130fd16565b6040805182815290519192506001600160a01b0385169133917f63982df10efd8dfaaaa0fcc7f50b2d93b7cba26ccc48adee2873220d485dc39a919081900360200190a36136618333838561386a565b505050600101613558565b50613676856136df565b61368033866136e8565b60408051868152905133917f7a011ddbb8da163de89faccb018bb75c616e6ac270738b8bf1785f08ae1b2d6f919081900360200190a25050505050565b6000806040518080613c39602191396040519081900360210190209392505050565b6111bd81613a4c565b6111008282613ae3565b60008282018381101561373f576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b9392505050565b60008082841061375c5750508082036000613764565b505081810360015b9250929050565b611100823083612d94565b6000613780612d64565b3060009081526003820160205260409020549091508211156137e0576040805162461bcd60e51b815260206004820152601460248201527311549497d25394d551919250d251539517d0905360621b604482015290519081900360640190fd5b306000908152600382016020526040902054613802908363ffffffff612ec816565b3060009081526003830160205260409020556002810154613829908363ffffffff612ec816565b600282015560408051838152905160009130917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000613874612f2a565b5460408051634a46c67360e11b81526001600160a01b0388811660048301529151919092169250600091839163948d8ce691602480820192602092909190829003018186803b1580156138c657600080fd5b505afa1580156138da573d6000803e3d6000fd5b505050506040513d60208110156138f057600080fd5b5051604080516323b872dd60e01b81526001600160a01b038881166004830152306024830152604482018890529151929350908816916323b872dd916064808201926020929091908290030181600087803b15801561394e57600080fd5b505af1158015613962573d6000803e3d6000fd5b505050506040513d602081101561397857600080fd5b50516139b55760405162461bcd60e51b8152600401808060200182810382526034815260200180613cdf6034913960400191505060405180910390fd5b6001600160a01b038216633fdddaa2876139d5868863ffffffff6136f216565b846040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050600060405180830381600087803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b50505050505050505050565b6000613a56612d64565b306000908152600382016020526040902054909150613a7b908363ffffffff6136f216565b3060009081526003830160205260409020556002810154613aa2908363ffffffff6136f216565b600282015560408051838152905130916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b611100308383612d94565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613b2f5782800160ff19823516178555613b5c565b82800160010185558215613b5c579182015b82811115613b5c578235825591602001919060010190613b41565b50613b68929150613b6c565b5090565b61093691905b80821115613b685760008155600101613b7256fe504261736963536d617274506f6f6c2e62696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e6f6e6c79546f6b656e42696e6465723a206e6f7420746f6b656e2062696e646572504261736963536d617274506f6f6c2e696e69743a205f696e697469616c537570706c792063616e206e6f74207a65726f504261736963536d617274506f6f6c2e756e62696e643a207472616e73666572206661696c656450436170706564536d617274506f6f6c2e73746f726167652e6c6f636174696f6e50436170706564536d617274506f6f6c2e77697468696e4361703a20436170206c696d697420726561636865645265656e74727950726f74656374696f6e2e6e6f5265656e7472793a207265656e747279206465746563746564504261736963536d617274506f6f6c2e726562696e643a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e5f70756c6c556e6465726c79696e673a207472616e7366657246726f6d206661696c6564504261736963536d617274506f6f6c2e726562696e643a207472616e73666572206661696c65645265656e74727950726f74656374696f6e2e73746f726167652e6c6f636174696f6e8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925504261736963536d617274506f6f6c2e696e69743a20616c726561647920696e697469616c69736564504261736963536d617274506f6f6c2e5f70757368556e6465726c79696e673a207472616e73666572206661696c6564504261736963536d617274506f6f6c2e6f6e6c79436f6e74726f6c6c65723a206e6f7420636f6e74726f6c6c6572504261736963536d617274506f6f6c2e696e69743a205f62506f6f6c2063616e6e6f7420626520307830302e2e2e2e303030504261736963536d617274506f6f6c2e6f6e6c795075626c6963537761705365747465723a206e6f74207075626c6963207377617020736574746572a2646970667358221220921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e564736f6c63430006040033
Deployed Bytecode Sourcemap
36262:1432:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36262:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;16365:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16365:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16567:214;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16567:214:0;;-1:-1:-1;;;;;16567:214:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19442:79;;;:::i;:::-;;;;;;;;;;;;;;;;16254:103;;;:::i;17716:566::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;17716:566:0;;;;;;;;;;;;;;;;;:::i;32549:98::-;;;:::i;:::-;;;;-1:-1:-1;;;;;32549:98:0;;;;;;;;;;;;;;26884:936;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;26884:936:0;;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;26884:936:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;26884:936:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;26884:936:0;;-1:-1:-1;26884:936:0;-1:-1:-1;26884:936:0;:::i;:::-;;31386:108;;;:::i;14729:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24460:172;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24460:172:0;;:::i;37107:116::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37107:116:0;;:::i;30738:530::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30738:530:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30738:530:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30738:530:0;;;;;;;;;;;;;;;;;;;28665:1003;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28665:1003:0;;-1:-1:-1;;;;;28665:1003:0;;;;;;;;;;;:::i;31858:101::-;;;:::i;36785:156::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36785:156:0;;:::i;24108:181::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24108:181:0;;;;:::i;31627:111::-;;;:::i;23301:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23301:244:0;-1:-1:-1;;;;;23301:244:0;;:::i;37327:85::-;;;:::i;36316:80::-;;;:::i;17097:451::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17097:451:0;;-1:-1:-1;;;;;17097:451:0;;;;;;:::i;16127:119::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16127:119:0;-1:-1:-1;;;;;16127:119:0;;:::i;18486:80::-;;;:::i;22924:193::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22924:193:0;-1:-1:-1;;;;;22924:193:0;;:::i;16464:95::-;;;:::i;17556:152::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17556:152:0;;-1:-1:-1;;;;;17556:152:0;;;;;;:::i;30285:127::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30285:127:0;;;;;;;;;;;;;;;;;23716:209;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23716:209:0;-1:-1:-1;;;;;23716:209:0;;:::i;25934:717::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25934:717:0;;:::i;29764:513::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29764:513:0;-1:-1:-1;;;;;29764:513:0;;:::i;21531:741::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;21531:741:0;;-1:-1:-1;;;;;21531:741:0;;;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;21531:741:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;21531:741:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;21531:741:0;;;;;;;;;;;-1:-1:-1;;;11:28;;8:2;;;52:1;49;42:12;8:2;21531:741:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;21531:741:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;21531:741:0;;-1:-1:-1;21531:741:0;-1:-1:-1;21531:741:0;;:::i;32293:105::-;;;:::i;16789:300::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16789:300:0;;-1:-1:-1;;;;;16789:300:0;;;;;;:::i;15980:139::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15980:139:0;;;;;;;;;;:::i;28068:407::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28068:407:0;;-1:-1:-1;;;;;28068:407:0;;;;;;;;;;;:::i;11402:70::-;;;:::i;22437:316::-;;;:::i;32082:106::-;;;:::i;16365:91::-;16404:13;16437:6;:4;:6::i;:::-;16430:18;;;;;;;;;;;;;-1:-1:-1;;16430:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16365:91;;:::o;16567:214::-;16639:4;16693:7;16656:6;:4;:6::i;:::-;16673:10;16656:28;;;;:16;;;;;:28;;;;;;;;-1:-1:-1;;;;;16656:34:0;;;;;;;;;;;:44;;;;16716:35;;;;;;;-1:-1:-1;;16673:10:0;;16716:35;;;;16656:28;;-1:-1:-1;16656:28:0;-1:-1:-1;;;;;16716:35:0;;;;;;;;;-1:-1:-1;16769:4:0;16567:214;;;;;:::o;19442:79::-;19476:45;;;;;;;;;;;;;;;;19442:79;:::o;16254:103::-;16307:4;16331:6;:4;:6::i;:::-;:18;;;16324:25;;16254:103;:::o;17716:566::-;17807:4;17824:13;17840:6;:4;:6::i;:::-;17824:22;-1:-1:-1;;;;;;17865:18:0;;:10;:18;;:62;;-1:-1:-1;;;;;;17898:17:0;;;;;;:11;;;:17;;;;;;;;17916:10;17898:29;;;;;;;;17887:40;;;17865:62;17857:97;;;;;-1:-1:-1;;;17857:97:0;;;;;;;;;;;;-1:-1:-1;;;17857:97:0;;;;;;;;;;;;;;;17965:26;17971:4;17977;17983:7;17965:5;:26::i;:::-;-1:-1:-1;;;;;18006:18:0;;:10;:18;;;;:66;;-1:-1:-1;;;;;;18028:17:0;;;;;;:11;;;:17;;;;;;;;18046:10;18028:29;;;;;;;;-1:-1:-1;;18028:44:0;;18006:66;18002:251;;;-1:-1:-1;;;;;18121:17:0;;;;;;:11;;;:17;;;;;;;;18139:10;18121:29;;;;;;;;:43;;18156:7;18121:34;:43::i;:::-;-1:-1:-1;;;;;18089:17:0;;;;;;;:11;;;:17;;;;;;;;18107:10;18089:29;;;;;;;;;:75;;;18184:57;;;;;;;-1:-1:-1;;18184:57:0;;;;18107:10;;18184:57;;;;18089:17;-1:-1:-1;18089:17:0;-1:-1:-1;;;;;18184:57:0;;;;;;;;;18002:251;-1:-1:-1;18270:4:0;;17716:566;-1:-1:-1;;;;17716:566:0:o;32549:98::-;32591:7;32626:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;32626:12:0;;32549:98;-1:-1:-1;32549:98:0:o;26884:936::-;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;27012:6:::2;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;27012:12:0::2;::::0;-1:-1:-1;27012:12:0::2;27052:13;:11;:13::i;:::-;27035:30:::0;-1:-1:-1;27076:10:0::2;27089:23;:7:::0;27035:30;27089:23:::2;:12;:23;:::i;:::-;27076:36:::0;-1:-1:-1;27131:10:0;27123:19:::2;;12:1:-1;9::::0;2:12:::2;27123:19:0;27155:35;27170:10;27182:7;27155:14;:35::i;:::-;27201:23;27216:7;27201:14;:23::i;:::-;27237;27263:5;-1:-1:-1::0;;;;;27263:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;27263:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;27263:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;27263:24:0;80:15:-1::0;;::::2;-1:-1:::0;;76:31:::2;65:43:::0;::::2;120:4;113:20:::0;15:2:::2;7:11:::0;::::2;4:2;;;31:1;28::::0;21:12:::2;4:2;27263:24:0::0;;::::2;::::0;;;;::::2;::::0;;;;;-1:-1:-1;;;11:20;::::2;8:2;;;44:1;41::::0;34:12:::2;8:2;62:21:::0;;::::2;::::0;123:4:::2;114:14:::0;::::2;138:31:::0;;::::2;135:2;;;182:1;179::::0;172:12:::2;135:2;213:10:::0;;-1:-1;;;244:29;::::2;325:2;307:21:::0;::::2;285:44:::0;::::2;282:59:::0;-1:-1;233:116:::2;230:2;;;362:1;359::::0;352:12:::2;230:2;373:25:::0;;-1:-1;27263:24:0;;421:4:-1::2;412:14:::0;;::::2;::::0;27263:24:0;::::2;::::0;::::2;::::0;412:14:-1;27263:24:0;23:1:-1::2;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;27263:24:0;;;;;;;;::::0;::::2;;27237:50;;27305:6;27314:1:::0;27305:10:::2;;27300:445;27321:6;:13;27317:1;:17;27300:445;;;27430:33;27440:6;27447:1;27440:9;;;;;;;;;;;;;;27451:11;;27430:33;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::2;74:27:::0;;;;-1:-1;27430:9:0::2;::::0;-1:-1:-1;;;27430:33:0:i:2;:::-;27427:80;;;27483:8;;27427:80;27521:9;27533:6;27540:1;27533:9;;;;;;;;;::::0;;::::2;::::0;;;;;;;27568:19:::2;::::0;;-1:-1:-1;;;27568:19:0;;-1:-1:-1;;;;;27568:19:0;;::::2;;::::0;::::2;::::0;;;27533:9;;-1:-1:-1;27557:8:0::2;::::0;27568:16;;::::2;::::0;::::2;::::0;:19;;;;;27533:9;;27568:19;;;;;;:16;:19;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;27568:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;27568:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;27568:19:0;;-1:-1:-1;27602:8:0::2;27613:15;:5:::0;27568:19;27613:15:::2;:10;:15;:::i;:::-;27648:28;::::0;;;;;;;;;-1:-1:-1;;;;;;27648:28:0;::::2;::::0;27657:10:::2;::::0;27648:28:::2;::::0;;;;;::::2;::::0;;::::2;27693:40;27709:1;27712:10;27724:3;27729;27693:15;:40::i;:::-;27300:445;;;;27336:3;;27300:445;;;-1:-1:-1::0;27760:52:0::2;::::0;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;27779:10:::2;::::0;27760:52:::2;::::0;27791:7;;27800:11;;;;27760:52;;;;;27800:11;;27760:52;::::2;::::0;27800:11;27760:52;1:33:-1::2;99:1;81:16:::0;;::::2;74:27:::0;27760:52:0::2;::::0;137:4:-1::2;117:14:::0;;::::2;-1:-1:::0;;113:30:::2;157:16:::0;;::::2;27760:52:0::0;;::::2;::::0;-1:-1:-1;27760:52:0;;-1:-1:-1;;;;;27760:52:0::2;18832:1;;;;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19795:1;26884:936:::0;;;:::o;31386:108::-;31442:7;31469:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;31469:17:0;;31386:108;-1:-1:-1;31386:108:0:o;14729:35::-;14762:2;14729:35;:::o;24460:172::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;24548:32:::2;::::0;;;;;;;18803:18;;-1:-1:-1;24559:10:0::2;::::0;24548:32:::2;::::0;;;;::::2;::::0;;::::2;24591:6;:4;:6::i;:::-;:12:::0;:33:::2;::::0;;-1:-1:-1;;;24591:33:0;;::::2;::::0;::::2;::::0;;;;;-1:-1:-1;;;;;24591:12:0;;::::2;::::0;-1:-1:-1;;24591:33:0;;;;;-1:-1:-1;;24591:33:0;;;;;;;;-1:-1:-1;24591:12:0;:33;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;24591:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;24591:33:0;;;;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20883:1;24460:172:::0;:::o;37107:116::-;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;37191:24:0::2;37207:7:::0;37191:15:::2;:24::i;:::-;18865:6:::1;:4;:6::i;:::-;:18:::0;18852:31;::::1;18844:89;;;;-1:-1:-1::0;;;18844:89:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36567:1;36603:6:::0;:4;:6::i;:::-;:10;36587:13;:11;:13::i;:::-;:26;36579:84;;;;-1:-1:-1;;;36579:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37107:116;:::o;30738:530::-;30815:23;30840:24;30886:6;:4;:6::i;:::-;:12;:31;;;-1:-1:-1;;;30886:31:0;;;;-1:-1:-1;;;;;30886:12:0;;;;-1:-1:-1;;30886:31:0;;;;;:12;;:31;;;;;;;;:12;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;30886:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30886:31:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30886:31:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;30886:31:0;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;325:2;307:21;;285:44;;282:59;-1:-1;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;30886:31:0;;421:4:-1;412:14;;;;30886:31:0;;;;;412:14:-1;30886:31:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30886:31:0;;;;;;;;;;;30877:40;;30952:6;:13;30938:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;30938:28:0;;30928:38;;30977:13;30993:27;31006:13;:11;:13::i;:::-;30993:7;;:27;:12;:27;:::i;:::-;30977:43;-1:-1:-1;31037:9:0;31033:228;31056:6;:13;31052:1;:17;31033:228;;;31092:9;31104:6;31111:1;31104:9;;;;;;;;;;;;;;31092:21;;31128:11;31142:6;:4;:6::i;:::-;:12;:26;;;-1:-1:-1;;;31142:26:0;;-1:-1:-1;;;;;31142:26:0;;;;;;;;;:12;;;;;-1:-1:-1;;31142:26:0;;;;;;;;;;;;;;:12;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;31142:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31142:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31142:26:0;;-1:-1:-1;31183:14:0;31200:15;:5;31142:26;31200:15;:10;:15;:::i;:::-;31183:32;;31243:6;31230:7;31238:1;31230:10;;;;;;;;;;;;;;;;;:19;-1:-1:-1;;;31071:4:0;;31033:228;;;;30738:530;;;;:::o;28665:1003::-;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;28793:6:::2;:4;:6::i;:::-;:12:::0;28934:18:::2;::::0;;-1:-1:-1;;;28934:18:0;;-1:-1:-1;;;;;28934:18:0;;::::2;;::::0;::::2;::::0;;;28793:12;;;::::2;::::0;-1:-1:-1;28934:18:0;;28793:12;;28934:10:::2;::::0;:18;;;;;-1:-1:-1;;28934:18:0;;;;;;;;-1:-1:-1;28793:12:0;28934:18;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28934:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;28986:31:0::2;::::0;;-1:-1:-1;;;28986:31:0;;-1:-1:-1;;;;;28986:31:0;;::::2;;::::0;::::2;::::0;;;28965:18:::2;::::0;-1:-1:-1;28986:15:0;;::::2;::::0;-1:-1:-1;28986:15:0::2;::::0;:31;;;;;::::2;::::0;;;;;;;;:15;:31;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28986:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28986:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;28986:31:0;;-1:-1:-1;29087:21:0;;::::2;29084:238;;;-1:-1:-1::0;;;;;29133:18:0;::::2;;29152:10;29172:4;29179:25;:8:::0;29193:10;29179:13:::2;:25::i;:::-;29133:72;::::0;;-1:-1:-1;;;;;;29133:72:0::2;::::0;;;;;;-1:-1:-1;;;;;29133:72:0;;::::2;;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;;;::::2;::::0;;;;;;;;-1:-1:-1;29133:72:0;;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29133:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29133:72:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29133:72:0;29125:128:::2;;;;-1:-1:-1::0;;;29125:128:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29268:42;::::0;;-1:-1:-1;;;29268:42:0;;-1:-1:-1;;;;;29268:42:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;29268:42:0;;;;;;:13;;::::2;::::0;-1:-1:-1;;29268:42:0;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;29268:13:0;:42;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29268:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29268:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;;29084:238:0::2;29334:39;::::0;;-1:-1:-1;;;29334:39:0;;-1:-1:-1;;;;;29334:39:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;:12;;::::2;::::0;::::2;::::0;:39;;;;;-1:-1:-1;;29334:39:0;;;;;;;;-1:-1:-1;29334:12:0;:39;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29334:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;29480:30:0::2;::::0;;-1:-1:-1;;;29480:30:0;;29504:4:::2;29480:30;::::0;::::2;::::0;;;-1:-1:-1;;;;;;;;29480:15:0;::::2;::::0;-1:-1:-1;;;29480:30:0;;;;;::::2;::::0;;;;;;;;;:15;:30;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29480:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29480:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29480:30:0;;-1:-1:-1;29524:16:0;;29521:140:::2;;29565:40;::::0;;-1:-1:-1;;;29565:40:0;;29580:10:::2;29565:40;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;29565:14:0;::::2;::::0;-1:-1:-1;;29565:40:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;29565:14:0;:40;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29565:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;29565:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;29565:40:0;29557:92:::2;;;;-1:-1:-1::0;;;29557:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18832:1;;;;18865:6:::1;:4;:6::i;31858:101::-:0;31906:7;31933:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;31933:18:0;;31858:101;-1:-1:-1;31858:101:0:o;36785:156::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;36876:10:0::2;36865:40;36888:6;:4;:6::i;:::-;:10:::0;36865:40:::2;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;::::2;36929:4;36916:6;:4;:6::i;:::-;:17:::0;18865:6:::1;:4;:6::i;24108:181::-:0;20965:6;:4;:6::i;:::-;:23;;;-1:-1:-1;;;;;20965:23:0;20951:10;:37;20943:110;;;;-1:-1:-1;;;20943:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;24201:34:::2;::::0;18803:18;;-1:-1:-1;24201:34:0;::::2;;::::0;24215:10:::2;::::0;24201:34:::2;::::0;18803:18:::1;::::0;24201:34:::2;24246:6;:4;:6::i;:::-;:12:::0;:35:::2;::::0;;-1:-1:-1;;;24246:35:0;;;::::2;;;::::0;::::2;::::0;;;-1:-1:-1;;;;;24246:12:0;;::::2;::::0;:26:::2;::::0;:35;;;;;-1:-1:-1;;24246:35:0;;;;;;;;-1:-1:-1;24246:12:0;:35;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;31627:111:0::0;31680:7;31707:6;:4;:6::i;:::-;:23;;;-1:-1:-1;;;;;31707:23:0;;31627:111;-1:-1:-1;31627:111:0:o;23301:244::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23410:70:0;::::2;23434:6;:4;:6::i;:::-;:23;;::::0;23410:70:::2;::::0;-1:-1:-1;;;;;23434:23:0;;::::2;::::0;23410:70:::2;::::0;23434:23:::2;::::0;23410:70:::2;23517:20;23491:6;:4;:6::i;:::-;:23;;:46:::0;;-1:-1:-1;;;;;;23491:46:0::2;-1:-1:-1::0;;;;;23491:46:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;37327:85::-:0;37367:7;37394:6;:4;:6::i;:::-;:10;;-1:-1:-1;37327:85:0;:::o;36316:80::-;36350:46;;;;;;;;;;;;;;;;;;36316:80;:::o;17097:451::-;17169:4;17186:13;17202:6;:4;:6::i;:::-;17247:10;17219:13;17235:23;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17235:29:0;;;;;;;;;;:11;;-1:-1:-1;17279:18:0;;;17275:171;;;17326:10;17346:1;17314:23;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17314:29:0;;;;;;;;;:33;17275:171;;;17412:22;:8;17426:7;17412:22;:13;:22;:::i;:::-;17392:10;17380:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17380:29:0;;;;;;;;;:54;17275:171;17470:10;17488:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;17461:57:0;;17488:29;;;;;;;;;;17461:57;;;;;;;-1:-1:-1;;17461:57:0;;17470:10;17461:57;;17488:23;-1:-1:-1;17488:23:0;-1:-1:-1;;;;;17461:57:0;;;;;;;;;;-1:-1:-1;17536:4:0;;17097:451;-1:-1:-1;;;;17097:451:0:o;16127:119::-;16193:4;16217:6;:4;:6::i;:::-;-1:-1:-1;;;;;16217:21:0;;;;;;;;:14;;;;:21;;-1:-1:-1;16217:21:0;;;;;16127:119::o;18486:80::-;18519:47;;;;;;;;;;;;;;;;;;18486:80;:::o;22924:193::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23018:49:0;::::2;23036:6;:4;:6::i;:::-;:17;;::::0;23018:49:::2;::::0;-1:-1:-1;;;;;23036:17:0;;::::2;::::0;23018:49:::2;::::0;23036:17:::2;::::0;23018:49:::2;23098:11;23078:6;:4;:6::i;:::-;:17;;:31:::0;;-1:-1:-1;;;;;;23078:31:0::2;-1:-1:-1::0;;;;;23078:31:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;16464:95::-:0;16505:13;16538:6;:4;:6::i;:::-;:13;;;;16531:20;;;;;;;;;;;;;-1:-1:-1;;16531:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16538:13;16531:20;;;;;;;;;;;;;;;;;;;;;;;;17556:152;17629:4;17646:32;17652:10;17664:4;17670:7;17646:5;:32::i;:::-;-1:-1:-1;17696:4:0;17556:152;;;;:::o;30285:127::-;30337:16;30373:6;:4;:6::i;:::-;:12;:31;;;-1:-1:-1;;;30373:31:0;;;;-1:-1:-1;;;;;30373:12:0;;;;-1:-1:-1;;30373:31:0;;;;;:12;;:31;;;;;;;;:12;:31;;;2:2:-1;;;;27:1;24;17:12;2:2;30373:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30373:31:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;30373:31:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;15:2;7:11;;4:2;;;31:1;28;21:12;4:2;30373:31:0;;;;;;;;;;;;;-1:-1:-1;;;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;-1:-1;;;244:29;;325:2;307:21;;285:44;;282:59;-1:-1;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;30373:31:0;;421:4:-1;412:14;;;;30373:31:0;;;;;412:14:-1;30373:31:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30373:31:0;;;;;;;;;;;30366:38;;30285:127;:::o;23716:209::-;20804:6;:4;:6::i;:::-;:17;;;-1:-1:-1;;;;;20804:17:0;20790:10;:31;20782:90;;;;-1:-1:-1;;;20782:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;;;;;;23815:55:0;::::2;23834:6;:4;:6::i;:::-;:18;;::::0;23815:55:::2;::::0;-1:-1:-1;;;;;23834:18:0;;::::2;::::0;23815:55:::2;::::0;23834:18:::2;::::0;23815:55:::2;23902:15;23881:6;:4;:6::i;:::-;:18;;:36:::0;;-1:-1:-1;;;;;;23881:36:0::2;-1:-1:-1::0;;;;;23881:36:0;;;::::2;::::0;;;::::2;::::0;;18865:6:::1;:4;:6::i;25934:717::-:0;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;26029:6:::2;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;26029:12:0::2;::::0;-1:-1:-1;26029:12:0::2;26069:13;:11;:13::i;:::-;26052:30:::0;-1:-1:-1;26093:10:0::2;26106:23;:7:::0;26052:30;26106:23:::2;:12;:23;:::i;:::-;26093:36:::0;-1:-1:-1;26148:10:0;26140:19:::2;;12:1:-1;9::::0;2:12:::2;26140:19:0;26172:35;26187:10;26199:7;26172:14;:35::i;:::-;26218:23;26233:7;26218:14;:23::i;:::-;26254;26280:5;-1:-1:-1::0;;;;;26280:22:0::2;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;26280:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;26280:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;26280:24:0;80:15:-1::0;;::::2;-1:-1:::0;;76:31:::2;65:43:::0;::::2;120:4;113:20:::0;15:2:::2;7:11:::0;::::2;4:2;;;31:1;28::::0;21:12:::2;4:2;26280:24:0::0;;::::2;::::0;;;;::::2;::::0;;;;;-1:-1:-1;;;11:20;::::2;8:2;;;44:1;41::::0;34:12:::2;8:2;62:21:::0;;::::2;::::0;123:4:::2;114:14:::0;::::2;138:31:::0;;::::2;135:2;;;182:1;179::::0;172:12:::2;135:2;213:10:::0;;-1:-1;;;244:29;::::2;325:2;307:21:::0;::::2;285:44:::0;::::2;282:59:::0;-1:-1;233:116:::2;230:2;;;362:1;359::::0;352:12:::2;230:2;373:25:::0;;-1:-1;26280:24:0;;421:4:-1::2;412:14:::0;;::::2;::::0;26280:24:0;::::2;::::0;::::2;::::0;412:14:-1;26280:24:0;23:1:-1::2;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::2;84:18:::0;71:11;;::::2;64:39:::0;52:2:::2;45:10;8:100;;;12:14;26280:24:0;;;;;;;;::::0;::::2;;26254:50;;26322:6;26331:1:::0;26322:10:::2;;26317:280;26338:6;:13;26334:1;:17;26317:280;;;26373:9;26385:6;26392:1;26385:9;;;;;;;;;::::0;;::::2;::::0;;;;;;;26420:19:::2;::::0;;-1:-1:-1;;;26420:19:0;;-1:-1:-1;;;;;26420:19:0;;::::2;;::::0;::::2;::::0;;;26385:9;;-1:-1:-1;26409:8:0::2;::::0;26420:16;;::::2;::::0;::::2;::::0;:19;;;;;26385:9;;26420:19;;;;;;:16;:19;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;26420:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;26420:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;26420:19:0;;-1:-1:-1;26454:8:0::2;26465:15;:5:::0;26420:19;26465:15:::2;:10;:15;:::i;:::-;26500:28;::::0;;;;;;;;;-1:-1:-1;;;;;;26500:28:0;::::2;::::0;26509:10:::2;::::0;26500:28:::2;::::0;;;;;::::2;::::0;;::::2;26545:40;26561:1;26564:10;26576:3;26581;26545:15;:40::i;:::-;-1:-1:-1::0;;;26353:3:0::2;;26317:280;;;-1:-1:-1::0;26612:31:0::2;::::0;;;;;;;26623:10:::2;::::0;26612:31:::2;::::0;;;;;::::2;::::0;;::::2;18832:1;;;;18865:6:::1;:4;:6::i;29764:513::-:0;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;29857:6:::2;:4;:6::i;:::-;:12:::0;29962:20:::2;::::0;;-1:-1:-1;;;29962:20:0;;-1:-1:-1;;;;;29962:20:0;;::::2;;::::0;::::2;::::0;;;29857:12;;;::::2;::::0;-1:-1:-1;29962:20:0;;29857:12;;-1:-1:-1;;29962:20:0;;;;;-1:-1:-1;;29962:20:0;;;;;;;;-1:-1:-1;29857:12:0;29962:20;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;29962:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;30089:30:0::2;::::0;;-1:-1:-1;;;30089:30:0;;30113:4:::2;30089:30;::::0;::::2;::::0;;;-1:-1:-1;;;;;;;;30089:15:0;::::2;::::0;-1:-1:-1;;;30089:30:0;;;;;::::2;::::0;;;;;;;;;:15;:30;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;30089:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;30089:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;30089:30:0;;-1:-1:-1;30133:16:0;;30130:140:::2;;30174:40;::::0;;-1:-1:-1;;;30174:40:0;;30189:10:::2;30174:40;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;;;;;30174:14:0;::::2;::::0;-1:-1:-1;;30174:40:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;30174:14:0;:40;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;30174:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;30174:40:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;30174:40:0;30166:92:::2;;;;-1:-1:-1::0;;;30166:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18832:1;;;18865:6:::1;:4;:6::i;21531:741::-:0;21653:13;21669:6;:4;:6::i;:::-;21702:7;;;;-1:-1:-1;;;;;;21702:7:0;21694:30;21686:84;;;;-1:-1:-1;;;21686:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21789:20:0;;21781:83;;;;-1:-1:-1;;;21781:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21883:19;21875:81;;;;-1:-1:-1;;;21875:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21967:24;;-1:-1:-1;;;;;;21967:24:0;;;-1:-1:-1;;;;;21967:24:0;;;;;-1:-1:-1;22002:12:0;;:25;;22017:10;22002:25;;;;;;;;22038:18;;;:31;;;;;;;;22080:13;;;:26;;;;;;;;22131:5;;22117:6;:4;:6::i;:::-;:19;;:11;;:19;:::i;:::-;;22163:7;;22147:6;:4;:6::i;:::-;:13;;:23;;;;;;;:::i;:::-;;22181:30;22196:14;22181;:30::i;:::-;22222:42;22237:10;22249:14;22222;:42::i;:::-;21531:741;;;;;;;:::o;32293:105::-;32338:7;32365:6;:4;:6::i;:::-;:12;:25;;;-1:-1:-1;;;32365:25:0;;;;-1:-1:-1;;;;;32365:12:0;;;;:23;;:25;;;;;;;;;;;;;;;:12;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;32365:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32365:25:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32365:25:0;;-1:-1:-1;32293:105:0;:::o;16789:300::-;16861:4;16878:13;16894:6;:4;:6::i;:::-;16955:10;16943:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;16943:29:0;;;;;;;;;;:11;;-1:-1:-1;16943:43:0;;16978:7;16943:34;:43::i;:::-;16923:10;16911:23;;;;:11;;;:23;;;;;;;;-1:-1:-1;;;;;16911:29:0;;;;;;;;;;;:75;;;17002:57;;;;;;;-1:-1:-1;;16911:29:0;;17002:57;;;;16911:23;-1:-1:-1;16911:23:0;-1:-1:-1;;;;;17002:57:0;;;;;;;;;;-1:-1:-1;17077:4:0;;16789:300;-1:-1:-1;;;16789:300:0:o;15980:139::-;16059:4;16083:6;:4;:6::i;:::-;-1:-1:-1;;;;;16083:22:0;;;;;;;:16;;;;;:22;;;;;;;;:28;;;;;;;;;;-1:-1:-1;16083:28:0;;;15980:139::o;28068:407::-;21141:6;:4;:6::i;:::-;:18;;;-1:-1:-1;;;;;21141:18:0;21127:10;:32;21119:94;;;;-1:-1:-1;;;21119:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18751:6:::1;:4;:6::i;:::-;:21:::0;;::::1;;::::0;;:18:::1;18803:6;:4;:6::i;:::-;:18:::0;;-1:-1:-1;18803:18:0::1;28194:6:::2;:4;:6::i;:::-;:12:::0;28265:55:::2;::::0;;-1:-1:-1;;;28265:55:0;;28284:10:::2;28265:55;::::0;::::2;::::0;28304:4:::2;28265:55:::0;;;;;;;;;;;;-1:-1:-1;;;;;28194:12:0;;::::2;::::0;-1:-1:-1;28239:6:0;;28265:18;::::2;::::0;-1:-1:-1;;28265:55:0;;;;;::::2;::::0;;;;;;;;-1:-1:-1;28265:18:0;:55;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28265:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28265:55:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;28265:55:0;28257:109:::2;;;;-1:-1:-1::0;;;28257:109:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28377:42;::::0;;-1:-1:-1;;;28377:42:0;;-1:-1:-1;;;;;28377:42:0;;::::2;;::::0;::::2;::::0;-1:-1:-1;;28377:42:0;;;;;;:13;;::::2;::::0;-1:-1:-1;;28377:42:0;;;;;::::2;::::0;;;;;;;;;-1:-1:-1;28377:13:0;:42;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28377:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28377:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;;28430:37:0::2;::::0;;-1:-1:-1;;;28430:37:0;;-1:-1:-1;;;;;28430:37:0;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;:10;;::::2;::::0;::::2;::::0;:37;;;;;-1:-1:-1;;28430:37:0;;;;;;;;-1:-1:-1;28430:10:0;:37;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;28430:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;28430:37:0;;;;18832:1;;18865:6:::1;:4;:6::i;11402:70::-:0;11435:37;;;-1:-1:-1;;;11435:37:0;;;;;;;;;;;;11402:70;:::o;22437:316::-;18751:6;:4;:6::i;:::-;:21;;;;;;:18;18803:6;:4;:6::i;:::-;:18;;-1:-1:-1;18803:18:0;22505:6:::1;:4;:6::i;:::-;:12:::0;22554:24:::1;::::0;;-1:-1:-1;;;22554:24:0;;;;-1:-1:-1;;;;;22505:12:0;;::::1;::::0;-1:-1:-1;22528:23:0::1;::::0;22505:12;;-1:-1:-1;;22554:24:0::1;::::0;;::::1;::::0;22505:12:::1;::::0;22554:24;;;;;;;22505:12;22554:24;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22554:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22554:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;22554:24:0;80:15:-1::0;;::::1;-1:-1:::0;;76:31:::1;65:43:::0;::::1;120:4;113:20:::0;15:2:::1;7:11:::0;::::1;4:2;;;31:1;28::::0;21:12:::1;4:2;22554:24:0::0;;::::1;::::0;;;;::::1;::::0;;;;;-1:-1:-1;;;11:20;::::1;8:2;;;44:1;41::::0;34:12:::1;8:2;62:21:::0;;::::1;::::0;123:4:::1;114:14:::0;::::1;138:31:::0;;::::1;135:2;;;182:1;179::::0;172:12:::1;135:2;213:10:::0;;-1:-1;;;244:29;::::1;325:2;307:21:::0;::::1;285:44:::0;::::1;282:59:::0;-1:-1;233:116:::1;230:2;;;362:1;359::::0;352:12:::1;230:2;373:25:::0;;-1:-1;22554:24:0;;421:4:-1::1;412:14:::0;;::::1;::::0;22554:24:0;::::1;::::0;::::1;::::0;412:14:-1;22554:24:0;23:1:-1::1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;22554:24:0;;;;;;;;::::0;::::1;;22528:50;;22593:9;22605:1:::0;22593:13:::1;;22589:125;22612:6;:13;22608:1;:17;22589:125;;;22655:6;22662:1;22655:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;22648:54:::1;::::0;;-1:-1:-1;;;22648:54:0;;-1:-1:-1;;;;;22648:54:0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;22648:54:0;;;;;;:25;;;::::1;::::0;::::1;::::0;:54;;;;;;;;;;;-1:-1:-1;22648:25:0;:54;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;22648:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;22648:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;;22627:4:0::1;;22589:125;;;-1:-1:-1::0;22729:16:0::1;::::0;::::1;::::0;;;::::1;18832:1;;18865:6:::0;:4;:6::i;:::-;:18;18852:31;;18844:89;;;;-1:-1:-1;;;18844:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32082:106;32129:4;32153:6;:4;:6::i;:::-;:12;:27;;;-1:-1:-1;;;32153:27:0;;;;-1:-1:-1;;;;;32153:12:0;;;;-1:-1:-1;;32153:27:0;;;;;;;;;;;;;;;:12;:27;;;2:2:-1;;;;27:1;24;17:12;11812:151:0;11435:37;;;-1:-1:-1;;;11435:37:0;;;;;;;;;;;;;11917:39::o;15406:338::-;15483:13;15499:6;:4;:6::i;:::-;-1:-1:-1;;;;;15524:15:0;;;;;;:9;;;:15;;;;;;:9;;-1:-1:-1;;;15524:26:0;15516:59;;;;;-1:-1:-1;;;15516:59:0;;;;;;;;;;;;-1:-1:-1;;;15516:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15604:15:0;;;;;;:9;;;:15;;;;;;:29;;15625:7;15604:20;:29::i;:::-;-1:-1:-1;;;;;15586:15:0;;;;;;;:9;;;:15;;;;;;:47;;;;15662:15;;;;;;;:29;;15683:7;15662:20;:29::i;:::-;-1:-1:-1;;;;;15644:15:0;;;;;;;:9;;;:15;;;;;;;;;:47;;;;15707:29;;;;;;;15644:15;;15707:29;;;;;;;;;;;;;15406:338;;;;:::o;12671:202::-;12742:4;12765:6;12773:9;12786:14;12795:1;12798;12786:8;:14::i;:::-;12764:36;;;;12820:4;12819:5;12811:35;;;;;-1:-1:-1;;;12811:35:0;;;;;;;;;;;;-1:-1:-1;;;12811:35:0;;;;;;;;;;;;;;;-1:-1:-1;12864:1:0;12671:202;-1:-1:-1;;;12671:202:0:o;36019:152::-;19476:45;;;;;;;;;;;;;;;;;36125:39::o;19083:151::-;19122:13;19148:11;18519:47;;;;;;;;;;;;;;;;;;;19188:39;-1:-1:-1;;;19188:39:0:o;13280:387::-;13351:4;13381:6;13373:31;;;;;-1:-1:-1;;;13373:31:0;;;;;;;;;;;;-1:-1:-1;;;13373:31:0;;;;;;;;;;;;;;;12056:6;13425:8;;13452:6;;;:24;;;12056:6;13467:1;13462:2;:6;;;;;;:14;13452:24;13444:53;;;;;-1:-1:-1;;;13444:53:0;;;;;;;;;;;;-1:-1:-1;;;13444:53:0;;;;;;;;;;;;;;;13545:1;13541:5;;13535:12;;13566:8;;;;13558:37;;;;;-1:-1:-1;;;13558:37:0;;;;;;;;;;;;-1:-1:-1;;;13558:37:0;;;;;;;;;;;;;;;13623:7;13638:1;13633:2;:6;;;;;;;13280:387;-1:-1:-1;;;;;;13280:387:0:o;34538:119::-;34628:21;34634:5;34641:7;34628:5;:21::i;34770:97::-;34845:14;34851:7;34845:5;:14::i;35624:280::-;35710:4;;35727:147;35750:9;:16;35746:1;:20;35727:147;;;35792:12;;-1:-1:-1;;;;;35792:23:0;;;:9;;35802:1;;35792:12;;;;;;;;;;;;-1:-1:-1;;;;;35792:23:0;;35789:74;;;35843:4;35836:11;;;;;35789:74;35768:4;;35727:147;;;-1:-1:-1;35891:5:0;;35624:280;-1:-1:-1;;;35624:280:0:o;12922:311::-;12993:4;13025:5;;;13049:6;;;:21;;;13069:1;13064;13059:2;:6;;;;;;:11;13049:21;13041:50;;;;;-1:-1:-1;;;13041:50:0;;;;;;;;;;;;-1:-1:-1;;;13041:50:0;;;;;;;;;;;;;;;13118:8;13112:15;;13146:8;;;;13138:37;;;;;-1:-1:-1;;;13138:37:0;;;;;;;;;;;;-1:-1:-1;;;13138:37:0;;;;;;;;;;;;;;;13186:7;12056:6;13196:2;:9;;33867:503;33998:12;34013:6;:4;:6::i;:::-;:12;34143:35;;;-1:-1:-1;;;34143:35:0;;-1:-1:-1;;;;;34143:35:0;;;;;;;;;34013:12;;;;;-1:-1:-1;;;34013:12:0;;34143:27;;:35;;;;;;;;;;;;;;;34013:12;34143:35;;;2:2:-1;;;;27:1;24;17:12;2:2;34143:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34143:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34143:35:0;;-1:-1:-1;;;;;;34189:12:0;;;34202:6;34210:27;:13;34229:7;34210:18;:27::i;:::-;34189:62;;;-1:-1:-1;;;;;;34189:62:0;;;;;;;-1:-1:-1;;;;;34189:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34189:62:0;;;;;;;-1:-1:-1;34189:62:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;34189:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;34272:37:0;;;-1:-1:-1;;;34272:37:0;;-1:-1:-1;;;;;34272:37:0;;;;;;;;;;;;;;;:23;;;;-1:-1:-1;34272:23:0;;-1:-1:-1;34272:37:0;;;;;;;;;;;;;;;-1:-1:-1;34272:23:0;:37;;;2:2:-1;;;;27:1;24;17:12;2:2;34272:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34272:37:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34272:37:0;34264:98;;;;-1:-1:-1;;;34264:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33867:503;;;;;;:::o;25049:733::-;19745:1;19720:6;:4;:6::i;:::-;:12;-1:-1:-1;;;;;19720:12:0;19712:35;;19704:80;;;;;-1:-1:-1;;;19704:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25119:12:::1;25134:6;:4;:6::i;:::-;:12:::0;-1:-1:-1;;;;;25134:12:0::1;::::0;-1:-1:-1;25134:12:0::1;25174:13;:11;:13::i;:::-;25157:30:::0;-1:-1:-1;25198:10:0::1;25211:23;:7:::0;25157:30;25211:23:::1;:12;:23;:::i;:::-;25198:36:::0;-1:-1:-1;25253:10:0;25245:19:::1;;12:1:-1;9::::0;2:12:::1;25245:19:0;25277:23;25303:5;-1:-1:-1::0;;;;;25303:22:0::1;;:24;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;25303:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25303:24:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;25303:24:0;80:15:-1::0;;::::1;-1:-1:::0;;76:31:::1;65:43:::0;::::1;120:4;113:20:::0;15:2:::1;7:11:::0;::::1;4:2;;;31:1;28::::0;21:12:::1;4:2;25303:24:0::0;;::::1;::::0;;;;::::1;::::0;;;;;-1:-1:-1;;;11:20;::::1;8:2;;;44:1;41::::0;34:12:::1;8:2;62:21:::0;;::::1;::::0;123:4:::1;114:14:::0;::::1;138:31:::0;;::::1;135:2;;;182:1;179::::0;172:12:::1;135:2;213:10:::0;;-1:-1;;;244:29;::::1;325:2;307:21:::0;::::1;285:44:::0;::::1;282:59:::0;-1:-1;233:116:::1;230:2;;;362:1;359::::0;352:12:::1;230:2;373:25:::0;;-1:-1;25303:24:0;;421:4:-1::1;412:14:::0;;::::1;::::0;25303:24:0;::::1;::::0;::::1;::::0;412:14:-1;25303:24:0;23:1:-1::1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;25303:24:0;;;;;;;;::::0;::::1;;25277:50;;25345:6;25354:1:::0;25345:10:::1;;25340:308;25361:6;:13;25357:1;:17;25340:308;;;25396:9;25408:6;25415:1;25408:9;;;;;;;;;::::0;;::::1;::::0;;;;;;;25443:19:::1;::::0;;-1:-1:-1;;;25443:19:0;;-1:-1:-1;;;;;25443:19:0;;::::1;;::::0;::::1;::::0;;;25408:9;;-1:-1:-1;25432:8:0::1;::::0;25443:16;;::::1;::::0;::::1;::::0;:19;;;;;25408:9;;25443:19;;;;;;:16;:19;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;25443:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;25443:19:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;25443:19:0;;-1:-1:-1;25477:18:0::1;25498:15;:5:::0;25443:19;25498:15:::1;:10;:15;:::i;:::-;25533:38;::::0;;;;;;;;;-1:-1:-1;;;;;;25533:38:0;::::1;::::0;25542:10:::1;::::0;25533:38:::1;::::0;;;;;::::1;::::0;;::::1;25586:50;25602:1;25605:10;25617:13;25632:3;25586:15;:50::i;:::-;-1:-1:-1::0;;;25376:3:0::1;;25340:308;;;;25658:23;25673:7;25658:14;:23::i;:::-;25692:35;25707:10;25719:7;25692:14;:35::i;:::-;25743:31;::::0;;;;;;;25754:10:::1;::::0;25743:31:::1;::::0;;;;;::::1;::::0;;::::1;19795:1;;;;25049:733:::0;:::o;37537:152::-;37576:13;37602:11;36350:46;;;;;;;;;;;;;;;;;;;37643:39;-1:-1:-1;;;37643:39:0:o;34982:97::-;35057:14;35063:7;35057:5;:14::i;35258:115::-;35346:19;35352:3;35357:7;35346:5;:19::i;12127:180::-;12198:4;12229:5;;;12253:6;;;;12245:35;;;;;-1:-1:-1;;;12245:35:0;;;;;;;;;;;;-1:-1:-1;;;12245:35:0;;;;;;;;;;;;;;;12298:1;12127:180;-1:-1:-1;;;12127:180:0:o;12387:223::-;12462:4;12468;12499:1;12494;:6;12490:113;;-1:-1:-1;;12525:5:0;;;12532;12517:21;;12490:113;-1:-1:-1;;12579:5:0;;;12586:4;12490:113;12387:223;;;;;:::o;15864:108::-;15928:36;15934:5;15949:4;15956:7;15928:5;:36::i;15050:348::-;15099:13;15115:6;:4;:6::i;:::-;15158:4;15140:24;;;;:9;;;:24;;;;;;15099:22;;-1:-1:-1;15140:35:0;-1:-1:-1;15140:35:0;15132:68;;;;;-1:-1:-1;;;15132:68:0;;;;;;;;;;;;-1:-1:-1;;;15132:68:0;;;;;;;;;;;;;;;15256:4;15238:24;;;;:9;;;:24;;;;;;:38;;15268:7;15238:38;:29;:38;:::i;:::-;15229:4;15211:24;;;;:9;;;:24;;;;;:65;15303:13;;;;:27;;15322:7;15303:27;:18;:27;:::i;:::-;15287:13;;;:43;15346:44;;;;;;;;15378:1;;15363:4;;15346:44;;;;;;;;;15050:348;;:::o;32999:530::-;33132:12;33147:6;:4;:6::i;:::-;:12;33277:35;;;-1:-1:-1;;;33277:35:0;;-1:-1:-1;;;;;33277:35:0;;;;;;;;;33147:12;;;;;-1:-1:-1;;;33147:12:0;;33277:27;;:35;;;;;;;;;;;;;;;33147:12;33277:35;;;2:2:-1;;;;27:1;24;17:12;2:2;33277:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33277:35:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33277:35:0;33333:58;;;-1:-1:-1;;;33333:58:0;;-1:-1:-1;;;;;33333:58:0;;;;;;;33376:4;33333:58;;;;;;;;;;;;33277:35;;-1:-1:-1;33333:27:0;;;;-1:-1:-1;;33333:58:0;;;;;33277:35;;33333:58;;;;;;;;-1:-1:-1;33333:27:0;:58;;;2:2:-1;;;;27:1;24;17:12;2:2;33333:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33333:58:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33333:58:0;33325:123;;;;-1:-1:-1;;;33325:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33459:12:0;;;33472:6;33480:27;:13;33499:7;33480:18;:27::i;:::-;33459:62;;;-1:-1:-1;;;;;;33459:62:0;;;;;;;-1:-1:-1;;;;;33459:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33459:62:0;;;;;;;-1:-1:-1;33459:62:0;;;;2:2:-1;;;;27:1;24;17:12;2:2;33459:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33459:62:0;;;;32999:530;;;;;;:::o;14773:269::-;14822:13;14838:6;:4;:6::i;:::-;14900:4;14882:24;;;;:9;;;:24;;;;;;14822:22;;-1:-1:-1;14882:38:0;;14912:7;14882:38;:29;:38;:::i;:::-;14873:4;14855:24;;;;:9;;;:24;;;;;:65;14947:13;;;;:27;;14966:7;14947:27;:18;:27;:::i;:::-;14931:13;;;:43;14990:44;;;;;;;;15019:4;;15007:1;;14990:44;;;;;;;;;14773:269;;:::o;15752:104::-;15814:34;15828:4;15835:3;15840:7;15814:5;:34::i;36262:1432::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36262:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36262:1432:0;;;-1:-1:-1;36262:1432:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://921f99f5ce710bff49f531f343876943c17e23402c0aabbc85e67784411cf5e5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.