Contract 0xa476c97d8d1ec7d263eafa0039645dbe0cc0a012

Contract Overview

EbisusBay: Ryoshi Router
Balance:
0 CRO

CRO Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x3c6c9f5ada9b2063d629144d3277d6e62a69bd90b2c809c3c7c5a00d5ceaee16Swap Exact Token...136364232024-04-24 22:40:563 mins ago0x755223d7eae4ccc59653a581647ac78c6df9c5ac IN  EbisusBay: Ryoshi Router0 CRO0.71015120
0x3db4b076d9de34b66790613bd7ef76677ca4acb222e1ab0f0a4ec42ec058438dSwap Exact Token...136364092024-04-24 22:39:374 mins ago0x5a1d7b0fb40d87a2aa1808f6225d9413de2b7197 IN  EbisusBay: Ryoshi Router0 CRO0.87646790
0x0da5825d5ce4976799741d4ceb15560ec5bf0aecf4fe304db5b35b4ed6e5d4c5Swap Exact Token...136362612024-04-24 22:25:3618 mins ago0xb1a2fd1a9bb93ceb5536ad5d3a826bc1c4c08a12 IN  EbisusBay: Ryoshi Router0 CRO0.735254750
0x0c9460ecc2679834639d61b6ca59a00b56ee59ef219c6daa031b8852fbd5756bAdd Liquidity ET...136361562024-04-24 22:15:3928 mins agoCronos ID Name minted1.cro IN  EbisusBay: Ryoshi Router1,501 CRO1.08650750
0x540a7c299f13be4657e73891ced8d553f4beea4848d0da27e860d207d23a23edSwap Tokens For ...136361382024-04-24 22:13:5730 mins agoCronos ID Name minted1.cro IN  EbisusBay: Ryoshi Router0 CRO0.71021180
0x1493dceacc9768a59ce5001ced001f2752d543e4cbf6feb1076e22930420bbc4Swap Exact Token...136361132024-04-24 22:11:3432 mins agoCronos ID Name idump.cro IN  EbisusBay: Ryoshi Router0 CRO0.710661250
0xe95b1651cb6b8758715615ffb8e73a79b95f0ec664238243354577ef32f1159dSwap Exact Token...136360852024-04-24 22:08:5535 mins agoCronos ID Name 271prophecy.cro IN  EbisusBay: Ryoshi Router0 CRO0.65003249025 5,000.75
0xb7f239791955786dec0556874ef1f310b67e925bc92e70b1a3f9e429a4ceb452Swap Tokens For ...136359262024-04-24 21:53:5250 mins ago0x7cee7d232dcae23fd673ea798078fde6c5a11c3a IN  EbisusBay: Ryoshi Router0 CRO0.734799078 5,048.5
0x94de30acb4cd877735b04c883972871ea6934146466b1cc41ae6c1763a03e904Swap Exact Token...136359062024-04-24 21:51:5952 mins ago0xc8a0113d6ff0bed2103e86d5e16e7864cae4d607 IN  EbisusBay: Ryoshi Router0 CRO0.538476450
0xb7aca0d3926934655d29cf9758d393cef7a3db2a845b369290e246af259b2ec7Swap Exact Token...136358782024-04-24 21:49:1954 mins ago0xc8a0113d6ff0bed2103e86d5e16e7864cae4d607 IN  EbisusBay: Ryoshi Router0 CRO0.53907740
0x7b565bb5c641a3c06113bd16ec3342e89d505df9285f6a6b75ab40c8d36a3e4fSwap Exact Token...136358702024-04-24 21:48:3455 mins ago0x5183eea0dc5dc8be03f68ba9a6b740d0127c1e95 IN  EbisusBay: Ryoshi Router0 CRO0.7105713265 5,048.5
0xfc7f1cc009e571dc998cbd7dc73d9301401dc7425f19d6af04bff5b08342d8c7Swap Exact ETH F...136358422024-04-24 21:45:5558 mins agoCronos ID Name usearubber.cro IN  EbisusBay: Ryoshi Router55.451227845553826 CRO0.739264450
0x07d8963d9f532be593a9f225dff0792df5b01f73749ed0b3b7cf3c8a2044159eSwap Exact Token...136358152024-04-24 21:43:221 hr ago0x7f5b7b2ebce8231714749c6f69be3b9ec005760b IN  EbisusBay: Ryoshi Router0 CRO0.7332693825 5,048.5
0xe4366c5c2b158ff59ac205ae398b0b39e863dcdf20f58c57d774929d1dec060eSwap Exact Token...136356862024-04-24 21:31:091 hr 13 mins ago0x45dfadc5e74f8fb62be7893aa7c1f34db7c26d8d IN  EbisusBay: Ryoshi Router0 CRO0.71384780
0xedfbcf1682c18fa980c5faec9e83ff4d3e9efb48a86e2778be8dc8aded3d8b7bSwap Exact ETH F...136356312024-04-24 21:25:561 hr 18 mins ago0x3ccb74e4d49f1bb8a32dcd47e6d9c7191c5c6342 IN  EbisusBay: Ryoshi Router300 CRO0.665811223445 5,047.045
0x2c4914647e10fa60d9ea532107ad4d7a94ce20f4ded42e23e5dc2b712d4fabcfSwap Exact ETH F...136355472024-04-24 21:17:571 hr 26 mins ago0x255bd8a226c9d5fffc99e8f82f900f982ec5bd7e IN  EbisusBay: Ryoshi Router2,000 CRO0.6510898995 5,048.5
0xef07a018026f6303fe554e835c173ab2508fb006dd643c52bc780aff5ba83864Swap Exact ETH F...136354282024-04-24 21:06:411 hr 37 mins ago0x376e682acebb2b294f8b0eab6b2749d047fec7d1 IN  EbisusBay: Ryoshi Router124 CRO0.666201050
0xb94f5b66d9940712787c6c5146f93fba1a6149d93c5cd0687d23cc98cf020f67Swap Exact ETH F...136354022024-04-24 21:04:131 hr 39 mins ago0x2414cb866c10e8e5f52bc85dc037a8595e0f7837 IN  EbisusBay: Ryoshi Router10 CRO0.665383904463 5,044.2646405
0x6ac37087cc0e560bdc4b41b27922feb8d2424f4ba10c3b169dd65e26cc4ca9ebSwap Exact Token...136353912024-04-24 21:03:101 hr 41 mins ago0x911a757df9d9f6384e52d8e85d1c29284ce5d522 IN  EbisusBay: Ryoshi Router0 CRO0.871463350
0x42cc276d3ef1a8d84c4784c20e9f9d4e827faefbd9fded4e6252637c611448bfSwap Exact Token...136353862024-04-24 21:02:421 hr 41 mins ago0x911a757df9d9f6384e52d8e85d1c29284ce5d522 IN  EbisusBay: Ryoshi Router0 CRO0.871463350
0x38f864c79631c3b10ce9b9e072a3c3c546aac5472afb09f405cb4e8c3f4f96c9Swap Exact Token...136353812024-04-24 21:02:141 hr 41 mins ago0x911a757df9d9f6384e52d8e85d1c29284ce5d522 IN  EbisusBay: Ryoshi Router0 CRO0.871463350
0x09e67e08d2f0e7a4473f308588adef871a67295a739705c8043ab13d63bba480Add Liquidity ET...136353802024-04-24 21:02:081 hr 42 mins ago0x84a4efb9f867472961009e33e641f94c47f76b8b IN  EbisusBay: Ryoshi Router52 CRO1.062979550
0x2ea06421b5cf34f4a6ce426b5b5d8836548d9e4af22456e9b203629f62e04fbeSwap Exact Token...136353732024-04-24 21:01:281 hr 42 mins ago0x911a757df9d9f6384e52d8e85d1c29284ce5d522 IN  EbisusBay: Ryoshi Router0 CRO0.871463350
0x0cff3ae48a9663a7a3e7d9b4270f45d77f209ce51bf0b100809196f15d3fc71eSwap Exact ETH F...136353702024-04-24 21:01:111 hr 43 mins ago0xc0c4573e4d244811bf9fa4ddb2c2fd2832311519 IN  EbisusBay: Ryoshi Router250 CRO0.6660637505 5,048.5
0x2de9047b9caf2093652a0862180816b3f99648f9f2470c067c860c46991d126aSwap Exact Token...136353702024-04-24 21:01:111 hr 43 mins ago0x911a757df9d9f6384e52d8e85d1c29284ce5d522 IN  EbisusBay: Ryoshi Router0 CRO0.871402750
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0da5825d5ce4976799741d4ceb15560ec5bf0aecf4fe304db5b35b4ed6e5d4c5136362612024-04-24 22:25:3618 mins ago EbisusBay: Ryoshi Router0xb1a2fd1a9bb93ceb5536ad5d3a826bc1c4c08a12575.154071433403528172 CRO
0x0da5825d5ce4976799741d4ceb15560ec5bf0aecf4fe304db5b35b4ed6e5d4c5136362612024-04-24 22:25:3618 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router575.154071433403528172 CRO
0x0c9460ecc2679834639d61b6ca59a00b56ee59ef219c6daa031b8852fbd5756b136361562024-04-24 22:15:3928 mins ago EbisusBay: Ryoshi RouterCronos ID Name minted1.cro1 basecro
0x0c9460ecc2679834639d61b6ca59a00b56ee59ef219c6daa031b8852fbd5756b136361562024-04-24 22:15:3928 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token1,500.999999999999999999 CRO
0x540a7c299f13be4657e73891ced8d553f4beea4848d0da27e860d207d23a23ed136361382024-04-24 22:13:5730 mins ago EbisusBay: Ryoshi RouterCronos ID Name minted1.cro2,000 CRO
0x540a7c299f13be4657e73891ced8d553f4beea4848d0da27e860d207d23a23ed136361382024-04-24 22:13:5730 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router2,000 CRO
0x1493dceacc9768a59ce5001ced001f2752d543e4cbf6feb1076e22930420bbc4136361132024-04-24 22:11:3432 mins ago EbisusBay: Ryoshi RouterCronos ID Name idump.cro8,947.383108364349702899 CRO
0x1493dceacc9768a59ce5001ced001f2752d543e4cbf6feb1076e22930420bbc4136361132024-04-24 22:11:3432 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router8,947.383108364349702899 CRO
0xe95b1651cb6b8758715615ffb8e73a79b95f0ec664238243354577ef32f1159d136360852024-04-24 22:08:5535 mins ago EbisusBay: Ryoshi RouterCronos ID Name 271prophecy.cro3,091.362359583697104522 CRO
0xe95b1651cb6b8758715615ffb8e73a79b95f0ec664238243354577ef32f1159d136360852024-04-24 22:08:5535 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router3,091.362359583697104522 CRO
0xb7f239791955786dec0556874ef1f310b67e925bc92e70b1a3f9e429a4ceb452136359262024-04-24 21:53:5250 mins ago EbisusBay: Ryoshi Router0x7cee7d232dcae23fd673ea798078fde6c5a11c3a1,000 CRO
0xb7f239791955786dec0556874ef1f310b67e925bc92e70b1a3f9e429a4ceb452136359262024-04-24 21:53:5250 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router1,000 CRO
0x7b565bb5c641a3c06113bd16ec3342e89d505df9285f6a6b75ab40c8d36a3e4f136358702024-04-24 21:48:3455 mins ago EbisusBay: Ryoshi Router0x5183eea0dc5dc8be03f68ba9a6b740d0127c1e95817.735462730322153827 CRO
0x7b565bb5c641a3c06113bd16ec3342e89d505df9285f6a6b75ab40c8d36a3e4f136358702024-04-24 21:48:3455 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router817.735462730322153827 CRO
0xfc7f1cc009e571dc998cbd7dc73d9301401dc7425f19d6af04bff5b08342d8c7136358422024-04-24 21:45:5558 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token55.451227845553826569 CRO
0x07d8963d9f532be593a9f225dff0792df5b01f73749ed0b3b7cf3c8a2044159e136358152024-04-24 21:43:221 hr ago EbisusBay: Ryoshi Router0x7f5b7b2ebce8231714749c6f69be3b9ec005760b1,095.020756171245178741 CRO
0x07d8963d9f532be593a9f225dff0792df5b01f73749ed0b3b7cf3c8a2044159e136358152024-04-24 21:43:221 hr ago Cronos: WCRO Token EbisusBay: Ryoshi Router1,095.020756171245178741 CRO
0xe4366c5c2b158ff59ac205ae398b0b39e863dcdf20f58c57d774929d1dec060e136356862024-04-24 21:31:091 hr 13 mins ago EbisusBay: Ryoshi Router0x45dfadc5e74f8fb62be7893aa7c1f34db7c26d8d5.091719921458065841 CRO
0xe4366c5c2b158ff59ac205ae398b0b39e863dcdf20f58c57d774929d1dec060e136356862024-04-24 21:31:091 hr 13 mins ago Cronos: WCRO Token EbisusBay: Ryoshi Router5.091719921458065841 CRO
0xedfbcf1682c18fa980c5faec9e83ff4d3e9efb48a86e2778be8dc8aded3d8b7b136356312024-04-24 21:25:561 hr 18 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token300 CRO
0x2c4914647e10fa60d9ea532107ad4d7a94ce20f4ded42e23e5dc2b712d4fabcf136355472024-04-24 21:17:571 hr 26 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token2,000 CRO
0xef07a018026f6303fe554e835c173ab2508fb006dd643c52bc780aff5ba83864136354282024-04-24 21:06:411 hr 37 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token124 CRO
0xb94f5b66d9940712787c6c5146f93fba1a6149d93c5cd0687d23cc98cf020f67136354022024-04-24 21:04:131 hr 39 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token10 CRO
0x09e67e08d2f0e7a4473f308588adef871a67295a739705c8043ab13d63bba480136353802024-04-24 21:02:081 hr 42 mins ago EbisusBay: Ryoshi Router0x84a4efb9f867472961009e33e641f94c47f76b8b1 basecro
0x09e67e08d2f0e7a4473f308588adef871a67295a739705c8043ab13d63bba480136353802024-04-24 21:02:081 hr 42 mins ago EbisusBay: Ryoshi Router Cronos: WCRO Token51.999999999999999999 CRO
[ Download CSV Export 
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RyoshiRouter

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 10 : IERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

File 2 of 10 : IRyoshiERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

interface IRyoshiERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 3 of 10 : IRyoshiFactory.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

interface IRyoshiFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    event FeeSetterChanged(address indexed oldSetter, address indexed newSetter);
    event FeeToChanged(address indexed oldFeeTo, address indexed newFeeTo);
    event SwapFeeChanged(address indexed pair, uint32 oldSwapFee, uint32 newSwapFee);
    event DefaultFeeChanged(uint32 oldSwapFee, uint32 newSwapFee);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function swapFee() external view returns (uint32);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
    function setSwapFee(address pair, uint32 swapFee) external;
}

