Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 12,450 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 9218288 | 244 days ago | IN | 0.0001 ETH | 0.00016753 | ||||
Swap Exact Token... | 9216308 | 244 days ago | IN | 0 ETH | 0.00019129 | ||||
Remove Liquidity | 9003900 | 253 days ago | IN | 0 ETH | 0.00047872 | ||||
Remove Liquidity... | 8665236 | 268 days ago | IN | 0 ETH | 0.00213152 | ||||
Add Liquidity ET... | 6545462 | 326 days ago | IN | 0.00268027 ETH | 0.00017025 | ||||
Add Liquidity | 6542431 | 326 days ago | IN | 0 ETH | 0.00011557 | ||||
Add Liquidity ET... | 6492083 | 327 days ago | IN | 0.00000533 ETH | 0.00007709 | ||||
Add Liquidity ET... | 6457115 | 328 days ago | IN | 0.0000147 ETH | 0.00007833 | ||||
Remove Liquidity | 6434579 | 329 days ago | IN | 0 ETH | 0.00017817 | ||||
Remove Liquidity | 6373872 | 331 days ago | IN | 0 ETH | 0.00008503 | ||||
Add Liquidity | 6174613 | 338 days ago | IN | 0 ETH | 0.00016299 | ||||
Add Liquidity ET... | 5916660 | 347 days ago | IN | 0 ETH | 0.00010644 | ||||
Add Liquidity ET... | 5870789 | 349 days ago | IN | 0.00005285 ETH | 0.00012329 | ||||
Add Liquidity ET... | 5806661 | 351 days ago | IN | 0 ETH | 0.00014309 | ||||
Add Liquidity ET... | 5548814 | 360 days ago | IN | 253 wei | 0.00016964 | ||||
Add Liquidity ET... | 5525127 | 361 days ago | IN | 183 wei | 0.00009023 | ||||
Add Liquidity ET... | 5524936 | 361 days ago | IN | 0.00003065 ETH | 0.00009062 | ||||
Add Liquidity ET... | 5524745 | 361 days ago | IN | 180 wei | 0.00008655 | ||||
Add Liquidity ET... | 5524587 | 361 days ago | IN | 264 wei | 0.00010956 | ||||
Add Liquidity ET... | 5446867 | 364 days ago | IN | 0 ETH | 0.00015212 | ||||
Add Liquidity ET... | 5441770 | 364 days ago | IN | 120 wei | 0.00011923 | ||||
Add Liquidity ET... | 5441631 | 364 days ago | IN | 206 wei | 0.00011879 | ||||
Add Liquidity ET... | 5441630 | 364 days ago | IN | 117 wei | 0.00015705 | ||||
Add Liquidity ET... | 5440874 | 364 days ago | IN | 111 wei | 0.00010386 | ||||
Add Liquidity ET... | 5440514 | 364 days ago | IN | 162 wei | 0.00018852 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8665236 | 268 days ago | 0.0000098 ETH | ||||
8665236 | 268 days ago | 0.0000098 ETH | ||||
6545462 | 326 days ago | 0.00268027 ETH | ||||
6492083 | 327 days ago | 0.00000533 ETH | ||||
6457115 | 328 days ago | 0 ETH | ||||
6457115 | 328 days ago | 0.00001469 ETH | ||||
5916660 | 347 days ago | 0 ETH | ||||
5870789 | 349 days ago | 0.00005285 ETH | ||||
5806661 | 351 days ago | 0 ETH | ||||
5548814 | 360 days ago | 253 wei | ||||
5524936 | 361 days ago | 0.00003065 ETH | ||||
5524745 | 361 days ago | 180 wei | ||||
5524587 | 361 days ago | 264 wei | ||||
5446867 | 364 days ago | 0 ETH | ||||
5441770 | 364 days ago | 120 wei | ||||
5441631 | 364 days ago | 206 wei | ||||
5441630 | 364 days ago | 117 wei | ||||
5440874 | 364 days ago | 111 wei | ||||
5440514 | 364 days ago | 162 wei | ||||
5439146 | 364 days ago | 123 wei | ||||
5413718 | 365 days ago | 126 wei | ||||
5413191 | 365 days ago | 152 wei | ||||
5412350 | 365 days ago | 163 wei | ||||
5412197 | 365 days ago | 115 wei | ||||
5412070 | 365 days ago | 0.00000252 ETH |
Loading...
Loading
Contract Name:
LeetSwapV2Router01
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity 0.8.17; import "./interfaces/ILeetSwapV2Factory.sol"; import "./interfaces/ILeetSwapV2Pair.sol"; import "./interfaces/ILeetSwapV2Router01.sol"; import "@leetswap/interfaces/ILiquidityManageable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract LeetSwapV2Router01 is Ownable, ILeetSwapV2Router01 { struct Route { address from; address to; bool stable; } address public immutable factory; IWCANTO public immutable wcanto; uint256 internal constant MINIMUM_LIQUIDITY = 10**3; bytes32 immutable pairCodeHash; mapping(address => bool) public stablePairs; mapping(address => bool) public isLiquidityManageableWhitelisted; bool public deadlineEnabled; bool public liquidityManageableEnabled; bool public liquidityManageableWhitelistEnabled; error InvalidToken(); error TransferFailed(); error TradeExpired(); error InsufficientOutputAmount(); error InvalidPath(); error InvalidAmount(); error CantoTransferFailed(); error IdenticalAddresses(); error InsufficientAmount(); error InsufficientAAmount(); error InsufficientBAmount(); error InsufficientLiquidity(); error ZeroAddress(); error DeadlineExpired(); error ArrayLengthMismatch(); error Unauthorized(); modifier ensure(uint256 deadline) { if (deadlineEnabled && deadline < block.timestamp) revert DeadlineExpired(); _; } constructor(address _factory, address _wcanto) { factory = _factory; pairCodeHash = ILeetSwapV2Factory(_factory).pairCodeHash(); wcanto = IWCANTO(_wcanto); liquidityManageableEnabled = true; liquidityManageableWhitelistEnabled = true; } receive() external payable { assert(msg.sender == address(wcanto)); // only accept ETH via fallback from the wcanto contract } // **** LIQUIDITY MANAGEABLE PROTOCOL **** // // we use the following functions because we can't use modifiers due to the stack size limit // and the hefty amount of parameters and local variables of the Uniswap liquidity functions // it's safe to naively call the functions because if any of the token don't implement the interface // or if the router is not a liquidity manager, the call will silently fail with no harm function _startLiquidityManagement(address tokenA, address tokenB) internal { if (!liquidityManageableEnabled) return; if ( !liquidityManageableWhitelistEnabled || isLiquidityManageableWhitelisted[tokenA] ) { ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA); try lmTokenA.isLiquidityManager(address(this)) returns ( bool isLiquidityManager ) { if (isLiquidityManager) lmTokenA.setLiquidityManagementPhase(true); } catch {} } if ( !liquidityManageableWhitelistEnabled || isLiquidityManageableWhitelisted[tokenB] ) { ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB); try lmTokenB.isLiquidityManager(address(this)) returns ( bool isLiquidityManager ) { if (isLiquidityManager) lmTokenB.setLiquidityManagementPhase(true); } catch {} } } // if the previous 'startPhase' call failed because the router is not a LM, nothing will happen here, // still silently fail, whereas if it succeeded, the liquidity management phase will be set to false function _stopLiquidityManagement(address tokenA, address tokenB) internal { if (!liquidityManageableEnabled) return; if ( !liquidityManageableWhitelistEnabled || isLiquidityManageableWhitelisted[tokenA] ) { ILiquidityManageable lmTokenA = ILiquidityManageable(tokenA); try lmTokenA.isLiquidityManager(address(this)) returns ( bool isLiquidityManager ) { if (isLiquidityManager) lmTokenA.setLiquidityManagementPhase(false); } catch {} } if ( !liquidityManageableWhitelistEnabled || isLiquidityManageableWhitelisted[tokenB] ) { ILiquidityManageable lmTokenB = ILiquidityManageable(tokenB); try lmTokenB.isLiquidityManager(address(this)) returns ( bool isLiquidityManager ) { if (isLiquidityManager) lmTokenB.setLiquidityManagementPhase(false); } catch {} } } // UniswapV2 compatibility function WETH() external view returns (address) { return address(wcanto); } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { if (tokenA == tokenB) revert IdenticalAddresses(); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); if (token0 == address(0)) revert ZeroAddress(); } function _pairFor( address tokenA, address tokenB, bool stable ) internal view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint160( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1, stable)), pairCodeHash // init code hash ) ) ) ) ); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); bool isStable = stablePairs[_pairFor(token0, token1, true)]; pair = address( uint160( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256( abi.encodePacked(token0, token1, isStable) ), pairCodeHash // init code hash ) ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB) public view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = ILeetSwapV2Pair( pairFor(tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut( uint256 amountIn, address tokenIn, address tokenOut ) public view returns (uint256 amount) { address pair = pairFor(tokenIn, tokenOut); if (ILeetSwapV2Factory(factory).isPair(pair)) { amount = ILeetSwapV2Pair(pair).getAmountOut(amountIn, tokenIn); } } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint256 amountIn, Route[] memory routes) public view returns (uint256[] memory amounts) { if (routes.length < 1) revert InvalidPath(); amounts = new uint256[](routes.length + 1); amounts[0] = amountIn; for (uint256 i = 0; i < routes.length; i++) { address pair = pairFor(routes[i].from, routes[i].to); if (ILeetSwapV2Factory(factory).isPair(pair)) { amounts[i + 1] = ILeetSwapV2Pair(pair).getAmountOut( amounts[i], routes[i].from ); } } } // UniswapV2 compatibility function getAmountsOut(uint256 amountIn, address[] calldata path) public view returns (uint256[] memory amounts) { if (path.length < 2) revert InvalidPath(); Route[] memory routes = _pathToRoutes(path); amounts = getAmountsOut(amountIn, routes); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { if (amountA <= 0) revert InsufficientAmount(); if (reserveA <= 0 || reserveB <= 0) revert InsufficientLiquidity(); amountB = (amountA * reserveB) / reserveA; } function isPair(address pair) public view returns (bool) { return ILeetSwapV2Factory(factory).isPair(pair); } function _pathToRoutes(address[] calldata path) internal view returns (Route[] memory routes) { routes = new Route[](path.length - 1); for (uint256 i = 0; i < path.length - 1; i++) { bool isStable = stablePairs[pairFor(path[i], path[i + 1])]; routes[i] = Route(path[i], path[i + 1], isStable); } } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, Route[] memory routes, address _to ) internal virtual { for (uint256 i = 0; i < routes.length; i++) { (address token0, ) = sortTokens(routes[i].from, routes[i].to); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = routes[i].from == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to) : _to; ILeetSwapV2Pair(pairFor(routes[i].from, routes[i].to)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external ensure(deadline) returns (uint256[] memory amounts) { Route[] memory routes = _pathToRoutes(path); amounts = getAmountsOut(amountIn, routes); if (amounts[amounts.length - 1] < amountOutMin) { revert InsufficientOutputAmount(); } _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to), amounts[0] ); _swap(amounts, routes, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ensure(deadline) returns (uint256[] memory amounts) { if (path[0] != address(wcanto)) revert InvalidPath(); Route[] memory routes = _pathToRoutes(path); amounts = getAmountsOut(msg.value, routes); if (amounts[amounts.length - 1] < amountOutMin) { revert InsufficientOutputAmount(); } wcanto.deposit{value: amounts[0]}(); assert( wcanto.transfer(pairFor(routes[0].from, routes[0].to), amounts[0]) ); _swap(amounts, routes, to); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external ensure(deadline) returns (uint256[] memory amounts) { if (path[path.length - 1] != address(wcanto)) { revert InvalidPath(); } Route[] memory routes = _pathToRoutes(path); amounts = getAmountsOut(amountIn, routes); if (amounts[amounts.length - 1] < amountOutMin) { revert InsufficientOutputAmount(); } _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to), amounts[0] ); _swap(amounts, routes, address(this)); wcanto.withdraw(amounts[amounts.length - 1]); _safeTransferETH(to, amounts[amounts.length - 1]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = sortTokens(input, output); ILeetSwapV2Pair pair = ILeetSwapV2Pair(pairFor(input, output)); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, ) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput; amountOutput = getAmountOut(amountInput, input, output); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to; if (i < path.length - 2) { to = pairFor(output, path[i + 2]); } else { to = _to; } pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual ensure(deadline) { _safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); if ( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore < amountOutMin ) { revert InsufficientOutputAmount(); } } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual ensure(deadline) { if (path[0] != address(wcanto)) revert InvalidPath(); uint256 amountIn = msg.value; IWCANTO(wcanto).deposit{value: amountIn}(); assert(IWCANTO(wcanto).transfer(pairFor(path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); if ( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore < amountOutMin ) { revert InsufficientOutputAmount(); } } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual ensure(deadline) { if (path[path.length - 1] != address(wcanto)) { revert InvalidPath(); } _safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(address(wcanto)).balanceOf(address(this)); if (amountOut < amountOutMin) { revert InsufficientOutputAmount(); } IWCANTO(wcanto).withdraw(amountOut); _safeTransferETH(to, amountOut); } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal returns (uint256 amountA, uint256 amountB) { if (amountADesired < amountAMin || amountBDesired < amountBMin) revert InvalidAmount(); // create the pair if it doesn"t exist yet address _pair = ILeetSwapV2Factory(factory).getPair( tokenA, tokenB, stable ); if (_pair == address(0)) { _pair = ILeetSwapV2Factory(factory).createPair( tokenA, tokenB, stable ); } (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = quoteLiquidity( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { if (amountBOptimal < amountBMin) { revert InsufficientBAmount(); } (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = quoteLiquidity( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); if (amountAOptimal < amountAMin) { revert InsufficientAAmount(); } (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external ensure(deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { _startLiquidityManagement(tokenA, tokenB); address pair = pairFor(tokenA, tokenB); bool isStable = stablePairs[pair]; (amountA, amountB) = _addLiquidity( tokenA, tokenB, isStable, amountADesired, amountBDesired, amountAMin, amountBMin ); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = ILeetSwapV2Pair(pair).mint(to); _stopLiquidityManagement(tokenA, tokenB); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountCANTOMin, address to, uint256 deadline ) external payable ensure(deadline) returns ( uint256 amountToken, uint256 amountCANTO, uint256 liquidity ) { _startLiquidityManagement(token, address(wcanto)); address pair = pairFor(token, address(wcanto)); bool isStable = stablePairs[pair]; (amountToken, amountCANTO) = _addLiquidity( token, address(wcanto), isStable, amountTokenDesired, msg.value, amountTokenMin, amountCANTOMin ); _safeTransferFrom(token, msg.sender, pair, amountToken); wcanto.deposit{value: amountCANTO}(); assert(wcanto.transfer(pair, amountCANTO)); liquidity = ILeetSwapV2Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountCANTO) { _safeTransferETH(msg.sender, msg.value - amountCANTO); } _stopLiquidityManagement(token, address(wcanto)); } function _safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); if (!success) revert CantoTransferFailed(); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountA, uint256 amountB) { _startLiquidityManagement(tokenA, tokenB); address pair = pairFor(tokenA, tokenB); if (!ILeetSwapV2Pair(pair).transferFrom(msg.sender, pair, liquidity)) revert TransferFailed(); (uint256 amount0, uint256 amount1) = ILeetSwapV2Pair(pair).burn(to); (address token0, ) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); if (amountA < amountAMin) { revert InsufficientAAmount(); } if (amountB < amountBMin) { revert InsufficientBAmount(); } _stopLiquidityManagement(tokenA, tokenB); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountCANTOMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountToken, uint256 amountCANTO) { _startLiquidityManagement(token, address(wcanto)); (amountToken, amountCANTO) = removeLiquidity( token, address(wcanto), liquidity, amountTokenMin, amountCANTOMin, address(this), deadline ); _safeTransfer(token, to, amountToken); wcanto.withdraw(amountCANTO); _safeTransferETH(to, amountCANTO); _stopLiquidityManagement(token, address(wcanto)); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountCANTOMin, address to, uint256 deadline ) public virtual ensure(deadline) returns (uint256 amountCANTO) { _startLiquidityManagement(token, address(wcanto)); (, amountCANTO) = removeLiquidity( token, address(wcanto), liquidity, amountTokenMin, amountCANTOMin, address(this), deadline ); _safeTransfer(token, to, IERC20(token).balanceOf(address(this))); wcanto.withdraw(amountCANTO); _safeTransferETH(to, amountCANTO); _stopLiquidityManagement(token, address(wcanto)); } // **** LIBRARY FUNCTIONS **** function _safeTransfer( address token, address to, uint256 value ) internal { if (token.code.length == 0) revert InvalidToken(); bool success = IERC20(token).transfer(to, value); if (!success) revert TransferFailed(); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { if (token.code.length == 0) revert InvalidToken(); bool success = IERC20(token).transferFrom(from, to, value); if (!success) revert TransferFailed(); } function setStablePair(address pair, bool stable) external onlyOwner { stablePairs[pair] = stable; } function setStablePairs(address[] calldata pairs, bool[] calldata stable) external onlyOwner { if (pairs.length != stable.length) revert ArrayLengthMismatch(); for (uint256 i = 0; i < pairs.length; i++) { stablePairs[pairs[i]] = stable[i]; } } function setDeadlineEnabled(bool _enabled) external onlyOwner { deadlineEnabled = _enabled; } function setLiquidityManageableEnabled(bool _enabled) external onlyOwner { liquidityManageableEnabled = _enabled; } function setLiquidityManageableWhitelistEnabled(bool _enabled) external onlyOwner { liquidityManageableWhitelistEnabled = _enabled; } function addLiquidityManageableWhitelist(address token) external onlyOwner { isLiquidityManageableWhitelisted[token] = true; } function removeLiquidityManageableWhitelist(address token) external onlyOwner { isLiquidityManageableWhitelisted[token] = false; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; interface ILeetSwapV2Factory { function allPairsLength() external view returns (uint256); function isPair(address pair) external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair( address tokenA, address token, bool stable ) external view returns (address); function createPair( address tokenA, address tokenB, bool stable ) external returns (address); function createPair(address tokenA, address tokenB) external returns (address); function getInitializable() external view returns ( address token0, address token1, bool stable ); function protocolFeesShare() external view returns (uint256); function protocolFeesRecipient() external view returns (address); function tradingFees(address pair, address to) external view returns (uint256); function isPaused() external view returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; interface ILeetSwapV2Pair { function factory() external view returns (address); function fees() external view returns (address); function transferFrom( address src, address dst, uint256 amount ) external returns (bool); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function burn(address to) external returns (uint256 amount0, uint256 amount1); function mint(address to) external returns (uint256 liquidity); function getReserves() external view returns ( uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast ); function getAmountOut(uint256, address) external view returns (uint256); function current(address tokenIn, uint256 amountIn) external view returns (uint256); function token0() external view returns (address); function token1() external view returns (address); function stable() external view returns (bool); function balanceOf(address) external view returns (uint256); //LP token pricing function sample( address tokenIn, uint256 amountIn, uint256 points, uint256 window ) external view returns (uint256[] memory); function quote( address tokenIn, uint256 amountIn, uint256 granularity ) external view returns (uint256); function claimFeesFor(address account) external returns (uint256 claimed0, uint256 claimed1); function claimFees() external returns (uint256 claimed0, uint256 claimed1); function claimableFeesFor(address account) external returns (uint256 claimed0, uint256 claimed1); function claimableFees() external returns (uint256 claimed0, uint256 claimed1); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; import "@leetswap/interfaces/IWCANTO.sol"; interface ILeetSwapV2Router01 { function factory() external view returns (address); function WETH() external view returns (address); function wcanto() external view returns (IWCANTO); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountCANTOMin, address to, uint256 deadline ) external returns (uint256 amountCANTO); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function getAmountOut( uint256 amountIn, address tokenIn, address tokenOut ) external view returns (uint256 amount); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function pairFor(address tokenA, address tokenB) external view returns (address pair); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; interface ILiquidityManageable { function setLiquidityManagementPhase(bool _isManagingLiquidity) external; function isLiquidityManager(address _addr) external returns (bool); function isLiquidityManagementPhase() external returns (bool); }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity ^0.8.0; interface IWCANTO { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
{ "remappings": [ "@leetswap/=src/", "@openzeppelin/=lib/openzeppelin-contracts/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wcanto","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"CantoTransferFailed","type":"error"},{"inputs":[],"name":"DeadlineExpired","type":"error"},{"inputs":[],"name":"IdenticalAddresses","type":"error"},{"inputs":[],"name":"InsufficientAAmount","type":"error"},{"inputs":[],"name":"InsufficientAmount","type":"error"},{"inputs":[],"name":"InsufficientBAmount","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"inputs":[],"name":"InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidPath","type":"error"},{"inputs":[],"name":"InvalidToken","type":"error"},{"inputs":[],"name":"TradeExpired","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCANTO","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"addLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deadlineEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct LeetSwapV2Router01.Route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLiquidityManageableWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityManageableEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityManageableWhitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountCANTO","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountCANTOMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountCANTO","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"removeLiquidityManageableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setDeadlineEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setLiquidityManageableWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"setStablePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"pairs","type":"address[]"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"setStablePairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stablePairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wcanto","outputs":[{"internalType":"contract IWCANTO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200421938038062004219833981016040819052620000349162000144565b6200003f33620000d7565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200008a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b091906200017c565b60c0526001600160a01b031660a052506003805462ffff0019166201010017905562000196565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200013f57600080fd5b919050565b600080604083850312156200015857600080fd5b620001638362000127565b9150620001736020840162000127565b90509250929050565b6000602082840312156200018f57600080fd5b5051919050565b60805160a05160c051613f65620002b46000396000611662015260008181610223015281816104b2015281816105e6015281816107cb015281816107f501528181610844015281816108b80152818161096501528181610ad40152818161111e01528181611202015281816112ae015281816113520152818161142c015281816114ba01528181611aa201528181611acc01528181611b8401528181611bf801528181611c5a01528181611cd801528181611d4c0152818161249e015281816124ca015281816125130152818161254f015281816125e401526126f001526000818161069f01528181610fe10152818161161a015281816117e10152818161224d0152818161344e015281816134e2015261358e0152613f656000f3fe6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f00000000000000000000000000000000000000000000000000000000000000006104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f0000000000000000000000000000000000000000000000000000000000000000612723565b61081e897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f00000000000000000000000000000000000000000000000000000000000000009161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f00000000000000000000000000000000000000000000000000000000000000006040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f0000000000000000000000000000000000000000000000000000000000000000612723565b611af5887f00000000000000000000000000000000000000000000000000000000000000008989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f0000000000000000000000000000000000000000000000000000000000000000612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f0000000000000000000000000000000000000000000000000000000000000000612723565b60006124ee8b7f00000000000000000000000000000000000000000000000000000000000000006115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f0000000000000000000000000000000000000000000000000000000000000000838e348f8f613482565b909650945061254d8c338489612e77565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f0000000000000000000000000000000000000000000000000000000000000000612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f000000000000000000000000000000000000000000000000000000000000000082828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000000000000000000000000000000000000000000090911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c63430008110033000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e840000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9
Deployed Bytecode
0x6080604052600436106102135760003560e01c806396ed28f911610118578063b6f9de95116100a0578063d52bb6f41161006f578063d52bb6f4146106e1578063e5e31b1314610701578063e8e3370014610721578063f2fde38b1461075c578063f305d7191461077c57600080fd5b8063b6f9de951461065a578063baa2abde1461066d578063c45a01551461068d578063d06ca61f146106c157600080fd5b8063accb16e0116100e7578063accb16e01461059d578063ad0950cb146105b7578063ad5c4648146105d7578063af2979eb1461060a578063b1be2f0f1461062a57600080fd5b806396ed28f91461051d5780639881fcb41461053d578063a90f63621461055d578063ab0aaadf1461057d57600080fd5b8063590e8e781161019b578063715018a61161016a578063715018a61461046b578063791ac947146104805780637aa497d9146104a05780637ff36ab5146104ec5780638da5cb5b146104ff57600080fd5b8063590e8e78146103cd5780635c11d795146103ed5780635e1e63251461040d5780636cc1e9841461043b57600080fd5b8063283c2ee1116101e2578063283c2ee1146102fe57806338ed17391461032e57806346d886a11461034e578063520709c51461036d578063544caa561461038d57600080fd5b806302751cec14610257578063056bfae114610291578063098b0eaa146102b157806318cbafe5146102d157600080fd5b3661025257336001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916146102505761025061372e565b005b600080fd5b34801561026357600080fd5b50610277610272366004613759565b61078f565b604080519283526020830191909152015b60405180910390f35b34801561029d57600080fd5b506102506102ac3660046137c5565b6108e8565b3480156102bd57600080fd5b506102506102cc3660046137c5565b610903565b3480156102dd57600080fd5b506102f16102ec36600461382e565b610927565b60405161028891906138a1565b34801561030a57600080fd5b5060035461031e9062010000900460ff1681565b6040519015158152602001610288565b34801561033a57600080fd5b506102f161034936600461382e565b610bb4565b34801561035a57600080fd5b5060035461031e90610100900460ff1681565b34801561037957600080fd5b506102506103883660046138e5565b610c6a565b34801561039957600080fd5b506103ad6103a836600461391e565b610c9d565b604080516001600160a01b03938416815292909116602083015201610288565b3480156103d957600080fd5b506102506103e83660046137c5565b610d28565b3480156103f957600080fd5b5061025061040836600461382e565b610d4a565b34801561041957600080fd5b5061042d61042836600461394c565b610fb2565b604051908152602001610288565b34801561044757600080fd5b5061031e61045636600461398e565b60016020526000908152604090205460ff1681565b34801561047757600080fd5b506102506110cf565b34801561048c57600080fd5b5061025061049b36600461382e565b6110e3565b3480156104ac57600080fd5b506104d47f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e981565b6040516001600160a01b039091168152602001610288565b6102f16104fa3660046139ab565b61131c565b34801561050b57600080fd5b506000546001600160a01b03166104d4565b34801561052957600080fd5b506104d461053836600461391e565b6115cd565b34801561054957600080fd5b506102f1610558366004613a82565b6116e8565b34801561056957600080fd5b5061025061057836600461398e565b61194d565b34801561058957600080fd5b50610250610598366004613b7d565b611976565b3480156105a957600080fd5b5060035461031e9060ff1681565b3480156105c357600080fd5b506102506105d236600461398e565b611a3c565b3480156105e357600080fd5b507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96104d4565b34801561061657600080fd5b5061042d610625366004613759565b611a68565b34801561063657600080fd5b5061031e61064536600461398e565b60026020526000908152604090205460ff1681565b6102506106683660046139ab565b611c27565b34801561067957600080fd5b50610277610688366004613be9565b611f4e565b34801561069957600080fd5b506104d47f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8481565b3480156106cd57600080fd5b506102f16106dc366004613c5b565b612139565b3480156106ed57600080fd5b506102776106fc36600461391e565b612175565b34801561070d57600080fd5b5061031e61071c36600461398e565b61222b565b34801561072d57600080fd5b5061074161073c366004613ca7565b6122c0565b60408051938452602084019290925290820152606001610288565b34801561076857600080fd5b5061025061077736600461398e565b6123e2565b61074161078a366004613759565b612460565b6003546000908190839060ff1680156107a757504281105b156107c557604051631ab7da6b60e01b815260040160405180910390fd5b6107ef897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b61081e897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e98a8a8a308a611f4e565b909350915061082e89868561293c565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561089057600080fd5b505af11580156108a4573d6000803e3d6000fd5b505050506108b285836129fe565b6108dc897f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b50965096945050505050565b6108f0612c73565b6003805460ff1916911515919091179055565b61090b612c73565b60038054911515620100000262ff000019909216919091179055565b600354606090829060ff16801561093d57504281105b1561095b57604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9168686610992600182613d39565b8181106109a1576109a1613d4c565b90506020020160208101906109b6919061398e565b6001600160a01b0316146109dd576040516320db826760e01b815260040160405180910390fd5b60006109e98787612ccd565b90506109f589826116e8565b9250878360018551610a079190613d39565b81518110610a1757610a17613d4c565b60200260200101511015610a3e576040516342301c2360e01b815260040160405180910390fd5b610ac781600081518110610a5457610a54613d4c565b60200260200101516000015133610aa784600081518110610a7757610a77613d4c565b60200260200101516000015185600081518110610a9657610a96613d4c565b6020026020010151602001516115cd565b86600081518110610aba57610aba613d4c565b6020026020010151612e77565b610ad2838230612f41565b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b0316632e1a7d4d8460018651610b109190613d39565b81518110610b2057610b20613d4c565b60200260200101516040518263ffffffff1660e01b8152600401610b4691815260200190565b600060405180830381600087803b158015610b6057600080fd5b505af1158015610b74573d6000803e3d6000fd5b50505050610ba8858460018651610b8b9190613d39565b81518110610b9b57610b9b613d4c565b60200260200101516129fe565b50509695505050505050565b600354606090829060ff168015610bca57504281105b15610be857604051631ab7da6b60e01b815260040160405180910390fd5b6000610bf48787612ccd565b9050610c0089826116e8565b9250878360018551610c129190613d39565b81518110610c2257610c22613d4c565b60200260200101511015610c49576040516342301c2360e01b815260040160405180910390fd5b610c5f81600081518110610a5457610a54613d4c565b610ba8838287612f41565b610c72612c73565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b600080826001600160a01b0316846001600160a01b031603610cd257604051630bd969eb60e41b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031610610cf2578284610cf5565b83835b90925090506001600160a01b038216610d215760405163d92e233d60e01b815260040160405180910390fd5b9250929050565b610d30612c73565b600380549115156101000261ff0019909216919091179055565b600354819060ff168015610d5d57504281105b15610d7b57604051631ab7da6b60e01b815260040160405180910390fd5b610e0085856000818110610d9157610d91613d4c565b9050602002016020810190610da6919061398e565b33610dfa88886000818110610dbd57610dbd613d4c565b9050602002016020810190610dd2919061398e565b89896001818110610de557610de5613d4c565b9050602002016020810190610538919061398e565b8a612e77565b60008585610e0f600182613d39565b818110610e1e57610e1e613d4c565b9050602002016020810190610e33919061398e565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190613d62565b9050610edf868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613148915050565b86818787610eee600182613d39565b818110610efd57610efd613d4c565b9050602002016020810190610f12919061398e565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa158015610f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7f9190613d62565b610f899190613d39565b1015610fa8576040516342301c2360e01b815260040160405180910390fd5b5050505050505050565b600080610fbf84846115cd565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190613d7b565b156110c7576040516378a051ad60e11b8152600481018690526001600160a01b03858116602483015282169063f140a35a90604401602060405180830381865afa1580156110a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c49190613d62565b91505b509392505050565b6110d7612c73565b6110e160006133e9565b565b600354819060ff1680156110f657504281105b1561111457604051631ab7da6b60e01b815260040160405180910390fd5b6001600160a01b037f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916858561114b600182613d39565b81811061115a5761115a613d4c565b905060200201602081019061116f919061398e565b6001600160a01b031614611196576040516320db826760e01b815260040160405180910390fd5b6111ac85856000818110610d9157610d91613d4c565b6111ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613148915050565b6040516370a0823160e01b81523060048201526000907f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b0316906370a0823190602401602060405180830381865afa158015611251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112759190613d62565b905086811015611298576040516342301c2360e01b815260040160405180910390fd5b604051632e1a7d4d60e01b8152600481018290527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156112fa57600080fd5b505af115801561130e573d6000803e3d6000fd5b50505050610fa884826129fe565b600354606090829060ff16801561133257504281105b1561135057604051631ab7da6b60e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b03168686600081811061138d5761138d613d4c565b90506020020160208101906113a2919061398e565b6001600160a01b0316146113c9576040516320db826760e01b815260040160405180910390fd5b60006113d58787612ccd565b90506113e134826116e8565b92508783600185516113f39190613d39565b8151811061140357611403613d4c565b6020026020010151101561142a576040516342301c2360e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db08460008151811061146c5761146c613d4c565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b50505050507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663a9059cbb61151c836000815181106114fd576114fd613d4c565b60200260200101516000015184600081518110610a9657610a96613d4c565b8560008151811061152f5761152f613d4c565b60200260200101516040518363ffffffff1660e01b81526004016115689291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611587573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ab9190613d7b565b6115b7576115b761372e565b6115c2838287612f41565b505095945050505050565b60008060006115dc8585610c9d565b915091506000600160006115f285856001613439565b6001600160a01b03168152602080820192909252604090810160002054905160ff90911692507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849161164a9186918691869101613d98565b604051602081830303815290604052805190602001207f28086d29c039f716c897e0615045599a42ea0133fa059e92faff694d05cfcd496040516020016116c6939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b606060018251101561170d576040516320db826760e01b815260040160405180910390fd5b815161171a906001613dcb565b67ffffffffffffffff81111561173257611732613a12565b60405190808252806020026020018201604052801561175b578160200160208202803683370190505b509050828160008151811061177257611772613d4c565b60200260200101818152505060005b82518110156119465760006117bf8483815181106117a1576117a1613d4c565b602002602001015160000151858481518110610a9657610a96613d4c565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa15801561182a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184e9190613d7b565b1561193357806001600160a01b031663f140a35a84848151811061187457611874613d4c565b602002602001015186858151811061188e5761188e613d4c565b6020026020010151600001516040518363ffffffff1660e01b81526004016118c99291909182526001600160a01b0316602082015260400190565b602060405180830381865afa1580156118e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190a9190613d62565b83611916846001613dcb565b8151811061192657611926613d4c565b6020026020010181815250505b508061193e81613dde565b915050611781565b5092915050565b611955612c73565b6001600160a01b03166000908152600260205260409020805460ff19169055565b61197e612c73565b82811461199e5760405163512509d360e11b815260040160405180910390fd5b60005b83811015611a35578282828181106119bb576119bb613d4c565b90506020020160208101906119d091906137c5565b600160008787858181106119e6576119e6613d4c565b90506020020160208101906119fb919061398e565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611a2d81613dde565b9150506119a1565b5050505050565b611a44612c73565b6001600160a01b03166000908152600260205260409020805460ff19166001179055565b600354600090829060ff168015611a7e57504281105b15611a9c57604051631ab7da6b60e01b815260040160405180910390fd5b611ac6887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b611af5887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e98989893089611f4e565b6040516370a0823160e01b8152306004820152909350611b6e9150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190613d62565b61293c565b604051632e1a7d4d60e01b8152600481018390527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611bd057600080fd5b505af1158015611be4573d6000803e3d6000fd5b50505050611bf284836129fe565b611c1c887f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b509695505050505050565b600354819060ff168015611c3a57504281105b15611c5857604051631ab7da6b60e01b815260040160405180910390fd5b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031685856000818110611c9557611c95613d4c565b9050602002016020810190611caa919061398e565b6001600160a01b031614611cd1576040516320db826760e01b815260040160405180910390fd5b60003490507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3157600080fd5b505af1158015611d45573d6000803e3d6000fd5b50505050507f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663a9059cbb611d8f88886000818110610dbd57610dbd613d4c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611ddc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e009190613d7b565b611e0c57611e0c61372e565b60008686611e1b600182613d39565b818110611e2a57611e2a613d4c565b9050602002016020810190611e3f919061398e565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611e87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eab9190613d62565b9050611eeb878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613148915050565b87818888611efa600182613d39565b818110611f0957611f09613d4c565b9050602002016020810190611f1e919061398e565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a0823190602401610f3e565b6003546000908190839060ff168015611f6657504281105b15611f8457604051631ab7da6b60e01b815260040160405180910390fd5b611f8e8a8a612723565b6000611f9a8b8b6115cd565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120149190613d7b565b612031576040516312171d8360e31b815260040160405180910390fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af115801561207d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a19190613df7565b9150915060006120b18e8e610c9d565b509050806001600160a01b03168e6001600160a01b0316146120d45781836120d7565b82825b90975095508a8710156120fd57604051638dc525d160e01b815260040160405180910390fd5b8986101561211e5760405163ef71d09160e01b815260040160405180910390fd5b6121288e8e612a8c565b505050505097509795505050505050565b6060600282101561215d576040516320db826760e01b815260040160405180910390fd5b60006121698484612ccd565b90506110c485826116e8565b60008060006121848585610c9d565b50905060008061219487876115cd565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156121d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f59190613e1b565b5091509150826001600160a01b0316876001600160a01b03161461221a57808261221d565b81815b909890975095505050505050565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e849091169063e5e31b1390602401602060405180830381865afa158015612296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ba9190613d7b565b92915050565b60035460009081908190849060ff1680156122da57504281105b156122f857604051631ab7da6b60e01b815260040160405180910390fd5b6123028c8c612723565b600061230e8d8d6115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661233c8e8e838f8f8f8f613482565b909650945061234d8e338489612e77565b6123598d338488612e77565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156123a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c59190613d62565b93506123d18e8e612a8c565b505050985098509895505050505050565b6123ea612c73565b6001600160a01b0381166124545760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61245d816133e9565b50565b60035460009081908190849060ff16801561247a57504281105b1561249857604051631ab7da6b60e01b815260040160405180910390fd5b6124c28a7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612723565b60006124ee8b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96115cd565b6001600160a01b03811660009081526001602052604090205490915060ff1661253c8c7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9838e348f8f613482565b909650945061254d8c338489612e77565b7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e96001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125a857600080fd5b505af11580156125bc573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a90527f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e916935063a9059cbb925060440190506020604051808303816000875af1158015612631573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126559190613d7b565b6126615761266161372e565b6040516335313c2160e11b81526001600160a01b038981166004830152831690636a627842906024016020604051808303816000875af11580156126a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cd9190613d62565b9350843411156126ea576126ea336126e58734613d39565b6129fe565b6127148c7f0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9612a8c565b50505096509650969350505050565b600354610100900460ff16612736575050565b60035462010000900460ff16158061276657506001600160a01b03821660009081526002602052604090205460ff165b15612839576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156127cf575060408051601f3d908101601f191682019092526127cc91810190613d7b565b60015b156128375780156128355760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff16158061286957506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af19250505080156128d2575060408051601f3d908101601f191682019092526128cf91810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600160048201526001600160a01b0383169063bd7d67e9906024015b600060405180830381600087803b15801561292057600080fd5b505af1158015610fa8573d6000803e3d6000fd5b505b505b5050565b826001600160a01b03163b6000036129675760405163c1ab6dc160e01b815260040160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390526000919085169063a9059cbb906044016020604051808303816000875af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129de9190613d7b565b905080612934576040516312171d8360e31b815260040160405180910390fd5b604080516000808252602082019092526001600160a01b038416908390604051612a289190613e6d565b60006040518083038185875af1925050503d8060008114612a65576040519150601f19603f3d011682016040523d82523d6000602084013e612a6a565b606091505b505090508061293657604051631db12dd560e21b815260040160405180910390fd5b600354610100900460ff16612a9f575050565b60035462010000900460ff161580612acf57506001600160a01b03821660009081526002602052604090205460ff165b15612ba2576040516337e26cd160e21b815230600482015282906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612b38575060408051601f3d908101601f19168201909252612b3591810190613d7b565b60015b15612ba0578015612b9e5760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401600060405180830381600087803b158015612b8557600080fd5b505af1158015612b99573d6000803e3d6000fd5b505050505b505b505b60035462010000900460ff161580612bd257506001600160a01b03811660009081526002602052604090205460ff165b15612938576040516337e26cd160e21b815230600482015281906001600160a01b0382169063df89b344906024016020604051808303816000875af1925050508015612c3b575060408051601f3d908101601f19168201909252612c3891810190613d7b565b60015b156129365780156129345760405163bd7d67e960e01b8152600060048201526001600160a01b0383169063bd7d67e990602401612906565b6000546001600160a01b031633146110e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161244b565b6060612cda600183613d39565b67ffffffffffffffff811115612cf257612cf2613a12565b604051908082528060200260200182016040528015612d3d57816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612d105790505b50905060005b612d4e600184613d39565b81101561194657600060016000612da1878786818110612d7057612d70613d4c565b9050602002016020810190612d85919061398e565b8888612d92886001613dcb565b818110610de557610de5613d4c565b6001600160a01b03168152602081019190915260409081016000205481516060810190925260ff16915080868685818110612dde57612dde613d4c565b9050602002016020810190612df3919061398e565b6001600160a01b031681526020018686612e0e866001613dcb565b818110612e1d57612e1d613d4c565b9050602002016020810190612e32919061398e565b6001600160a01b03168152602001821515815250838381518110612e5857612e58613d4c565b6020026020010181905250508080612e6f90613dde565b915050612d43565b836001600160a01b03163b600003612ea25760405163c1ab6dc160e01b815260040160405180910390fd5b6040516323b872dd60e01b81526001600160a01b038481166004830152838116602483015260448201839052600091908616906323b872dd906064016020604051808303816000875af1158015612efd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f219190613d7b565b905080611a35576040516312171d8360e31b815260040160405180910390fd5b60005b8251811015612934576000612f93848381518110612f6457612f64613d4c565b602002602001015160000151858481518110612f8257612f82613d4c565b602002602001015160200151610c9d565b509050600085612fa4846001613dcb565b81518110612fb457612fb4613d4c565b60200260200101519050600080836001600160a01b0316878681518110612fdd57612fdd613d4c565b6020026020010151600001516001600160a01b031614612fff57826000613003565b6000835b915091506000600188516130179190613d39565b8610613023578661306c565b61306c88613032886001613dcb565b8151811061304257613042613d4c565b6020026020010151600001518988600161305c9190613dcb565b81518110610a9657610a96613d4c565b90506130a188878151811061308357613083613d4c565b602002602001015160000151898881518110610a9657610a96613d4c565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156130de576020820181803683370190505b506040518563ffffffff1660e01b81526004016130fe9493929190613e89565b600060405180830381600087803b15801561311857600080fd5b505af115801561312c573d6000803e3d6000fd5b505050505050505050808061314090613dde565b915050612f44565b60005b600183516131599190613d39565b8110156129365760008084838151811061317557613175613d4c565b60200260200101518584600161318b9190613dcb565b8151811061319b5761319b613d4c565b60200260200101519150915060006131b38383610c9d565b50905060006131c284846115cd565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322c9190613e1b565b50915091506000866001600160a01b0316896001600160a01b031614613253578183613256565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925082918b16906370a0823190602401602060405180830381865afa1580156132a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c69190613d62565b6132d09190613d39565b94506132dd858a8a610fb2565b9350505050600080856001600160a01b0316886001600160a01b0316146133065782600061330a565b6000835b91509150600060028c5161331e9190613d39565b8a101561335957613352888d6133358d6002613dcb565b8151811061334557613345613d4c565b60200260200101516115cd565b905061335c565b50895b6040805160008152602081019182905263022c0d9f60e01b9091526001600160a01b0387169063022c0d9f9061339b9086908690869060248101613e89565b600060405180830381600087803b1580156133b557600080fd5b505af11580156133c9573d6000803e3d6000fd5b5050505050505050505050505080806133e190613dde565b91505061314b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060006134488686610c9d565b915091507f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8482828660405160200161164a93929190613d98565b6000808386108061349257508285105b156134b05760405163162908e360e11b815260040160405180910390fd5b6040516306801cc360e41b81526001600160a01b038a81166004830152898116602483015288151560448301526000917f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8490911690636801cc3090606401602060405180830381865afa15801561352b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061354f9190613ed9565b90506001600160a01b0381166135fe576040516320b7f73960e21b81526001600160a01b038b811660048301528a8116602483015289151560448301527f000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e8416906382dfdce4906064016020604051808303816000875af11580156135d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fb9190613ed9565b90505b60008061360b8c8c612175565b9150915081600014801561361d575080155b1561362d578894508793506136b7565b600061363a8a84846136c6565b905088811161366f57868110156136645760405163ef71d09160e01b815260040160405180910390fd5b8995509350836136b5565b600061367c8a84866136c6565b90508a81111561368e5761368e61372e565b888110156136af57604051638dc525d160e01b815260040160405180910390fd5b95508894505b505b50505097509795505050505050565b60008084116136e857604051632ca2f52b60e11b815260040160405180910390fd5b8215806136f3575081155b156137115760405163bb55fd2760e01b815260040160405180910390fd5b8261371c8386613ef6565b6137269190613f0d565b949350505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461245d57600080fd5b60008060008060008060c0878903121561377257600080fd5b863561377d81613744565b955060208701359450604087013593506060870135925060808701356137a281613744565b8092505060a087013590509295509295509295565b801515811461245d57600080fd5b6000602082840312156137d757600080fd5b81356137e2816137b7565b9392505050565b60008083601f8401126137fb57600080fd5b50813567ffffffffffffffff81111561381357600080fd5b6020830191508360208260051b8501011115610d2157600080fd5b60008060008060008060a0878903121561384757600080fd5b8635955060208701359450604087013567ffffffffffffffff81111561386c57600080fd5b61387889828a016137e9565b909550935050606087013561388c81613744565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156138d9578351835292840192918401916001016138bd565b50909695505050505050565b600080604083850312156138f857600080fd5b823561390381613744565b91506020830135613913816137b7565b809150509250929050565b6000806040838503121561393157600080fd5b823561393c81613744565b9150602083013561391381613744565b60008060006060848603121561396157600080fd5b83359250602084013561397381613744565b9150604084013561398381613744565b809150509250925092565b6000602082840312156139a057600080fd5b81356137e281613744565b6000806000806000608086880312156139c357600080fd5b85359450602086013567ffffffffffffffff8111156139e157600080fd5b6139ed888289016137e9565b9095509350506040860135613a0181613744565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715613a4b57613a4b613a12565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a7a57613a7a613a12565b604052919050565b6000806040808486031215613a9657600080fd5b8335925060208085013567ffffffffffffffff80821115613ab657600080fd5b818701915087601f830112613aca57600080fd5b813581811115613adc57613adc613a12565b613aea848260051b01613a51565b8181528481019250606091820284018501918a831115613b0957600080fd5b938501935b82851015613b6c5780858c031215613b265760008081fd5b613b2e613a28565b8535613b3981613744565b815285870135613b4881613744565b8188015285880135613b59816137b7565b8189015284529384019392850192613b0e565b508096505050505050509250929050565b60008060008060408587031215613b9357600080fd5b843567ffffffffffffffff80821115613bab57600080fd5b613bb7888389016137e9565b90965094506020870135915080821115613bd057600080fd5b50613bdd878288016137e9565b95989497509550505050565b600080600080600080600060e0888a031215613c0457600080fd5b8735613c0f81613744565b96506020880135613c1f81613744565b955060408801359450606088013593506080880135925060a0880135613c4481613744565b8092505060c0880135905092959891949750929550565b600080600060408486031215613c7057600080fd5b83359250602084013567ffffffffffffffff811115613c8e57600080fd5b613c9a868287016137e9565b9497909650939450505050565b600080600080600080600080610100898b031215613cc457600080fd5b8835613ccf81613744565b97506020890135613cdf81613744565b965060408901359550606089013594506080890135935060a0890135925060c0890135613d0b81613744565b8092505060e089013590509295985092959890939650565b634e487b7160e01b600052601160045260246000fd5b818103818111156122ba576122ba613d23565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613d7457600080fd5b5051919050565b600060208284031215613d8d57600080fd5b81516137e2816137b7565b6bffffffffffffffffffffffff19606094851b811682529290931b9091166014830152151560f81b602882015260290190565b808201808211156122ba576122ba613d23565b600060018201613df057613df0613d23565b5060010190565b60008060408385031215613e0a57600080fd5b505080516020909101519092909150565b600080600060608486031215613e3057600080fd5b8351925060208401519150604084015190509250925092565b60005b83811015613e64578181015183820152602001613e4c565b50506000910152565b60008251613e7f818460208701613e49565b9190910192915050565b84815283602082015260018060a01b03831660408201526080606082015260008251806080840152613ec28160a0850160208701613e49565b601f01601f19169190910160a00195945050505050565b600060208284031215613eeb57600080fd5b81516137e281613744565b80820281158282048414176122ba576122ba613d23565b600082613f2a57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212202e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e840000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9
-----Decoded View---------------
Arg [0] : _factory (address): 0xcE87E0960f4e2702f4bFFE277655E993Ae720e84
Arg [1] : _wcanto (address): 0x4F9A0e7FD2Bf6067db6994CF12E4495Df938E6e9
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ce87e0960f4e2702f4bffe277655e993ae720e84
Arg [1] : 0000000000000000000000004f9a0e7fd2bf6067db6994cf12e4495df938e6e9
Deployed Bytecode Sourcemap
370:25131:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1911:10;-1:-1:-1;;;;;1933:6:3;1911:29;;1904:37;;;;:::i;:::-;370:25131;;;;;22050:791;;;;;;;;;;-1:-1:-1;22050:791:3;;;;;:::i;:::-;;:::i;:::-;;;;1124:25:9;;;1180:2;1165:18;;1158:34;;;;1097:18;22050:791:3;;;;;;;;24778:105;;;;;;;;;;-1:-1:-1;24778:105:3;;;;;:::i;:::-;;:::i;25022:165::-;;;;;;;;;;-1:-1:-1;25022:165:3;;;;;:::i;:::-;;:::i;12061:883::-;;;;;;;;;;-1:-1:-1;12061:883:3;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;890:47::-;;;;;;;;;;-1:-1:-1;890:47:3;;;;;;;;;;;;;;3529:14:9;;3522:22;3504:41;;3492:2;3477:18;890:47:3;3364:187:9;10696:662:3;;;;;;;;;;-1:-1:-1;10696:662:3;;;;;:::i;:::-;;:::i;846:38::-;;;;;;;;;;-1:-1:-1;846:38:3;;;;;;;;;;;24351:112;;;;;;;;;;-1:-1:-1;24351:112:3;;;;;:::i;:::-;;:::i;4950:361::-;;;;;;;;;;-1:-1:-1;4950:361:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4566:15:9;;;4548:34;;4618:15;;;;4613:2;4598:18;;4591:43;4483:18;4950:361:3;4336:304:9;24889:127:3;;;;;;;;;;-1:-1:-1;24889:127:3;;;;;:::i;:::-;;:::i;14461:700::-;;;;;;;;;;-1:-1:-1;14461:700:3;;;;;:::i;:::-;;:::i;7415:342::-;;;;;;;;;;-1:-1:-1;7415:342:3;;;;;:::i;:::-;;:::i;:::-;;;5252:25:9;;;5240:2;5225:18;7415:342:3;5106:177:9;694:43:3;;;;;;;;;;-1:-1:-1;694:43:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;15940:811:3:-;;;;;;;;;;-1:-1:-1;15940:811:3;;;;;:::i;:::-;;:::i;563:31::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5720:32:9;;;5702:51;;5690:2;5675:18;563:31:3;5540:219:9;11364:691:3;;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1247:7:0;1273:6;-1:-1:-1;;;;;1273:6:0;1201:85;;6062:771:3;;;;;;;;;;-1:-1:-1;6062:771:3;;;;;:::i;:::-;;:::i;7836:641::-;;;;;;;;;;-1:-1:-1;7836:641:3;;;;;:::i;:::-;;:::i;25337:162::-;;;;;;;;;;-1:-1:-1;25337:162:3;;;;;:::i;:::-;;:::i;24469:303::-;;;;;;;;;;-1:-1:-1;24469:303:3;;;;;:::i;:::-;;:::i;813:27::-;;;;;;;;;;-1:-1:-1;813:27:3;;;;;;;;25193:138;;;;;;;;;;-1:-1:-1;25193:138:3;;;;;:::i;:::-;;:::i;4857:87::-;;;;;;;;;;-1:-1:-1;4930:6:3;4857:87;;22917:795;;;;;;;;;;-1:-1:-1;22917:795:3;;;;;:::i;:::-;;:::i;743:64::-;;;;;;;;;;-1:-1:-1;743:64:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;15167:767;;;;;;:::i;:::-;;:::i;21073:971::-;;;;;;;;;;-1:-1:-1;21073:971:3;;;;;:::i;:::-;;:::i;525:32::-;;;;;;;;;;;;;;;8514:303;;;;;;;;;;-1:-1:-1;8514:303:3;;;;;:::i;:::-;;:::i;6888:448::-;;;;;;;;;;-1:-1:-1;6888:448:3;;;;;:::i;:::-;;:::i;9269:121::-;;;;;;;;;;-1:-1:-1;9269:121:3;;;;;:::i;:::-;;:::i;18615:1001::-;;;;;;;;;;-1:-1:-1;18615:1001:3;;;;;:::i;:::-;;:::i;:::-;;;;12181:25:9;;;12237:2;12222:18;;12215:34;;;;12265:18;;;12258:34;12169:2;12154:18;18615:1001:3;11979:319:9;2081:198:0;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;19622:1220:3:-;;;;;;:::i;:::-;;:::i;22050:791::-;1474:15;;22301:19;;;;22274:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;22357:49:::1;22383:5;22398:6;22357:25;:49::i;:::-;22446:201;22475:5;22502:6;22523:9;22546:14;22574;22610:4;22629:8;22446:15;:201::i;:::-;22417:230:::0;;-1:-1:-1;22417:230:3;-1:-1:-1;22657:37:3::1;22671:5:::0;22678:2;22417:230;22657:13:::1;:37::i;:::-;22704:28;::::0;-1:-1:-1;;;22704:28:3;;::::1;::::0;::::1;5252:25:9::0;;;22704:6:3::1;-1:-1:-1::0;;;;;22704:15:3::1;::::0;::::1;::::0;5225:18:9;;22704:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22742:33;22759:2;22763:11;22742:16;:33::i;:::-;22786:48;22811:5;22826:6;22786:24;:48::i;:::-;22050:791:::0;;;;;;;;;;:::o;24778:105::-;1094:13:0;:11;:13::i;:::-;24850:15:3::1;:26:::0;;-1:-1:-1;;24850:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24778:105::o;25022:165::-;1094:13:0;:11;:13::i;:::-;25134:35:3::1;:46:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;25134:46:3;;::::1;::::0;;;::::1;::::0;;25022:165::o;12061:883::-;1474:15;;12268:24;;12249:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;12341:6:3::1;12308:40;:4:::0;;12313:15:::1;12327:1;12308:4:::0;12313:15:::1;:::i;:::-;12308:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12308:40:3::1;;12304:91;;12371:13;;-1:-1:-1::0;;;12371:13:3::1;;;;;;;;;;;12304:91;12404:21;12428:19;12442:4;;12428:13;:19::i;:::-;12404:43;;12467:31;12481:8;12491:6;12467:13;:31::i;:::-;12457:41;;12542:12;12512:7;12537:1;12520:7;:14;:18;;;;:::i;:::-;12512:27;;;;;;;;:::i;:::-;;;;;;;:42;12508:106;;;12577:26;;-1:-1:-1::0;;;12577:26:3::1;;;;;;;;;;;12508:106;12623:154;12654:6;12661:1;12654:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12682:10;12706:37;12714:6;12721:1;12714:9;;;;;;;;:::i;:::-;;;;;;;:14;;;12730:6;12737:1;12730:9;;;;;;;;:::i;:::-;;;;;;;:12;;;12706:7;:37::i;:::-;12757:7;12765:1;12757:10;;;;;;;;:::i;:::-;;;;;;;12623:17;:154::i;:::-;12787:37;12793:7;12802:6;12818:4;12787:5;:37::i;:::-;12834:6;-1:-1:-1::0;;;;;12834:15:3::1;;12850:7;12875:1;12858:7;:14;:18;;;;:::i;:::-;12850:27;;;;;;;;:::i;:::-;;;;;;;12834:44;;;;;;;;;;;;;5252:25:9::0;;5240:2;5225:18;;5106:177;12834:44:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;12888:49;12905:2;12909:7;12934:1;12917:7;:14;:18;;;;:::i;:::-;12909:27;;;;;;;;:::i;:::-;;;;;;;12888:16;:49::i;:::-;12294:650;12061:883:::0;;;;;;;;;:::o;10696:662::-;1474:15;;10906:24;;10887:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;10942:21:::1;10966:19;10980:4;;10966:13;:19::i;:::-;10942:43;;11005:31;11019:8;11029:6;11005:13;:31::i;:::-;10995:41;;11080:12;11050:7;11075:1;11058:7;:14;:18;;;;:::i;:::-;11050:27;;;;;;;;:::i;:::-;;;;;;;:42;11046:106;;;11115:26;;-1:-1:-1::0;;;11115:26:3::1;;;;;;;;;;;11046:106;11161:154;11192:6;11199:1;11192:9;;;;;;;;:::i;11161:154::-;11325:26;11331:7;11340:6;11348:2;11325:5;:26::i;24351:112::-:0;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;24430:17:3;;;::::1;;::::0;;;:11:::1;:17;::::0;;;;:26;;-1:-1:-1;;24430:26:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24351:112::o;4950:361::-;5047:14;5063;5107:6;-1:-1:-1;;;;;5097:16:3;:6;-1:-1:-1;;;;;5097:16:3;;5093:49;;5122:20;;-1:-1:-1;;;5122:20:3;;;;;;;;;;;5093:49;5180:6;-1:-1:-1;;;;;5171:15:3;:6;-1:-1:-1;;;;;5171:15:3;;:77;;5233:6;5241;5171:77;;;5202:6;5210;5171:77;5152:96;;-1:-1:-1;5152:96:3;-1:-1:-1;;;;;;5262:20:3;;5258:46;;5291:13;;-1:-1:-1;;;5291:13:3;;;;;;;;;;;5258:46;4950:361;;;;;:::o;24889:127::-;1094:13:0;:11;:13::i;:::-;24972:26:3::1;:37:::0;;;::::1;;;;-1:-1:-1::0;;24972:37:3;;::::1;::::0;;;::::1;::::0;;24889:127::o;14461:700::-;1474:15;;14689:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;14709:133:::1;14740:4;;14745:1;14740:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14761:10;14785:25;14793:4;;14798:1;14793:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14802:4;;14807:1;14802:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;14785:25::-;14824:8;14709:17;:133::i;:::-;14852:21;14883:4:::0;;14888:15:::1;14902:1;14883:4:::0;14888:15:::1;:::i;:::-;14883:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;14876:43;::::0;-1:-1:-1;;;14876:43:3;;-1:-1:-1;;;;;5720:32:9;;;14876:43:3::1;::::0;::::1;5702:51:9::0;14876:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;14876:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14852:67;;14929:44;14964:4;;14929:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;14970:2:3;;-1:-1:-1;14929:34:3::1;::::0;-1:-1:-1;;14929:44:3:i:1;:::-;15074:12:::0;15046:13;15007:4;;15012:15:::1;15026:1;15007:4:::0;15012:15:::1;:::i;:::-;15007:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15000:43;::::0;-1:-1:-1;;;15000:43:3;;-1:-1:-1;;;;;5720:32:9;;;15000:43:3::1;::::0;::::1;5702:51:9::0;15000:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15000:43:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:86;14983:172;;;15118:26;;-1:-1:-1::0;;;15118:26:3::1;;;;;;;;;;;14983:172;14699:462;14461:700:::0;;;;;;;:::o;7415:342::-;7541:14;7567:12;7582:26;7590:7;7599:8;7582:7;:26::i;:::-;7622:40;;-1:-1:-1;;;7622:40:3;;-1:-1:-1;;;;;5720:32:9;;;7622:40:3;;;5702:51:9;7567:41:3;;-1:-1:-1;7641:7:3;7622:34;;;;;;5675:18:9;;7622:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7618:133;;;7687:53;;-1:-1:-1;;;7687:53:3;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;;;13354:18;;;13347:60;7687:34:3;;;;;13286:18:9;;7687:53:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7678:62;;7618:133;7557:200;7415:342;;;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;15940:811:3:-;1474:15;;16165:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;-1:-1:-1;;;;;16222:6:3::1;16189:40;:4:::0;;16194:15:::1;16208:1;16189:4:::0;16194:15:::1;:::i;:::-;16189:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;16189:40:3::1;;16185:91;;16252:13;;-1:-1:-1::0;;;16252:13:3::1;;;;;;;;;;;16185:91;16285:133;16316:4;;16321:1;16316:7;;;;;;;:::i;16285:133::-;16428:55;16463:4;;16428:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;16477:4:3::1;::::0;-1:-1:-1;16428:34:3::1;::::0;-1:-1:-1;;16428:55:3:i:1;:::-;16513:48;::::0;-1:-1:-1;;;16513:48:3;;16555:4:::1;16513:48;::::0;::::1;5702:51:9::0;16493:17:3::1;::::0;16528:6:::1;-1:-1:-1::0;;;;;16513:33:3::1;::::0;::::1;::::0;5675:18:9;;16513:48:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16493:68;;16587:12;16575:9;:24;16571:88;;;16622:26;;-1:-1:-1::0;;;16622:26:3::1;;;;;;;;;;;16571:88;16668:35;::::0;-1:-1:-1;;;16668:35:3;;::::1;::::0;::::1;5252:25:9::0;;;16676:6:3::1;-1:-1:-1::0;;;;;16668:24:3::1;::::0;::::1;::::0;5225:18:9;;16668:35:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;16713:31;16730:2;16734:9;16713:16;:31::i;11364:691::-:0;1474:15;;11553:24;;11534:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;11612:6:::1;-1:-1:-1::0;;;;;11593:26:3::1;:4;;11598:1;11593:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11593:26:3::1;;11589:52;;11628:13;;-1:-1:-1::0;;;11628:13:3::1;;;;;;;;;;;11589:52;11651:21;11675:19;11689:4;;11675:13;:19::i;:::-;11651:43;;11714:32;11728:9;11739:6;11714:13;:32::i;:::-;11704:42;;11790:12;11760:7;11785:1;11768:7;:14;:18;;;;:::i;:::-;11760:27;;;;;;;;:::i;:::-;;;;;;;:42;11756:106;;;11825:26;;-1:-1:-1::0;;;11825:26:3::1;;;;;;;;;;;11756:106;11871:6;-1:-1:-1::0;;;;;11871:14:3::1;;11893:7;11901:1;11893:10;;;;;;;;:::i;:::-;;;;;;;11871:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;11936:6;-1:-1:-1::0;;;;;11936:15:3::1;;11952:37;11960:6;11967:1;11960:9;;;;;;;;:::i;:::-;;;;;;;:14;;;11976:6;11983:1;11976:9;;;;;;;;:::i;11952:37::-;11991:7;11999:1;11991:10;;;;;;;;:::i;:::-;;;;;;;11936:66;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;13610:32:9;;;;13592:51;;13674:2;13659:18;;13652:34;13580:2;13565:18;;13418:274;11936:66:3::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11916:96;;;;:::i;:::-;12022:26;12028:7;12037:6;12045:2;12022:5;:26::i;:::-;11579:476;11364:691:::0;;;;;;;;:::o;6062:771::-;6156:12;6185:14;6201;6219:26;6230:6;6238;6219:10;:26::i;:::-;6184:61;;;;6255:13;6271:11;:43;6283:30;6292:6;6300;6308:4;6283:8;:30::i;:::-;-1:-1:-1;;;;;6271:43:3;;;;;;;;;;;;;;;-1:-1:-1;6271:43:3;;6604:42;;6271:43;;;;;-1:-1:-1;6524:7:3;;6604:42;;6621:6;;6629;;6271:43;;6604:42;;:::i;:::-;;;;;;;;;;;;;6561:115;;;;;;6706:12;6441:321;;;;;;;;;-1:-1:-1;;;;;;14406:26:9;;14469:2;14465:15;;;;-1:-1:-1;;14461:53:9;14457:1;14448:11;;14441:74;14540:2;14531:12;;14524:28;;;;14577:2;14568:12;;14561:28;14614:2;14605:12;;14120:503;6441:321:3;;;;-1:-1:-1;;6441:321:3;;;;;;;;;6406:378;;6441:321;6406:378;;;;;6062:771;-1:-1:-1;;;;;;6062:771:3:o;7836:641::-;7945:24;8005:1;7989:6;:13;:17;7985:43;;;8015:13;;-1:-1:-1;;;8015:13:3;;;;;;;;;;;7985:43;8062:13;;:17;;8078:1;8062:17;:::i;:::-;8048:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8048:32:3;;8038:42;;8103:8;8090:7;8098:1;8090:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8126:9;8121:350;8145:6;:13;8141:1;:17;8121:350;;;8179:12;8194:37;8202:6;8209:1;8202:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8218:6;8225:1;8218:9;;;;;;;;:::i;8194:37::-;8249:40;;-1:-1:-1;;;8249:40:3;;-1:-1:-1;;;;;5720:32:9;;;8249:40:3;;;5702:51:9;8179:52:3;;-1:-1:-1;8268:7:3;8249:34;;;;;;5675:18:9;;8249:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8245:216;;;8342:4;-1:-1:-1;;;;;8326:34:3;;8382:7;8390:1;8382:10;;;;;;;;:::i;:::-;;;;;;;8414:6;8421:1;8414:9;;;;;;;;:::i;:::-;;;;;;;:14;;;8326:120;;;;;;;;;;;;;;;13313:25:9;;;-1:-1:-1;;;;;13374:32:9;13369:2;13354:18;;13347:60;13301:2;13286:18;;13139:274;8326:120:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8309:7;8317:5;:1;8321;8317:5;:::i;:::-;8309:14;;;;;;;;:::i;:::-;;;;;;:137;;;;;8245:216;-1:-1:-1;8160:3:3;;;;:::i;:::-;;;;8121:350;;;;7836:641;;;;:::o;25337:162::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25445:39:3::1;25487:5;25445:39:::0;;;:32:::1;:39;::::0;;;;:47;;-1:-1:-1;;25445:47:3::1;::::0;;25337:162::o;24469:303::-;1094:13:0;:11;:13::i;:::-;24596:29:3;;::::1;24592:63;;24634:21;;-1:-1:-1::0;;;24634:21:3::1;;;;;;;;;;;24592:63;24670:9;24665:101;24685:16:::0;;::::1;24665:101;;;24746:6;;24753:1;24746:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;24722:11;:21;24734:5;;24740:1;24734:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;24722:21:3::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;24722:21:3;:33;;-1:-1:-1;;24722:33:3::1;::::0;::::1;;::::0;;;::::1;::::0;;24703:3;::::1;::::0;::::1;:::i;:::-;;;;24665:101;;;;24469:303:::0;;;;:::o;25193:138::-;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;25278:39:3::1;;::::0;;;:32:::1;:39;::::0;;;;:46;;-1:-1:-1;;25278:46:3::1;25320:4;25278:46;::::0;;25193:138::o;22917:795::-;1474:15;;23181:19;;23162:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;23212:49:::1;23238:5;23253:6;23212:25;:49::i;:::-;23290:201;23319:5;23346:6;23367:9;23390:14;23418;23454:4;23473:8;23290:15;:201::i;:::-;23526:38;::::0;-1:-1:-1;;;23526:38:3;;23558:4:::1;23526:38;::::0;::::1;5702:51:9::0;23272:219:3;;-1:-1:-1;23501:64:3::1;::::0;-1:-1:-1;23515:5:3;;23522:2;;-1:-1:-1;;;;;23526:23:3;::::1;::::0;::::1;::::0;5675:18:9;;23526:38:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23501:13;:64::i;:::-;23575:28;::::0;-1:-1:-1;;;23575:28:3;;::::1;::::0;::::1;5252:25:9::0;;;23575:6:3::1;-1:-1:-1::0;;;;;23575:15:3::1;::::0;::::1;::::0;5225:18:9;;23575:28:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;23613:33;23630:2;23634:11;23613:16;:33::i;:::-;23657:48;23682:5;23697:6;23657:24;:48::i;:::-;22917:795:::0;;;;;;;;;:::o;15167:767::-;1474:15;;15374:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;15417:6:::1;-1:-1:-1::0;;;;;15398:26:3::1;:4;;15403:1;15398:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;15398:26:3::1;;15394:52;;15433:13;;-1:-1:-1::0;;;15433:13:3::1;;;;;;;;;;;15394:52;15456:16;15475:9;15456:28;;15502:6;-1:-1:-1::0;;;;;15494:23:3::1;;15525:8;15494:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;15561:6;-1:-1:-1::0;;;;;15553:24:3::1;;15578:25;15586:4;;15591:1;15586:7;;;;;;;:::i;15578:25::-;15553:61;::::0;-1:-1:-1;;;;;;15553:61:3::1;::::0;;;;;;-1:-1:-1;;;;;13610:32:9;;;15553:61:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;13565:18;;15553:61:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15546:69;;;;:::i;:::-;15625:21;15656:4:::0;;15661:15:::1;15675:1;15656:4:::0;15661:15:::1;:::i;:::-;15656:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15649:43;::::0;-1:-1:-1;;;15649:43:3;;-1:-1:-1;;;;;5720:32:9;;;15649:43:3::1;::::0;::::1;5702:51:9::0;15649:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15649:43:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15625:67;;15702:44;15737:4;;15702:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;15743:2:3;;-1:-1:-1;15702:34:3::1;::::0;-1:-1:-1;;15702:44:3:i:1;:::-;15847:12:::0;15819:13;15780:4;;15785:15:::1;15799:1;15780:4:::0;15785:15:::1;:::i;:::-;15780:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;15773:43;::::0;-1:-1:-1;;;15773:43:3;;-1:-1:-1;;;;;5720:32:9;;;15773:43:3::1;::::0;::::1;5702:51:9::0;15773:39:3;;;::::1;::::0;::::1;::::0;5675:18:9;;15773:43:3::1;5540:219:9::0;21073:971:3;1474:15;;21314;;;;21295:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;21358:41:::1;21384:6;21392;21358:25;:41::i;:::-;21410:12;21425:23;21433:6;21441;21425:7;:23::i;:::-;21463:63;::::0;-1:-1:-1;;;21463:63:3;;21498:10:::1;21463:63;::::0;::::1;15138:34:9::0;-1:-1:-1;;;;;21463:34:3;::::1;15188:18:9::0;;;15181:43;;;15240:18;;;15233:34;;;21410:38:3;;-1:-1:-1;21463:34:3::1;::::0;15073:18:9;;21463:63:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21458:105;;21547:16;;-1:-1:-1::0;;;21547:16:3::1;;;;;;;;;;;21458:105;21610:30;::::0;-1:-1:-1;;;21610:30:3;;-1:-1:-1;;;;;5720:32:9;;;21610:30:3::1;::::0;::::1;5702:51:9::0;21574:15:3::1;::::0;;;21610:26;::::1;::::0;::::1;::::0;5675:18:9;;21610:30:3::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21573:67;;;;21651:14;21671:26;21682:6;21690;21671:10;:26::i;:::-;21650:47;;;21738:6;-1:-1:-1::0;;;;;21728:16:3::1;:6;-1:-1:-1::0;;;;;21728:16:3::1;;:82;;21793:7;21802;21728:82;;;21760:7;21769;21728:82;21707:103:::0;;-1:-1:-1;21707:103:3;-1:-1:-1;21824:20:3;;::::1;21820:79;;;21867:21;;-1:-1:-1::0;;;21867:21:3::1;;;;;;;;;;;21820:79;21922:10;21912:7;:20;21908:79;;;21955:21;;-1:-1:-1::0;;;21955:21:3::1;;;;;;;;;;;21908:79;21997:40;22022:6;22030;21997:24;:40::i;:::-;21348:696;;;;21073:971:::0;;;;;;;;;;;:::o;8514:303::-;8625:24;8683:1;8669:15;;8665:41;;;8693:13;;-1:-1:-1;;;8693:13:3;;;;;;;;;;;8665:41;8716:21;8740:19;8754:4;;8740:13;:19::i;:::-;8716:43;;8779:31;8793:8;8803:6;8779:13;:31::i;6888:448::-;6986:16;7004;7037:14;7057:26;7068:6;7076;7057:10;:26::i;:::-;7036:47;;;7094:16;7112;7163:23;7171:6;7179;7163:7;:23::i;:::-;-1:-1:-1;;;;;7134:74:3;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7093:117;;;;;7253:6;-1:-1:-1;;;;;7243:16:3;:6;-1:-1:-1;;;;;7243:16:3;;:86;;7310:8;7320;7243:86;;;7275:8;7285;7243:86;7220:109;;;;-1:-1:-1;6888:448:3;-1:-1:-1;;;;;;6888:448:3:o;9269:121::-;9343:40;;-1:-1:-1;;;9343:40:3;;-1:-1:-1;;;;;5720:32:9;;;9343:40:3;;;5702:51:9;9320:4:3;;9362:7;9343:34;;;;;;5675:18:9;;9343:40:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9336:47;9269:121;-1:-1:-1;;9269:121:3:o;18615:1001::-;1474:15;;18929;;;;;;18889:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;19029:41:::1;19055:6;19063;19029:25;:41::i;:::-;19081:12;19096:23;19104:6;19112;19096:7;:23::i;:::-;-1:-1:-1::0;;;;;19145:17:3;::::1;19129:13;19145:17:::0;;;:11:::1;:17;::::0;;;;;19081:38;;-1:-1:-1;19145:17:3::1;;19193:189;19220:6:::0;19240;19145:17;19282:14;19310;19338:10;19362;19193:13:::1;:189::i;:::-;19172:210:::0;;-1:-1:-1;19172:210:3;-1:-1:-1;19392:52:3::1;19410:6:::0;19418:10:::1;19430:4:::0;19172:210;19392:17:::1;:52::i;:::-;19454;19472:6;19480:10;19492:4;19498:7;19454:17;:52::i;:::-;19528:30;::::0;-1:-1:-1;;;19528:30:3;;-1:-1:-1;;;;;5720:32:9;;;19528:30:3::1;::::0;::::1;5702:51:9::0;19528:26:3;::::1;::::0;::::1;::::0;5675:18:9;;19528:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19516:42;;19569:40;19594:6;19602;19569:24;:40::i;:::-;19019:597;;18615:1001:::0;;;;;;;;;;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;16041:2:9;2161:73:0::1;::::0;::::1;16023:21:9::0;16080:2;16060:18;;;16053:30;16119:34;16099:18;;;16092:62;-1:-1:-1;;;16170:18:9;;;16163:36;16216:19;;2161:73:0::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;19622:1220:3:-;1474:15;;19910:19;;;;;;19870:8;;1474:15;;:45;;;;;1504:15;1493:8;:26;1474:45;1470:87;;;1540:17;;-1:-1:-1;;;1540:17:3;;;;;;;;;;;1470:87;20018:49:::1;20044:5;20059:6;20018:25;:49::i;:::-;20078:12;20093:31;20101:5;20116:6;20093:7;:31::i;:::-;-1:-1:-1::0;;;;;20150:17:3;::::1;20134:13;20150:17:::0;;;:11:::1;:17;::::0;;;;;20078:46;;-1:-1:-1;20150:17:3::1;;20206:204;20233:5:::0;20260:6:::1;20150:17:::0;20303:18;20335:9:::1;20358:14:::0;20386;20206:13:::1;:204::i;:::-;20177:233:::0;;-1:-1:-1;20177:233:3;-1:-1:-1;20420:55:3::1;20438:5:::0;20445:10:::1;20457:4:::0;20177:233;20420:17:::1;:55::i;:::-;20485:6;-1:-1:-1::0;;;;;20485:14:3::1;;20507:11;20485:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20538:34:3::1;::::0;-1:-1:-1;;;20538:34:3;;-1:-1:-1;;;;;13610:32:9;;;20538:34:3::1;::::0;::::1;13592:51:9::0;13659:18;;;13652:34;;;20538:6:3::1;:15;::::0;-1:-1:-1;20538:15:3::1;::::0;-1:-1:-1;13565:18:9;;;-1:-1:-1;20538:34:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20531:42;;;;:::i;:::-;20595:30;::::0;-1:-1:-1;;;20595:30:3;;-1:-1:-1;;;;;5720:32:9;;;20595:30:3::1;::::0;::::1;5702:51:9::0;20595:26:3;::::1;::::0;::::1;::::0;5675:18:9;;20595:30:3::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20583:42;;20686:11;20674:9;:23;20670:107;;;20713:53;20730:10;20742:23;20754:11:::0;20742:9:::1;:23;:::i;:::-;20713:16;:53::i;:::-;20787:48;20812:5;20827:6;20787:24;:48::i;:::-;20008:834;;19622:1220:::0;;;;;;;;;;;:::o;2458:1078::-;2561:26;;;;;;;2556:40;;2458:1078;;:::o;2556:40::-;2624:35;;;;;;;2623:36;;:92;;-1:-1:-1;;;;;;2675:40:3;;;;;;:32;:40;;;;;;;;2623:92;2606:457;;;2818:42;;-1:-1:-1;;;2818:42:3;;2854:4;2818:42;;;5702:51:9;2793:6:3;;-1:-1:-1;;;;;2818:27:3;;;;;5675:18:9;;2818:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;2818:42:3;;;;;;;;-1:-1:-1;;2818:42:3;;;;;;;;;;;;:::i;:::-;;;2814:239;;;2947:18;2943:86;;;2987:42;;-1:-1:-1;;;2987:42:3;;3024:4;2987:42;;;3504:41:9;-1:-1:-1;;;;;2987:36:3;;;;;3477:18:9;;2987:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2943:86;2861:183;2814:239;2726:337;2606:457;3091:35;;;;;;;3090:36;;:92;;-1:-1:-1;;;;;;3142:40:3;;;;;;:32;:40;;;;;;;;3090:92;3073:457;;;3285:42;;-1:-1:-1;;;3285:42:3;;3321:4;3285:42;;;5702:51:9;3260:6:3;;-1:-1:-1;;;;;3285:27:3;;;;;5675:18:9;;3285:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;3285:42:3;;;;;;;;-1:-1:-1;;3285:42:3;;;;;;;;;;;;:::i;:::-;;;3281:239;;;3414:18;3410:86;;;3454:42;;-1:-1:-1;;;3454:42:3;;3491:4;3454:42;;;3504:41:9;-1:-1:-1;;;;;3454:36:3;;;;;3477:18:9;;3454:42:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3410:86;3328:183;3281:239;3193:337;3073:457;2458:1078;;:::o;23753:275::-;23871:5;-1:-1:-1;;;;;23871:17:3;;23892:1;23871:22;23867:49;;23902:14;;-1:-1:-1;;;23902:14:3;;;;;;;;;;;23867:49;23941:33;;-1:-1:-1;;;23941:33:3;;-1:-1:-1;;;;;13610:32:9;;;23941:33:3;;;13592:51:9;13659:18;;;13652:34;;;23926:12:3;;23941:22;;;;;;13565:18:9;;23941:33:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23926:48;;23989:7;23984:37;;24005:16;;-1:-1:-1;;;24005:16:3;;;;;;;;;;;20848:185;20961:12;;;20921;20961;;;;;;;;;-1:-1:-1;;;;;20939:7:3;;;20954:5;;20939:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20920:54;;;20989:7;20984:42;;21005:21;;-1:-1:-1;;;21005:21:3;;;;;;;;;;;3753:1067;3843:26;;;;;;;3838:40;;3753:1067;;:::o;3838:40::-;3906:35;;;;;;;3905:36;;:92;;-1:-1:-1;;;;;;3957:40:3;;;;;;:32;:40;;;;;;;;3905:92;3888:458;;;4100:42;;-1:-1:-1;;;4100:42:3;;4136:4;4100:42;;;5702:51:9;4075:6:3;;-1:-1:-1;;;;;4100:27:3;;;;;5675:18:9;;4100:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4100:42:3;;;;;;;;-1:-1:-1;;4100:42:3;;;;;;;;;;;;:::i;:::-;;;4096:240;;;4229:18;4225:87;;;4269:43;;-1:-1:-1;;;4269:43:3;;4306:5;4269:43;;;3504:41:9;-1:-1:-1;;;;;4269:36:3;;;;;3477:18:9;;4269:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4225:87;4143:184;4096:240;4008:338;3888:458;4374:35;;;;;;;4373:36;;:92;;-1:-1:-1;;;;;;4425:40:3;;;;;;:32;:40;;;;;;;;4373:92;4356:458;;;4568:42;;-1:-1:-1;;;4568:42:3;;4604:4;4568:42;;;5702:51:9;4543:6:3;;-1:-1:-1;;;;;4568:27:3;;;;;5675:18:9;;4568:42:3;;;;;;;;;;;;;;;;;;;-1:-1:-1;4568:42:3;;;;;;;;-1:-1:-1;;4568:42:3;;;;;;;;;;;;:::i;:::-;;;4564:240;;;4697:18;4693:87;;;4737:43;;-1:-1:-1;;;4737:43:3;;4774:5;4737:43;;;3504:41:9;-1:-1:-1;;;;;4737:36:3;;;;;3477:18:9;;4737:43:3;3364:187:9;1359:130:0;1247:7;1273:6;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;16995:2:9;1414:68:0;;;16977:21:9;;;17014:18;;;17007:30;17073:34;17053:18;;;17046:62;17125:18;;1414:68:0;16793:356:9;9396:377:3;9491:21;9549:15;9563:1;9549:4;:15;:::i;:::-;9537:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;9537:28:3;;-1:-1:-1;;9537:28:3;;;;;;;;;;;;9528:37;;9580:9;9575:192;9599:15;9613:1;9599:4;:15;:::i;:::-;9595:1;:19;9575:192;;;9635:13;9651:11;:42;9663:29;9671:4;;9676:1;9671:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9680:4;;9685:5;:1;9689;9685:5;:::i;:::-;9680:11;;;;;;;:::i;9663:29::-;-1:-1:-1;;;;;9651:42:3;;;;;;;;;;;;;;-1:-1:-1;9651:42:3;;9719:37;;;;;;;;9651:42;;;-1:-1:-1;9719:37:3;9725:4;;9730:1;9725:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9734:4;;9739:5;:1;9743;9739:5;:::i;:::-;9734:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9719:37:3;;;;;9747:8;9719:37;;;;;9707:6;9714:1;9707:9;;;;;;;;:::i;:::-;;;;;;:49;;;;9621:146;9616:3;;;;;:::i;:::-;;;;9575:192;;24034:311;24178:5;-1:-1:-1;;;;;24178:17:3;;24199:1;24178:22;24174:49;;24209:14;;-1:-1:-1;;;24209:14:3;;;;;;;;;;;24174:49;24248:43;;-1:-1:-1;;;24248:43:3;;-1:-1:-1;;;;;15156:15:9;;;24248:43:3;;;15138:34:9;15208:15;;;15188:18;;;15181:43;15240:18;;;15233:34;;;24233:12:3;;24248:26;;;;;;15073:18:9;;24248:43:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24233:58;;24306:7;24301:37;;24322:16;;-1:-1:-1;;;24322:16:3;;;;;;;;;;;9880:810;10019:9;10014:670;10038:6;:13;10034:1;:17;10014:670;;;10073:14;10093:40;10104:6;10111:1;10104:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10120:6;10127:1;10120:9;;;;;;;;:::i;:::-;;;;;;;:12;;;10093:10;:40::i;:::-;-1:-1:-1;10072:61:3;-1:-1:-1;10147:17:3;10167:7;10175:5;:1;10179;10175:5;:::i;:::-;10167:14;;;;;;;;:::i;:::-;;;;;;;10147:34;;10196:18;10216;10256:6;-1:-1:-1;;;;;10238:24:3;:6;10245:1;10238:9;;;;;;;;:::i;:::-;;;;;;;:14;;;-1:-1:-1;;;;;10238:24:3;;:108;;10324:9;10343:1;10238:108;;;10290:1;10294:9;10238:108;10195:151;;;;10360:10;10393:1;10377:6;:13;:17;;;;:::i;:::-;10373:1;:21;:107;;10477:3;10373:107;;;10413:45;10421:6;10428:5;:1;10432;10428:5;:::i;:::-;10421:13;;;;;;;;:::i;:::-;;;;;;;:18;;;10441:6;10448:1;10452;10448:5;;;;:::i;:::-;10441:13;;;;;;;;:::i;10413:45::-;10360:120;;10510:37;10518:6;10525:1;10518:9;;;;;;;;:::i;:::-;;;;;;;:14;;;10534:6;10541:1;10534:9;;;;;;;;:::i;10510:37::-;-1:-1:-1;;;;;10494:59:3;;10571:10;10599;10627:2;10657:1;10647:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10647:12:3;;10494:179;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10058:626;;;;;10053:3;;;;;:::i;:::-;;;;10014:670;;13087:1368;13221:9;13216:1233;13250:1;13236:4;:11;:15;;;;:::i;:::-;13232:1;:19;13216:1233;;;13273:13;13288:14;13307:4;13312:1;13307:7;;;;;;;;:::i;:::-;;;;;;;13316:4;13321:1;13325;13321:5;;;;:::i;:::-;13316:11;;;;;;;;:::i;:::-;;;;;;;13272:56;;;;13343:14;13363:25;13374:5;13381:6;13363:10;:25::i;:::-;13342:46;;;13402:20;13441:22;13449:5;13456:6;13441:7;:22::i;:::-;13402:62;;13478:19;13511:20;13620:16;13638;13660:4;-1:-1:-1;;;;;13660:16:3;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13619:59;;;;;13697:20;13732:6;-1:-1:-1;;;;;13723:15:3;:5;-1:-1:-1;;;;;13723:15:3;;:101;;13805:8;13815;13723:101;;;13762:8;13772;13723:101;-1:-1:-1;13876:38:3;;-1:-1:-1;;;13876:38:3;;-1:-1:-1;;;;;5720:32:9;;;13876:38:3;;;5702:51:9;13696:128:3;;-1:-1:-1;13696:128:3;;13876:23;;;;;5675:18:9;;13876:38:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;13842:107;;13982:40;13995:11;14008:5;14015:6;13982:12;:40::i;:::-;13967:55;;13545:492;;;14051:18;14071;14102:6;-1:-1:-1;;;;;14093:15:3;:5;-1:-1:-1;;;;;14093:15:3;;:105;;14173:12;14195:1;14093:105;;;14136:1;14140:12;14093:105;14050:148;;;;14212:10;14258:1;14244:4;:11;:15;;;;:::i;:::-;14240:1;:19;14236:138;;;14284:28;14292:6;14300:4;14305:5;:1;14309;14305:5;:::i;:::-;14300:11;;;;;;;;:::i;:::-;;;;;;;14284:7;:28::i;:::-;14279:33;;14236:138;;;-1:-1:-1;14356:3:3;14236:138;14425:12;;;14435:1;14425:12;;;;;;;;;-1:-1:-1;;;14387:51:3;;;-1:-1:-1;;;;;14387:9:3;;;;;:51;;14397:10;;14409;;14421:2;;14387:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13258:1191;;;;;;;;;13253:3;;;;;:::i;:::-;;;;13216:1233;;2433:187:0;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;5317:656:3:-;5433:12;5458:14;5474;5492:26;5503:6;5511;5492:10;:26::i;:::-;5457:61;;;;5728:7;5792:6;5800;5808;5775:40;;;;;;;;;;:::i;16788:1821::-;17024:15;17041;17089:10;17072:14;:27;:58;;;;17120:10;17103:14;:27;17072:58;17068:98;;;17151:15;;-1:-1:-1;;;17151:15:3;;;;;;;;;;;17068:98;17243:105;;-1:-1:-1;;;17243:105:3;;-1:-1:-1;;;;;18048:15:9;;;17243:105:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17227:13:3;;17262:7;17243:35;;;;;;17965:18:9;;17243:105:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17227:121;-1:-1:-1;;;;;;17362:19:3;;17358:182;;17405:124;;-1:-1:-1;;;17405:124:3;;-1:-1:-1;;;;;18048:15:9;;;17405:124:3;;;18030:34:9;18100:15;;;18080:18;;;18073:43;18159:14;;18152:22;18132:18;;;18125:50;17424:7:3;17405:38;;;;17965:18:9;;17405:124:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17397:132;;17358:182;17550:16;17568;17588:27;17600:6;17608;17588:11;:27::i;:::-;17549:66;;;;17629:8;17641:1;17629:13;:30;;;;-1:-1:-1;17646:13:3;;17629:30;17625:978;;;17697:14;;-1:-1:-1;17713:14:3;;-1:-1:-1;17625:978:3;;;17759:22;17784:112;17816:14;17848:8;17874;17784:14;:112::i;:::-;17759:137;;17932:14;17914;:32;17910:683;;17987:10;17970:14;:27;17966:102;;;18028:21;;-1:-1:-1;;;18028:21:3;;;;;;;;;;;17966:102;18107:14;;-1:-1:-1;18123:14:3;-1:-1:-1;18123:14:3;17910:683;;;18177:22;18202:128;18238:14;18274:8;18304;18202:14;:128::i;:::-;18177:153;;18373:14;18355;:32;;18348:40;;;;:::i;:::-;18427:10;18410:14;:27;18406:102;;;18468:21;;-1:-1:-1;;;18468:21:3;;;;;;;;;;;18406:102;18547:14;-1:-1:-1;18563:14:3;;-1:-1:-1;17910:683:3;17745:858;17625:978;17058:1551;;;16788:1821;;;;;;;;;;:::o;8927:336::-;9057:15;9099:1;9088:7;:12;9084:45;;9109:20;;-1:-1:-1;;;9109:20:3;;;;;;;;;;;9084:45;9143:13;;;:30;;-1:-1:-1;9160:13:3;;9143:30;9139:66;;;9182:23;;-1:-1:-1;;;9182:23:3;;;;;;;;;;;9139:66;9248:8;9226:18;9236:8;9226:7;:18;:::i;:::-;9225:31;;;;:::i;:::-;9215:41;8927:336;-1:-1:-1;;;;8927:336:3:o;14:127:9:-;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:131;-1:-1:-1;;;;;221:31:9;;211:42;;201:70;;267:1;264;257:12;282:663;386:6;394;402;410;418;426;479:3;467:9;458:7;454:23;450:33;447:53;;;496:1;493;486:12;447:53;535:9;522:23;554:31;579:5;554:31;:::i;:::-;604:5;-1:-1:-1;656:2:9;641:18;;628:32;;-1:-1:-1;707:2:9;692:18;;679:32;;-1:-1:-1;758:2:9;743:18;;730:32;;-1:-1:-1;814:3:9;799:19;;786:33;828;786;828;:::i;:::-;880:7;870:17;;;934:3;923:9;919:19;906:33;896:43;;282:663;;;;;;;;:::o;1203:118::-;1289:5;1282:13;1275:21;1268:5;1265:32;1255:60;;1311:1;1308;1301:12;1326:241;1382:6;1435:2;1423:9;1414:7;1410:23;1406:32;1403:52;;;1451:1;1448;1441:12;1403:52;1490:9;1477:23;1509:28;1531:5;1509:28;:::i;:::-;1556:5;1326:241;-1:-1:-1;;;1326:241:9:o;1572:367::-;1635:8;1645:6;1699:3;1692:4;1684:6;1680:17;1676:27;1666:55;;1717:1;1714;1707:12;1666:55;-1:-1:-1;1740:20:9;;1783:18;1772:30;;1769:50;;;1815:1;1812;1805:12;1769:50;1852:4;1844:6;1840:17;1828:29;;1912:3;1905:4;1895:6;1892:1;1888:14;1880:6;1876:27;1872:38;1869:47;1866:67;;;1929:1;1926;1919:12;1944:778;2066:6;2074;2082;2090;2098;2106;2159:3;2147:9;2138:7;2134:23;2130:33;2127:53;;;2176:1;2173;2166:12;2127:53;2212:9;2199:23;2189:33;;2269:2;2258:9;2254:18;2241:32;2231:42;;2324:2;2313:9;2309:18;2296:32;2351:18;2343:6;2340:30;2337:50;;;2383:1;2380;2373:12;2337:50;2422:70;2484:7;2475:6;2464:9;2460:22;2422:70;:::i;:::-;2511:8;;-1:-1:-1;2396:96:9;-1:-1:-1;;2596:2:9;2581:18;;2568:32;2609:31;2568:32;2609:31;:::i;:::-;2659:5;2649:15;;;2711:3;2700:9;2696:19;2683:33;2673:43;;1944:778;;;;;;;;:::o;2727:632::-;2898:2;2950:21;;;3020:13;;2923:18;;;3042:22;;;2869:4;;2898:2;3121:15;;;;3095:2;3080:18;;;2869:4;3164:169;3178:6;3175:1;3172:13;3164:169;;;3239:13;;3227:26;;3308:15;;;;3273:12;;;;3200:1;3193:9;3164:169;;;-1:-1:-1;3350:3:9;;2727:632;-1:-1:-1;;;;;;2727:632:9:o;3556:382::-;3621:6;3629;3682:2;3670:9;3661:7;3657:23;3653:32;3650:52;;;3698:1;3695;3688:12;3650:52;3737:9;3724:23;3756:31;3781:5;3756:31;:::i;:::-;3806:5;-1:-1:-1;3863:2:9;3848:18;;3835:32;3876:30;3835:32;3876:30;:::i;:::-;3925:7;3915:17;;;3556:382;;;;;:::o;3943:388::-;4011:6;4019;4072:2;4060:9;4051:7;4047:23;4043:32;4040:52;;;4088:1;4085;4078:12;4040:52;4127:9;4114:23;4146:31;4171:5;4146:31;:::i;:::-;4196:5;-1:-1:-1;4253:2:9;4238:18;;4225:32;4266:33;4225:32;4266:33;:::i;4645:456::-;4722:6;4730;4738;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4843:9;4830:23;4820:33;;4903:2;4892:9;4888:18;4875:32;4916:31;4941:5;4916:31;:::i;:::-;4966:5;-1:-1:-1;5023:2:9;5008:18;;4995:32;5036:33;4995:32;5036:33;:::i;:::-;5088:7;5078:17;;;4645:456;;;;;:::o;5288:247::-;5347:6;5400:2;5388:9;5379:7;5375:23;5371:32;5368:52;;;5416:1;5413;5406:12;5368:52;5455:9;5442:23;5474:31;5499:5;5474:31;:::i;5764:709::-;5877:6;5885;5893;5901;5909;5962:3;5950:9;5941:7;5937:23;5933:33;5930:53;;;5979:1;5976;5969:12;5930:53;6015:9;6002:23;5992:33;;6076:2;6065:9;6061:18;6048:32;6103:18;6095:6;6092:30;6089:50;;;6135:1;6132;6125:12;6089:50;6174:70;6236:7;6227:6;6216:9;6212:22;6174:70;:::i;:::-;6263:8;;-1:-1:-1;6148:96:9;-1:-1:-1;;6348:2:9;6333:18;;6320:32;6361:31;6320:32;6361:31;:::i;:::-;5764:709;;;;-1:-1:-1;5764:709:9;;6463:2;6448:18;6435:32;;5764:709;-1:-1:-1;;5764:709:9:o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:253;6890:2;6884:9;6932:4;6920:17;;6967:18;6952:34;;6988:22;;;6949:62;6946:88;;;7014:18;;:::i;:::-;7050:2;7043:22;6818:253;:::o;7076:275::-;7147:2;7141:9;7212:2;7193:13;;-1:-1:-1;;7189:27:9;7177:40;;7247:18;7232:34;;7268:22;;;7229:62;7226:88;;;7294:18;;:::i;:::-;7330:2;7323:22;7076:275;;-1:-1:-1;7076:275:9:o;7356:1644::-;7471:6;7479;7510:2;7553;7541:9;7532:7;7528:23;7524:32;7521:52;;;7569:1;7566;7559:12;7521:52;7605:9;7592:23;7582:33;;7634:2;7687;7676:9;7672:18;7659:32;7710:18;7751:2;7743:6;7740:14;7737:34;;;7767:1;7764;7757:12;7737:34;7805:6;7794:9;7790:22;7780:32;;7850:7;7843:4;7839:2;7835:13;7831:27;7821:55;;7872:1;7869;7862:12;7821:55;7908:2;7895:16;7930:2;7926;7923:10;7920:36;;;7936:18;;:::i;:::-;7976:36;8008:2;8003;8000:1;7996:10;7992:19;7976:36;:::i;:::-;8046:15;;;8077:12;;;;-1:-1:-1;8108:4:9;8147:11;;;8139:20;;8135:29;;;8176:19;;;8173:39;;;8208:1;8205;8198:12;8173:39;8232:11;;;;8252:718;8268:6;8263:3;8260:15;8252:718;;;8348:2;8342:3;8333:7;8329:17;8325:26;8322:116;;;8392:1;8421:2;8417;8410:14;8322:116;8464:22;;:::i;:::-;8527:3;8514:17;8544:33;8569:7;8544:33;:::i;:::-;8590:22;;8653:12;;;8640:26;8679:33;8640:26;8679:33;:::i;:::-;8732:14;;;8725:31;8797:12;;;8784:26;8823:30;8784:26;8823:30;:::i;:::-;8873:14;;;8866:31;8910:18;;8285:12;;;;8948;;;;8252:718;;;8256:3;8989:5;8979:15;;;;;;;;7356:1644;;;;;:::o;9005:770::-;9124:6;9132;9140;9148;9201:2;9189:9;9180:7;9176:23;9172:32;9169:52;;;9217:1;9214;9207:12;9169:52;9257:9;9244:23;9286:18;9327:2;9319:6;9316:14;9313:34;;;9343:1;9340;9333:12;9313:34;9382:70;9444:7;9435:6;9424:9;9420:22;9382:70;:::i;:::-;9471:8;;-1:-1:-1;9356:96:9;-1:-1:-1;9559:2:9;9544:18;;9531:32;;-1:-1:-1;9575:16:9;;;9572:36;;;9604:1;9601;9594:12;9572:36;;9643:72;9707:7;9696:8;9685:9;9681:24;9643:72;:::i;:::-;9005:770;;;;-1:-1:-1;9734:8:9;-1:-1:-1;;;;9005:770:9:o;9780:805::-;9893:6;9901;9909;9917;9925;9933;9941;9994:3;9982:9;9973:7;9969:23;9965:33;9962:53;;;10011:1;10008;10001:12;9962:53;10050:9;10037:23;10069:31;10094:5;10069:31;:::i;:::-;10119:5;-1:-1:-1;10176:2:9;10161:18;;10148:32;10189:33;10148:32;10189:33;:::i;:::-;10241:7;-1:-1:-1;10295:2:9;10280:18;;10267:32;;-1:-1:-1;10346:2:9;10331:18;;10318:32;;-1:-1:-1;10397:3:9;10382:19;;10369:33;;-1:-1:-1;10454:3:9;10439:19;;10426:33;10468;10426;10468;:::i;:::-;10520:7;10510:17;;;10574:3;10563:9;10559:19;10546:33;10536:43;;9780:805;;;;;;;;;;:::o;10590:505::-;10685:6;10693;10701;10754:2;10742:9;10733:7;10729:23;10725:32;10722:52;;;10770:1;10767;10760:12;10722:52;10806:9;10793:23;10783:33;;10867:2;10856:9;10852:18;10839:32;10894:18;10886:6;10883:30;10880:50;;;10926:1;10923;10916:12;10880:50;10965:70;11027:7;11018:6;11007:9;11003:22;10965:70;:::i;:::-;10590:505;;11054:8;;-1:-1:-1;10939:96:9;;-1:-1:-1;;;;10590:505:9:o;11100:874::-;11222:6;11230;11238;11246;11254;11262;11270;11278;11331:3;11319:9;11310:7;11306:23;11302:33;11299:53;;;11348:1;11345;11338:12;11299:53;11387:9;11374:23;11406:31;11431:5;11406:31;:::i;:::-;11456:5;-1:-1:-1;11513:2:9;11498:18;;11485:32;11526:33;11485:32;11526:33;:::i;:::-;11578:7;-1:-1:-1;11632:2:9;11617:18;;11604:32;;-1:-1:-1;11683:2:9;11668:18;;11655:32;;-1:-1:-1;11734:3:9;11719:19;;11706:33;;-1:-1:-1;11786:3:9;11771:19;;11758:33;;-1:-1:-1;11843:3:9;11828:19;;11815:33;11857;11815;11857;:::i;:::-;11909:7;11899:17;;;11963:3;11952:9;11948:19;11935:33;11925:43;;11100:874;;;;;;;;;;;:::o;12303:127::-;12364:10;12359:3;12355:20;12352:1;12345:31;12395:4;12392:1;12385:15;12419:4;12416:1;12409:15;12435:128;12502:9;;;12523:11;;;12520:37;;;12537:18;;:::i;12568:127::-;12629:10;12624:3;12620:20;12617:1;12610:31;12660:4;12657:1;12650:15;12684:4;12681:1;12674:15;12700:184;12770:6;12823:2;12811:9;12802:7;12798:23;12794:32;12791:52;;;12839:1;12836;12829:12;12791:52;-1:-1:-1;12862:16:9;;12700:184;-1:-1:-1;12700:184:9:o;12889:245::-;12956:6;13009:2;12997:9;12988:7;12984:23;12980:32;12977:52;;;13025:1;13022;13015:12;12977:52;13057:9;13051:16;13076:28;13098:5;13076:28;:::i;13697:418::-;-1:-1:-1;;13946:2:9;13942:15;;;13938:24;;13926:37;;13997:15;;;;13993:24;;;13988:2;13979:12;;13972:46;14064:14;14057:22;14052:3;14048:32;14043:2;14034:12;;14027:54;14106:2;14097:12;;13697:418::o;14628:125::-;14693:9;;;14714:10;;;14711:36;;;14727:18;;:::i;14758:135::-;14797:3;14818:17;;;14815:43;;14838:18;;:::i;:::-;-1:-1:-1;14885:1:9;14874:13;;14758:135::o;15278:245::-;15357:6;15365;15418:2;15406:9;15397:7;15393:23;15389:32;15386:52;;;15434:1;15431;15424:12;15386:52;-1:-1:-1;;15457:16:9;;15513:2;15498:18;;;15492:25;15457:16;;15492:25;;-1:-1:-1;15278:245:9:o;15528:306::-;15616:6;15624;15632;15685:2;15673:9;15664:7;15660:23;15656:32;15653:52;;;15701:1;15698;15691:12;15653:52;15730:9;15724:16;15714:26;;15780:2;15769:9;15765:18;15759:25;15749:35;;15824:2;15813:9;15809:18;15803:25;15793:35;;15528:306;;;;;:::o;16246:250::-;16331:1;16341:113;16355:6;16352:1;16349:13;16341:113;;;16431:11;;;16425:18;16412:11;;;16405:39;16377:2;16370:10;16341:113;;;-1:-1:-1;;16488:1:9;16470:16;;16463:27;16246:250::o;16501:287::-;16630:3;16668:6;16662:13;16684:66;16743:6;16738:3;16731:4;16723:6;16719:17;16684:66;:::i;:::-;16766:16;;;;;16501:287;-1:-1:-1;;16501:287:9:o;17154:637::-;17385:6;17374:9;17367:25;17428:6;17423:2;17412:9;17408:18;17401:34;17500:1;17496;17491:3;17487:11;17483:19;17475:6;17471:32;17466:2;17455:9;17451:18;17444:60;17540:3;17535:2;17524:9;17520:18;17513:31;17348:4;17573:6;17567:13;17617:6;17611:3;17600:9;17596:19;17589:35;17633:80;17706:6;17700:3;17689:9;17685:19;17680:2;17672:6;17668:15;17633:80;:::i;:::-;17774:2;17753:15;-1:-1:-1;;17749:29:9;17734:45;;;;17781:3;17730:55;;17154:637;-1:-1:-1;;;;;17154:637:9:o;18186:251::-;18256:6;18309:2;18297:9;18288:7;18284:23;18280:32;18277:52;;;18325:1;18322;18315:12;18277:52;18357:9;18351:16;18376:31;18401:5;18376:31;:::i;18442:168::-;18515:9;;;18546;;18563:15;;;18557:22;;18543:37;18533:71;;18584:18;;:::i;18615:217::-;18655:1;18681;18671:132;;18725:10;18720:3;18716:20;18713:1;18706:31;18760:4;18757:1;18750:15;18788:4;18785:1;18778:15;18671:132;-1:-1:-1;18817:9:9;;18615:217::o
Swarm Source
ipfs://2e016813496ad0b4c738836e30897bee7e4d7ed2b9b7a2e06b10b1433c2e92e7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.