Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 6,770 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 20117377 | 235 days ago | IN | 0 ETH | 0.00084693 | ||||
Add Liquidity | 19692117 | 295 days ago | IN | 0 ETH | 0.00109776 | ||||
Remove Liquidity | 19683204 | 296 days ago | IN | 0 ETH | 0.00261139 | ||||
Remove Liquidity... | 19675862 | 297 days ago | IN | 0 ETH | 0.00848204 | ||||
Remove Liquidity... | 19235069 | 359 days ago | IN | 0 ETH | 0.00661672 | ||||
Swap Exact Token... | 18278079 | 493 days ago | IN | 0 ETH | 0.00161023 | ||||
Swap Exact Token... | 18206337 | 503 days ago | IN | 0 ETH | 0.00113292 | ||||
Swap Exact Token... | 18206333 | 503 days ago | IN | 0 ETH | 0.00106879 | ||||
Swap Exact Token... | 18206327 | 503 days ago | IN | 0 ETH | 0.00106868 | ||||
Swap Exact Token... | 18206317 | 503 days ago | IN | 0 ETH | 0.00106879 | ||||
Swap Exact Token... | 18206307 | 503 days ago | IN | 0 ETH | 0.00122269 | ||||
Swap Exact Token... | 18066596 | 522 days ago | IN | 0 ETH | 0.0015081 | ||||
Swap Exact Token... | 18065942 | 523 days ago | IN | 0 ETH | 0.00435057 | ||||
Swap Exact Token... | 18056741 | 524 days ago | IN | 0 ETH | 0.00236518 | ||||
Swap Exact Token... | 18056300 | 524 days ago | IN | 0 ETH | 0.00126214 | ||||
Swap Exact Token... | 18056258 | 524 days ago | IN | 0 ETH | 0.00134765 | ||||
Swap Exact Token... | 18052932 | 524 days ago | IN | 0 ETH | 0.00134855 | ||||
Swap Exact Token... | 18050667 | 525 days ago | IN | 0 ETH | 0.00169695 | ||||
Swap Exact Token... | 18047510 | 525 days ago | IN | 0 ETH | 0.00193446 | ||||
Swap Exact Token... | 18043689 | 526 days ago | IN | 0 ETH | 0.00354019 | ||||
Swap Exact Token... | 18041673 | 526 days ago | IN | 0 ETH | 0.00168987 | ||||
Swap Exact Token... | 18035996 | 527 days ago | IN | 0 ETH | 0.00796394 | ||||
Swap Exact Token... | 18034348 | 527 days ago | IN | 0 ETH | 0.00149465 | ||||
Swap Exact Token... | 18033205 | 527 days ago | IN | 0 ETH | 0.00189489 | ||||
Swap Exact Token... | 18031945 | 527 days ago | IN | 0 ETH | 0.00149472 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
15345540 | 908 days ago | 0.07368959 ETH | ||||
15345540 | 908 days ago | 0.07368959 ETH | ||||
15196001 | 931 days ago | 0.00601123 ETH | ||||
15118621 | 943 days ago | 0.09684286 ETH | ||||
15118621 | 943 days ago | 0.09684286 ETH | ||||
15117749 | 943 days ago | 0.13633563 ETH | ||||
15117749 | 943 days ago | 0.13633563 ETH | ||||
14990950 | 965 days ago | 0.05921002 ETH | ||||
14990950 | 965 days ago | 0.05921002 ETH | ||||
14973314 | 968 days ago | 0.12381482 ETH | ||||
14942686 | 973 days ago | 0.01873055 ETH | ||||
14942686 | 973 days ago | 0.01873055 ETH | ||||
14941101 | 973 days ago | 0.01877783 ETH | ||||
14941101 | 973 days ago | 0.01877783 ETH | ||||
14918894 | 977 days ago | 0.01985745 ETH | ||||
14918894 | 977 days ago | 0.01985745 ETH | ||||
14912770 | 978 days ago | 0.01997927 ETH | ||||
14912770 | 978 days ago | 0.01997927 ETH | ||||
14908574 | 979 days ago | 0.01248218 ETH | ||||
14908574 | 979 days ago | 0.01248218 ETH | ||||
14892256 | 982 days ago | 0.03279412 ETH | ||||
14892256 | 982 days ago | 0.03279412 ETH | ||||
14888473 | 982 days ago | 0.145 ETH | ||||
14883377 | 983 days ago | 0.02412862 ETH | ||||
14883377 | 983 days ago | 0.02412862 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GemswapRouter
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-01 */ // SPDX-License-Identifier: WTFPL pragma solidity >=0.8.0; // ██████╗ ███████╗███╗ ███╗███████╗██╗ ██╗ █████╗ ██████╗ // ██╔════╝ ██╔════╝████╗ ████║██╔════╝██║ ██║██╔══██╗██╔══██╗ // ██║ ███╗█████╗ ██╔████╔██║███████╗██║ █╗ ██║███████║██████╔╝ // ██║ ██║██╔══╝ ██║╚██╔╝██║╚════██║██║███╗██║██╔══██║██╔═══╝ // ╚██████╔╝███████╗██║ ╚═╝ ██║███████║╚███╔███╔╝██║ ██║██║ // ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚═╝ interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); } // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } interface IGemswapPair { function getReserves() external view returns ( uint112 baseReserves, uint112 quoteReserves, uint32 lastUpdate ); } library GemswapLibrary { uint256 internal constant BIPS_DIVISOR = 10_000; function uDiv(uint256 x, uint256 y) internal pure returns (uint256 z) {assembly {z := div(x, y)}} // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens( address tokenA, address tokenB ) internal pure returns (address token0, address token1) { (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); } function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } error NONEXISTENT_PAIR(); // calculates the clone address for a pair without making any external calls function pairFor( address factory, address implementation, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = predictDeterministicAddress(implementation, keccak256(abi.encodePacked(token0, token1, uint256(1))), factory); } // fetches and sorts the reserves for a pair function getReserves( address factory, address implementation, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint256 baseReserves, uint256 quoteReserves,) = IGemswapPair(pairFor(factory, implementation, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (baseReserves, quoteReserves) : (quoteReserves, baseReserves); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { amountB = uDiv(amountA * reserveB, reserveA); } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { uint256 amountInWithFee = amountIn * 9975; amountOut = uDiv(amountInWithFee * reserveOut, reserveIn * BIPS_DIVISOR + amountInWithFee); } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { amountIn = uDiv(reserveIn * amountOut * BIPS_DIVISOR, reserveOut - amountOut * 9975) + 1; } /* -------------------------------------------------------------------------- */ /* SHOULD PROB BE UNCHECKED VVV */ /* -------------------------------------------------------------------------- */ // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, address implementation, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { unchecked { uint256 pathLength = path.length; // save gas amounts = new uint256[](pathLength); amounts[0] = amountIn; for (uint256 i; i < pathLength - 1; ++i) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, implementation, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, address implementation, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { unchecked { uint256 pathLength = path.length; // save gas amounts = new uint256[](pathLength); amounts[pathLength - 1] = amountOut; for (uint256 i = pathLength - 1; i > 0; --i) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, implementation, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } } interface IERC20PermitAllowed { function permit( address holder, address spender, uint256 nonce, uint256 expiry, bool allowed, uint8 v, bytes32 r, bytes32 s ) external; } contract GemswapRouter { address public immutable factory; address public immutable implementation; address public immutable WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "EXPIRED"); _; } constructor( address _factory, address _implementation, address _WETH ) { factory = _factory; implementation = _implementation; WETH = _WETH; } receive() external payable { // only accept ETH via fallback from the WETH contract assert(msg.sender == WETH); } /* -------------------------------------------------------------------------- */ /* ADD LIQUIDITY LOGIC */ /* -------------------------------------------------------------------------- */ function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) private returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) { IUniswapV2Factory(factory).createPair(tokenA, tokenB); } (uint reserveA, uint reserveB) = GemswapLibrary.getReserves(factory, implementation, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = GemswapLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'Gemswap: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = GemswapLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'Gemswap: INSUFFICIENT_A_AMOUNT'); (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) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = GemswapLibrary.pairFor(factory, implementation, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IUniswapV2Pair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = GemswapLibrary.pairFor(factory, implementation, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IUniswapV2Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** 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) { address pair = GemswapLibrary.pairFor(factory, implementation, tokenA, tokenB); IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to); (address token0,) = GemswapLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB) { IUniswapV2Pair(GemswapLibrary.pairFor(factory, implementation, tokenA, tokenB)).permit( msg.sender, address(this), approveMax ? type(uint256).max : liquidity, deadline, v, r, s ); (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH) { address pair = GemswapLibrary.pairFor(factory, implementation, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH) { address pair = GemswapLibrary.pairFor(factory, implementation, token, WETH); uint256 value = approveMax ? type(uint256).max : liquidity; IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(token, liquidity, amountTokenMin, amountETHMin, to, deadline); } /* -------------------------------------------------------------------------- */ /* SWAP LOGIC */ /* -------------------------------------------------------------------------- */ // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { // unchecked orginally unchecked { uint256 pathLength = path.length; address _implementation = implementation; for (uint256 i; i < pathLength - 1; ++i) { (address input, address output) = (path[i], path[i + 1]); (address token0,) = GemswapLibrary.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? GemswapLibrary.pairFor(factory, _implementation, output, path[i + 2]) : _to; IUniswapV2Pair(GemswapLibrary.pairFor(factory, _implementation, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) public ensure(deadline) returns (uint256[] memory amounts) { unchecked { address _implementation = implementation; amounts = GemswapLibrary.getAmountsOut(factory, _implementation, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, GemswapLibrary.pairFor(factory, _implementation, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) public ensure(deadline) returns (uint256[] memory amounts) { address _implementation = implementation; amounts = GemswapLibrary.getAmountsIn(factory, implementation, amountOut, path); require(amounts[0] <= amountInMax, "EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, GemswapLibrary.pairFor(factory, _implementation, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "INVALID_PATH"); address _implementation = implementation; amounts = GemswapLibrary.getAmountsOut(factory, _implementation, msg.value, path); require(amounts[amounts.length - 1] >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(GemswapLibrary.pairFor(factory, _implementation, path[0], path[1]), amounts[0])); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) public ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "INVALID_PATH"); address _implementation = implementation; amounts = GemswapLibrary.getAmountsIn(factory, _implementation, amountOut, path); require(amounts[0] <= amountInMax, "EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom(path[0], msg.sender, GemswapLibrary.pairFor( factory, _implementation, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) public ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "INVALID_PATH"); address _implementation = implementation; amounts = GemswapLibrary.getAmountsOut(factory, _implementation, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, GemswapLibrary.pairFor(factory, _implementation, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "INVALID_PATH"); address _implementation = implementation; amounts = GemswapLibrary.getAmountsIn(factory, _implementation, amountOut, path); require(amounts[0] <= msg.value, "EXCESSIVE_INPUT_AMOUNT"); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(GemswapLibrary.pairFor(factory, _implementation, path[0], path[1]), amounts[0])); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } /* -------------------------------------------------------------------------- */ /* PERMIT SWAP LOGIC */ /* -------------------------------------------------------------------------- */ function swapExactTokensForTokensUsingPermit( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20Permit(path[0]).permit(msg.sender, address(this), amountIn, deadline, v, r, s); amounts = swapExactTokensForTokens(amountIn, amountOutMin, path, to, deadline); } function swapExactTokensForTokensUsingPermitAllowed( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20PermitAllowed(path[0]).permit(msg.sender, address(this), nonce, deadline, true, v, r, s); amounts = swapExactTokensForTokens(amountIn, amountOutMin, path, to, deadline); } function swapTokensForExactTokensUsingPermit( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20Permit(path[0]).permit(msg.sender, address(this), amountInMax, deadline, v, r, s); amounts = swapTokensForExactTokens(amountOut, amountInMax, path, to, deadline); } function swapTokensForExactTokensUsingPermitAllowed( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20PermitAllowed(path[0]).permit(msg.sender, address(this), nonce, deadline, true, v, r, s); amounts = swapTokensForExactTokens(amountOut, amountInMax, path, to, deadline); } function swapTokensForExactETHUsingPermit( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20Permit(path[0]).permit(msg.sender, address(this), amountInMax, deadline, v, r, s); amounts = swapTokensForExactETH(amountOut, amountInMax, path, to, deadline); } function swapTokensForExactETHUsingPermitAllowed( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20PermitAllowed(path[0]).permit(msg.sender, address(this), nonce, deadline, true, v, r, s); amounts = swapTokensForExactETH(amountOut, amountInMax, path, to, deadline); } function swapExactTokensForETHUsingPermit( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20Permit(path[0]).permit(msg.sender, address(this), amountIn, deadline, v, r, s); amounts = swapExactTokensForETH(amountIn, amountOutMin, path, to, deadline); } function swapExactTokensForETHUsingPermitAllowed( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external returns (uint256[] memory amounts) { IERC20PermitAllowed(path[0]).permit(msg.sender, address(this), nonce, deadline, true, v, r, s); amounts = swapExactTokensForETH(amountIn, amountOutMin, path, to, deadline); } /* -------------------------------------------------------------------------- */ /* SWAP (supporting fee-on-transfer tokens) LOGIC */ /* -------------------------------------------------------------------------- */ // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { address _implementation = implementation; // uint256 pathLength = path.length; // removed to avoid stack too deep :( for (uint256 i; i < path.length - 1; ++i) { (address input, address output) = (path[i], path[i + 1]); (address token0,) = GemswapLibrary.sortTokens(input, output); IUniswapV2Pair pair = IUniswapV2Pair(GemswapLibrary.pairFor(factory, _implementation, input, output)); uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1,) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountOutput = GemswapLibrary.getAmountOut( IERC20(input).balanceOf(address(pair)) - reserveInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? GemswapLibrary.pairFor(factory, _implementation, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external ensure(deadline) { TransferHelper.safeTransferFrom(path[0], msg.sender, GemswapLibrary.pairFor(factory, implementation,path[0], path[1]), amountIn); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require(IERC20(path[path.length - 1]).balanceOf(to) - (balanceBefore) >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable ensure(deadline) { require(path[0] == WETH, "INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert(IWETH(WETH).transfer(GemswapLibrary.pairFor(factory, implementation, path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require(IERC20(path[path.length - 1]).balanceOf(to) - (balanceBefore) >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external ensure(deadline) { require(path[path.length - 1] == WETH, "INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, GemswapLibrary.pairFor(factory, implementation, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, "INSUFFICIENT_OUTPUT_AMOUNT"); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } /* -------------------------------------------------------------------------- */ /* LIBRARY FUNCTIONS */ /* -------------------------------------------------------------------------- */ function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public pure returns (uint256 amountB) { return GemswapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut(uint256 amountIn, uint256 reserveIn, uint256 reserveOut) public pure returns (uint256 amountOut) { return GemswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn(uint256 amountOut, uint256 reserveIn, uint256 reserveOut) public pure returns (uint256 amountIn) { return GemswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) public view returns (uint256[] memory amounts) { return GemswapLibrary.getAmountsOut(factory, implementation, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) public view returns (uint256[] memory amounts) { return GemswapLibrary.getAmountsIn(factory, implementation, amountOut, path); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"amountETHMin","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":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","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":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","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":"amountETHMin","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":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","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":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","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"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","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":"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"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapExactTokensForETHUsingPermit","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"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapExactTokensForETHUsingPermitAllowed","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":"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":"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"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapExactTokensForTokensUsingPermit","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"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapExactTokensForTokensUsingPermitAllowed","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapTokensForExactETHUsingPermit","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapTokensForExactETHUsingPermitAllowed","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapTokensForExactTokensUsingPermit","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"swapTokensForExactTokensUsingPermitAllowed","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162004a2838038062004a2883398101604081905262000034916200006f565b6001600160a01b0392831660805290821660a0521660c052620000b9565b80516001600160a01b03811681146200006a57600080fd5b919050565b6000806000606084860312156200008557600080fd5b620000908462000052565b9250620000a06020850162000052565b9150620000b06040850162000052565b90509250925092565b60805160a05160c051614747620002e1600039600081816102020152818161053c015281816106f9015281816107480152818161080401528181610a4e01528181610e83015281816111fd01528181611610015281816116f30152818161179e015281816118d201528181611a1601528181611aa401528181611e0001528181611eb801528181611f5401528181611fd10152818161204501528181612601015281816128130152818161288a015281816128be0152818161295301528181612a8c01528181612bc40152612c5201526000818161041d0152818161087f01528181610b5601528181610bac01528181610c9301528181610efe015281816111db015281816113330152818161194c01528181611cee01528181611d3501528181612098015281816122d5015281816124ea015281816125df015281816127290152818161286801528181612b060152818161331f015281816136130152613b0b0152600081816105e3015281816108a50152818161097801528181610b3501528181610b8b01528181610cb901528181610f24015281816111ba015281816113120152818161197201528181611ad601528181611d1401528181612077015281816122b4015281816124c9015281816125be015281816127080152818161284701528181612b2c01528181612c84015281816133fe01528181613448015281816136a70152818161384f015281816139d001528181613a730152613aea01526147476000f3fe6080604052600436106101f25760003560e01c80637d4217e61161010d578063b6f9de95116100a0578063d7b0c8191161006f578063d7b0c81914610625578063ded9382a14610645578063e8e3370014610665578063f305d719146106a0578063fb3bdb41146106b357600080fd5b8063b6f9de951461059e578063baa2abde146105b1578063c45a0155146105d1578063d06ca61f1461060557600080fd5b80638803dbee116100dc5780638803dbee1461050a578063ad5c46481461052a578063ad615dec1461055e578063af2979eb1461057e57600080fd5b80637d4217e6146104975780637ff36ab5146104b75780638009f653146104ca57806385f8c259146104ea57600080fd5b80634ac1e4de116101855780635c11d795116101545780635c11d795146103eb5780635c60da1b1461040b578063768fc05614610457578063791ac9471461047757600080fd5b80634ac1e4de1461036b5780635119603f1461038b57806354c750b0146103ab5780635b0d5984146103cb57600080fd5b80632195995c116101c15780632195995c146102eb57806338ed17391461030b5780633a2775641461032b5780634a25d94a1461034b57600080fd5b806302751cec14610236578063054d50d41461027057806318cbafe51461029e5780631f00ca74146102cb57600080fd5b3661023157336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461022f5761022f613d14565b005b600080fd5b34801561024257600080fd5b50610256610251366004613d52565b6106c6565b604080519283526020830191909152015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004613db0565b6107c2565b604051908152602001610267565b3480156102aa57600080fd5b506102be6102b9366004613e28565b6107d7565b6040516102679190613e9b565b3480156102d757600080fd5b506102be6102e6366004613ef5565b610b2e565b3480156102f757600080fd5b50610256610306366004613fe5565b610b83565b34801561031757600080fd5b506102be610326366004613e28565b610c6c565b34801561033757600080fd5b506102be61034636600461408f565b610da7565b34801561035757600080fd5b506102be610366366004613e28565b610e56565b34801561037757600080fd5b506102be610386366004614125565b610fba565b34801561039757600080fd5b506102be6103a6366004614125565b61106d565b3480156103b757600080fd5b506102be6103c636600461408f565b611111565b3480156103d757600080fd5b506102906103e63660046141c6565b6111b2565b3480156103f757600080fd5b5061022f610406366004613e28565b6112c0565b34801561041757600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610267565b34801561046357600080fd5b506102be61047236600461408f565b611544565b34801561048357600080fd5b5061022f610492366004613e28565b6115e5565b3480156104a357600080fd5b506102be6104b236600461408f565b61180c565b6102be6104c536600461425c565b6118ad565b3480156104d657600080fd5b506102be6104e5366004614125565b611c16565b3480156104f657600080fd5b50610290610505366004613db0565b611cba565b34801561051657600080fd5b506102be610525366004613e28565b611cc7565b34801561053657600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561056a57600080fd5b50610290610579366004613db0565b611dca565b34801561058a57600080fd5b50610290610599366004613d52565b611dd7565b61022f6105ac36600461425c565b611f31565b3480156105bd57600080fd5b506102566105cc3660046142c3565b612289565b3480156105dd57600080fd5b5061043f7f000000000000000000000000000000000000000000000000000000000000000081565b34801561061157600080fd5b506102be610620366004613ef5565b6124c2565b34801561063157600080fd5b506102be610640366004614125565b612510565b34801561065157600080fd5b506102566106603660046141c6565b6125b4565b34801561067157600080fd5b50610685610680366004614335565b6126c8565b60408051938452602084019290925290820152606001610267565b6106856106ae366004613d52565b6127e7565b6102be6106c136600461425c565b612a67565b60008082428110156106f35760405162461bcd60e51b81526004016106ea906143b1565b60405180910390fd5b610722897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612289565b9093509150610732898685612ddd565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561079457600080fd5b505af11580156107a8573d6000803e3d6000fd5b505050506107b68583612ef8565b50965096945050505050565b60006107cf848484612fc6565b949350505050565b606081428110156107fa5760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866108316001826143e8565b818110610840576108406143ff565b90506020020160208101906108559190614415565b6001600160a01b03161461087b5760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000000000000000000000000000000000000000000090506108ff7f0000000000000000000000000000000000000000000000000000000000000000828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b925087836001855161091191906143e8565b81518110610921576109216143ff565b602002602001015110156109475760405162461bcd60e51b81526004016106ea90614458565b610a0d8787600081811061095d5761095d6143ff565b90506020020160208101906109729190614415565b336109ed7f0000000000000000000000000000000000000000000000000000000000000000858c8c60008181106109ab576109ab6143ff565b90506020020160208101906109c09190614415565b8d8d60018181106109d3576109d36143ff565b90506020020160208101906109e89190614415565b613121565b86600081518110610a0057610a006143ff565b60200260200101516131eb565b610a4c8388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061331b915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8460018651610a8a91906143e8565b81518110610a9a57610a9a6143ff565b60200260200101516040518263ffffffff1660e01b8152600401610ac091815260200190565b600060405180830381600087803b158015610ada57600080fd5b505af1158015610aee573d6000803e3d6000fd5b50505050610b22858460018651610b0591906143e8565b81518110610b1557610b156143ff565b6020026020010151612ef8565b50509695505050505050565b6060610b7c7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008585613510565b9392505050565b600080610bd27f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008f8f613121565b6001600160a01b031663d505accf333089610bed578e610bf1565b6000195b8b8a8a8a6040518863ffffffff1660e01b8152600401610c17979695949392919061448f565b600060405180830381600087803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b50505050610c588d8d8d8d8d8d8d612289565b909e909d509b505050505050505050505050565b60608142811015610c8f5760405162461bcd60e51b81526004016106ea906143b1565b60007f00000000000000000000000000000000000000000000000000000000000000009050610d137f0000000000000000000000000000000000000000000000000000000000000000828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b92508783600185510381518110610d2c57610d2c6143ff565b60200260200101511015610d525760405162461bcd60e51b81526004016106ea90614458565b610d688787600081811061095d5761095d6143ff565b610b22838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b606087876000818110610dbc57610dbc6143ff565b9050602002016020810190610dd19190614415565b6001600160a01b031663d505accf33308d898989896040518863ffffffff1660e01b8152600401610e08979695949392919061448f565b600060405180830381600087803b158015610e2257600080fd5b505af1158015610e36573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a610c6c565b9a9950505050505050505050565b60608142811015610e795760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610eb06001826143e8565b818110610ebf57610ebf6143ff565b9050602002016020810190610ed49190614415565b6001600160a01b031614610efa5760405162461bcd60e51b81526004016106ea90614432565b60007f00000000000000000000000000000000000000000000000000000000000000009050610f7e7f0000000000000000000000000000000000000000000000000000000000000000828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92508783600081518110610f9457610f946143ff565b602002602001015111156109475760405162461bcd60e51b81526004016106ea906144d0565b606088886000818110610fcf57610fcf6143ff565b9050602002016020810190610fe49190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b815260040161101e989796959493929190614500565b600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b6107d7565b9b9a5050505050505050505050565b606088886000818110611082576110826143ff565b90506020020160208101906110979190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b81526004016110d1989796959493929190614500565b600060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b611cc7565b606087876000818110611126576111266143ff565b905060200201602081019061113b9190614415565b6001600160a01b031663d505accf33308c898989896040518863ffffffff1660e01b8152600401611172979695949392919061448f565b600060405180830381600087803b15801561118c57600080fd5b505af11580156111a0573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a611cc7565b6000806112217f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613121565b9050600086611230578b611234565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061126f903390309086908e908d908d908d9060040161448f565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506112af8d8d8d8d8d8d611dd7565b9d9c50505050505050505050505050565b80428110156112e15760405162461bcd60e51b81526004016106ea906143b1565b611393858560008181106112f7576112f76143ff565b905060200201602081019061130c9190614415565b3361138d7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110611365576113656143ff565b905060200201602081019061137a9190614415565b8b8b60018181106109d3576109d36143ff565b8a6131eb565b600085856113a26001826143e8565b8181106113b1576113b16143ff565b90506020020160208101906113c69190614415565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190614549565b9050611472868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613611915050565b868187876114816001826143e8565b818110611490576114906143ff565b90506020020160208101906114a59190614415565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190614549565b61151c91906143e8565b101561153a5760405162461bcd60e51b81526004016106ea90614458565b5050505050505050565b606087876000818110611559576115596143ff565b905060200201602081019061156e9190614415565b6001600160a01b031663d505accf33308d898989896040518863ffffffff1660e01b81526004016115a5979695949392919061448f565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a6107d7565b80428110156116065760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561163d6001826143e8565b81811061164c5761164c6143ff565b90506020020160208101906116619190614415565b6001600160a01b0316146116875760405162461bcd60e51b81526004016106ea90614432565b61169d858560008181106112f7576112f76143ff565b6116db858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190614549565b9050868110156117885760405162461bcd60e51b81526004016106ea90614458565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ea57600080fd5b505af11580156117fe573d6000803e3d6000fd5b5050505061153a8482612ef8565b606087876000818110611821576118216143ff565b90506020020160208101906118369190614415565b6001600160a01b031663d505accf33308c898989896040518863ffffffff1660e01b815260040161186d979695949392919061448f565b600060405180830381600087803b15801561188757600080fd5b505af115801561189b573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a610e56565b606081428110156118d05760405162461bcd60e51b81526004016106ea906143b1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061190d5761190d6143ff565b90506020020160208101906119229190614415565b6001600160a01b0316146119485760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000000000000000000000000000000000000000000090506119cc7f000000000000000000000000000000000000000000000000000000000000000082348a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b92508783600185516119de91906143e8565b815181106119ee576119ee6143ff565b60200260200101511015611a145760405162461bcd60e51b81526004016106ea90614458565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db084600081518110611a5657611a566143ff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a8957600080fd5b505af1158015611a9d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611b317f0000000000000000000000000000000000000000000000000000000000000000848b8b6000818110611b0957611b096143ff565b9050602002016020810190611b1e9190614415565b8c8c60018181106109d3576109d36143ff565b85600081518110611b4457611b446143ff565b60200260200101516040518363ffffffff1660e01b8152600401611b7d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc09190614562565b611bcc57611bcc613d14565b611c0b838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b505095945050505050565b606088886000818110611c2b57611c2b6143ff565b9050602002016020810190611c409190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b8152600401611c7a989796959493929190614500565b600060405180830381600087803b158015611c9457600080fd5b505af1158015611ca8573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b610c6c565b60006107cf84848461391f565b60608142811015611cea5760405162461bcd60e51b81526004016106ea906143b1565b60007f00000000000000000000000000000000000000000000000000000000000000009050611d8e7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92508783600081518110611da457611da46143ff565b60200260200101511115610d525760405162461bcd60e51b81526004016106ea906144d0565b60006107cf84848461395c565b60008142811015611dfa5760405162461bcd60e51b81526004016106ea906143b1565b611e29887f00000000000000000000000000000000000000000000000000000000000000008989893089612289565b6040516370a0823160e01b8152306004820152909350611ea29150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d9190614549565b612ddd565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0457600080fd5b505af1158015611f18573d6000803e3d6000fd5b50505050611f268483612ef8565b509695505050505050565b8042811015611f525760405162461bcd60e51b81526004016106ea906143b1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611f8f57611f8f6143ff565b9050602002016020810190611fa49190614415565b6001600160a01b031614611fca5760405162461bcd60e51b81526004016106ea90614432565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202a57600080fd5b505af115801561203e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120ca7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110611365576113656143ff565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190614562565b61214757612147613d14565b600086866121566001826143e8565b818110612165576121656143ff565b905060200201602081019061217a9190614415565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e69190614549565b9050612226878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b878188886122356001826143e8565b818110612244576122446143ff565b90506020020160208101906122599190614415565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024016114d1565b60008082428110156122ad5760405162461bcd60e51b81526004016106ea906143b1565b60006122fb7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008d8d613121565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190614562565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e6919061457f565b9150915060006123f68e8e613971565b509050806001600160a01b03168e6001600160a01b03161461241957818361241c565b82825b90975095508a8710156124695760405162461bcd60e51b8152602060048201526015602482015274125394d551919250d251539517d057d05353d55395605a1b60448201526064016106ea565b898610156124b15760405162461bcd60e51b8152602060048201526015602482015274125394d551919250d251539517d097d05353d55395605a1b60448201526064016106ea565b505050505097509795505050505050565b6060610b7c7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008585613009565b606088886000818110612525576125256143ff565b905060200201602081019061253a9190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b8152600401612574989796959493929190614500565b600060405180830381600087803b15801561258e57600080fd5b505af11580156125a2573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b610e56565b60008060006126257f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008f7f0000000000000000000000000000000000000000000000000000000000000000613121565b9050600087612634578c612638565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612673903390309086908f908e908e908e9060040161448f565b600060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506126b38e8e8e8e8e8e6106c6565b909f909e509c50505050505050505050505050565b600080600083428110156126ee5760405162461bcd60e51b81526004016106ea906143b1565b6126fc8c8c8c8c8c8c6139a2565b9094509250600061274f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008f8f613121565b905061275d8d3383886131eb565b6127698c3383876131eb565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156127b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d59190614549565b92505050985098509895505050505050565b6000806000834281101561280d5760405162461bcd60e51b81526004016106ea906143b1565b61283b8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6139a2565b909450925060006128ae7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613121565b90506128bc8b3383886131eb565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561291757600080fd5b505af115801561292b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156129a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c49190614562565b6129d0576129d0613d14565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c9190614549565b925083341115612a5957612a5933612a5486346143e8565b612ef8565b505096509650969350505050565b60608142811015612a8a5760405162461bcd60e51b81526004016106ea906143b1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612ac757612ac76143ff565b9050602002016020810190612adc9190614415565b6001600160a01b031614612b025760405162461bcd60e51b81526004016106ea90614432565b60007f00000000000000000000000000000000000000000000000000000000000000009050612b867f0000000000000000000000000000000000000000000000000000000000000000828a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92503483600081518110612b9c57612b9c6143ff565b60200260200101511115612bc25760405162461bcd60e51b81526004016106ea906144d0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db084600081518110612c0457612c046143ff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c3757600080fd5b505af1158015612c4b573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612cb77f0000000000000000000000000000000000000000000000000000000000000000848b8b6000818110611b0957611b096143ff565b85600081518110612cca57612cca6143ff565b60200260200101516040518363ffffffff1660e01b8152600401612d039291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d469190614562565b612d5257612d52613d14565b612d91838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b82600081518110612da457612da46143ff565b6020026020010151341115611c0b57611c0b3384600081518110612dca57612dca6143ff565b602002602001015134612a5491906143e8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612e3991906145cf565b6000604051808303816000865af19150503d8060008114612e76576040519150601f19603f3d011682016040523d82523d6000602084013e612e7b565b606091505b5091509150818015612ea5575080511580612ea5575080806020019051810190612ea59190614562565b612ef15760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106ea565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051612f2291906145cf565b60006040518083038185875af1925050503d8060008114612f5f576040519150601f19603f3d011682016040523d82523d6000602084013e612f64565b606091505b5050905080612fc15760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016106ea565b505050565b600080612fd5856126f76145eb565b9050613000612fe484836145eb565b82612ff1612710886145eb565b612ffb919061460a565b900490565b95945050505050565b80516060908067ffffffffffffffff81111561302757613027613edf565b604051908082528060200260200182016040528015613050578160200160208202803683370190505b5091508382600081518110613067576130676143ff565b60200260200101818152505060005b60018203811015613117576000806130c5898988868151811061309b5761309b6143ff565b60200260200101518987600101815181106130b8576130b86143ff565b6020026020010151613c48565b915091506130ed8584815181106130de576130de6143ff565b60200260200101518383612fc6565b858460010181518110613102576131026143ff565b60209081029190910101525050600101613076565b5050949350505050565b60008060006131308585613971565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201526001604882015291935091506131e09087906068016040516020818303038152906040528051906020012089604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b979650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161324f91906145cf565b6000604051808303816000865af19150503d806000811461328c576040519150601f19603f3d011682016040523d82523d6000602084013e613291565b606091505b50915091508180156132bb5750805115806132bb5750808060200190518101906132bb9190614562565b6133135760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016106ea565b505050505050565b81517f000000000000000000000000000000000000000000000000000000000000000060005b6001830381101561331357600080868381518110613361576133616143ff565b602002602001015187846001018151811061337e5761337e6143ff565b60200260200101519150915060006133968383613971565b50905060008985600101815181106133b0576133b06143ff565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146133de578260006133e2565b6000835b91509150600060028c510388106133f9578a613441565b6134417f00000000000000000000000000000000000000000000000000000000000000008a888f8c60020181518110613434576134346143ff565b6020026020010151613121565b905061346f7f00000000000000000000000000000000000000000000000000000000000000008a8989613121565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156134ac576020820181803683370190505b506040518563ffffffff1660e01b81526004016134cc9493929190614622565b600060405180830381600087803b1580156134e657600080fd5b505af11580156134fa573d6000803e3d6000fd5b5050505050505050505050806001019050613341565b80516060908067ffffffffffffffff81111561352e5761352e613edf565b604051908082528060200260200182016040528015613557578160200160208202803683370190505b50915083826001830381518110613570576135706143ff565b602090810291909101015260001981015b8015613117576000806135be89898860018703815181106135a4576135a46143ff565b60200260200101518987815181106130b8576130b86143ff565b915091506135e68584815181106135d7576135d76143ff565b6020026020010151838361391f565b8560018503815181106135fb576135fb6143ff565b6020908102919091010152505060001901613581565b7f000000000000000000000000000000000000000000000000000000000000000060005b6001845161364391906143e8565b8110156139195760008085838151811061365f5761365f6143ff565b602002602001015186846001613675919061460a565b81518110613685576136856143ff565b602002602001015191509150600061369d8383613971565b50905060006136ce7f0000000000000000000000000000000000000000000000000000000000000000878686613121565b90506000806000836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613713573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137379190614689565b506001600160701b031691506001600160701b03169150600080866001600160a01b0316896001600160a01b031614613771578284613774565b83835b6040516370a0823160e01b81526001600160a01b0389811660048301529294509092506137fc918491908c16906370a0823190602401602060405180830381865afa1580156137c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137eb9190614549565b6137f591906143e8565b8383612fc6565b945050505050600080846001600160a01b0316876001600160a01b0316146138265782600061382a565b6000835b91509150600060028c5161383e91906143e8565b891061384a578a61388c565b61388c7f00000000000000000000000000000000000000000000000000000000000000008b898f61387c8e600261460a565b81518110613434576134346143ff565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0386169063022c0d9f906138ce9086908690869060248101614622565b600060405180830381600087803b1580156138e857600080fd5b505af11580156138fc573d6000803e3d6000fd5b50505050505050505050505080613912906146d9565b9050613635565b50505050565b600061395161271061393186866145eb565b61393b91906145eb565b613947866126f76145eb565b612ffb90856143e8565b6107cf90600161460a565b60006107cf61396b83866145eb565b84900490565b600080826001600160a01b0316846001600160a01b031610613994578284613997565b83835b909590945092505050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015613a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3d91906146f4565b6001600160a01b03161415613ae2576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015613abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae091906146f4565b505b600080613b317f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008c8c613c48565b91509150816000148015613b43575080155b15613b5357879350869250613c3b565b6000613b6089848461395c565b9050878111613bc45785811015613bb95760405162461bcd60e51b815260206004820152601e60248201527f47656d737761703a20494e53554646494349454e545f425f414d4f554e54000060448201526064016106ea565b889450925082613c39565b6000613bd189848661395c565b905089811115613be357613be3613d14565b87811015613c335760405162461bcd60e51b815260206004820152601e60248201527f47656d737761703a20494e53554646494349454e545f415f414d4f554e54000060448201526064016106ea565b94508793505b505b5050965096945050505050565b6000806000613c578585613971565b509050600080613c6989898989613121565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cca9190614689565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613d01578082613d04565b81815b909a909950975050505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613d3f57600080fd5b50565b8035613d4d81613d2a565b919050565b60008060008060008060c08789031215613d6b57600080fd5b8635613d7681613d2a565b95506020870135945060408701359350606087013592506080870135613d9b81613d2a565b8092505060a087013590509295509295509295565b600080600060608486031215613dc557600080fd5b505081359360208301359350604090920135919050565b60008083601f840112613dee57600080fd5b50813567ffffffffffffffff811115613e0657600080fd5b6020830191508360208260051b8501011115613e2157600080fd5b9250929050565b60008060008060008060a08789031215613e4157600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e6657600080fd5b613e7289828a01613ddc565b9095509350506060870135613e8681613d2a565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015613ed357835183529284019291840191600101613eb7565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613f0857600080fd5b8235915060208084013567ffffffffffffffff80821115613f2857600080fd5b818601915086601f830112613f3c57600080fd5b813581811115613f4e57613f4e613edf565b8060051b604051601f19603f83011681018181108582111715613f7357613f73613edf565b604052918252848201925083810185019189831115613f9157600080fd5b938501935b82851015613fb657613fa785613d42565b84529385019392850192613f96565b8096505050505050509250929050565b8015158114613d3f57600080fd5b803560ff81168114613d4d57600080fd5b60008060008060008060008060008060006101608c8e03121561400757600080fd5b8b3561401281613d2a565b9a5060208c013561402281613d2a565b995060408c0135985060608c0135975060808c0135965060a08c013561404781613d2a565b955060c08c0135945060e08c013561405e81613fc6565b935061406d6101008d01613fd4565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060008060008060008060006101008a8c0312156140ae57600080fd5b8935985060208a0135975060408a013567ffffffffffffffff8111156140d357600080fd5b6140df8c828d01613ddc565b90985096505060608a01356140f381613d2a565b945060808a0135935061410860a08b01613fd4565b925060c08a0135915060e08a013590509295985092959850929598565b6000806000806000806000806000806101208b8d03121561414557600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff81111561416a57600080fd5b6141768d828e01613ddc565b90995097505060608b013561418a81613d2a565b955060808b0135945060a08b013593506141a660c08c01613fd4565b925060e08b013591506101008b013590509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d0312156141e657600080fd5b8a356141f181613d2a565b995060208b0135985060408b0135975060608b0135965060808b013561421681613d2a565b955060a08b0135945060c08b013561422d81613fc6565b935061423b60e08c01613fd4565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561427457600080fd5b85359450602086013567ffffffffffffffff81111561429257600080fd5b61429e88828901613ddc565b90955093505060408601356142b281613d2a565b949793965091946060013592915050565b600080600080600080600060e0888a0312156142de57600080fd5b87356142e981613d2a565b965060208801356142f981613d2a565b955060408801359450606088013593506080880135925060a088013561431e81613d2a565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561435257600080fd5b883561435d81613d2a565b9750602089013561436d81613d2a565b965060408901359550606089013594506080890135935060a0890135925060c089013561439981613d2a565b8092505060e089013590509295985092959890939650565b6020808252600790820152661156141254915160ca1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156143fa576143fa6143d2565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561442757600080fd5b8135610b7c81613d2a565b6020808252600c908201526b0929cac82989288bea082a8960a31b604082015260600190565b6020808252601a908201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604082015260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b602080825260169082015275115610d154d4d2559157d25394155517d05353d5539560521b604082015260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60006020828403121561455b57600080fd5b5051919050565b60006020828403121561457457600080fd5b8151610b7c81613fc6565b6000806040838503121561459257600080fd5b505080516020909101519092909150565b60005b838110156145be5781810151838201526020016145a6565b838111156139195750506000910152565b600082516145e18184602087016145a3565b9190910192915050565b6000816000190483118215151615614605576146056143d2565b500290565b6000821982111561461d5761461d6143d2565b500190565b84815283602082015260018060a01b0383166040820152608060608201526000825180608084015261465b8160a08501602087016145a3565b601f01601f19169190910160a00195945050505050565b80516001600160701b0381168114613d4d57600080fd5b60008060006060848603121561469e57600080fd5b6146a784614672565b92506146b560208501614672565b9150604084015163ffffffff811681146146ce57600080fd5b809150509250925092565b60006000198214156146ed576146ed6143d2565b5060010190565b60006020828403121561470657600080fd5b8151610b7c81613d2a56fea26469706673582212209298cd273fd907cc76edaec3d02ff9a58f43e3587749b7dc09e3963db198a7b764736f6c634300080b0033000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80637d4217e61161010d578063b6f9de95116100a0578063d7b0c8191161006f578063d7b0c81914610625578063ded9382a14610645578063e8e3370014610665578063f305d719146106a0578063fb3bdb41146106b357600080fd5b8063b6f9de951461059e578063baa2abde146105b1578063c45a0155146105d1578063d06ca61f1461060557600080fd5b80638803dbee116100dc5780638803dbee1461050a578063ad5c46481461052a578063ad615dec1461055e578063af2979eb1461057e57600080fd5b80637d4217e6146104975780637ff36ab5146104b75780638009f653146104ca57806385f8c259146104ea57600080fd5b80634ac1e4de116101855780635c11d795116101545780635c11d795146103eb5780635c60da1b1461040b578063768fc05614610457578063791ac9471461047757600080fd5b80634ac1e4de1461036b5780635119603f1461038b57806354c750b0146103ab5780635b0d5984146103cb57600080fd5b80632195995c116101c15780632195995c146102eb57806338ed17391461030b5780633a2775641461032b5780634a25d94a1461034b57600080fd5b806302751cec14610236578063054d50d41461027057806318cbafe51461029e5780631f00ca74146102cb57600080fd5b3661023157336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461022f5761022f613d14565b005b600080fd5b34801561024257600080fd5b50610256610251366004613d52565b6106c6565b604080519283526020830191909152015b60405180910390f35b34801561027c57600080fd5b5061029061028b366004613db0565b6107c2565b604051908152602001610267565b3480156102aa57600080fd5b506102be6102b9366004613e28565b6107d7565b6040516102679190613e9b565b3480156102d757600080fd5b506102be6102e6366004613ef5565b610b2e565b3480156102f757600080fd5b50610256610306366004613fe5565b610b83565b34801561031757600080fd5b506102be610326366004613e28565b610c6c565b34801561033757600080fd5b506102be61034636600461408f565b610da7565b34801561035757600080fd5b506102be610366366004613e28565b610e56565b34801561037757600080fd5b506102be610386366004614125565b610fba565b34801561039757600080fd5b506102be6103a6366004614125565b61106d565b3480156103b757600080fd5b506102be6103c636600461408f565b611111565b3480156103d757600080fd5b506102906103e63660046141c6565b6111b2565b3480156103f757600080fd5b5061022f610406366004613e28565b6112c0565b34801561041757600080fd5b5061043f7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c81565b6040516001600160a01b039091168152602001610267565b34801561046357600080fd5b506102be61047236600461408f565b611544565b34801561048357600080fd5b5061022f610492366004613e28565b6115e5565b3480156104a357600080fd5b506102be6104b236600461408f565b61180c565b6102be6104c536600461425c565b6118ad565b3480156104d657600080fd5b506102be6104e5366004614125565b611c16565b3480156104f657600080fd5b50610290610505366004613db0565b611cba565b34801561051657600080fd5b506102be610525366004613e28565b611cc7565b34801561053657600080fd5b5061043f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561056a57600080fd5b50610290610579366004613db0565b611dca565b34801561058a57600080fd5b50610290610599366004613d52565b611dd7565b61022f6105ac36600461425c565b611f31565b3480156105bd57600080fd5b506102566105cc3660046142c3565b612289565b3480156105dd57600080fd5b5061043f7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd81565b34801561061157600080fd5b506102be610620366004613ef5565b6124c2565b34801561063157600080fd5b506102be610640366004614125565b612510565b34801561065157600080fd5b506102566106603660046141c6565b6125b4565b34801561067157600080fd5b50610685610680366004614335565b6126c8565b60408051938452602084019290925290820152606001610267565b6106856106ae366004613d52565b6127e7565b6102be6106c136600461425c565b612a67565b60008082428110156106f35760405162461bcd60e51b81526004016106ea906143b1565b60405180910390fd5b610722897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a612289565b9093509150610732898685612ddd565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561079457600080fd5b505af11580156107a8573d6000803e3d6000fd5b505050506107b68583612ef8565b50965096945050505050565b60006107cf848484612fc6565b949350505050565b606081428110156107fa5760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866108316001826143e8565b818110610840576108406143ff565b90506020020160208101906108559190614415565b6001600160a01b03161461087b5760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c90506108ff7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b925087836001855161091191906143e8565b81518110610921576109216143ff565b602002602001015110156109475760405162461bcd60e51b81526004016106ea90614458565b610a0d8787600081811061095d5761095d6143ff565b90506020020160208101906109729190614415565b336109ed7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd858c8c60008181106109ab576109ab6143ff565b90506020020160208101906109c09190614415565b8d8d60018181106109d3576109d36143ff565b90506020020160208101906109e89190614415565b613121565b86600081518110610a0057610a006143ff565b60200260200101516131eb565b610a4c8388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061331b915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8460018651610a8a91906143e8565b81518110610a9a57610a9a6143ff565b60200260200101516040518263ffffffff1660e01b8152600401610ac091815260200190565b600060405180830381600087803b158015610ada57600080fd5b505af1158015610aee573d6000803e3d6000fd5b50505050610b22858460018651610b0591906143e8565b81518110610b1557610b156143ff565b6020026020010151612ef8565b50509695505050505050565b6060610b7c7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8585613510565b9392505050565b600080610bd27f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8f8f613121565b6001600160a01b031663d505accf333089610bed578e610bf1565b6000195b8b8a8a8a6040518863ffffffff1660e01b8152600401610c17979695949392919061448f565b600060405180830381600087803b158015610c3157600080fd5b505af1158015610c45573d6000803e3d6000fd5b50505050610c588d8d8d8d8d8d8d612289565b909e909d509b505050505050505050505050565b60608142811015610c8f5760405162461bcd60e51b81526004016106ea906143b1565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c9050610d137f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b92508783600185510381518110610d2c57610d2c6143ff565b60200260200101511015610d525760405162461bcd60e51b81526004016106ea90614458565b610d688787600081811061095d5761095d6143ff565b610b22838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b606087876000818110610dbc57610dbc6143ff565b9050602002016020810190610dd19190614415565b6001600160a01b031663d505accf33308d898989896040518863ffffffff1660e01b8152600401610e08979695949392919061448f565b600060405180830381600087803b158015610e2257600080fd5b505af1158015610e36573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a610c6c565b9a9950505050505050505050565b60608142811015610e795760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610eb06001826143e8565b818110610ebf57610ebf6143ff565b9050602002016020810190610ed49190614415565b6001600160a01b031614610efa5760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c9050610f7e7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd828b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92508783600081518110610f9457610f946143ff565b602002602001015111156109475760405162461bcd60e51b81526004016106ea906144d0565b606088886000818110610fcf57610fcf6143ff565b9050602002016020810190610fe49190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b815260040161101e989796959493929190614500565b600060405180830381600087803b15801561103857600080fd5b505af115801561104c573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b6107d7565b9b9a5050505050505050505050565b606088886000818110611082576110826143ff565b90506020020160208101906110979190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b81526004016110d1989796959493929190614500565b600060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b611cc7565b606087876000818110611126576111266143ff565b905060200201602081019061113b9190614415565b6001600160a01b031663d505accf33308c898989896040518863ffffffff1660e01b8152600401611172979695949392919061448f565b600060405180830381600087803b15801561118c57600080fd5b505af11580156111a0573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a611cc7565b6000806112217f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613121565b9050600086611230578b611234565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061126f903390309086908e908d908d908d9060040161448f565b600060405180830381600087803b15801561128957600080fd5b505af115801561129d573d6000803e3d6000fd5b505050506112af8d8d8d8d8d8d611dd7565b9d9c50505050505050505050505050565b80428110156112e15760405162461bcd60e51b81526004016106ea906143b1565b611393858560008181106112f7576112f76143ff565b905060200201602081019061130c9190614415565b3361138d7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8a8a6000818110611365576113656143ff565b905060200201602081019061137a9190614415565b8b8b60018181106109d3576109d36143ff565b8a6131eb565b600085856113a26001826143e8565b8181106113b1576113b16143ff565b90506020020160208101906113c69190614415565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561140e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114329190614549565b9050611472868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613611915050565b868187876114816001826143e8565b818110611490576114906143ff565b90506020020160208101906114a59190614415565b6040516370a0823160e01b81526001600160a01b03888116600483015291909116906370a08231906024015b602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190614549565b61151c91906143e8565b101561153a5760405162461bcd60e51b81526004016106ea90614458565b5050505050505050565b606087876000818110611559576115596143ff565b905060200201602081019061156e9190614415565b6001600160a01b031663d505accf33308d898989896040518863ffffffff1660e01b81526004016115a5979695949392919061448f565b600060405180830381600087803b1580156115bf57600080fd5b505af11580156115d3573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a6107d7565b80428110156116065760405162461bcd60e51b81526004016106ea906143b1565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216858561163d6001826143e8565b81811061164c5761164c6143ff565b90506020020160208101906116619190614415565b6001600160a01b0316146116875760405162461bcd60e51b81526004016106ea90614432565b61169d858560008181106112f7576112f76143ff565b6116db858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613611915050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a0823190602401602060405180830381865afa158015611742573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117669190614549565b9050868110156117885760405162461bcd60e51b81526004016106ea90614458565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ea57600080fd5b505af11580156117fe573d6000803e3d6000fd5b5050505061153a8482612ef8565b606087876000818110611821576118216143ff565b90506020020160208101906118369190614415565b6001600160a01b031663d505accf33308c898989896040518863ffffffff1660e01b815260040161186d979695949392919061448f565b600060405180830381600087803b15801561188757600080fd5b505af115801561189b573d6000803e3d6000fd5b50505050610e488a8a8a8a8a8a610e56565b606081428110156118d05760405162461bcd60e51b81526004016106ea906143b1565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061190d5761190d6143ff565b90506020020160208101906119229190614415565b6001600160a01b0316146119485760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c90506119cc7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd82348a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061300992505050565b92508783600185516119de91906143e8565b815181106119ee576119ee6143ff565b60200260200101511015611a145760405162461bcd60e51b81526004016106ea90614458565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db084600081518110611a5657611a566143ff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a8957600080fd5b505af1158015611a9d573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb611b317f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd848b8b6000818110611b0957611b096143ff565b9050602002016020810190611b1e9190614415565b8c8c60018181106109d3576109d36143ff565b85600081518110611b4457611b446143ff565b60200260200101516040518363ffffffff1660e01b8152600401611b7d9291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc09190614562565b611bcc57611bcc613d14565b611c0b838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b505095945050505050565b606088886000818110611c2b57611c2b6143ff565b9050602002016020810190611c409190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b8152600401611c7a989796959493929190614500565b600060405180830381600087803b158015611c9457600080fd5b505af1158015611ca8573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b610c6c565b60006107cf84848461391f565b60608142811015611cea5760405162461bcd60e51b81526004016106ea906143b1565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c9050611d8e7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8b8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92508783600081518110611da457611da46143ff565b60200260200101511115610d525760405162461bcd60e51b81526004016106ea906144d0565b60006107cf84848461395c565b60008142811015611dfa5760405162461bcd60e51b81526004016106ea906143b1565b611e29887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28989893089612289565b6040516370a0823160e01b8152306004820152909350611ea29150899086906001600160a01b038316906370a0823190602401602060405180830381865afa158015611e79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9d9190614549565b612ddd565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0457600080fd5b505af1158015611f18573d6000803e3d6000fd5b50505050611f268483612ef8565b509695505050505050565b8042811015611f525760405162461bcd60e51b81526004016106ea906143b1565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611f8f57611f8f6143ff565b9050602002016020810190611fa49190614415565b6001600160a01b031614611fca5760405162461bcd60e51b81526004016106ea90614432565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561202a57600080fd5b505af115801561203e573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6120ca7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8a8a6000818110611365576113656143ff565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213b9190614562565b61214757612147613d14565b600086866121566001826143e8565b818110612165576121656143ff565b905060200201602081019061217a9190614415565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa1580156121c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e69190614549565b9050612226878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613611915050565b878188886122356001826143e8565b818110612244576122446143ff565b90506020020160208101906122599190614415565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024016114d1565b60008082428110156122ad5760405162461bcd60e51b81526004016106ea906143b1565b60006122fb7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8d8d613121565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190614562565b5060405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156123c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e6919061457f565b9150915060006123f68e8e613971565b509050806001600160a01b03168e6001600160a01b03161461241957818361241c565b82825b90975095508a8710156124695760405162461bcd60e51b8152602060048201526015602482015274125394d551919250d251539517d057d05353d55395605a1b60448201526064016106ea565b898610156124b15760405162461bcd60e51b8152602060048201526015602482015274125394d551919250d251539517d097d05353d55395605a1b60448201526064016106ea565b505050505097509795505050505050565b6060610b7c7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8585613009565b606088886000818110612525576125256143ff565b905060200201602081019061253a9190614415565b6001600160a01b0316638fcbaf0c3330888a60018a8a8a6040518963ffffffff1660e01b8152600401612574989796959493929190614500565b600060405180830381600087803b15801561258e57600080fd5b505af11580156125a2573d6000803e3d6000fd5b5050505061105e8b8b8b8b8b8b610e56565b60008060006126257f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8f7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613121565b9050600087612634578c612638565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90612673903390309086908f908e908e908e9060040161448f565b600060405180830381600087803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050506126b38e8e8e8e8e8e6106c6565b909f909e509c50505050505050505050505050565b600080600083428110156126ee5760405162461bcd60e51b81526004016106ea906143b1565b6126fc8c8c8c8c8c8c6139a2565b9094509250600061274f7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8f8f613121565b905061275d8d3383886131eb565b6127698c3383876131eb565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156127b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d59190614549565b92505050985098509895505050505050565b6000806000834281101561280d5760405162461bcd60e51b81526004016106ea906143b1565b61283b8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c6139a2565b909450925060006128ae7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613121565b90506128bc8b3383886131eb565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561291757600080fd5b505af115801561292b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af11580156129a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c49190614562565b6129d0576129d0613d14565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af1158015612a18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3c9190614549565b925083341115612a5957612a5933612a5486346143e8565b612ef8565b505096509650969350505050565b60608142811015612a8a5760405162461bcd60e51b81526004016106ea906143b1565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110612ac757612ac76143ff565b9050602002016020810190612adc9190614415565b6001600160a01b031614612b025760405162461bcd60e51b81526004016106ea90614432565b60007f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c9050612b867f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd828a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351092505050565b92503483600081518110612b9c57612b9c6143ff565b60200260200101511115612bc25760405162461bcd60e51b81526004016106ea906144d0565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db084600081518110612c0457612c046143ff565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c3757600080fd5b505af1158015612c4b573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb612cb77f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd848b8b6000818110611b0957611b096143ff565b85600081518110612cca57612cca6143ff565b60200260200101516040518363ffffffff1660e01b8152600401612d039291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015612d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d469190614562565b612d5257612d52613d14565b612d91838888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a925061331b915050565b82600081518110612da457612da46143ff565b6020026020010151341115611c0b57611c0b3384600081518110612dca57612dca6143ff565b602002602001015134612a5491906143e8565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612e3991906145cf565b6000604051808303816000865af19150503d8060008114612e76576040519150601f19603f3d011682016040523d82523d6000602084013e612e7b565b606091505b5091509150818015612ea5575080511580612ea5575080806020019051810190612ea59190614562565b612ef15760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106ea565b5050505050565b604080516000808252602082019092526001600160a01b038416908390604051612f2291906145cf565b60006040518083038185875af1925050503d8060008114612f5f576040519150601f19603f3d011682016040523d82523d6000602084013e612f64565b606091505b5050905080612fc15760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016106ea565b505050565b600080612fd5856126f76145eb565b9050613000612fe484836145eb565b82612ff1612710886145eb565b612ffb919061460a565b900490565b95945050505050565b80516060908067ffffffffffffffff81111561302757613027613edf565b604051908082528060200260200182016040528015613050578160200160208202803683370190505b5091508382600081518110613067576130676143ff565b60200260200101818152505060005b60018203811015613117576000806130c5898988868151811061309b5761309b6143ff565b60200260200101518987600101815181106130b8576130b86143ff565b6020026020010151613c48565b915091506130ed8584815181106130de576130de6143ff565b60200260200101518383612fc6565b858460010181518110613102576131026143ff565b60209081029190910101525050600101613076565b5050949350505050565b60008060006131308585613971565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b1660348201526001604882015291935091506131e09087906068016040516020818303038152906040528051906020012089604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b8152606093841b60148201526f5af43d82803e903d91602b57fd5bf3ff60801b6028820152921b6038830152604c8201526037808220606c830152605591012090565b979650505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161324f91906145cf565b6000604051808303816000865af19150503d806000811461328c576040519150601f19603f3d011682016040523d82523d6000602084013e613291565b606091505b50915091508180156132bb5750805115806132bb5750808060200190518101906132bb9190614562565b6133135760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416044820152631253115160e21b60648201526084016106ea565b505050505050565b81517f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c60005b6001830381101561331357600080868381518110613361576133616143ff565b602002602001015187846001018151811061337e5761337e6143ff565b60200260200101519150915060006133968383613971565b50905060008985600101815181106133b0576133b06143ff565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146133de578260006133e2565b6000835b91509150600060028c510388106133f9578a613441565b6134417f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd8a888f8c60020181518110613434576134346143ff565b6020026020010151613121565b905061346f7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd8a8989613121565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156134ac576020820181803683370190505b506040518563ffffffff1660e01b81526004016134cc9493929190614622565b600060405180830381600087803b1580156134e657600080fd5b505af11580156134fa573d6000803e3d6000fd5b5050505050505050505050806001019050613341565b80516060908067ffffffffffffffff81111561352e5761352e613edf565b604051908082528060200260200182016040528015613557578160200160208202803683370190505b50915083826001830381518110613570576135706143ff565b602090810291909101015260001981015b8015613117576000806135be89898860018703815181106135a4576135a46143ff565b60200260200101518987815181106130b8576130b86143ff565b915091506135e68584815181106135d7576135d76143ff565b6020026020010151838361391f565b8560018503815181106135fb576135fb6143ff565b6020908102919091010152505060001901613581565b7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c60005b6001845161364391906143e8565b8110156139195760008085838151811061365f5761365f6143ff565b602002602001015186846001613675919061460a565b81518110613685576136856143ff565b602002602001015191509150600061369d8383613971565b50905060006136ce7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd878686613121565b90506000806000836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613713573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137379190614689565b506001600160701b031691506001600160701b03169150600080866001600160a01b0316896001600160a01b031614613771578284613774565b83835b6040516370a0823160e01b81526001600160a01b0389811660048301529294509092506137fc918491908c16906370a0823190602401602060405180830381865afa1580156137c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137eb9190614549565b6137f591906143e8565b8383612fc6565b945050505050600080846001600160a01b0316876001600160a01b0316146138265782600061382a565b6000835b91509150600060028c5161383e91906143e8565b891061384a578a61388c565b61388c7f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd8b898f61387c8e600261460a565b81518110613434576134346143ff565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0386169063022c0d9f906138ce9086908690869060248101614622565b600060405180830381600087803b1580156138e857600080fd5b505af11580156138fc573d6000803e3d6000fd5b50505050505050505050505080613912906146d9565b9050613635565b50505050565b600061395161271061393186866145eb565b61393b91906145eb565b613947866126f76145eb565b612ffb90856143e8565b6107cf90600161460a565b60006107cf61396b83866145eb565b84900490565b600080826001600160a01b0316846001600160a01b031610613994578284613997565b83835b909590945092505050565b60405163e6a4390560e01b81526001600160a01b0387811660048301528681166024830152600091829182917f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd9091169063e6a4390590604401602060405180830381865afa158015613a19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a3d91906146f4565b6001600160a01b03161415613ae2576040516364e329cb60e11b81526001600160a01b03898116600483015288811660248301527f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd169063c9c65396906044016020604051808303816000875af1158015613abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae091906146f4565b505b600080613b317f000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd7f000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c8c8c613c48565b91509150816000148015613b43575080155b15613b5357879350869250613c3b565b6000613b6089848461395c565b9050878111613bc45785811015613bb95760405162461bcd60e51b815260206004820152601e60248201527f47656d737761703a20494e53554646494349454e545f425f414d4f554e54000060448201526064016106ea565b889450925082613c39565b6000613bd189848661395c565b905089811115613be357613be3613d14565b87811015613c335760405162461bcd60e51b815260206004820152601e60248201527f47656d737761703a20494e53554646494349454e545f415f414d4f554e54000060448201526064016106ea565b94508793505b505b5050965096945050505050565b6000806000613c578585613971565b509050600080613c6989898989613121565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cca9190614689565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b031614613d01578082613d04565b81815b909a909950975050505050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b0381168114613d3f57600080fd5b50565b8035613d4d81613d2a565b919050565b60008060008060008060c08789031215613d6b57600080fd5b8635613d7681613d2a565b95506020870135945060408701359350606087013592506080870135613d9b81613d2a565b8092505060a087013590509295509295509295565b600080600060608486031215613dc557600080fd5b505081359360208301359350604090920135919050565b60008083601f840112613dee57600080fd5b50813567ffffffffffffffff811115613e0657600080fd5b6020830191508360208260051b8501011115613e2157600080fd5b9250929050565b60008060008060008060a08789031215613e4157600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613e6657600080fd5b613e7289828a01613ddc565b9095509350506060870135613e8681613d2a565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b81811015613ed357835183529284019291840191600101613eb7565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215613f0857600080fd5b8235915060208084013567ffffffffffffffff80821115613f2857600080fd5b818601915086601f830112613f3c57600080fd5b813581811115613f4e57613f4e613edf565b8060051b604051601f19603f83011681018181108582111715613f7357613f73613edf565b604052918252848201925083810185019189831115613f9157600080fd5b938501935b82851015613fb657613fa785613d42565b84529385019392850192613f96565b8096505050505050509250929050565b8015158114613d3f57600080fd5b803560ff81168114613d4d57600080fd5b60008060008060008060008060008060006101608c8e03121561400757600080fd5b8b3561401281613d2a565b9a5060208c013561402281613d2a565b995060408c0135985060608c0135975060808c0135965060a08c013561404781613d2a565b955060c08c0135945060e08c013561405e81613fc6565b935061406d6101008d01613fd4565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60008060008060008060008060006101008a8c0312156140ae57600080fd5b8935985060208a0135975060408a013567ffffffffffffffff8111156140d357600080fd5b6140df8c828d01613ddc565b90985096505060608a01356140f381613d2a565b945060808a0135935061410860a08b01613fd4565b925060c08a0135915060e08a013590509295985092959850929598565b6000806000806000806000806000806101208b8d03121561414557600080fd5b8a35995060208b0135985060408b013567ffffffffffffffff81111561416a57600080fd5b6141768d828e01613ddc565b90995097505060608b013561418a81613d2a565b955060808b0135945060a08b013593506141a660c08c01613fd4565b925060e08b013591506101008b013590509295989b9194979a5092959850565b6000806000806000806000806000806101408b8d0312156141e657600080fd5b8a356141f181613d2a565b995060208b0135985060408b0135975060608b0135965060808b013561421681613d2a565b955060a08b0135945060c08b013561422d81613fc6565b935061423b60e08c01613fd4565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561427457600080fd5b85359450602086013567ffffffffffffffff81111561429257600080fd5b61429e88828901613ddc565b90955093505060408601356142b281613d2a565b949793965091946060013592915050565b600080600080600080600060e0888a0312156142de57600080fd5b87356142e981613d2a565b965060208801356142f981613d2a565b955060408801359450606088013593506080880135925060a088013561431e81613d2a565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561435257600080fd5b883561435d81613d2a565b9750602089013561436d81613d2a565b965060408901359550606089013594506080890135935060a0890135925060c089013561439981613d2a565b8092505060e089013590509295985092959890939650565b6020808252600790820152661156141254915160ca1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000828210156143fa576143fa6143d2565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561442757600080fd5b8135610b7c81613d2a565b6020808252600c908201526b0929cac82989288bea082a8960a31b604082015260600190565b6020808252601a908201527f494e53554646494349454e545f4f55545055545f414d4f554e54000000000000604082015260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b602080825260169082015275115610d154d4d2559157d25394155517d05353d5539560521b604082015260600190565b6001600160a01b039889168152969097166020870152604086019490945260608501929092521515608084015260ff1660a083015260c082015260e08101919091526101000190565b60006020828403121561455b57600080fd5b5051919050565b60006020828403121561457457600080fd5b8151610b7c81613fc6565b6000806040838503121561459257600080fd5b505080516020909101519092909150565b60005b838110156145be5781810151838201526020016145a6565b838111156139195750506000910152565b600082516145e18184602087016145a3565b9190910192915050565b6000816000190483118215151615614605576146056143d2565b500290565b6000821982111561461d5761461d6143d2565b500190565b84815283602082015260018060a01b0383166040820152608060608201526000825180608084015261465b8160a08501602087016145a3565b601f01601f19169190910160a00195945050505050565b80516001600160701b0381168114613d4d57600080fd5b60008060006060848603121561469e57600080fd5b6146a784614672565b92506146b560208501614672565b9150604084015163ffffffff811681146146ce57600080fd5b809150509250925092565b60006000198214156146ed576146ed6143d2565b5060010190565b60006020828403121561470657600080fd5b8151610b7c81613d2a56fea26469706673582212209298cd273fd907cc76edaec3d02ff9a58f43e3587749b7dc09e3963db198a7b764736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0x066a5Cb7ddC6d55384E2F6cA13D5DD2Cd2685cbd
Arg [1] : _implementation (address): 0xE8e429cb147Ca1b984eB4E43b8813e6DdC36db6C
Arg [2] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000066a5cb7ddc6d55384e2f6ca13d5dd2cd2685cbd
Arg [1] : 000000000000000000000000e8e429cb147ca1b984eb4e43b8813e6ddc36db6c
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
14632:24382:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15233:10;-1:-1:-1;;;;;15247:4:0;15233:18;;15226:26;;;;:::i;:::-;14632:24382;;;;;19578:680;;;;;;;;;;-1:-1:-1;19578:680:0;;;;;:::i;:::-;;:::i;:::-;;;;1263:25:1;;;1319:2;1304:18;;1297:34;;;;1236:18;19578:680:0;;;;;;;;38166:205;;;;;;;;;;-1:-1:-1;38166:205:0;;;;;:::i;:::-;;:::i;:::-;;;1809:25:1;;;1797:2;1782:18;38166:205:0;1663:177:1;27743:938:0;;;;;;;;;;-1:-1:-1;27743:938:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38805:206::-;;;;;;;;;;-1:-1:-1;38805:206:0;;;;;:::i;:::-;;:::i;20266:750::-;;;;;;;;;;-1:-1:-1;20266:750:0;;;;;:::i;:::-;;:::i;24569:781::-;;;;;;;;;;-1:-1:-1;24569:781:0;;;;;:::i;:::-;;:::i;29793:459::-;;;;;;;;;;-1:-1:-1;29793:459:0;;;;;:::i;:::-;;:::i;26801:934::-;;;;;;;;;;-1:-1:-1;26801:934:0;;;;;:::i;:::-;;:::i;33166:489::-;;;;;;;;;;-1:-1:-1;33166:489:0;;;;;:::i;:::-;;:::i;31229:491::-;;;;;;;;;;-1:-1:-1;31229:491:0;;;;;:::i;:::-;;:::i;30759:462::-;;;;;;;;;;-1:-1:-1;30759:462:0;;;;;:::i;:::-;;:::i;22403:718::-;;;;;;;;;;-1:-1:-1;22403:718:0;;;;;:::i;:::-;;:::i;35494:643::-;;;;;;;;;;-1:-1:-1;35494:643:0;;;;;:::i;:::-;;:::i;14703:39::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9634:32:1;;;9616:51;;9604:2;9589:18;14703:39:0;9470:203:1;32701:457:0;;;;;;;;;;-1:-1:-1;32701:457:0;;;;;:::i;:::-;;:::i;36890:819::-;;;;;;;;;;-1:-1:-1;36890:819:0;;;;;:::i;:::-;;:::i;31728:464::-;;;;;;;;;;-1:-1:-1;31728:464:0;;;;;:::i;:::-;;:::i;26070:723::-;;;;;;:::i;:::-;;:::i;30260:491::-;;;;;;;;;;-1:-1:-1;30260:491:0;;;;;:::i;:::-;;:::i;38379:204::-;;;;;;;;;;-1:-1:-1;38379:204:0;;;;;:::i;:::-;;:::i;25358:704::-;;;;;;;;;;-1:-1:-1;25358:704:0;;;;;:::i;:::-;;:::i;14749:29::-;;;;;;;;;;;;;;;37977:181;;;;;;;;;;-1:-1:-1;37977:181:0;;;;;:::i;:::-;;:::i;21799:596::-;;;;;;;;;;-1:-1:-1;21799:596:0;;;;;:::i;:::-;;:::i;36145:737::-;;;;;;:::i;:::-;;:::i;18720:850::-;;;;;;;;;;-1:-1:-1;18720:850:0;;;;;:::i;:::-;;:::i;14664:32::-;;;;;;;;;;;;;;;38591:206;;;;;;;;;;-1:-1:-1;38591:206:0;;;;;:::i;:::-;;:::i;32200:493::-;;;;;;;;;;-1:-1:-1;32200:493:0;;;;;:::i;:::-;;:::i;21024:696::-;;;;;;;;;;-1:-1:-1;21024:696:0;;;;;:::i;:::-;;:::i;16912:760::-;;;;;;;;;;-1:-1:-1;16912:760:0;;;;;:::i;:::-;;:::i;:::-;;;;12283:25:1;;;12339:2;12324:18;;12317:34;;;;12367:18;;;12360:34;12271:2;12256:18;16912:760:0;12081:319:1;17680:997:0;;;;;;:::i;:::-;;:::i;28689:836::-;;;;;;:::i;:::-;;:::i;19578:680::-;19810:19;19831:17;19791:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;;;;;;;;;19888:202:::1;19918:5;19939:4;19959:9;19984:14;20014:12;20050:4;20071:8;19888:15;:202::i;:::-;19861:229:::0;;-1:-1:-1;19861:229:0;-1:-1:-1;20101:51:0::1;20129:5:::0;20136:2;19861:229;20101:27:::1;:51::i;:::-;20163:31;::::0;-1:-1:-1;;;20163:31:0;;::::1;::::0;::::1;1809:25:1::0;;;20169:4:0::1;-1:-1:-1::0;;;;;20163:20:0::1;::::0;::::1;::::0;1782:18:1;;20163:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20205:45;20236:2;20240:9;20205:30;:45::i;:::-;19578:680:::0;;;;;;;;;;:::o;38166:205::-;38266:17;38303:60;38331:8;38341:9;38352:10;38303:27;:60::i;:::-;38296:67;38166:205;-1:-1:-1;;;;38166:205:0:o;27743:938::-;27958:24;27939:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28028:4:0::1;28003:29;:4:::0;;28008:15:::1;28022:1;28003:4:::0;28008:15:::1;:::i;:::-;28003:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28003:29:0::1;;27995:54;;;;-1:-1:-1::0;;;27995:54:0::1;;;;;;;:::i;:::-;28060:23;28086:14;28060:40;;28121:70;28150:7;28159:15;28176:8;28186:4;;28121:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28121:28:0::1;::::0;-1:-1:-1;;;28121:70:0:i:1;:::-;28111:80;;28241:12;28210:7;28235:1;28218:7;:14;:18;;;;:::i;:::-;28210:27;;;;;;;;:::i;:::-;;;;;;;:43;;28202:82;;;;-1:-1:-1::0;;;28202:82:0::1;;;;;;;:::i;:::-;28295:198;28341:4;;28346:1;28341:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28364:10;28390:66;28413:7;28422:15;28439:4;;28444:1;28439:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28448:4;;28453:1;28448:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28390:22;:66::i;:::-;28472:7;28480:1;28472:10;;;;;;;;:::i;:::-;;;;;;;28295:31;:198::i;:::-;28504:35;28510:7;28519:4;;28504:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28533:4:0::1;::::0;-1:-1:-1;28504:5:0::1;::::0;-1:-1:-1;;28504:35:0:i:1;:::-;28556:4;-1:-1:-1::0;;;;;28550:20:0::1;;28571:7;28596:1;28579:7;:14;:18;;;;:::i;:::-;28571:27;;;;;;;;:::i;:::-;;;;;;;28550:49;;;;;;;;;;;;;1809:25:1::0;;1797:2;1782:18;;1663:177;28550:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28610:63;28641:2;28645:7;28670:1;28653:7;:14;:18;;;;:::i;:::-;28645:27;;;;;;;;:::i;:::-;;;;;;;28610:30;:63::i;:::-;27984:697;27743:938:::0;;;;;;;;;:::o;38805:206::-;38890:24;38934:69;38962:7;38971:14;38987:9;38998:4;38934:27;:69::i;:::-;38927:76;38805:206;-1:-1:-1;;;38805:206:0:o;20266:750::-;20567:15;20584;20627:63;20650:7;20659:14;20675:6;20683;20627:22;:63::i;:::-;-1:-1:-1;;;;;20612:86:0;;20713:10;20747:4;20768:10;:42;;20801:9;20768:42;;;-1:-1:-1;;20768:42:0;20826:8;20850:1;20867;20884;20612:284;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20928:80;20944:6;20952;20960:9;20971:10;20983;20995:2;20999:8;20928:15;:80::i;:::-;20907:101;;;;-1:-1:-1;20266:750:0;-1:-1:-1;;;;;;;;;;;;20266:750:0:o;24569:781::-;24783:24;24764:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;24845:23:::1;24871:14;24845:40;;24910:70;24939:7;24948:15;24965:8;24975:4;;24910:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24910:28:0::1;::::0;-1:-1:-1;;;24910:70:0:i:1;:::-;24900:80;;25034:12;25003:7;25028:1;25011:7;:14;:18;25003:27;;;;;;;;:::i;:::-;;;;;;;:43;;24995:82;;;;-1:-1:-1::0;;;24995:82:0::1;;;;;;;:::i;:::-;25092:200;25142:4;;25147:1;25142:7;;;;;;;:::i;25092:200::-;25307:24;25313:7;25322:4;;25307:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25328:2:0;;-1:-1:-1;25307:5:0::1;::::0;-1:-1:-1;;25307:24:0:i:1;29793:459::-:0;30034:24;30084:4;;30089:1;30084:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30071:28:0;;30100:10;30120:4;30127:8;30137;30147:1;30150;30153;30071:84;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30176:68;30201:8;30211:12;30225:4;;30231:2;30235:8;30176:24;:68::i;:::-;30166:78;29793:459;-1:-1:-1;;;;;;;;;;29793:459:0:o;26801:934::-;27020:24;27001:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27090:4:0::1;27065:29;:4:::0;;27070:15:::1;27084:1;27065:4:::0;27070:15:::1;:::i;:::-;27065:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27065:29:0::1;;27057:54;;;;-1:-1:-1::0;;;27057:54:0::1;;;;;;;:::i;:::-;27122:23;27148:14;27122:40;;27183:70;27211:7;27220:15;27237:9;27248:4;;27183:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;27183:27:0::1;::::0;-1:-1:-1;;;27183:70:0:i:1;:::-;27173:80;;27286:11;27272:7;27280:1;27272:10;;;;;;;;:::i;:::-;;;;;;;:25;;27264:60;;;;-1:-1:-1::0;;;27264:60:0::1;;;;;;;:::i;33166:489::-:0;33430:24;33487:4;;33492:1;33487:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33467:35:0;;33503:10;33523:4;33530:5;33537:8;33547:4;33553:1;33556;33559;33467:94;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33582:65;33604:8;33614:12;33628:4;;33634:2;33638:8;33582:21;:65::i;:::-;33572:75;33166:489;-1:-1:-1;;;;;;;;;;;33166:489:0:o;31229:491::-;31492:24;31549:4;;31554:1;31549:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31529:35:0;;31565:10;31585:4;31592:5;31599:8;31609:4;31615:1;31618;31621;31529:94;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31644:68;31669:9;31680:11;31693:4;;31699:2;31703:8;31644:24;:68::i;30759:462::-;31000:24;31050:4;;31055:1;31050:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31037:28:0;;31066:10;31086:4;31093:11;31106:8;31116:1;31119;31122;31037:87;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31145:68;31170:9;31181:11;31194:4;;31200:2;31204:8;31145:24;:68::i;22403:718::-;22716:17;22746:12;22761:60;22784:7;22793:14;22809:5;22816:4;22761:22;:60::i;:::-;22746:75;;22832:13;22848:10;:42;;22881:9;22848:42;;;-1:-1:-1;;22848:42:0;22901:80;;-1:-1:-1;;;22901:80:0;;22832:58;;-1:-1:-1;;;;;;22901:27:0;;;;;:80;;22929:10;;22949:4;;22832:58;;22963:8;;22973:1;;22976;;22979;;22901:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23004:109;23052:5;23059:9;23070:14;23086:12;23100:2;23104:8;23004:47;:109::i;:::-;22992:121;22403:718;-1:-1:-1;;;;;;;;;;;;;22403:718:0:o;35494:643::-;35720:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;35741:128:::1;35773:4;;35778:1;35773:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35782:10;35794:64;35817:7;35826:14;35841:4;;35846:1;35841:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35850:4;;35855:1;35850:7;;;;;;;:::i;35794:64::-;35860:8;35741:31;:128::i;:::-;35880:21;35911:4:::0;;35916:15:::1;35930:1;35911:4:::0;35916:15:::1;:::i;:::-;35911:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;35904:43;::::0;-1:-1:-1;;;35904:43:0;;-1:-1:-1;;;;;9634:32:1;;;35904:43:0::1;::::0;::::1;9616:51:1::0;35904:39:0;;;::::1;::::0;::::1;::::0;9589:18:1;;35904:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35880:67;;35958:44;35993:4;;35958:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35999:2:0;;-1:-1:-1;35958:34:0::1;::::0;-1:-1:-1;;35958:44:0:i:1;:::-;36086:12:::0;36068:13;36028:4;;36033:15:::1;36047:1;36028:4:::0;36033:15:::1;:::i;:::-;36028:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36021:43;::::0;-1:-1:-1;;;36021:43:0;;-1:-1:-1;;;;;9634:32:1;;;36021:43:0::1;::::0;::::1;9616:51:1::0;36021:39:0;;;::::1;::::0;::::1;::::0;9589:18:1;;36021:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;;;:::i;:::-;:77;;36013:116;;;;-1:-1:-1::0;;;36013:116:0::1;;;;;;;:::i;:::-;35730:407;35494:643:::0;;;;;;;:::o;32701:457::-;32943:24;32993:4;;32998:1;32993:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32980:28:0;;33009:10;33029:4;33036:8;33046;33056:1;33059;33062;32980:84;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33085:65;33107:8;33117:12;33131:4;;33137:2;33141:8;33085:21;:65::i;36890:819::-;37113:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37167:4:0::1;37142:29;:4:::0;;37147:15:::1;37161:1;37142:4:::0;37147:15:::1;:::i;:::-;37142:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37142:29:0::1;;37134:54;;;;-1:-1:-1::0;;;37134:54:0::1;;;;;;;:::i;:::-;37199:195;37245:4;;37250:1;37245:7;;;;;;;:::i;37199:195::-;37405:55;37440:4;;37405:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37454:4:0::1;::::0;-1:-1:-1;37405:34:0::1;::::0;-1:-1:-1;;37405:55:0:i:1;:::-;37491:37;::::0;-1:-1:-1;;;37491:37:0;;37522:4:::1;37491:37;::::0;::::1;9616:51:1::0;37471:17:0::1;::::0;37498:4:::1;-1:-1:-1::0;;;;;37491:22:0::1;::::0;::::1;::::0;9589:18:1;;37491:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37471:57;;37560:12;37547:9;:25;;37539:64;;;;-1:-1:-1::0;;;37539:64:0::1;;;;;;;:::i;:::-;37614:31;::::0;-1:-1:-1;;;37614:31:0;;::::1;::::0;::::1;1809:25:1::0;;;37620:4:0::1;-1:-1:-1::0;;;;;37614:20:0::1;::::0;::::1;::::0;1782:18:1;;37614:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37656:45;37687:2;37691:9;37656:30;:45::i;31728:464::-:0;31974:24;32024:4;;32029:1;32024:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32011:28:0;;32040:10;32060:4;32067:11;32080:8;32090:1;32093;32096;32011:87;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32119:65;32141:9;32152:11;32165:4;;32171:2;32175:8;32119:21;:65::i;26070:723::-;26267:24;26248:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;26323:4:::1;-1:-1:-1::0;;;;;26312:15:0::1;:4;;26317:1;26312:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26312:15:0::1;;26304:40;;;;-1:-1:-1::0;;;26304:40:0::1;;;;;;;:::i;:::-;26355:23;26381:14;26355:40;;26416:71;26445:7;26454:15;26471:9;26482:4;;26416:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26416:28:0::1;::::0;-1:-1:-1;;;26416:71:0:i:1;:::-;26406:81;;26537:12;26506:7;26531:1;26514:7;:14;:18;;;;:::i;:::-;26506:27;;;;;;;;:::i;:::-;;;;;;;:43;;26498:82;;;;-1:-1:-1::0;;;26498:82:0::1;;;;;;;:::i;:::-;26597:4;-1:-1:-1::0;;;;;26591:19:0::1;;26618:7;26626:1;26618:10;;;;;;;;:::i;:::-;;;;;;;26591:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;26655:4;-1:-1:-1::0;;;;;26649:20:0::1;;26670:66;26693:7;26702:15;26719:4;;26724:1;26719:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;26728:4;;26733:1;26728:7;;;;;;;:::i;26670:66::-;26738:7;26746:1;26738:10;;;;;;;;:::i;:::-;;;;;;;26649:100;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16246:32:1;;;;16228:51;;16310:2;16295:18;;16288:34;16216:2;16201:18;;16054:274;26649:100:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26642:108;;;;:::i;:::-;26761:24;26767:7;26776:4;;26761:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;26782:2:0;;-1:-1:-1;26761:5:0::1;::::0;-1:-1:-1;;26761:24:0:i:1;:::-;26293:500;26070:723:::0;;;;;;;;:::o;30260:491::-;30523:24;30580:4;;30585:1;30580:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30560:35:0;;30596:10;30616:4;30623:5;30630:8;30640:4;30646:1;30649;30652;30560:94;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30675:68;30700:8;30710:12;30724:4;;30730:2;30734:8;30675:24;:68::i;38379:204::-;38479:16;38515:60;38542:9;38553;38564:10;38515:26;:60::i;25358:704::-;25572:24;25553:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;25609:23:::1;25635:14;25609:40;;25670:69;25698:7;25707:14;25723:9;25734:4;;25670:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25670:27:0::1;::::0;-1:-1:-1;;;25670:69:0:i:1;:::-;25660:79;;25772:11;25758:7;25766:1;25758:10;;;;;;;;:::i;:::-;;;;;;;:25;;25750:60;;;;-1:-1:-1::0;;;25750:60:0::1;;;;;;;:::i;37977:181::-:0;38066:15;38101:49;38122:7;38131:8;38141;38101:20;:49::i;21799:596::-;22060:17;22041:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;22106:94:::1;22122:5;22129:4;22135:9;22146:14;22162:12;22184:4;22191:8;22106:15;:94::i;:::-;22250:38;::::0;-1:-1:-1;;;22250:38:0;;22282:4:::1;22250:38;::::0;::::1;9616:51:1::0;22090:110:0;;-1:-1:-1;22211:78:0::1;::::0;-1:-1:-1;22239:5:0;;22246:2;;-1:-1:-1;;;;;22250:23:0;::::1;::::0;::::1;::::0;9589:18:1;;22250:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22211:27;:78::i;:::-;22300:31;::::0;-1:-1:-1;;;22300:31:0;;::::1;::::0;::::1;1809:25:1::0;;;22306:4:0::1;-1:-1:-1::0;;;;;22300:20:0::1;::::0;::::1;::::0;1782:18:1;;22300:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22342:45;22373:2;22377:9;22342:30;:45::i;:::-;21799:596:::0;;;;;;;;;:::o;36145:737::-;36349:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;36389:4:::1;-1:-1:-1::0;;;;;36378:15:0::1;:4;;36383:1;36378:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36378:15:0::1;;36370:40;;;;-1:-1:-1::0;;;36370:40:0::1;;;;;;;:::i;:::-;36421:16;36440:9;36421:28;;36466:4;-1:-1:-1::0;;;;;36460:19:0::1;;36487:8;36460:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;36522:4;-1:-1:-1::0;;;;;36516:20:0::1;;36537:65;36560:7;36569:14;36585:4;;36590:1;36585:7;;;;;;;:::i;36537:65::-;36516:97;::::0;-1:-1:-1;;;;;;36516:97:0::1;::::0;;;;;;-1:-1:-1;;;;;16246:32:1;;;36516:97:0::1;::::0;::::1;16228:51:1::0;16295:18;;;16288:34;;;16201:18;;36516:97:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36509:105;;;;:::i;:::-;36625:21;36656:4:::0;;36661:15:::1;36675:1;36656:4:::0;36661:15:::1;:::i;:::-;36656:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36649:43;::::0;-1:-1:-1;;;36649:43:0;;-1:-1:-1;;;;;9634:32:1;;;36649:43:0::1;::::0;::::1;9616:51:1::0;36649:39:0;;;::::1;::::0;::::1;::::0;9589:18:1;;36649:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36625:67;;36703:44;36738:4;;36703:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36744:2:0;;-1:-1:-1;36703:34:0::1;::::0;-1:-1:-1;;36703:44:0:i:1;:::-;36831:12:::0;36813:13;36773:4;;36778:15:::1;36792:1;36773:4:::0;36778:15:::1;:::i;:::-;36773:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36766:43;::::0;-1:-1:-1;;;36766:43:0;;-1:-1:-1;;;;;9634:32:1;;;36766:43:0::1;::::0;::::1;9616:51:1::0;36766:39:0;;;::::1;::::0;::::1;::::0;9589:18:1;;36766:43:0::1;9470:203:1::0;18720:850:0;18969:15;18986;18950:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;19014:12:::1;19029:63;19052:7;19061:14;19077:6;19085;19029:22;:63::i;:::-;19103:62;::::0;-1:-1:-1;;;19103:62:0;;19137:10:::1;19103:62;::::0;::::1;16823:34:1::0;-1:-1:-1;;;;;19103:33:0;::::1;16873:18:1::0;;;16866:43;;;16925:18;;;16918:34;;;19014:78:0;;-1:-1:-1;19103:33:0::1;::::0;16758:18:1;;19103:62:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;19239:29:0::1;::::0;-1:-1:-1;;;19239:29:0;;-1:-1:-1;;;;;9634:32:1;;;19239:29:0::1;::::0;::::1;9616:51:1::0;19203:15:0::1;::::0;;;19239:25;::::1;::::0;::::1;::::0;9589:18:1;;19239:29:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19202:66;;;;19280:14;19299:41;19325:6;19333;19299:25;:41::i;:::-;19279:61;;;19382:6;-1:-1:-1::0;;;;;19372:16:0::1;:6;-1:-1:-1::0;;;;;19372:16:0::1;;:58;;19413:7;19422;19372:58;;;19392:7;19401;19372:58;19351:79:::0;;-1:-1:-1;19351:79:0;-1:-1:-1;19449:21:0;;::::1;;19441:55;;;::::0;-1:-1:-1;;;19441:55:0;;17415:2:1;19441:55:0::1;::::0;::::1;17397:21:1::0;17454:2;17434:18;;;17427:30;-1:-1:-1;;;17473:18:1;;;17466:51;17534:18;;19441:55:0::1;17213:345:1::0;19441:55:0::1;19526:10;19515:7;:21;;19507:55;;;::::0;-1:-1:-1;;;19507:55:0;;17765:2:1;19507:55:0::1;::::0;::::1;17747:21:1::0;17804:2;17784:18;;;17777:30;-1:-1:-1;;;17823:18:1;;;17816:51;17884:18;;19507:55:0::1;17563:345:1::0;19507:55:0::1;19003:567;;;;18720:850:::0;;;;;;;;;;;:::o;38591:206::-;38676:24;38720:69;38749:7;38758:14;38774:8;38784:4;38720:28;:69::i;32200:493::-;32468:24;32525:4;;32530:1;32525:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32505:35:0;;32541:10;32561:4;32568:5;32575:8;32585:4;32591:1;32594;32597;32505:94;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32620:65;32642:9;32653:11;32666:4;;32672:2;32676:8;32620:21;:65::i;21024:696::-;21308:19;21329:17;21359:12;21374:60;21397:7;21406:14;21422:5;21429:4;21374:22;:60::i;:::-;21359:75;;21445:13;21461:10;:42;;21494:9;21461:42;;;-1:-1:-1;;21461:42:0;21514:80;;-1:-1:-1;;;21514:80:0;;21445:58;;-1:-1:-1;;;;;;21514:27:0;;;;;:80;;21542:10;;21562:4;;21445:58;;21576:8;;21586:1;;21589;;21592;;21514:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21632;21651:5;21658:9;21669:14;21685:12;21699:2;21703:8;21632:18;:80::i;:::-;21605:107;;;;-1:-1:-1;21024:696:0;-1:-1:-1;;;;;;;;;;;;;21024:696:0:o;16912:760::-;17198:15;17215;17232:17;17179:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;17284:85:::1;17298:6;17306;17314:14;17330;17346:10;17358;17284:13;:85::i;:::-;17263:106:::0;;-1:-1:-1;17263:106:0;-1:-1:-1;17380:12:0::1;17395:63;17418:7;17427:14;17443:6:::0;17451;17395:22:::1;:63::i;:::-;17380:78;;17469:66;17501:6;17509:10;17521:4;17527:7;17469:31;:66::i;:::-;17546;17578:6;17586:10;17598:4;17604:7;17546:31;:66::i;:::-;17635:29;::::0;-1:-1:-1;;;17635:29:0;;-1:-1:-1;;;;;9634:32:1;;;17635:29:0::1;::::0;::::1;9616:51:1::0;17635:25:0;::::1;::::0;::::1;::::0;9589:18:1;;17635:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17623:41;;17251:421;16912:760:::0;;;;;;;;;;;;;:::o;17680:997::-;17928:19;17949:17;17968;17909:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;18025:181:::1;18053:5;18074:4;18094:18;18128:9;18153:14;18183:12;18025:13;:181::i;:::-;17998:208:::0;;-1:-1:-1;17998:208:0;-1:-1:-1;18217:12:0::1;18232:60;18255:7;18264:14;18280:5:::0;18287:4:::1;18232:22;:60::i;:::-;18217:75;;18303:69;18335:5;18342:10;18354:4;18360:11;18303:31;:69::i;:::-;18389:4;-1:-1:-1::0;;;;;18383:19:0::1;;18410:9;18383:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18440:37:0::1;::::0;-1:-1:-1;;;18440:37:0;;-1:-1:-1;;;;;16246:32:1;;;18440:37:0::1;::::0;::::1;16228:51:1::0;16295:18;;;16288:34;;;18446:4:0::1;18440:20;::::0;-1:-1:-1;18440:20:0::1;::::0;-1:-1:-1;16201:18:1;;;-1:-1:-1;18440:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18433:45;;;;:::i;:::-;18501:29;::::0;-1:-1:-1;;;18501:29:0;;-1:-1:-1;;;;;9634:32:1;;;18501:29:0::1;::::0;::::1;9616:51:1::0;18501:25:0;::::1;::::0;::::1;::::0;9589:18:1;;18501:29:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18489:41;;18593:9;18581;:21;18577:92;;;18604:65;18635:10;18647:21;18659:9:::0;18647::::1;:21;:::i;:::-;18604:30;:65::i;:::-;17987:690;17680:997:::0;;;;;;;;;;;:::o;28689:836::-;28883:24;28864:8;14852:15;14840:8;:27;;14832:47;;;;-1:-1:-1;;;14832:47:0;;;;;;;:::i;:::-;28939:4:::1;-1:-1:-1::0;;;;;28928:15:0::1;:4;;28933:1;28928:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;28928:15:0::1;;28920:40;;;;-1:-1:-1::0;;;28920:40:0::1;;;;;;;:::i;:::-;28971:23;28997:14;28971:40;;29032:70;29060:7;29069:15;29086:9;29097:4;;29032:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29032:27:0::1;::::0;-1:-1:-1;;;29032:70:0:i:1;:::-;29022:80;;29135:9;29121:7;29129:1;29121:10;;;;;;;;:::i;:::-;;;;;;;:23;;29113:58;;;;-1:-1:-1::0;;;29113:58:0::1;;;;;;;:::i;:::-;29188:4;-1:-1:-1::0;;;;;29182:19:0::1;;29209:7;29217:1;29209:10;;;;;;;;:::i;:::-;;;;;;;29182:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;29246:4;-1:-1:-1::0;;;;;29240:20:0::1;;29261:66;29284:7;29293:15;29310:4;;29315:1;29310:7;;;;;;;:::i;29261:66::-;29329:7;29337:1;29329:10;;;;;;;;:::i;:::-;;;;;;;29240:100;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;16246:32:1;;;;16228:51;;16310:2;16295:18;;16288:34;16216:2;16201:18;;16054:274;29240:100:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29233:108;;;;:::i;:::-;29352:24;29358:7;29367:4;;29352:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29373:2:0;;-1:-1:-1;29352:5:0::1;::::0;-1:-1:-1;;29352:24:0:i:1;:::-;29439:7;29447:1;29439:10;;;;;;;;:::i;:::-;;;;;;;29427:9;:22;29423:94;;;29451:66;29482:10;29506:7;29514:1;29506:10;;;;;;;;:::i;:::-;;;;;;;29494:9;:22;;;;:::i;5692:361::-:0;5887:45;;;-1:-1:-1;;;;;16246:32:1;;;5887:45:0;;;16228:51:1;16295:18;;;;16288:34;;;5887:45:0;;;;;;;;;;16201:18:1;;;;5887:45:0;;;;;;;-1:-1:-1;;;;;5887:45:0;-1:-1:-1;;;5887:45:0;;;5876:57;;-1:-1:-1;;;;5876:10:0;;;;:57;;5887:45;5876:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5840:93;;;;5952:7;:57;;;;-1:-1:-1;5964:11:0;;:16;;:44;;;5995:4;5984:24;;;;;;;;;;;;:::i;:::-;5944:101;;;;-1:-1:-1;;;5944:101:0;;18657:2:1;5944:101:0;;;18639:21:1;18696:2;18676:18;;;18669:30;18735:33;18715:18;;;18708:61;18786:18;;5944:101:0;18455:355:1;5944:101:0;5762:291;;5692:361;;;:::o;6471:195::-;6579:12;;;6541;6579;;;;;;;;;-1:-1:-1;;;;;6558:7:0;;;6572:5;;6558:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6540:52;;;6611:7;6603:55;;;;-1:-1:-1;;;6603:55:0;;19017:2:1;6603:55:0;;;18999:21:1;19056:2;19036:18;;;19029:30;19095:34;19075:18;;;19068:62;-1:-1:-1;;;19146:18:1;;;19139:33;19189:19;;6603:55:0;18815:399:1;6603:55:0;6529:137;6471:195;;:::o;11871:318::-;12009:17;;12065:15;:8;12076:4;12065:15;:::i;:::-;12039:41;-1:-1:-1;12103:78:0;12108:28;12126:10;12039:41;12108:28;:::i;:::-;12165:15;12138:24;9185:6;12138:9;:24;:::i;:::-;:42;;;;:::i;:::-;9286:9;;;9200:97;12103:78;12091:90;11871:318;-1:-1:-1;;;;;11871:318:0:o;12915:683::-;13169:11;;13086:24;;13169:11;13231:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13231:25:0;;13221:35;;13284:8;13271:7;13279:1;13271:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;13326:9;13321:259;13354:1;13341:10;:14;13337:1;:18;13321:259;;;13382:17;13401:18;13423:58;13435:7;13444:14;13460:4;13465:1;13460:7;;;;;;;;:::i;:::-;;;;;;;13469:4;13474:1;13478;13474:5;13469:11;;;;;;;;:::i;:::-;;;;;;;13423;:58::i;:::-;13381:100;;;;13517:47;13530:7;13538:1;13530:10;;;;;;;;:::i;:::-;;;;;;;13542:9;13553:10;13517:12;:47::i;:::-;13500:7;13508:1;13512;13508:5;13500:14;;;;;;;;:::i;:::-;;;;;;;;;;:64;-1:-1:-1;;13357:3:0;;13321:259;;;;13123:468;12915:683;;;;;;:::o;10480:379::-;10638:12;10664:14;10680;10698:26;10709:6;10717;10698:10;:26::i;:::-;10796:44;;-1:-1:-1;;19780:2:1;19776:15;;;19772:24;;10796:44:0;;;19760:37:1;19831:15;;;19827:24;19813:12;;;19806:46;10837:1:0;19868:12:1;;;19861:28;10663:61:0;;-1:-1:-1;10663:61:0;-1:-1:-1;10742:109:0;;10770:14;;19905:12:1;;10796:44:0;;;;;;;;;;;;10786:55;;;;;;10843:7;9859:4;9853:11;-1:-1:-1;;;9878:79:0;;9998:4;9994:25;;;9987:4;9978:14;;9971:49;-1:-1:-1;;;10050:4:0;10041:14;;10034:90;10161:19;;10154:4;10145:14;;10138:43;10211:4;10202:14;;10195:28;10275:4;10260:20;;;10253:4;10244:14;;10237:44;10334:4;10318:14;;10308:31;;9638:719;10742:109;10735:116;10480:379;-1:-1:-1;;;;;;;10480:379:0:o;6061:402::-;6286:51;;;-1:-1:-1;;;;;16841:15:1;;;6286:51:0;;;16823:34:1;16893:15;;;16873:18;;;16866:43;16925:18;;;;16918:34;;;6286:51:0;;;;;;;;;;16758:18:1;;;;6286:51:0;;;;;;;-1:-1:-1;;;;;6286:51:0;-1:-1:-1;;;6286:51:0;;;6275:63;;-1:-1:-1;;;;6275:10:0;;;;:63;;6286:51;6275:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6239:99;;;;6357:7;:57;;;;-1:-1:-1;6369:11:0;;:16;;:44;;;6400:4;6389:24;;;;;;;;;;;;:::i;:::-;6349:106;;;;-1:-1:-1;;;6349:106:0;;20130:2:1;6349:106:0;;;20112:21:1;20169:2;20149:18;;;20142:30;20208:34;20188:18;;;20181:62;-1:-1:-1;;;20259:18:1;;;20252:34;20303:19;;6349:106:0;19928:400:1;6349:106:0;6149:314;;6061:402;;;;:::o;23469:1092::-;23689:11;;23741:14;23668:18;23770:773;23803:1;23790:10;:14;23786:1;:18;23770:773;;;23831:13;23846:14;23865:4;23870:1;23865:7;;;;;;;;:::i;:::-;;;;;;;23874:4;23879:1;23883;23879:5;23874:11;;;;;;;;:::i;:::-;;;;;;;23830:56;;;;23906:14;23925:40;23951:5;23958:6;23925:25;:40::i;:::-;23905:60;;;23984:17;24004:7;24012:1;24016;24012:5;24004:14;;;;;;;;:::i;:::-;;;;;;;23984:34;;24038:18;24058;24089:6;-1:-1:-1;;;;;24080:15:0;:5;-1:-1:-1;;;;;24080:15:0;;:67;;24125:9;24144:1;24080:67;;;24107:1;24111:9;24080:67;24037:110;;;;24166:10;24197:1;24183:4;:11;:15;24179:1;:19;:97;;24273:3;24179:97;;;24201:69;24224:7;24233:15;24250:6;24258:4;24263:1;24267;24263:5;24258:11;;;;;;;;:::i;:::-;;;;;;;24201:22;:69::i;:::-;24166:110;;24310:63;24333:7;24342:15;24359:5;24366:6;24310:22;:63::i;:::-;-1:-1:-1;;;;;24295:84:0;;24402:10;24436;24470:2;24506:1;24496:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24496:12:0;;24295:232;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23811:732;;;;;;;23806:3;;;;;23770:773;;13679:689;13934:11;;13851:24;;13934:11;13984:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13984:25:0;;13974:35;;14050:9;14024:7;14045:1;14032:10;:14;14024:23;;;;;;;;:::i;:::-;;;;;;;;;;:35;-1:-1:-1;;14105:14:0;;14088:262;14121:5;;14088:262;;14153:17;14172:18;14194:58;14206:7;14215:14;14231:4;14240:1;14236;:5;14231:11;;;;;;;;:::i;:::-;;;;;;;14244:4;14249:1;14244:7;;;;;;;;:::i;14194:58::-;14152:100;;;;14288:46;14300:7;14308:1;14300:10;;;;;;;;:::i;:::-;;;;;;;14312:9;14323:10;14288:11;:46::i;:::-;14271:7;14283:1;14279;:5;14271:14;;;;;;;;:::i;:::-;;;;;;;;;;:63;-1:-1:-1;;;;14128:3:0;14088:262;;34001:1485;34161:14;34135:23;34272:1207;34306:1;34292:4;:11;:15;;;;:::i;:::-;34288:1;:19;34272:1207;;;34344:13;34359:14;34378:4;34383:1;34378:7;;;;;;;;:::i;:::-;;;;;;;34387:4;34392:1;34396;34392:5;;;;:::i;:::-;34387:11;;;;;;;;:::i;:::-;;;;;;;34343:56;;;;34415:14;34434:40;34460:5;34467:6;34434:25;:40::i;:::-;34414:60;;;34489:19;34526:63;34549:7;34558:15;34575:5;34582:6;34526:22;:63::i;:::-;34489:101;;34607:20;34716:16;34734;34755:4;-1:-1:-1;;;;;34755:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34715:58;-1:-1:-1;;;;;34715:58:0;;;-1:-1:-1;;;;;34715:58:0;;;34793:20;34815:21;34849:6;-1:-1:-1;;;;;34840:15:0;:5;-1:-1:-1;;;;;34840:15:0;;:61;;34882:8;34892;34840:61;;;34859:8;34869;34840:61;34985:38;;-1:-1:-1;;;34985:38:0;;-1:-1:-1;;;;;9634:32:1;;;34985:38:0;;;9616:51:1;34792:109:0;;-1:-1:-1;34792:109:0;;-1:-1:-1;34935:195:0;;34792:109;;34985:23;;;;;;9589:18:1;;34985:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;35062:12;35098:13;34935:27;:195::i;:::-;34920:210;;34656:490;;;;35161:18;35181;35212:6;-1:-1:-1;;;;;35203:15:0;:5;-1:-1:-1;;;;;35203:15:0;;:73;;35251:12;35273:1;35203:73;;;35230:1;35234:12;35203:73;35160:116;;;;35291:10;35322:1;35308:4;:11;:15;;;;:::i;:::-;35304:1;:19;:97;;35398:3;35304:97;;;35326:69;35349:7;35358:15;35375:6;35383:4;35388:5;:1;35392;35388:5;:::i;:::-;35383:11;;;;;;;;:::i;35326:69::-;35454:12;;;35464:1;35454:12;;;;;;;;;-1:-1:-1;;;35416:51:0;;;35291:110;;-1:-1:-1;;;;;;35416:9:0;;;;;:51;;35426:10;;35438;;35291:110;;35416:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34314:1165;;;;;;;;34309:3;;;;:::i;:::-;;;34272:1207;;;;34124:1362;34001:1485;;:::o;12310:263::-;12448:16;12488:73;9185:6;12493:21;12505:9;12493;:21;:::i;:::-;:36;;;;:::i;:::-;12544:16;:9;12556:4;12544:16;:::i;:::-;12531:29;;:10;:29;:::i;12488:73::-;:77;;12564:1;12488:77;:::i;11542:207::-;11669:15;11707:34;11712:18;11722:8;11712:7;:18;:::i;:::-;11732:8;9286:9;;;9200:97;9406:224;9507:14;9523;9578:6;-1:-1:-1;;;;;9569:15:0;:6;-1:-1:-1;;;;;9569:15:0;;:53;;9607:6;9615;9569:53;;;9588:6;9596;9569:53;9550:72;;;;-1:-1:-1;9406:224:0;-1:-1:-1;;;9406:224:0:o;15529:1375::-;15833:50;;-1:-1:-1;;;15833:50:0;;-1:-1:-1;;;;;21980:15:1;;;15833:50:0;;;21962:34:1;22032:15;;;22012:18;;;22005:43;-1:-1:-1;;;;;;15851:7:0;15833:34;;;;;;21897:18:1;;15833:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15833:64:0;;15829:150;;;15914:53;;-1:-1:-1;;;15914:53:0;;-1:-1:-1;;;;;21980:15:1;;;15914:53:0;;;21962:34:1;22032:15;;;22012:18;;;22005:43;15932:7:0;15914:37;;;;21897:18:1;;15914:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15829:150;15990:13;16005;16022:67;16049:7;16058:14;16074:6;16082;16022:26;:67::i;:::-;15989:100;;;;16104:8;16116:1;16104:13;:30;;;;-1:-1:-1;16121:13:0;;16104:30;16100:797;;;16173:14;;-1:-1:-1;16189:14:0;;-1:-1:-1;16100:797:0;;;16237:19;16259:56;16280:14;16296:8;16306;16259:20;:56::i;:::-;16237:78;;16352:14;16334;:32;16330:556;;16413:10;16395:14;:28;;16387:71;;;;-1:-1:-1;;;16387:71:0;;22517:2:1;16387:71:0;;;22499:21:1;22556:2;22536:18;;;22529:30;22595:32;22575:18;;;22568:60;22645:18;;16387:71:0;22315:354:1;16387:71:0;16499:14;;-1:-1:-1;16515:14:0;-1:-1:-1;16515:14:0;16330:556;;;16571:19;16593:56;16614:14;16630:8;16640;16593:20;:56::i;:::-;16571:78;;16693:14;16675;:32;;16668:40;;;;:::i;:::-;16753:10;16735:14;:28;;16727:71;;;;-1:-1:-1;;;16727:71:0;;22876:2:1;16727:71:0;;;22858:21:1;22915:2;22895:18;;;22888:30;22954:32;22934:18;;;22927:60;23004:18;;16727:71:0;22674:354:1;16727:71:0;16839:14;-1:-1:-1;16855:14:0;;-1:-1:-1;16330:556:0;16222:675;16100:797;15766:1138;;15529:1375;;;;;;;;;:::o;10917:512::-;11078:16;11096;11126:14;11145:26;11156:6;11164;11145:10;:26::i;:::-;11125:46;;;11183:20;11205:21;11244:48;11252:7;11261:14;11277:6;11285;11244:7;:48::i;:::-;-1:-1:-1;;;;;11231:74:0;;:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11182:125;-1:-1:-1;;;;;11182:125:0;;;-1:-1:-1;;;;;11182:125:0;;;11351:6;-1:-1:-1;;;;;11341:16:0;:6;-1:-1:-1;;;;;11341:16:0;;:80;;11393:13;11408:12;11341:80;;;11361:12;11375:13;11341:80;11318:103;;;;-1:-1:-1;10917:512:0;-1:-1:-1;;;;;;;;10917:512:0:o;14:127:1:-;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:1;;211:42;;201:70;;267:1;264;257:12;201:70;146:131;:::o;282:134::-;350:20;;379:31;350:20;379:31;:::i;:::-;282:134;;;:::o;421:663::-;525:6;533;541;549;557;565;618:3;606:9;597:7;593:23;589:33;586:53;;;635:1;632;625:12;586:53;674:9;661:23;693:31;718:5;693:31;:::i;:::-;743:5;-1:-1:-1;795:2:1;780:18;;767:32;;-1:-1:-1;846:2:1;831:18;;818:32;;-1:-1:-1;897:2:1;882:18;;869:32;;-1:-1:-1;953:3:1;938:19;;925:33;967;925;967;:::i;:::-;1019:7;1009:17;;;1073:3;1062:9;1058:19;1045:33;1035:43;;421:663;;;;;;;;:::o;1342:316::-;1419:6;1427;1435;1488:2;1476:9;1467:7;1463:23;1459:32;1456:52;;;1504:1;1501;1494:12;1456:52;-1:-1:-1;;1527:23:1;;;1597:2;1582:18;;1569:32;;-1:-1:-1;1648:2:1;1633:18;;;1620:32;;1342:316;-1:-1:-1;1342:316:1:o;1845:367::-;1908:8;1918:6;1972:3;1965:4;1957:6;1953:17;1949:27;1939:55;;1990:1;1987;1980:12;1939:55;-1:-1:-1;2013:20:1;;2056:18;2045:30;;2042:50;;;2088:1;2085;2078:12;2042:50;2125:4;2117:6;2113:17;2101:29;;2185:3;2178:4;2168:6;2165:1;2161:14;2153:6;2149:27;2145:38;2142:47;2139:67;;;2202:1;2199;2192:12;2139:67;1845:367;;;;;:::o;2217:778::-;2339:6;2347;2355;2363;2371;2379;2432:3;2420:9;2411:7;2407:23;2403:33;2400:53;;;2449:1;2446;2439:12;2400:53;2485:9;2472:23;2462:33;;2542:2;2531:9;2527:18;2514:32;2504:42;;2597:2;2586:9;2582:18;2569:32;2624:18;2616:6;2613:30;2610:50;;;2656:1;2653;2646:12;2610:50;2695:70;2757:7;2748:6;2737:9;2733:22;2695:70;:::i;:::-;2784:8;;-1:-1:-1;2669:96:1;-1:-1:-1;;2869:2:1;2854:18;;2841:32;2882:31;2841:32;2882:31;:::i;:::-;2932:5;2922:15;;;2984:3;2973:9;2969:19;2956:33;2946:43;;2217:778;;;;;;;;:::o;3000:632::-;3171:2;3223:21;;;3293:13;;3196:18;;;3315:22;;;3142:4;;3171:2;3394:15;;;;3368:2;3353:18;;;3142:4;3437:169;3451:6;3448:1;3445:13;3437:169;;;3512:13;;3500:26;;3581:15;;;;3546:12;;;;3473:1;3466:9;3437:169;;;-1:-1:-1;3623:3:1;;3000:632;-1:-1:-1;;;;;;3000:632:1:o;3637:127::-;3698:10;3693:3;3689:20;3686:1;3679:31;3729:4;3726:1;3719:15;3753:4;3750:1;3743:15;3769:1189;3862:6;3870;3923:2;3911:9;3902:7;3898:23;3894:32;3891:52;;;3939:1;3936;3929:12;3891:52;3975:9;3962:23;3952:33;;4004:2;4057;4046:9;4042:18;4029:32;4080:18;4121:2;4113:6;4110:14;4107:34;;;4137:1;4134;4127:12;4107:34;4175:6;4164:9;4160:22;4150:32;;4220:7;4213:4;4209:2;4205:13;4201:27;4191:55;;4242:1;4239;4232:12;4191:55;4278:2;4265:16;4300:2;4296;4293:10;4290:36;;;4306:18;;:::i;:::-;4352:2;4349:1;4345:10;4384:2;4378:9;4447:2;4443:7;4438:2;4434;4430:11;4426:25;4418:6;4414:38;4502:6;4490:10;4487:22;4482:2;4470:10;4467:18;4464:46;4461:72;;;4513:18;;:::i;:::-;4549:2;4542:22;4599:18;;;4633:15;;;;-1:-1:-1;4675:11:1;;;4671:20;;;4703:19;;;4700:39;;;4735:1;4732;4725:12;4700:39;4759:11;;;;4779:148;4795:6;4790:3;4787:15;4779:148;;;4861:23;4880:3;4861:23;:::i;:::-;4849:36;;4812:12;;;;4905;;;;4779:148;;;4946:6;4936:16;;;;;;;;3769:1189;;;;;:::o;4963:118::-;5049:5;5042:13;5035:21;5028:5;5025:32;5015:60;;5071:1;5068;5061:12;5086:156;5152:20;;5212:4;5201:16;;5191:27;;5181:55;;5232:1;5229;5222:12;5247:1152;5391:6;5399;5407;5415;5423;5431;5439;5447;5455;5463;5471:7;5525:3;5513:9;5504:7;5500:23;5496:33;5493:53;;;5542:1;5539;5532:12;5493:53;5581:9;5568:23;5600:31;5625:5;5600:31;:::i;:::-;5650:5;-1:-1:-1;5707:2:1;5692:18;;5679:32;5720:33;5679:32;5720:33;:::i;:::-;5772:7;-1:-1:-1;5826:2:1;5811:18;;5798:32;;-1:-1:-1;5877:2:1;5862:18;;5849:32;;-1:-1:-1;5928:3:1;5913:19;;5900:33;;-1:-1:-1;5985:3:1;5970:19;;5957:33;5999;5957;5999;:::i;:::-;6051:7;-1:-1:-1;6105:3:1;6090:19;;6077:33;;-1:-1:-1;6162:3:1;6147:19;;6134:33;6176:30;6134:33;6176:30;:::i;:::-;6225:7;-1:-1:-1;6251:37:1;6283:3;6268:19;;6251:37;:::i;:::-;6241:47;;6335:3;6324:9;6320:19;6307:33;6297:43;;6388:3;6377:9;6373:19;6360:33;6349:44;;5247:1152;;;;;;;;;;;;;;:::o;6404:987::-;6551:6;6559;6567;6575;6583;6591;6599;6607;6615;6668:3;6656:9;6647:7;6643:23;6639:33;6636:53;;;6685:1;6682;6675:12;6636:53;6721:9;6708:23;6698:33;;6778:2;6767:9;6763:18;6750:32;6740:42;;6833:2;6822:9;6818:18;6805:32;6860:18;6852:6;6849:30;6846:50;;;6892:1;6889;6882:12;6846:50;6931:70;6993:7;6984:6;6973:9;6969:22;6931:70;:::i;:::-;7020:8;;-1:-1:-1;6905:96:1;-1:-1:-1;;7105:2:1;7090:18;;7077:32;7118:31;7077:32;7118:31;:::i;:::-;7168:5;-1:-1:-1;7220:3:1;7205:19;;7192:33;;-1:-1:-1;7244:37:1;7276:3;7261:19;;7244:37;:::i;:::-;7234:47;;7328:3;7317:9;7313:19;7300:33;7290:43;;7380:3;7369:9;7365:19;7352:33;7342:43;;6404:987;;;;;;;;;;;:::o;7396:1056::-;7552:6;7560;7568;7576;7584;7592;7600;7608;7616;7624;7677:3;7665:9;7656:7;7652:23;7648:33;7645:53;;;7694:1;7691;7684:12;7645:53;7730:9;7717:23;7707:33;;7787:2;7776:9;7772:18;7759:32;7749:42;;7842:2;7831:9;7827:18;7814:32;7869:18;7861:6;7858:30;7855:50;;;7901:1;7898;7891:12;7855:50;7940:70;8002:7;7993:6;7982:9;7978:22;7940:70;:::i;:::-;8029:8;;-1:-1:-1;7914:96:1;-1:-1:-1;;8114:2:1;8099:18;;8086:32;8127:31;8086:32;8127:31;:::i;:::-;8177:5;-1:-1:-1;8229:3:1;8214:19;;8201:33;;-1:-1:-1;8281:3:1;8266:19;;8253:33;;-1:-1:-1;8305:37:1;8337:3;8322:19;;8305:37;:::i;:::-;8295:47;;8389:3;8378:9;8374:19;8361:33;8351:43;;8441:3;8430:9;8426:19;8413:33;8403:43;;7396:1056;;;;;;;;;;;;;:::o;8457:1008::-;8592:6;8600;8608;8616;8624;8632;8640;8648;8656;8664;8717:3;8705:9;8696:7;8692:23;8688:33;8685:53;;;8734:1;8731;8724:12;8685:53;8773:9;8760:23;8792:31;8817:5;8792:31;:::i;:::-;8842:5;-1:-1:-1;8894:2:1;8879:18;;8866:32;;-1:-1:-1;8945:2:1;8930:18;;8917:32;;-1:-1:-1;8996:2:1;8981:18;;8968:32;;-1:-1:-1;9052:3:1;9037:19;;9024:33;9066;9024;9066;:::i;:::-;9118:7;-1:-1:-1;9172:3:1;9157:19;;9144:33;;-1:-1:-1;9229:3:1;9214:19;;9201:33;9243:30;9201:33;9243:30;:::i;:::-;9292:7;-1:-1:-1;9318:37:1;9350:3;9335:19;;9318:37;:::i;:::-;9308:47;;9402:3;9391:9;9387:19;9374:33;9364:43;;9454:3;9443:9;9439:19;9426:33;9416:43;;8457:1008;;;;;;;;;;;;;:::o;9678:709::-;9791:6;9799;9807;9815;9823;9876:3;9864:9;9855:7;9851:23;9847:33;9844:53;;;9893:1;9890;9883:12;9844:53;9929:9;9916:23;9906:33;;9990:2;9979:9;9975:18;9962:32;10017:18;10009:6;10006:30;10003:50;;;10049:1;10046;10039:12;10003:50;10088:70;10150:7;10141:6;10130:9;10126:22;10088:70;:::i;:::-;10177:8;;-1:-1:-1;10062:96:1;-1:-1:-1;;10262:2:1;10247:18;;10234:32;10275:31;10234:32;10275:31;:::i;:::-;9678:709;;;;-1:-1:-1;9678:709:1;;10377:2;10362:18;10349:32;;9678:709;-1:-1:-1;;9678:709:1:o;10392:805::-;10505:6;10513;10521;10529;10537;10545;10553;10606:3;10594:9;10585:7;10581:23;10577:33;10574:53;;;10623:1;10620;10613:12;10574:53;10662:9;10649:23;10681:31;10706:5;10681:31;:::i;:::-;10731:5;-1:-1:-1;10788:2:1;10773:18;;10760:32;10801:33;10760:32;10801:33;:::i;:::-;10853:7;-1:-1:-1;10907:2:1;10892:18;;10879:32;;-1:-1:-1;10958:2:1;10943:18;;10930:32;;-1:-1:-1;11009:3:1;10994:19;;10981:33;;-1:-1:-1;11066:3:1;11051:19;;11038:33;11080;11038;11080;:::i;:::-;11132:7;11122:17;;;11186:3;11175:9;11171:19;11158:33;11148:43;;10392:805;;;;;;;;;;:::o;11202:874::-;11324:6;11332;11340;11348;11356;11364;11372;11380;11433:3;11421:9;11412:7;11408:23;11404:33;11401:53;;;11450:1;11447;11440:12;11401:53;11489:9;11476:23;11508:31;11533:5;11508:31;:::i;:::-;11558:5;-1:-1:-1;11615:2:1;11600:18;;11587:32;11628:33;11587:32;11628:33;:::i;:::-;11680:7;-1:-1:-1;11734:2:1;11719:18;;11706:32;;-1:-1:-1;11785:2:1;11770:18;;11757:32;;-1:-1:-1;11836:3:1;11821:19;;11808:33;;-1:-1:-1;11888:3:1;11873:19;;11860:33;;-1:-1:-1;11945:3:1;11930:19;;11917:33;11959;11917;11959;:::i;:::-;12011:7;12001:17;;;12065:3;12054:9;12050:19;12037:33;12027:43;;11202:874;;;;;;;;;;;:::o;12405:330::-;12607:2;12589:21;;;12646:1;12626:18;;;12619:29;-1:-1:-1;;;12679:2:1;12664:18;;12657:37;12726:2;12711:18;;12405:330::o;12740:127::-;12801:10;12796:3;12792:20;12789:1;12782:31;12832:4;12829:1;12822:15;12856:4;12853:1;12846:15;12872:125;12912:4;12940:1;12937;12934:8;12931:34;;;12945:18;;:::i;:::-;-1:-1:-1;12982:9:1;;12872:125::o;13002:127::-;13063:10;13058:3;13054:20;13051:1;13044:31;13094:4;13091:1;13084:15;13118:4;13115:1;13108:15;13134:247;13193:6;13246:2;13234:9;13225:7;13221:23;13217:32;13214:52;;;13262:1;13259;13252:12;13214:52;13301:9;13288:23;13320:31;13345:5;13320:31;:::i;13386:336::-;13588:2;13570:21;;;13627:2;13607:18;;;13600:30;-1:-1:-1;;;13661:2:1;13646:18;;13639:42;13713:2;13698:18;;13386:336::o;13727:350::-;13929:2;13911:21;;;13968:2;13948:18;;;13941:30;14007:28;14002:2;13987:18;;13980:56;14068:2;14053:18;;13727:350::o;14082:670::-;-1:-1:-1;;;;;14449:15:1;;;14431:34;;14501:15;;;;14496:2;14481:18;;14474:43;14548:2;14533:18;;14526:34;;;;14591:2;14576:18;;14569:34;;;;14652:4;14640:17;14634:3;14619:19;;14612:46;14411:3;14674:19;;14667:35;14733:3;14718:19;;14711:35;;;;14380:3;14365:19;;14082:670::o;14757:346::-;14959:2;14941:21;;;14998:2;14978:18;;;14971:30;-1:-1:-1;;;15032:2:1;15017:18;;15010:52;15094:2;15079:18;;14757:346::o;15108:752::-;-1:-1:-1;;;;;15497:15:1;;;15479:34;;15549:15;;;;15544:2;15529:18;;15522:43;15596:2;15581:18;;15574:34;;;;15639:2;15624:18;;15617:34;;;;15695:14;15688:22;15682:3;15667:19;;15660:51;15760:4;15748:17;15459:3;15727:19;;15720:46;15797:3;15782:19;;15775:35;15841:3;15826:19;;15819:35;;;;15428:3;15413:19;;15108:752::o;15865:184::-;15935:6;15988:2;15976:9;15967:7;15963:23;15959:32;15956:52;;;16004:1;16001;15994:12;15956:52;-1:-1:-1;16027:16:1;;15865:184;-1:-1:-1;15865:184:1:o;16333:245::-;16400:6;16453:2;16441:9;16432:7;16428:23;16424:32;16421:52;;;16469:1;16466;16459:12;16421:52;16501:9;16495:16;16520:28;16542:5;16520:28;:::i;16963:245::-;17042:6;17050;17103:2;17091:9;17082:7;17078:23;17074:32;17071:52;;;17119:1;17116;17109:12;17071:52;-1:-1:-1;;17142:16:1;;17198:2;17183:18;;;17177:25;17142:16;;17177:25;;-1:-1:-1;16963:245:1:o;17913:258::-;17985:1;17995:113;18009:6;18006:1;18003:13;17995:113;;;18085:11;;;18079:18;18066:11;;;18059:39;18031:2;18024:10;17995:113;;;18126:6;18123:1;18120:13;18117:48;;;-1:-1:-1;;18161:1:1;18143:16;;18136:27;17913:258::o;18176:274::-;18305:3;18343:6;18337:13;18359:53;18405:6;18400:3;18393:4;18385:6;18381:17;18359:53;:::i;:::-;18428:16;;;;;18176:274;-1:-1:-1;;18176:274:1:o;19219:168::-;19259:7;19325:1;19321;19317:6;19313:14;19310:1;19307:21;19302:1;19295:9;19288:17;19284:45;19281:71;;;19332:18;;:::i;:::-;-1:-1:-1;19372:9:1;;19219:168::o;19392:128::-;19432:3;19463:1;19459:6;19456:1;19453:13;19450:39;;;19469:18;;:::i;:::-;-1:-1:-1;19505:9:1;;19392:128::o;20333:624::-;20564:6;20553:9;20546:25;20607:6;20602:2;20591:9;20587:18;20580:34;20679:1;20675;20670:3;20666:11;20662:19;20654:6;20650:32;20645:2;20634:9;20630:18;20623:60;20719:3;20714:2;20703:9;20699:18;20692:31;20527:4;20752:6;20746:13;20796:6;20790:3;20779:9;20775:19;20768:35;20812:67;20872:6;20866:3;20855:9;20851:19;20846:2;20838:6;20834:15;20812:67;:::i;:::-;20940:2;20919:15;-1:-1:-1;;20915:29:1;20900:45;;;;20947:3;20896:55;;20333:624;-1:-1:-1;;;;;20333:624:1:o;20962:188::-;21041:13;;-1:-1:-1;;;;;21083:42:1;;21073:53;;21063:81;;21140:1;21137;21130:12;21155:450;21242:6;21250;21258;21311:2;21299:9;21290:7;21286:23;21282:32;21279:52;;;21327:1;21324;21317:12;21279:52;21350:40;21380:9;21350:40;:::i;:::-;21340:50;;21409:49;21454:2;21443:9;21439:18;21409:49;:::i;:::-;21399:59;;21501:2;21490:9;21486:18;21480:25;21545:10;21538:5;21534:22;21527:5;21524:33;21514:61;;21571:1;21568;21561:12;21514:61;21594:5;21584:15;;;21155:450;;;;;:::o;21610:135::-;21649:3;-1:-1:-1;;21670:17:1;;21667:43;;;21690:18;;:::i;:::-;-1:-1:-1;21737:1:1;21726:13;;21610:135::o;22059:251::-;22129:6;22182:2;22170:9;22161:7;22157:23;22153:32;22150:52;;;22198:1;22195;22188:12;22150:52;22230:9;22224:16;22249:31;22274:5;22249:31;:::i
Swarm Source
ipfs://9298cd273fd907cc76edaec3d02ff9a58f43e3587749b7dc09e3963db198a7b7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.