File 4 of 10 : IRyoshiPair.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

import {IRyoshiERC20} from "./IRyoshiERC20.sol";

interface IRyoshiPair is IRyoshiERC20 {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

File 5 of 10 : IRyoshiRouter.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

import {IRyoshiRouter01} from "./IRyoshiRouter01.sol";

interface IRyoshiRouter is IRyoshiRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 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);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

File 6 of 10 : IRyoshiRouter01.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

//solhint-disable func-name-mixedcase

interface IRyoshiRouter01 {
    function factory() external view returns (address);

    function WETH() external view returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function 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);

    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);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(
        uint256 amountIn,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);

    function getAmountsIn(
        uint256 amountOut,
        address[] calldata path
    ) external view returns (uint256[] memory amounts);
}

File 7 of 10 : IWETH.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

File 8 of 10 : RyoshiLibrary.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

//solhint-disable reason-string

import {IRyoshiPair} from "../interfaces/IRyoshiPair.sol";

library RyoshiLibrary {
    // 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) {
        require(tokenA != tokenB, "RyoshiLibrary: IDENTICAL_ADDRESSES");
        (token0, token1) = tokenA < tokenB
            ? (tokenA, tokenB)
            : (tokenB, tokenA);
        require(token0 != address(0), "RyoshiLibrary: ZERO_ADDRESS");
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(
            uint160(
                uint256(
                    keccak256(
                        abi.encodePacked(
                            bytes1(0xff),
                            factory,
                            keccak256(abi.encodePacked(token0, token1)),
                            hex"347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016" // init code hash
                        )
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IRyoshiPair(
            pairFor(factory, tokenA, tokenB)
        ).getReserves();
        (reserveA, reserveB) = tokenA == token0
            ? (reserve0, reserve1)
            : (reserve1, reserve0);
    }

    // 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) {
        require(amountA > 0, "RyoshiLibrary: INSUFFICIENT_AMOUNT");
        require(
            reserveA > 0 && reserveB > 0,
            "RyoshiLibrary: INSUFFICIENT_LIQUIDITY"
        );
        amountB = (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) {
        require(amountIn > 0, "RyoshiLibrary: INSUFFICIENT_INPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "RyoshiLibrary: INSUFFICIENT_LIQUIDITY"
        );
        uint256 amountInWithFee = amountIn * 997;
        uint256 numerator = amountInWithFee * reserveOut;
        uint256 denominator = reserveIn * 1000 + amountInWithFee;
        amountOut = numerator / denominator;
    }

    // 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) {
        require(amountOut > 0, "RyoshiLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
        require(
            reserveIn > 0 && reserveOut > 0,
            "RyoshiLibrary: INSUFFICIENT_LIQUIDITY"
        );
        uint256 numerator = reserveIn * amountOut * 1000;
        uint256 denominator = (reserveOut - amountOut) * 997;
        amountIn = numerator / denominator + 1;
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(
        address factory,
        uint256 amountIn,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "RyoshiLibrary: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[0] = amountIn;
        for (uint256 i; i < path.length - 1; i++) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                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,
        uint256 amountOut,
        address[] memory path
    ) internal view returns (uint256[] memory amounts) {
        require(path.length >= 2, "RyoshiLibrary: INVALID_PATH");
        amounts = new uint256[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint256 i = path.length - 1; i > 0; i--) {
            (uint256 reserveIn, uint256 reserveOut) = getReserves(
                factory,
                path[i - 1],
                path[i]
            );
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

File 9 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

// 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, uint256 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::safeApprove: approve failed"
        );
    }

    function safeTransfer(address token, address to, uint256 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::safeTransfer: transfer failed"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 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::transferFrom: transferFrom failed"
        );
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(
            success,
            "TransferHelper::safeTransferETH: ETH transfer failed"
        );
    }
}

File 10 of 10 : RyoshiRouter.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity =0.8.4;

import {IRyoshiFactory} from "./interfaces/IRyoshiFactory.sol";
import {IRyoshiRouter} from "./interfaces/IRyoshiRouter.sol";
import {IRyoshiPair} from "./interfaces/IRyoshiPair.sol";
import {IERC20} from "./interfaces/IERC20.sol";
import {IWETH} from "./interfaces/IWETH.sol";

import {TransferHelper} from "./libraries/TransferHelper.sol";
import {RyoshiLibrary} from "./libraries/RyoshiLibrary.sol";

contract RyoshiRouter is IRyoshiRouter {
    //solhint-disable-next-line immutable-vars-naming
    address public immutable override factory;
    address public immutable override WETH;

    modifier ensure(uint256 deadline) {
        require(deadline >= block.timestamp, "RyoshiRouter: EXPIRED");
        _;
    }

    constructor(address _factory, address _WETH) {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IRyoshiFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IRyoshiFactory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) = RyoshiLibrary.getReserves(
            factory,
            tokenA,
            tokenB
        );
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = RyoshiLibrary.quote(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "RyoshiRouter: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = RyoshiLibrary.quote(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "RyoshiRouter: 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
        virtual
        override
        ensure(deadline)
        returns (uint256 amountA, uint256 amountB, uint256 liquidity)
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin
        );
        address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IRyoshiPair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = RyoshiLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IRyoshiPair(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
        virtual
        override
        ensure(deadline)
        returns (uint256 amountA, uint256 amountB)
    {
        address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB);
        IRyoshiPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IRyoshiPair(pair).burn(to);
        (address token0, ) = RyoshiLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0
            ? (amount0, amount1)
            : (amount1, amount0);
        require(
            amountA >= amountAMin,
            "RyoshiRouter: INSUFFICIENT_A_AMOUNT"
        );
        require(
            amountB >= amountBMin,
            "RyoshiRouter: INSUFFICIENT_B_AMOUNT"
        );
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        public
        virtual
        override
        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 virtual override returns (uint256 amountA, uint256 amountB) {
        address pair = RyoshiLibrary.pairFor(factory, tokenA, tokenB);
        uint256 value = approveMax ? type(uint256).max : liquidity;
        IRyoshiPair(pair).permit(
            msg.sender,
            address(this),
            value,
            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
        virtual
        override
        returns (uint256 amountToken, uint256 amountETH)
    {
        address pair = RyoshiLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? type(uint256).max : liquidity;
        IRyoshiPair(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 virtual override 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 virtual override returns (uint256 amountETH) {
        address pair = RyoshiLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? type(uint256).max : liquidity;
        IRyoshiPair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // 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 {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = RyoshiLibrary.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
                ? RyoshiLibrary.pairFor(factory, output, path[i + 2])
                : _to;
            IRyoshiPair(RyoshiLibrary.pairFor(factory, input, output))
                .swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = RyoshiLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WETH, "RyoshiRouter: INVALID_PATH");
        amounts = RyoshiLibrary.getAmountsOut(factory, msg.value, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                RyoshiLibrary.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH");
        amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= amountInMax,
            "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, 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
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH");
        amounts = RyoshiLibrary.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, 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
        virtual
        override
        ensure(deadline)
        returns (uint256[] memory amounts)
    {
        require(path[0] == WETH, "RyoshiRouter: INVALID_PATH");
        amounts = RyoshiLibrary.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= msg.value,
            "RyoshiRouter: EXCESSIVE_INPUT_AMOUNT"
        );
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                RyoshiLibrary.pairFor(factory, 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]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = RyoshiLibrary.sortTokens(input, output);
            IRyoshiPair pair = IRyoshiPair(
                RyoshiLibrary.pairFor(factory, input, output)
            );
            uint256 amountInput;
            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);
                amountInput =
                    IERC20(input).balanceOf(address(pair)) -
                    reserveInput;
                amountOutput = RyoshiLibrary.getAmountOut(
                    amountInput,
                    reserveInput,
                    reserveOutput
                );
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to = i < path.length - 2
                ? RyoshiLibrary.pairFor(factory, 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 virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, 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,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) {
        require(path[0] == WETH, "RyoshiRouter: INVALID_PATH");
        uint256 amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(
            IWETH(WETH).transfer(
                RyoshiLibrary.pairFor(factory, 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,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
    }

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) {
        require(path[path.length - 1] == WETH, "RyoshiRouter: INVALID_PATH");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            RyoshiLibrary.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IERC20(WETH).balanceOf(address(this));
        require(
            amountOut >= amountOutMin,
            "RyoshiRouter: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) public pure virtual override returns (uint256 amountB) {
        return RyoshiLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure virtual override returns (uint256 amountOut) {
        return RyoshiLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) public pure virtual override returns (uint256 amountIn) {
        return RyoshiLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(
        uint256 amountIn,
        address[] memory path
    ) public view virtual override returns (uint256[] memory amounts) {
        return RyoshiLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(
        uint256 amountOut,
        address[] memory path
    ) public view virtual override returns (uint256[] memory amounts) {
        return RyoshiLibrary.getAmountsIn(factory, amountOut, path);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "metadata": {
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","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":[{"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"}],"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":"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"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200517a3803806200517a833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c614f3b6200023f6000396000818161019f015281816103bb0152818161059c01528181610604015281816106f0015281816109ed01528181610e4501528181611021015281816114f1015281816116390152818161176201528181611825015281816119e501528181611a8101528181611dc501528181611ebe01528181611f7f0152818161203a015281816120ae015281816126be0152818161296a015281816129c0015281816129f401528181612aa201528181612c5001528181612e030152612e9f01526000818161047a015281816107aa015281816108ee01528181610aef01528181610b2601528181610c8001528181610eff01528181610fff015281816111a7015281816118de01528181611ab301528181611c67015281816120e0015281816123cc0152818161266c0152818161269c015281816128280152818161299e01528181612d0901528181612ed10152818161398d015281816139eb01528181613d2601528181613f140152818161439a0152818161446501526144eb0152614f3b6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104dc578063f305d71914610517578063fb3bdb411461052a57600080fd5b8063c45a015514610468578063d06ca61f1461049c578063ded9382a146104bc57600080fd5b8063af2979eb116100b0578063af2979eb14610415578063b6f9de9514610435578063baa2abde1461044857600080fd5b80638803dbee14610389578063ad5c4648146103a9578063ad615dec146103f557600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103365780637ff36ab51461035657806385f8c2591461036957600080fd5b80634a25d94a146102d65780635b0d5984146102f65780635c11d7951461031657600080fd5b80631f00ca74116101695780631f00ca74146102765780632195995c1461029657806338ed1739146102b657600080fd5b806302751cec146101e1578063054d50d41461021b57806318cbafe51461024957600080fd5b366101dc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149b8565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614d16565b61067e565b604051908152602001610212565b34801561025557600080fd5b50610269610264366004614ca5565b610693565b6040516102129190614d5d565b34801561028257600080fd5b50610269610291366004614b91565b610ae8565b3480156102a257600080fd5b506102016102b1366004614894565b610b1c565b3480156102c257600080fd5b506102696102d1366004614ca5565b610c28565b3480156102e257600080fd5b506102696102f1366004614ca5565b610de8565b34801561030257600080fd5b5061023b610311366004614a15565b610ff7565b34801561032257600080fd5b506101da610331366004614ca5565b611117565b34801561034257600080fd5b506101da610351366004614ca5565b611496565b610269610364366004614b2c565b6117d0565b34801561037557600080fd5b5061023b610384366004614d16565b611c02565b34801561039557600080fd5b506102696103a4366004614ca5565b611c0f565b3480156103b557600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610212565b34801561040157600080fd5b5061023b610410366004614d16565b611d5f565b34801561042157600080fd5b5061023b6104303660046149b8565b611d6c565b6101da610443366004614b2c565b611f2c565b34801561045457600080fd5b50610201610463366004614823565b612371565b34801561047457600080fd5b506103dd7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a857600080fd5b506102696104b7366004614b91565b612665565b3480156104c857600080fd5b506102016104d7366004614a15565b612692565b3480156104e857600080fd5b506104fc6104f736600461493d565b6127b8565b60408051938452602084019290925290820152606001610212565b6104fc6105253660046149b8565b61290e565b610269610538366004614b2c565b612bfb565b60008082428110156105965760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6105c5897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612371565b90935091506105d589868561307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b5050505061067285836131ed565b50965096945050505050565b600061068b8484846132d5565b949350505050565b606081428110156106e65760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868661071d600182614e67565b81811061073a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074f91906147eb565b6001600160a01b0316146107a55760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6108037f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516108159190614e67565b8151811061083357634e487b7160e01b600052603260045260246000fd5b602002602001015110156108af5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6109ac868660008181106108d357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108e891906147eb565b3361097e7f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061092e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061094391906147eb565b8b8b600181811061096457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061097991906147eb565b6135fb565b8560008151811061099f57634e487b7160e01b600052603260045260246000fd5b6020026020010151613708565b6109eb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613880915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610a299190614e67565b81518110610a4757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a6d91815260200190565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b50505050610add848360018551610ab29190614e67565b81518110610ad057634e487b7160e01b600052603260045260246000fd5b60200260200101516131ed565b509695505050505050565b6060610b157f00000000000000000000000000000000000000000000000000000000000000008484613ac0565b9392505050565b6000806000610b4c7f00000000000000000000000000000000000000000000000000000000000000008f8f6135fb565b9050600087610b5b578c610b5f565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b50505050610c0e8f8f8f8f8f8f8f612371565b809450819550505050509b509b9950505050505050505050565b60608142811015610c7b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b610cd97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b9150868260018451610ceb9190614e67565b81518110610d0957634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d855760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b610da9868660008181106108d357634e487b7160e01b600052603260045260246000fd5b610add82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b60608142811015610e3b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686610e72600182614e67565b818110610e8f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ea491906147eb565b6001600160a01b031614610efa5760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b610f587f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110610f7c57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108af5760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000806110457f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006135fb565b9050600086611054578b611058565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506111068d8d8d8d8d8d611d6c565b9d9c50505050505050505050505050565b80428110156111685760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6112238585600081811061118c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111a191906147eb565b3361121d7f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111fc91906147eb565b8a8a600181811061096457634e487b7160e01b600052603260045260246000fd5b8a613708565b60008585611232600182614e67565b81811061124f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061126491906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614b14565b9050611338868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c95915050565b86818787611347600182614e67565b81811061136457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137991906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140e9190614b14565b6114189190614e67565b101561148c5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b5050505050505050565b80428110156114e75760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858561151e600182614e67565b81811061153b57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061155091906147eb565b6001600160a01b0316146115a65760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6115ca8585600081811061118c57634e487b7160e01b600052603260045260246000fd5b611608858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c95915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190614b14565b9050868110156117335760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b5050505061148c84826131ed565b606081428110156118235760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061186e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061188391906147eb565b6001600160a01b0316146118d95760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6119377f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516119499190614e67565b8151811061196757634e487b7160e01b600052603260045260246000fd5b602002602001015110156119e35760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611a3357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611af37f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110611b1457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611b4d9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611b6757600080fd5b505af1158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190614aaa565b611bb957634e487b7160e01b600052600160045260246000fd5b611bf882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b5095945050505050565b600061068b848484613fe9565b60608142811015611c625760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611cc07f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110611ce457634e487b7160e01b600052603260045260246000fd5b60200260200101511115610d855760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b600061068b848484614135565b60008142811015611dbf5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611dee887f00000000000000000000000000000000000000000000000000000000000000008989893089612371565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350611e8f9150899086906001600160a01b038316906370a082319060240160206040518083038186803b158015611e5257600080fd5b505afa158015611e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8a9190614b14565b61307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b50505050610add84836131ed565b8042811015611f7d5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611fc857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fdd91906147eb565b6001600160a01b0316146120335760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561209357600080fd5b505af11580156120a7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121207f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190614aaa565b6121d257634e487b7160e01b600052600160045260246000fd5b600086866121e1600182614e67565b8181106121fe57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061221391906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561226f57600080fd5b505afa158015612283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a79190614b14565b90506122e7878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c95915050565b878188886122f6600182614e67565b81811061231357634e487b7160e01b600052603260045260246000fd5b905060200201602081019061232891906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024016113be565b60008082428110156123c55760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b60006123f27f00000000000000000000000000000000000000000000000000000000000000008c8c6135fb565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190614aaa565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190614c82565b91509150600061253d8e8e614243565b509050806001600160a01b03168e6001600160a01b031614612560578183612563565b82825b90975095508a8710156125de5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b898610156126545760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b505050505097509795505050505050565b6060610b157f0000000000000000000000000000000000000000000000000000000000000000848461341c565b60008060006126e27f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006135fb565b90506000876126f1578c6126f5565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506127a38e8e8e8e8e8e61053d565b909f909e509c50505050505050505050505050565b6000806000834281101561280e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b61281c8c8c8c8c8c8c614353565b9094509250600061284e7f00000000000000000000000000000000000000000000000000000000000000008e8e6135fb565b905061285c8d338388613708565b6128688c338387613708565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fc9190614b14565b92505050985098509895505050505050565b600080600083428110156129645760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6129928a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614353565b909450925060006129e47f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006135fb565b90506129f28b338388613708565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4d57600080fd5b505af1158015612a61573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b158015612aea57600080fd5b505af1158015612afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b229190614aaa565b612b3c57634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612b9857600080fd5b505af1158015612bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd09190614b14565b925083341115612bed57612bed33612be88634614e67565b6131ed565b505096509650969350505050565b60608142811015612c4e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612c9957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612cae91906147eb565b6001600160a01b031614612d045760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b612d627f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91503482600081518110612d8657634e487b7160e01b600052603260045260246000fd5b60200260200101511115612e015760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e5157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e8457600080fd5b505af1158015612e98573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612f117f0000000000000000000000000000000000000000000000000000000000000000898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110612f3257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f6b9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190614aaa565b612fd757634e487b7160e01b600052600160045260246000fd5b61301682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b8160008151811061303757634e487b7160e01b600052603260045260246000fd5b6020026020010151341115611bf857611bf8338360008151811061306b57634e487b7160e01b600052603260045260246000fd5b602002602001015134612be89190614e67565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916131089190614d41565b6000604051808303816000865af19150503d8060008114613145576040519150601f19603f3d011682016040523d82523d6000602084013e61314a565b606091505b50915091508180156131745750805115806131745750808060200190518101906131749190614aaa565b6131e65760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c656400000000000000000000000000000000000000606482015260840161058d565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516132179190614d41565b60006040518083038185875af1925050503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50509050806132d05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c6564000000000000000000000000606482015260840161058d565b505050565b600080841161334c5760405162461bcd60e51b815260206004820152602860248201527f52796f7368694c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b60008311801561335c5750600082115b6133ce5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006133dc856103e5614e48565b905060006133ea8483614e48565b90506000826133fb876103e8614e48565b6134059190614e10565b90506134118183614e28565b979650505050505050565b60606002825110156134705760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff81111561349857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134c1578160200160208202803683370190505b50905082816000815181106134e657634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516135039190614e67565b8110156135f3576000806135728786858151811061353157634e487b7160e01b600052603260045260246000fd5b6020026020010151878660016135479190614e10565b8151811061356557634e487b7160e01b600052603260045260246000fd5b6020026020010151614682565b915091506135a884848151811061359957634e487b7160e01b600052603260045260246000fd5b602002602001015183836132d5565b846135b4856001614e10565b815181106135d257634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806135eb90614ec1565b9150506134f5565b509392505050565b600080600061360a8585614243565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527f347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161379a9190614d41565b6000604051808303816000865af19150503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091508180156138065750805115806138065750808060200190518101906138069190614aaa565b6138785760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c6564000000000000000000000000000000606482015260840161058d565b505050505050565b60005b600183516138919190614e67565b811015613aba576000808483815181106138bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138d19190614e10565b815181106138ef57634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006139078383614243565b509050600087613918866001614e10565b8151811061393657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461396457826000613968565b6000835b91509150600060028a5161397c9190614e67565b881061398857886139e4565b6139e47f0000000000000000000000000000000000000000000000000000000000000000878c6139b98c6002614e10565b815181106139d757634e487b7160e01b600052603260045260246000fd5b60200260200101516135fb565b9050613a117f000000000000000000000000000000000000000000000000000000000000000088886135fb565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a4e576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a6e9493929190614da1565b600060405180830381600087803b158015613a8857600080fd5b505af1158015613a9c573d6000803e3d6000fd5b50505050505050505050508080613ab290614ec1565b915050613883565b50505050565b6060600282511015613b145760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff811115613b3c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b65578160200160208202803683370190505b509050828160018351613b789190614e67565b81518110613b9657634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351613bb29190614e67565b90505b80156135f357600080613c148786613bce600187614e67565b81518110613bec57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061356557634e487b7160e01b600052603260045260246000fd5b91509150613c4a848481518110613c3b57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613fe9565b84613c56600186614e67565b81518110613c7457634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c8d90614eaa565b915050613bb5565b60005b60018351613ca69190614e67565b8110156132d057600080848381518110613cd057634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613ce69190614e10565b81518110613d0457634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613d1c8383614243565b5090506000613d4c7f000000000000000000000000000000000000000000000000000000000000000085856135fb565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d8d57600080fd5b505afa158015613da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc59190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613e0d578284613e10565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e7257600080fd5b505afa158015613e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eaa9190614b14565b613eb49190614e67565b9550613ec18683836132d5565b945050505050600080856001600160a01b0316886001600160a01b031614613eeb57826000613eef565b6000835b91509150600060028c51613f039190614e67565b8a10613f0f578a613f40565b613f407f0000000000000000000000000000000000000000000000000000000000000000898e6139b98e6002614e10565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f9b9086908690869060248101614da1565b600060405180830381600087803b158015613fb557600080fd5b505af1158015613fc9573d6000803e3d6000fd5b505050505050505050505050508080613fe190614ec1565b915050613c98565b60008084116140605760405162461bcd60e51b815260206004820152602960248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e540000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156140705750600082115b6140e25760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006140ee8585614e48565b6140fa906103e8614e48565b905060006141088685614e67565b614114906103e5614e48565b90506141208183614e28565b61412b906001614e10565b9695505050505050565b60008084116141ac5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e54000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156141bc5750600082115b61422e5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b826142398386614e48565b61068b9190614e28565b600080826001600160a01b0316846001600160a01b031614156142ce5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a204944454e544943414c5f4144445245535360448201527f4553000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b826001600160a01b0316846001600160a01b0316106142ee5782846142f1565b83835b90925090506001600160a01b03821661434c5760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a205a45524f5f414444524553530000000000604482015260640161058d565b9250929050565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b1580156143de57600080fd5b505afa1580156143f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144169190614807565b6001600160a01b031614156144e3576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c6539690604401602060405180830381600087803b1580156144a957600080fd5b505af11580156144bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e19190614807565b505b6000806145117f00000000000000000000000000000000000000000000000000000000000000008b8b614682565b91509150816000148015614523575080155b1561453357879350869250614675565b6000614540898484614135565b90508781116145ca57858110156145bf5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b889450925082614673565b60006145d7898486614135565b9050898111156145f757634e487b7160e01b600052600160045260246000fd5b8781101561466d5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b94508793505b505b5050965096945050505050565b60008060006146918585614243565b5090506000806146a28888886135fb565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156146da57600080fd5b505afa1580156146ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147129190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461475757808261475a565b81815b90999098509650505050505050565b803561477481614f08565b919050565b60008083601f84011261478a578081fd5b50813567ffffffffffffffff8111156147a1578182fd5b6020830191508360208260051b850101111561434c57600080fd5b80516dffffffffffffffffffffffffffff8116811461477457600080fd5b803560ff8116811461477457600080fd5b6000602082840312156147fc578081fd5b8135610b1581614f08565b600060208284031215614818578081fd5b8151610b1581614f08565b600080600080600080600060e0888a03121561483d578283fd5b873561484881614f08565b9650602088013561485881614f08565b955060408801359450606088013593506080880135925060a088013561487d81614f08565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e0312156148b5578384fd5b8b356148c081614f08565b9a5060208c01356148d081614f08565b995060408c0135985060608c0135975060808c0135965060a08c01356148f581614f08565b955060c08c0135945060e08c013561490c81614f20565b935061491b6101008d016147da565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215614959578384fd5b883561496481614f08565b9750602089013561497481614f08565b965060408901359550606089013594506080890135935060a0890135925060c08901356149a081614f08565b8092505060e089013590509295985092959890939650565b60008060008060008060c087890312156149d0578182fd5b86356149db81614f08565b95506020870135945060408701359350606087013592506080870135614a0081614f08565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215614a34578384fd5b8a35614a3f81614f08565b995060208b0135985060408b0135975060608b0135965060808b0135614a6481614f08565b955060a08b0135945060c08b0135614a7b81614f20565b9350614a8960e08c016147da565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614abb578081fd5b8151610b1581614f20565b600080600060608486031215614ada578081fd5b614ae3846147bc565b9250614af1602085016147bc565b9150604084015163ffffffff81168114614b09578182fd5b809150509250925092565b600060208284031215614b25578081fd5b5051919050565b600080600080600060808688031215614b43578283fd5b85359450602086013567ffffffffffffffff811115614b60578384fd5b614b6c88828901614779565b9095509350506040860135614b8081614f08565b949793965091946060013592915050565b60008060408385031215614ba3578182fd5b8235915060208084013567ffffffffffffffff80821115614bc2578384fd5b818601915086601f830112614bd5578384fd5b813581811115614be757614be7614ef2565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614c2a57614c2a614ef2565b604052828152858101935084860182860187018b1015614c48578788fd5b8795505b83861015614c7157614c5d81614769565b855260019590950194938601938601614c4c565b508096505050505050509250929050565b60008060408385031215614c94578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614cbd578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614ce1578485fd5b614ced89828a01614779565b9095509350506060870135614d0181614f08565b80925050608087013590509295509295509295565b600080600060608486031215614d2a578081fd5b505081359360208301359350604090920135919050565b60008251614d53818460208701614e7e565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d9557835183529284019291840191600101614d79565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614ddb8160a0850160208701614e7e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614e2357614e23614edc565b500190565b600082614e4357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e6257614e62614edc565b500290565b600082821015614e7957614e79614edc565b500390565b60005b83811015614e99578181015183820152602001614e81565b83811115613aba5750506000910152565b600081614eb957614eb9614edc565b506000190190565b6000600019821415614ed557614ed5614edc565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614f1d57600080fd5b50565b8015158114614f1d57600080fdfea164736f6c6343000804000a0000000000000000000000005f1d751f447236f486f4268b883782897a9023790000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

Deployed Bytecode

0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e33700146104dc578063f305d71914610517578063fb3bdb411461052a57600080fd5b8063c45a015514610468578063d06ca61f1461049c578063ded9382a146104bc57600080fd5b8063af2979eb116100b0578063af2979eb14610415578063b6f9de9514610435578063baa2abde1461044857600080fd5b80638803dbee14610389578063ad5c4648146103a9578063ad615dec146103f557600080fd5b80634a25d94a11610138578063791ac94711610112578063791ac947146103365780637ff36ab51461035657806385f8c2591461036957600080fd5b80634a25d94a146102d65780635b0d5984146102f65780635c11d7951461031657600080fd5b80631f00ca74116101695780631f00ca74146102765780632195995c1461029657806338ed1739146102b657600080fd5b806302751cec146101e1578063054d50d41461021b57806318cbafe51461024957600080fd5b366101dc57336001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149b8565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614d16565b61067e565b604051908152602001610212565b34801561025557600080fd5b50610269610264366004614ca5565b610693565b6040516102129190614d5d565b34801561028257600080fd5b50610269610291366004614b91565b610ae8565b3480156102a257600080fd5b506102016102b1366004614894565b610b1c565b3480156102c257600080fd5b506102696102d1366004614ca5565b610c28565b3480156102e257600080fd5b506102696102f1366004614ca5565b610de8565b34801561030257600080fd5b5061023b610311366004614a15565b610ff7565b34801561032257600080fd5b506101da610331366004614ca5565b611117565b34801561034257600080fd5b506101da610351366004614ca5565b611496565b610269610364366004614b2c565b6117d0565b34801561037557600080fd5b5061023b610384366004614d16565b611c02565b34801561039557600080fd5b506102696103a4366004614ca5565b611c0f565b3480156103b557600080fd5b506103dd7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2381565b6040516001600160a01b039091168152602001610212565b34801561040157600080fd5b5061023b610410366004614d16565b611d5f565b34801561042157600080fd5b5061023b6104303660046149b8565b611d6c565b6101da610443366004614b2c565b611f2c565b34801561045457600080fd5b50610201610463366004614823565b612371565b34801561047457600080fd5b506103dd7f0000000000000000000000005f1d751f447236f486f4268b883782897a90237981565b3480156104a857600080fd5b506102696104b7366004614b91565b612665565b3480156104c857600080fd5b506102016104d7366004614a15565b612692565b3480156104e857600080fd5b506104fc6104f736600461493d565b6127b8565b60408051938452602084019290925290820152606001610212565b6104fc6105253660046149b8565b61290e565b610269610538366004614b2c565b612bfb565b60008082428110156105965760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6105c5897f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238a8a8a308a612371565b90935091506105d589868561307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b5050505061067285836131ed565b50965096945050505050565b600061068b8484846132d5565b949350505050565b606081428110156106e65760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316868661071d600182614e67565b81811061073a57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061074f91906147eb565b6001600160a01b0316146107a55760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6108037f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516108159190614e67565b8151811061083357634e487b7160e01b600052603260045260246000fd5b602002602001015110156108af5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6109ac868660008181106108d357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906108e891906147eb565b3361097e7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798a8a600081811061092e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061094391906147eb565b8b8b600181811061096457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061097991906147eb565b6135fb565b8560008151811061099f57634e487b7160e01b600052603260045260246000fd5b6020026020010151613708565b6109eb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613880915050565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b0316632e1a7d4d8360018551610a299190614e67565b81518110610a4757634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610a6d91815260200190565b600060405180830381600087803b158015610a8757600080fd5b505af1158015610a9b573d6000803e3d6000fd5b50505050610add848360018551610ab29190614e67565b81518110610ad057634e487b7160e01b600052603260045260246000fd5b60200260200101516131ed565b509695505050505050565b6060610b157f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798484613ac0565b9392505050565b6000806000610b4c7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798f8f6135fb565b9050600087610b5b578c610b5f565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610be757600080fd5b505af1158015610bfb573d6000803e3d6000fd5b50505050610c0e8f8f8f8f8f8f8f612371565b809450819550505050509b509b9950505050505050505050565b60608142811015610c7b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b610cd97f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b9150868260018451610ceb9190614e67565b81518110610d0957634e487b7160e01b600052603260045260246000fd5b60200260200101511015610d855760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b610da9868660008181106108d357634e487b7160e01b600052603260045260246000fd5b610add82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b60608142811015610e3b5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23168686610e72600182614e67565b818110610e8f57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610ea491906147eb565b6001600160a01b031614610efa5760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b610f587f0000000000000000000000005f1d751f447236f486f4268b883782897a90237989888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110610f7c57634e487b7160e01b600052603260045260246000fd5b602002602001015111156108af5760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000806110457f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798d7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b9050600086611054578b611058565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b1580156110e057600080fd5b505af11580156110f4573d6000803e3d6000fd5b505050506111068d8d8d8d8d8d611d6c565b9d9c50505050505050505050505050565b80428110156111685760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6112238585600081811061118c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111a191906147eb565b3361121d7f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b90506020020160208101906111fc91906147eb565b8a8a600181811061096457634e487b7160e01b600052603260045260246000fd5b8a613708565b60008585611232600182614e67565b81811061124f57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061126491906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b1580156112c057600080fd5b505afa1580156112d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f89190614b14565b9050611338868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c95915050565b86818787611347600182614e67565b81811061136457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137991906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a08231906024015b60206040518083038186803b1580156113d657600080fd5b505afa1580156113ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140e9190614b14565b6114189190614e67565b101561148c5760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b5050505050505050565b80428110156114e75760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6001600160a01b037f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316858561151e600182614e67565b81811061153b57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061155091906147eb565b6001600160a01b0316146115a65760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6115ca8585600081811061118c57634e487b7160e01b600052603260045260246000fd5b611608858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c95915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b0316906370a082319060240160206040518083038186803b15801561168357600080fd5b505afa158015611697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116bb9190614b14565b9050868110156117335760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b1580156117ae57600080fd5b505af11580156117c2573d6000803e3d6000fd5b5050505061148c84826131ed565b606081428110156118235760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b03168686600081811061186e57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061188391906147eb565b6001600160a01b0316146118d95760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b6119377f0000000000000000000000005f1d751f447236f486f4268b883782897a9023793488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061341c92505050565b91508682600184516119499190614e67565b8151811061196757634e487b7160e01b600052603260045260246000fd5b602002602001015110156119e35760405162461bcd60e51b815260206004820152602860248201527f52796f736869526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db083600081518110611a3357634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb611af37f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110611b1457634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401611b4d9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015611b6757600080fd5b505af1158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190614aaa565b611bb957634e487b7160e01b600052600160045260246000fd5b611bf882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b5095945050505050565b600061068b848484613fe9565b60608142811015611c625760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611cc07f0000000000000000000000005f1d751f447236f486f4268b883782897a90237989888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91508682600081518110611ce457634e487b7160e01b600052603260045260246000fd5b60200260200101511115610d855760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b600061068b848484614135565b60008142811015611dbf5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b611dee887f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238989893089612371565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350611e8f9150899086906001600160a01b038316906370a082319060240160206040518083038186803b158015611e5257600080fd5b505afa158015611e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8a9190614b14565b61307e565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611f0a57600080fd5b505af1158015611f1e573d6000803e3d6000fd5b50505050610add84836131ed565b8042811015611f7d5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031685856000818110611fc857634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fdd91906147eb565b6001600160a01b0316146120335760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b60003490507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561209357600080fd5b505af11580156120a7573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb6121207f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561218057600080fd5b505af1158015612194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b89190614aaa565b6121d257634e487b7160e01b600052600160045260246000fd5b600086866121e1600182614e67565b8181106121fe57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061221391906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561226f57600080fd5b505afa158015612283573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a79190614b14565b90506122e7878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c95915050565b878188886122f6600182614e67565b81811061231357634e487b7160e01b600052603260045260246000fd5b905060200201602081019061232891906147eb565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024016113be565b60008082428110156123c55760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b60006123f27f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798c8c6135fb565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561245c57600080fd5b505af1158015612470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124949190614aaa565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b1580156124f557600080fd5b505af1158015612509573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252d9190614c82565b91509150600061253d8e8e614243565b509050806001600160a01b03168e6001600160a01b031614612560578183612563565b82825b90975095508a8710156125de5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b898610156126545760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b505050505097509795505050505050565b6060610b157f0000000000000000000000005f1d751f447236f486f4268b883782897a902379848461341c565b60008060006126e27f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798e7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b90506000876126f1578c6126f5565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506127a38e8e8e8e8e8e61053d565b909f909e509c50505050505050505050505050565b6000806000834281101561280e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b61281c8c8c8c8c8c8c614353565b9094509250600061284e7f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798e8e6135fb565b905061285c8d338388613708565b6128688c338387613708565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b1580156128c457600080fd5b505af11580156128d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fc9190614b14565b92505050985098509895505050505050565b600080600083428110156129645760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b6129928a7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae238b348c8c614353565b909450925060006129e47f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798c7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236135fb565b90506129f28b338388613708565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612a4d57600080fd5b505af1158015612a61573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae2316935063a9059cbb92506044019050602060405180830381600087803b158015612aea57600080fd5b505af1158015612afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b229190614aaa565b612b3c57634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612b9857600080fd5b505af1158015612bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd09190614b14565b925083341115612bed57612bed33612be88634614e67565b6131ed565b505096509650969350505050565b60608142811015612c4e5760405162461bcd60e51b815260206004820152601560248201527f52796f736869526f757465723a20455850495245440000000000000000000000604482015260640161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031686866000818110612c9957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612cae91906147eb565b6001600160a01b031614612d045760405162461bcd60e51b815260206004820152601a60248201527f52796f736869526f757465723a20494e56414c49445f50415448000000000000604482015260640161058d565b612d627f0000000000000000000000005f1d751f447236f486f4268b883782897a90237988888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613ac092505050565b91503482600081518110612d8657634e487b7160e01b600052603260045260246000fd5b60200260200101511115612e015760405162461bcd60e51b8152602060048201526024808201527f52796f736869526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e5400000000000000000000000000000000000000000000000000000000606482015260840161058d565b7f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663d0e30db083600081518110612e5157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e8457600080fd5b505af1158015612e98573d6000803e3d6000fd5b50505050507f0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae236001600160a01b031663a9059cbb612f117f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898960008181106111e757634e487b7160e01b600052603260045260246000fd5b84600081518110612f3257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b8152600401612f6b9291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbd9190614aaa565b612fd757634e487b7160e01b600052600160045260246000fd5b61301682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613880915050565b8160008151811061303757634e487b7160e01b600052603260045260246000fd5b6020026020010151341115611bf857611bf8338360008151811061306b57634e487b7160e01b600052603260045260246000fd5b602002602001015134612be89190614e67565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916131089190614d41565b6000604051808303816000865af19150503d8060008114613145576040519150601f19603f3d011682016040523d82523d6000602084013e61314a565b606091505b50915091508180156131745750805115806131745750808060200190518101906131749190614aaa565b6131e65760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c656400000000000000000000000000000000000000606482015260840161058d565b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040516132179190614d41565b60006040518083038185875af1925050503d8060008114613254576040519150601f19603f3d011682016040523d82523d6000602084013e613259565b606091505b50509050806132d05760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c6564000000000000000000000000606482015260840161058d565b505050565b600080841161334c5760405162461bcd60e51b815260206004820152602860248201527f52796f7368694c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e54000000000000000000000000000000000000000000000000606482015260840161058d565b60008311801561335c5750600082115b6133ce5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006133dc856103e5614e48565b905060006133ea8483614e48565b90506000826133fb876103e8614e48565b6134059190614e10565b90506134118183614e28565b979650505050505050565b60606002825110156134705760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff81111561349857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156134c1578160200160208202803683370190505b50905082816000815181106134e657634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600183516135039190614e67565b8110156135f3576000806135728786858151811061353157634e487b7160e01b600052603260045260246000fd5b6020026020010151878660016135479190614e10565b8151811061356557634e487b7160e01b600052603260045260246000fd5b6020026020010151614682565b915091506135a884848151811061359957634e487b7160e01b600052603260045260246000fd5b602002602001015183836132d5565b846135b4856001614e10565b815181106135d257634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806135eb90614ec1565b9150506134f5565b509392505050565b600080600061360a8585614243565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527f347deace88ba101bfe81fb4a9b4306e0a67b3d6d354f8da19b7ed90cee4b7016609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161379a9190614d41565b6000604051808303816000865af19150503d80600081146137d7576040519150601f19603f3d011682016040523d82523d6000602084013e6137dc565b606091505b50915091508180156138065750805115806138065750808060200190518101906138069190614aaa565b6138785760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c6564000000000000000000000000000000606482015260840161058d565b505050505050565b60005b600183516138919190614e67565b811015613aba576000808483815181106138bb57634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138d19190614e10565b815181106138ef57634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006139078383614243565b509050600087613918866001614e10565b8151811061393657634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461396457826000613968565b6000835b91509150600060028a5161397c9190614e67565b881061398857886139e4565b6139e47f0000000000000000000000005f1d751f447236f486f4268b883782897a902379878c6139b98c6002614e10565b815181106139d757634e487b7160e01b600052603260045260246000fd5b60200260200101516135fb565b9050613a117f0000000000000000000000005f1d751f447236f486f4268b883782897a90237988886135fb565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a4e576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a6e9493929190614da1565b600060405180830381600087803b158015613a8857600080fd5b505af1158015613a9c573d6000803e3d6000fd5b50505050505050505050508080613ab290614ec1565b915050613883565b50505050565b6060600282511015613b145760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a20494e56414c49445f504154480000000000604482015260640161058d565b815167ffffffffffffffff811115613b3c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b65578160200160208202803683370190505b509050828160018351613b789190614e67565b81518110613b9657634e487b7160e01b600052603260045260246000fd5b602002602001018181525050600060018351613bb29190614e67565b90505b80156135f357600080613c148786613bce600187614e67565b81518110613bec57634e487b7160e01b600052603260045260246000fd5b602002602001015187868151811061356557634e487b7160e01b600052603260045260246000fd5b91509150613c4a848481518110613c3b57634e487b7160e01b600052603260045260246000fd5b60200260200101518383613fe9565b84613c56600186614e67565b81518110613c7457634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c8d90614eaa565b915050613bb5565b60005b60018351613ca69190614e67565b8110156132d057600080848381518110613cd057634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613ce69190614e10565b81518110613d0457634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613d1c8383614243565b5090506000613d4c7f0000000000000000000000005f1d751f447236f486f4268b883782897a90237985856135fb565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d8d57600080fd5b505afa158015613da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dc59190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613e0d578284613e10565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e7257600080fd5b505afa158015613e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eaa9190614b14565b613eb49190614e67565b9550613ec18683836132d5565b945050505050600080856001600160a01b0316886001600160a01b031614613eeb57826000613eef565b6000835b91509150600060028c51613f039190614e67565b8a10613f0f578a613f40565b613f407f0000000000000000000000005f1d751f447236f486f4268b883782897a902379898e6139b98e6002614e10565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f9b9086908690869060248101614da1565b600060405180830381600087803b158015613fb557600080fd5b505af1158015613fc9573d6000803e3d6000fd5b505050505050505050505050508080613fe190614ec1565b915050613c98565b60008084116140605760405162461bcd60e51b815260206004820152602960248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e540000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156140705750600082115b6140e25760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b60006140ee8585614e48565b6140fa906103e8614e48565b905060006141088685614e67565b614114906103e5614e48565b90506141208183614e28565b61412b906001614e10565b9695505050505050565b60008084116141ac5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e54000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b6000831180156141bc5750600082115b61422e5760405162461bcd60e51b815260206004820152602560248201527f52796f7368694c6962726172793a20494e53554646494349454e545f4c49515560448201527f4944495459000000000000000000000000000000000000000000000000000000606482015260840161058d565b826142398386614e48565b61068b9190614e28565b600080826001600160a01b0316846001600160a01b031614156142ce5760405162461bcd60e51b815260206004820152602260248201527f52796f7368694c6962726172793a204944454e544943414c5f4144445245535360448201527f4553000000000000000000000000000000000000000000000000000000000000606482015260840161058d565b826001600160a01b0316846001600160a01b0316106142ee5782846142f1565b83835b90925090506001600160a01b03821661434c5760405162461bcd60e51b815260206004820152601b60248201527f52796f7368694c6962726172793a205a45524f5f414444524553530000000000604482015260640161058d565b9250929050565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f0000000000000000000000005f1d751f447236f486f4268b883782897a9023799091169063e6a439059060440160206040518083038186803b1580156143de57600080fd5b505afa1580156143f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144169190614807565b6001600160a01b031614156144e3576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f0000000000000000000000005f1d751f447236f486f4268b883782897a902379169063c9c6539690604401602060405180830381600087803b1580156144a957600080fd5b505af11580156144bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e19190614807565b505b6000806145117f0000000000000000000000005f1d751f447236f486f4268b883782897a9023798b8b614682565b91509150816000148015614523575080155b1561453357879350869250614675565b6000614540898484614135565b90508781116145ca57858110156145bf5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b889450925082614673565b60006145d7898486614135565b9050898111156145f757634e487b7160e01b600052600160045260246000fd5b8781101561466d5760405162461bcd60e51b815260206004820152602360248201527f52796f736869526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e540000000000000000000000000000000000000000000000000000000000606482015260840161058d565b94508793505b505b5050965096945050505050565b60008060006146918585614243565b5090506000806146a28888886135fb565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156146da57600080fd5b505afa1580156146ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147129190614ac6565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461475757808261475a565b81815b90999098509650505050505050565b803561477481614f08565b919050565b60008083601f84011261478a578081fd5b50813567ffffffffffffffff8111156147a1578182fd5b6020830191508360208260051b850101111561434c57600080fd5b80516dffffffffffffffffffffffffffff8116811461477457600080fd5b803560ff8116811461477457600080fd5b6000602082840312156147fc578081fd5b8135610b1581614f08565b600060208284031215614818578081fd5b8151610b1581614f08565b600080600080600080600060e0888a03121561483d578283fd5b873561484881614f08565b9650602088013561485881614f08565b955060408801359450606088013593506080880135925060a088013561487d81614f08565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e0312156148b5578384fd5b8b356148c081614f08565b9a5060208c01356148d081614f08565b995060408c0135985060608c0135975060808c0135965060a08c01356148f581614f08565b955060c08c0135945060e08c013561490c81614f20565b935061491b6101008d016147da565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215614959578384fd5b883561496481614f08565b9750602089013561497481614f08565b965060408901359550606089013594506080890135935060a0890135925060c08901356149a081614f08565b8092505060e089013590509295985092959890939650565b60008060008060008060c087890312156149d0578182fd5b86356149db81614f08565b95506020870135945060408701359350606087013592506080870135614a0081614f08565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215614a34578384fd5b8a35614a3f81614f08565b995060208b0135985060408b0135975060608b0135965060808b0135614a6481614f08565b955060a08b0135945060c08b0135614a7b81614f20565b9350614a8960e08c016147da565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614abb578081fd5b8151610b1581614f20565b600080600060608486031215614ada578081fd5b614ae3846147bc565b9250614af1602085016147bc565b9150604084015163ffffffff81168114614b09578182fd5b809150509250925092565b600060208284031215614b25578081fd5b5051919050565b600080600080600060808688031215614b43578283fd5b85359450602086013567ffffffffffffffff811115614b60578384fd5b614b6c88828901614779565b9095509350506040860135614b8081614f08565b949793965091946060013592915050565b60008060408385031215614ba3578182fd5b8235915060208084013567ffffffffffffffff80821115614bc2578384fd5b818601915086601f830112614bd5578384fd5b813581811115614be757614be7614ef2565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614c2a57614c2a614ef2565b604052828152858101935084860182860187018b1015614c48578788fd5b8795505b83861015614c7157614c5d81614769565b855260019590950194938601938601614c4c565b508096505050505050509250929050565b60008060408385031215614c94578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614cbd578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614ce1578485fd5b614ced89828a01614779565b9095509350506060870135614d0181614f08565b80925050608087013590509295509295509295565b600080600060608486031215614d2a578081fd5b505081359360208301359350604090920135919050565b60008251614d53818460208701614e7e565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d9557835183529284019291840191600101614d79565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614ddb8160a0850160208701614e7e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614e2357614e23614edc565b500190565b600082614e4357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e6257614e62614edc565b500290565b600082821015614e7957614e79614edc565b500390565b60005b83811015614e99578181015183820152602001614e81565b83811115613aba5750506000910152565b600081614eb957614eb9614edc565b506000190190565b6000600019821415614ed557614ed5614edc565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614f1d57600080fd5b50565b8015158114614f1d57600080fdfea164736f6c6343000804000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005f1d751f447236f486f4268b883782897a9023790000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Decoded View---------------
Arg [0] : _factory (address): 0x5f1d751f447236f486f4268b883782897a902379
Arg [1] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f1d751f447236f486f4268b883782897a902379
Arg [1] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.