Latest 25 from a total of 56,524 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Token... | 23736768 | 56 mins ago | IN | 0 ETH | 0.00010966 | ||||
| Swap Exact Token... | 23736630 | 1 hr ago | IN | 0 ETH | 0.00013456 | ||||
| Swap Exact Token... | 23736095 | 3 hrs ago | IN | 0 ETH | 0.0001155 | ||||
| Swap Exact Token... | 23735507 | 5 hrs ago | IN | 0 ETH | 0.00126315 | ||||
| Swap Exact Token... | 23734926 | 7 hrs ago | IN | 0 ETH | 0.00016463 | ||||
| Swap Exact Token... | 23734664 | 8 hrs ago | IN | 0 ETH | 0.00022859 | ||||
| Swap Exact Token... | 23734561 | 8 hrs ago | IN | 0 ETH | 0.00008198 | ||||
| Swap Exact Token... | 23734560 | 8 hrs ago | IN | 0 ETH | 0.00089836 | ||||
| Swap Exact Token... | 23734557 | 8 hrs ago | IN | 0 ETH | 0.00024658 | ||||
| Swap Exact Token... | 23733726 | 11 hrs ago | IN | 0 ETH | 0.00034797 | ||||
| Swap Exact Token... | 23733216 | 12 hrs ago | IN | 0 ETH | 0.00130433 | ||||
| Swap Exact Token... | 23733089 | 13 hrs ago | IN | 0 ETH | 0.00132874 | ||||
| Swap Exact Token... | 23732990 | 13 hrs ago | IN | 0 ETH | 0.00129036 | ||||
| Swap Exact Token... | 23732953 | 13 hrs ago | IN | 0 ETH | 0.00127049 | ||||
| Swap Exact Token... | 23732545 | 15 hrs ago | IN | 0 ETH | 0.00126542 | ||||
| Swap Exact Token... | 23732521 | 15 hrs ago | IN | 0 ETH | 0.00015832 | ||||
| Swap Exact Token... | 23732511 | 15 hrs ago | IN | 0 ETH | 0.00013647 | ||||
| Swap Exact Token... | 23732510 | 15 hrs ago | IN | 0 ETH | 0.00014724 | ||||
| Swap Exact Token... | 23732505 | 15 hrs ago | IN | 0 ETH | 0.00072643 | ||||
| Swap Exact Token... | 23731995 | 17 hrs ago | IN | 0 ETH | 0.00010094 | ||||
| Swap Exact Token... | 23731149 | 19 hrs ago | IN | 0 ETH | 0.0000753 | ||||
| Swap Exact Token... | 23730556 | 21 hrs ago | IN | 0 ETH | 0.00128843 | ||||
| Swap Exact Token... | 23730279 | 22 hrs ago | IN | 0 ETH | 0.0002713 | ||||
| Swap Exact Token... | 23730073 | 23 hrs ago | IN | 0 ETH | 0.000834 | ||||
| Swap Exact Token... | 23730032 | 23 hrs ago | IN | 0 ETH | 0.00072245 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23702449 | 4 days ago | 0.00033321 ETH | ||||
| Transfer | 23702449 | 4 days ago | 0.00033321 ETH | ||||
| Transfer | 23623592 | 15 days ago | 1.68899999 ETH | ||||
| Transfer | 23623592 | 15 days ago | 1.68899999 ETH | ||||
| Deposit | 23571587 | 23 days ago | 0.00929999 ETH | ||||
| Deposit | 23565423 | 24 days ago | 0.0002 ETH | ||||
| Deposit | 23555773 | 25 days ago | 0.04656853 ETH | ||||
| Swap Exact ETH F... | 23555773 | 25 days ago | 0.04656853 ETH | ||||
| Transfer | 23519985 | 30 days ago | 0.21185207 ETH | ||||
| Transfer | 23519985 | 30 days ago | 0.21185207 ETH | ||||
| Transfer | 23391854 | 48 days ago | 0.00488563 ETH | ||||
| Transfer | 23391854 | 48 days ago | 0.00488563 ETH | ||||
| Deposit | 23391819 | 48 days ago | 0.00762753 ETH | ||||
| Deposit | 23391809 | 48 days ago | 1.79644405 ETH | ||||
| Transfer | 23158789 | 80 days ago | 0.0403 ETH | ||||
| Transfer | 23158789 | 80 days ago | 0.0403 ETH | ||||
| Deposit | 23139675 | 83 days ago | 0.16734118 ETH | ||||
| Deposit | 23136495 | 83 days ago | 0.04299999 ETH | ||||
| Deposit | 23071049 | 93 days ago | 0.22086553 ETH | ||||
| Transfer | 23035317 | 98 days ago | 0.26403953 ETH | ||||
| Transfer | 23035317 | 98 days ago | 0.26403953 ETH | ||||
| Deposit | 23035142 | 98 days ago | 0.267 ETH | ||||
| Deposit | 23035052 | 98 days ago | 0.0015 ETH | ||||
| Transfer | 23004004 | 102 days ago | 0.00189708 ETH | ||||
| Transfer | 23004004 | 102 days ago | 0.00189708 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxswapRouter
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-08-19
*/
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;
// Sources flattened with hardhat v2.10.1 https://hardhat.org
// File contracts/Fraxswap/core/interfaces/IUniswapV2FactoryV5.sol
interface IUniswapV2FactoryV5 {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function globalPause() external view returns (bool);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function createPair(address tokenA, address tokenB, uint fee) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function toggleGlobalPause() external;
}
// File contracts/Fraxswap/core/interfaces/IUniswapV2PairV5.sol
interface IUniswapV2PairV5 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// File contracts/Fraxswap/core/interfaces/IFraxswapPair.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================= IFraxswapPair ==========================
// ====================================================================
// Fraxswap LP Pair Interface
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
interface IFraxswapPair is IUniswapV2PairV5 {
// TWAMM
event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals);
event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals);
event CancelLongTermOrder(address indexed addr, uint256 orderId, address sellToken, uint256 unsoldAmount, address buyToken, uint256 purchasedAmount);
event WithdrawProceedsFromLongTermOrder(address indexed addr, uint256 orderId, address indexed proceedToken, uint256 proceeds, bool orderExpired);
function fee() external view returns (uint);
function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function cancelLongTermSwap(uint256 orderId) external;
function withdrawProceedsFromLongTermSwap(uint256 orderId) external returns (bool is_expired, address rewardTkn, uint256 totalReward);
function executeVirtualOrders(uint256 blockTimestamp) external;
function getAmountOut(uint amountIn, address tokenIn) external view returns (uint);
function getAmountIn(uint amountOut, address tokenOut) external view returns (uint);
function orderTimeInterval() external returns (uint256);
function getTWAPHistoryLength() external view returns (uint);
function getTwammReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast, uint112 _twammReserve0, uint112 _twammReserve1, uint256 _fee);
function getReserveAfterTwamm(uint256 blockTimestamp) external view returns (uint112 _reserve0, uint112 _reserve1, uint256 lastVirtualOrderTimestamp, uint112 _twammReserve0, uint112 _twammReserve1);
function getNextOrderID() external view returns (uint256);
function getOrderIDsForUser(address user) external view returns (uint256[] memory);
function getOrderIDsForUserLength(address user) external view returns (uint256);
// function getDetailedOrdersForUser(address user, uint256 offset, uint256 limit) external view returns (LongTermOrdersLib.Order[] memory detailed_orders);
function twammUpToDate() external view returns (bool);
function getTwammState() external view returns (uint256 token0Rate, uint256 token1Rate, uint256 lastVirtualOrderTimestamp, uint256 orderTimeInterval_rtn, uint256 rewardFactorPool0, uint256 rewardFactorPool1);
function getTwammSalesRateEnding(uint256 _blockTimestamp) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding);
function getTwammRewardFactor(uint256 _blockTimestamp) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp);
function getTwammOrder(uint256 orderId) external view returns (uint256 id, uint256 creationTimestamp, uint256 expirationTimestamp, uint256 saleRate, address owner, address sellTokenAddr, address buyTokenAddr);
function getTwammOrderProceedsView(uint256 orderId, uint256 blockTimestamp) external view returns (bool orderExpired, uint256 totalReward);
function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward);
function togglePauseNewSwaps() external;
}
// File contracts/Fraxswap/libraries/TransferHelper.sol
// 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 contracts/Fraxswap/periphery/interfaces/IUniswapV2Router01V5.sol
interface IUniswapV2Router01V5 {
function factory() external view returns (address);
function WETH() external view returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router02V5.sol
interface IUniswapV2Router02V5 is IUniswapV2Router01V5 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File contracts/Fraxswap/periphery/libraries/FraxswapRouterLibrary.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ======================= FraxswapRouterLibrary ======================
// ====================================================================
// Fraxswap Router Library Functions
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM
library FraxswapRouterLibrary {
// 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, 'FraxswapRouterLibrary: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'FraxswapRouterLibrary: 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(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'4ce0b4ab368f39e4bd03ec712dfc405eb5a36cdb0294b3887b441cd1c743ced3' // init code / init hash
)))));
}
// fetches and sorts the reserves for a pair
function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IFraxswapPair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function getReservesWithTwamm(address factory, address tokenA, address tokenB) internal returns (uint reserveA, uint reserveB, uint twammReserveA, uint twammReserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
IFraxswapPair pair = IFraxswapPair(pairFor(factory, tokenA, tokenB));
pair.executeVirtualOrders(block.timestamp);
(uint reserve0, uint reserve1,,uint twammReserve0, uint twammReserve1, ) = pair.getTwammReserves();
(reserveA, reserveB, twammReserveA, twammReserveB) = tokenA == token0 ? (reserve0, reserve1, twammReserve0, twammReserve1) : (reserve1, reserve0, twammReserve1, twammReserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'FraxswapRouterLibrary: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'FraxswapRouterLibrary: INSUFFICIENT_LIQUIDITY');
amountB = amountA * reserveB / reserveA;
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
require(pair.twammUpToDate(), 'twamm out of date');
amounts[i + 1] = pair.getAmountOut(amounts[i], path[i]);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
require(pair.twammUpToDate(), 'twamm out of date');
amounts[i - 1] = pair.getAmountIn(amounts[i], path[i - 1]);
}
}
// performs chained getAmountOut calculations on any number of pairs with Twamm
function getAmountsOutWithTwamm(address factory, uint amountIn, address[] memory path) internal returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
pair.executeVirtualOrders(block.timestamp);
amounts[i + 1] = pair.getAmountOut(amounts[i], path[i]);
}
}
// performs chained getAmountIn calculations on any number of pairs with Twamm
function getAmountsInWithTwamm(address factory, uint amountOut, address[] memory path) internal returns (uint[] memory amounts) {
require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
pair.executeVirtualOrders(block.timestamp);
amounts[i - 1] = pair.getAmountIn(amounts[i], path[i - 1]);
}
}
}
// File contracts/Fraxswap/periphery/interfaces/IERC20.sol
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
// File contracts/Fraxswap/periphery/interfaces/IWETH.sol
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
// File contracts/Fraxswap/periphery/FraxswapRouter.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================== FraxswapRouter ==========================
// ====================================================================
// TWAMM Router
// Inspired by https://www.paradigm.xyz/2021/07/twamm
// https://github.com/para-dave/twamm
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// Logic / Algorithm Ideas
// FrankieIsLost: https://github.com/FrankieIsLost
// Reviewer(s) / Contributor(s)
// Travis Moore: https://github.com/FortisFortuna
// Sam Kazemian: https://github.com/samkazemian
// Drake Evans: https://github.com/DrakeEvans
// Jack Corddry: https://github.com/corddry
// Justin Moore: https://github.com/0xJM
contract FraxswapRouter is IUniswapV2Router02V5 {
address public immutable override factory;
address public immutable override WETH;
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'FraxswapV1Router: EXPIRED');
_;
}
constructor(address _factory, address _WETH) public {
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,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin
) internal virtual returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
if (IUniswapV2FactoryV5(factory).getPair(tokenA, tokenB) == address(0)) {
IUniswapV2FactoryV5(factory).createPair(tokenA, tokenB);
}
(uint reserveA, uint reserveB,,) = FraxswapRouterLibrary.getReservesWithTwamm(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = FraxswapRouterLibrary.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = FraxswapRouterLibrary.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IFraxswapPair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value: amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IFraxswapPair(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,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
IFraxswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = IFraxswapPair(pair).burn(to);
(address token0,) = FraxswapRouterLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT');
require(amountB >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT');
}
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint amountToken, uint 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,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountA, uint amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountToken, uint amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) public virtual override ensure(deadline) returns (uint 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,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external virtual override returns (uint amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint value = approveMax ? type(uint).max : liquidity;
IFraxswapPair(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(uint[] memory amounts, address[] memory path, address _to) internal virtual {
for (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FraxswapRouterLibrary.sortTokens(input, output);
uint amountOut = amounts[i + 1];
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)).swap(
amount0Out, amount1Out, to, new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
virtual
override
payable
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, msg.value, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
}
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
virtual
override
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.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(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
virtual
override
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.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(uint amountOut, address[] calldata path, address to, uint deadline)
external
virtual
override
payable
ensure(deadline)
returns (uint[] memory amounts)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= msg.value, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT');
IWETH(WETH).deposit{value: amounts[0]}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.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 (uint i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FraxswapRouterLibrary.sortTokens(input, output);
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output));
uint amountInput;
uint amountOutput;
{ // scope to avoid stack too deep errors
(uint reserveInput, uint reserveOutput, uint twammReserveInput, uint twammReserveOutput) = FraxswapRouterLibrary.getReservesWithTwamm(factory, input, output);
amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput - twammReserveInput;
amountOutput = pair.getAmountOut(amountInput, input);
}
(uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
);
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
)
external
virtual
override
payable
ensure(deadline)
{
require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH');
uint amountIn = msg.value;
IWETH(WETH).deposit{value: amountIn}();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn));
uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
)
external
virtual
override
ensure(deadline)
{
require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH');
TransferHelper.safeTransferFrom(
path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
return FraxswapRouterLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
public
pure
virtual
override
returns (uint amountOut)
{
revert("Deprecated: Use getAmountsOut"); // depends on the fee of the pool
}
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
public
pure
virtual
override
returns (uint amountIn)
{
revert("Deprecated: Use getAmountsIn"); // depends on the fee of the pool
}
function getAmountsOut(uint amountIn, address[] memory path)
public
view
virtual
override
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(uint amountOut, address[] memory path)
public
view
virtual
override
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsIn(factory, amountOut, path);
}
function getAmountsOutWithTwamm(uint amountIn, address[] memory path)
public
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
}
function getAmountsInWithTwamm(uint amountOut, address[] memory path)
public
returns (uint[] memory amounts)
{
return FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsInWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","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":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOutWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","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"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162005f2538038062005f25833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a051615cdd62000248600039600081816101c2015281816103f00152818161061801528181610680015281816107f001528181610ada01528181610f8d0152818161118f015281816116c80152818161181b0152818161195c01528181611a4601528181611c3801528181611cd30152818161209901528181612190015281816122a5015281816123860152818161240701528181612a5901528181612d6201528181612db801528181612dec01528181612eb40152818161305d0152818161324301526132de0152600081816104dc015281816108c301528181610a0501528181610bcd01528181610c0401528181610da3015281816110600152818161116d0152818161134c0152818161162001528181611b2501528181611d1201528181611f0c01528181612212015281816124460152818161271d01528181612a0701528181612a3701528181612c0801528181612d960152818161313c0152818161331d01528181613de601528181613e190152818161457b015281816145b10152818161479301528181614ebd01528181614f9201526150090152615cdd6000f3fe6080604052600436106101a55760003560e01c80638803dbee116100e1578063baa2abde1161008a578063ded9382a11610064578063ded9382a1461051e578063e8e337001461053e578063f305d71914610579578063fb3bdb411461058c57600080fd5b8063baa2abde146104aa578063c45a0155146104ca578063d06ca61f146104fe57600080fd5b8063af2979eb116100bb578063af2979eb14610457578063b66caf0614610477578063b6f9de951461049757600080fd5b80638803dbee146103be578063ad5c4648146103de578063ad615dec1461043757600080fd5b80634a25d94a1161014e578063704c32cf11610128578063704c32cf1461034b578063791ac9471461036b5780637ff36ab51461038b57806385f8c2591461039e57600080fd5b80634a25d94a146102eb5780635b0d59841461030b5780635c11d7951461032b57600080fd5b80631f00ca741161017f5780631f00ca741461028b5780632195995c146102ab57806338ed1739146102cb57600080fd5b806302751cec146101f6578063054d50d41461023057806318cbafe51461025e57600080fd5b366101f1573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101ef576101ef61538b565b005b600080fd5b34801561020257600080fd5b506102166102113660046153ef565b61059f565b604080519283526020830191909152015b60405180910390f35b34801561023c57600080fd5b5061025061024b36600461544d565b610707565b604051908152602001610227565b34801561026a57600080fd5b5061027e6102793660046154be565b61076c565b6040516102279190615531565b34801561029757600080fd5b5061027e6102a63660046155a4565b610bc6565b3480156102b757600080fd5b506102166102c63660046156b2565b610bfa565b3480156102d757600080fd5b5061027e6102e63660046154be565b610d31565b3480156102f757600080fd5b5061027e6103063660046154be565b610f09565b34801561031757600080fd5b5061025061032636600461575c565b611165565b34801561033757600080fd5b506101ef6103463660046154be565b6112b0565b34801561035757600080fd5b5061027e6103663660046155a4565b611619565b34801561037757600080fd5b506101ef6103863660046154be565b611646565b61027e6103993660046157f2565b6119d7565b3480156103aa57600080fd5b506102506103b936600461544d565b611e35565b3480156103ca57600080fd5b5061027e6103d93660046154be565b611e9a565b3480156103ea57600080fd5b506104127f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610227565b34801561044357600080fd5b5061025061045236600461544d565b612011565b34801561046357600080fd5b506102506104723660046153ef565b612026565b34801561048357600080fd5b5061027e6104923660046155a4565b61220b565b6101ef6104a53660046157f2565b612238565b3480156104b657600080fd5b506102166104c5366004615859565b6126a8565b3480156104d657600080fd5b506104127f000000000000000000000000000000000000000000000000000000000000000081565b34801561050a57600080fd5b5061027e6105193660046155a4565b612a00565b34801561052a57600080fd5b5061021661053936600461575c565b612a2d565b34801561054a57600080fd5b5061055e6105593660046158cb565b612b7e565b60408051938452602084019290925290820152606001610227565b61055e6105873660046153ef565b612cec565b61027e61059a3660046157f2565b612fee565b6000808242811015610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b610641897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6126a8565b9093509150610651898685613482565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156106d957600080fd5b505af11580156106ed573d6000803e3d6000fd5b505050506106fb8583613618565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f75740000006044820152600090606401610609565b606081428110156107d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016868661081d600182615976565b81811061082c5761082c61598d565b905060200201602081019061084191906159bc565b73ffffffffffffffffffffffffffffffffffffffff16146108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b61091c7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b915086826001845161092e9190615976565b8151811061093e5761093e61598d565b602002602001015110156109d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610a99868660008181106109ea576109ea61598d565b90506020020160208101906109ff91906159bc565b33610a797f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610a3757610a3761598d565b9050602002016020810190610a4c91906159bc565b8b8b6001818110610a5f57610a5f61598d565b9050602002016020810190610a7491906159bc565b613a15565b85600081518110610a8c57610a8c61598d565b6020026020010151613b4a565b610ad882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ce9915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610b239190615976565b81518110610b3357610b3361598d565b60200260200101516040518263ffffffff1660e01b8152600401610b5991815260200190565b600060405180830381600087803b158015610b7357600080fd5b505af1158015610b87573d6000803e3d6000fd5b50505050610bbb848360018551610b9e9190615976565b81518110610bae57610bae61598d565b6020026020010151613618565b509695505050505050565b6060610bf37f00000000000000000000000000000000000000000000000000000000000000008484613efb565b9392505050565b6000806000610c2a7f00000000000000000000000000000000000000000000000000000000000000008f8f613a15565b9050600087610c39578c610c5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b50505050610d178f8f8f8f8f8f8f6126a8565b809450819550505050509b509b9950505050505050505050565b60608142811015610d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b610dfc7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b9150868260018451610e0e9190615976565b81518110610e1e57610e1e61598d565b60200260200101511015610eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610eca868660008181106109ea576109ea61598d565b610bbb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b60608142811015610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168686610fba600182615976565b818110610fc957610fc961598d565b9050602002016020810190610fde91906159bc565b73ffffffffffffffffffffffffffffffffffffffff161461105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6110b97f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b915086826000815181106110cf576110cf61598d565b602002602001015111156109d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b6000806111b37f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613a15565b90506000866111c2578b6111e4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b15801561127957600080fd5b505af115801561128d573d6000803e3d6000fd5b5050505061129f8d8d8d8d8d8d612026565b9d9c50505050505050505050505050565b804281101561131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b6113ac858560008181106113315761133161598d565b905060200201602081019061134691906159bc565b336113a67f00000000000000000000000000000000000000000000000000000000000000008989600081811061137e5761137e61598d565b905060200201602081019061139391906159bc565b8a8a6001818110610a5f57610a5f61598d565b8a613b4a565b600085856113bb600182615976565b8181106113ca576113ca61598d565b90506020020160208101906113df91906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa15801561144d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147191906159d9565b90506114b1868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250614506915050565b868187876114c0600182615976565b8181106114cf576114cf61598d565b90506020020160208101906114e491906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157791906159d9565b6115819190615976565b101561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b5050505050505050565b6060610bf37f00000000000000000000000000000000000000000000000000000000000000008484613727565b80428110156116b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685856116f5600182615976565b8181106117045761170461598d565b905060200201602081019061171991906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6117ac858560008181106113315761133161598d565b6117ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614506915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b91906159d9565b90508681101561192d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156119b557600080fd5b505af11580156119c9573d6000803e3d6000fd5b5050505061160f8482613618565b60608142811015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110611a8e57611a8e61598d565b9050602002016020810190611aa391906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614611b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b611b7e7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b9150868260018451611b909190615976565b81518110611ba057611ba061598d565b60200260200101511015611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611c8557611c8561598d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d447f00000000000000000000000000000000000000000000000000000000000000008989600081811061137e5761137e61598d565b84600081518110611d5757611d5761598d565b60200260200101516040518363ffffffff1660e01b8152600401611d9d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de091906159f2565b611dec57611dec61538b565b611e2b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e000000006044820152600090606401610609565b60608142811015611f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b611f657f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b91508682600081518110611f7b57611f7b61598d565b60200260200101511115610eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b600061201e848484614875565b949350505050565b60008142811015612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b6120c2887f000000000000000000000000000000000000000000000000000000000000000089898930896126a8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061216191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215c91906159d9565b613482565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156121e957600080fd5b505af11580156121fd573d6000803e3d6000fd5b50505050610bbb8483613618565b6060610bf37f00000000000000000000000000000000000000000000000000000000000000008484614240565b80428110156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106122ed576122ed61598d565b905060200201602081019061230291906159bc565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124787f00000000000000000000000000000000000000000000000000000000000000008989600081811061137e5761137e61598d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af11580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e91906159f2565b61251a5761251a61538b565b60008686612529600182615976565b8181106125385761253861598d565b905060200201602081019061254d91906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df91906159d9565b905061261f878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614506915050565b8781888861262e600182615976565b81811061263d5761263d61598d565b905060200201602081019061265291906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a0823190602401611536565b6000808242811015612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b60006127437f00000000000000000000000000000000000000000000000000000000000000008c8c613a15565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156127bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e391906159f2565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615a0f565b91509150600061288a8e8e6149b7565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146128c75781836128ca565b82825b90975095508a87101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b898610156129ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b505050505097509795505050505050565b6060610bf37f00000000000000000000000000000000000000000000000000000000000000008484614b61565b6000806000612a7d7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613a15565b9050600087612a8c578c612aae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612b4357600080fd5b505af1158015612b57573d6000803e3d6000fd5b50505050612b698e8e8e8e8e8e61059f565b909f909e509c50505050505050505050505050565b60008060008342811015612bee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612bfc8c8c8c8c8c8c614e69565b90945092506000612c2e7f00000000000000000000000000000000000000000000000000000000000000008e8e613a15565b9050612c3c8d338388613b4a565b612c488c338387613b4a565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cda91906159d9565b92505050985098509895505050505050565b60008060008342811015612d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612d8a8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614e69565b90945092506000612ddc7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613a15565b9050612dea8b338388613b4a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2591906159f2565b612f3157612f3161538b565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906159d9565b925083341115612fe057612fe033612fdb8634615976565b613618565b505096509650969350505050565b6060814281101561305b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106130a5576130a561598d565b90506020020160208101906130ba91906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614613137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6131957f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b915034826000815181106131ab576131ab61598d565b60200260200101511115613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106132905761329061598d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156132c357600080fd5b505af11580156132d7573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61334f7f00000000000000000000000000000000000000000000000000000000000000008989600081811061137e5761137e61598d565b846000815181106133625761336261598d565b60200260200101516040518363ffffffff1660e01b81526004016133a892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156133c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133eb91906159f2565b6133f7576133f761538b565b61343682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b816000815181106134495761344961598d565b6020026020010151341115611e2b57611e2b338360008151811061346f5761346f61598d565b602002602001015134612fdb9190615976565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135199190615a5f565b6000604051808303816000865af19150503d8060008114613556576040519150601f19603f3d011682016040523d82523d6000602084013e61355b565b606091505b509150915081801561358557508051158061358557508080602001905181019061358591906159f2565b613611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610609565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161364f9190615a5f565b60006040518083038185875af1925050503d806000811461368c576040519150601f19603f3d011682016040523d82523d6000602084013e613691565b606091505b5050905080613722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610609565b505050565b60606002825110156137bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156137d5576137d5615575565b6040519080825280602002602001820160405280156137fe578160200160208202803683370190505b50905082816000815181106138155761381561598d565b60200260200101818152505060005b600183516138329190615976565b811015613a0d576000613884868584815181106138515761385161598d565b6020026020010151868560016138679190615a7b565b815181106138775761387761598d565b6020026020010151613a15565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156138ee57600080fd5b505af1158015613902573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a8484815181106139345761393461598d565b602002602001015186858151811061394e5761394e61598d565b60200260200101516040518363ffffffff1660e01b815260040161399292919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d391906159d9565b836139df846001615a7b565b815181106139ef576139ef61598d565b60209081029190910101525080613a0581615a93565b915050613824565b509392505050565b6000806000613a2485856149b7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001613b0a9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f4ce0b4ab368f39e4bd03ec712dfc405eb5a36cdb0294b3887b441cd1c743ced3603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613be99190615a5f565b6000604051808303816000865af19150503d8060008114613c26576040519150601f19603f3d011682016040523d82523d6000602084013e613c2b565b606091505b5091509150818015613c55575080511580613c55575080806020019051810190613c5591906159f2565b613ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610609565b505050505050565b60005b60018351613cfa9190615976565b811015613ef557600080848381518110613d1657613d1661598d565b602002602001015185846001613d2c9190615a7b565b81518110613d3c57613d3c61598d565b6020026020010151915091506000613d5483836149b7565b509050600087613d65866001615a7b565b81518110613d7557613d7561598d565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613dbd57826000613dc1565b6000835b91509150600060028a51613dd59190615976565b8810613de15788613e12565b613e127f0000000000000000000000000000000000000000000000000000000000000000878c6138678c6002615a7b565b9050613e3f7f00000000000000000000000000000000000000000000000000000000000000008888613a15565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e89576020820181803683370190505b506040518563ffffffff1660e01b8152600401613ea99493929190615acb565b600060405180830381600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b50505050505050505050508080613eed90615a93565b915050613cec565b50505050565b6060600282511015613f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff811115613fa957613fa9615575565b604051908082528060200260200182016040528015613fd2578160200160208202803683370190505b509050828160018351613fe59190615976565b81518110613ff557613ff561598d565b6020026020010181815250506000600183516140119190615976565b90505b8015613a0d576000614056868561402c600186615976565b8151811061403c5761403c61598d565b60200260200101518685815181106138775761387761598d565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c791906159f2565b61412d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b8073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061415b5761415b61598d565b6020026020010151866001866141719190615976565b815181106141815761418161598d565b60200260200101516040518363ffffffff1660e01b81526004016141c592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156141e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420691906159d9565b83614212600185615976565b815181106142225761422261598d565b6020908102919091010152508061423881615b47565b915050614014565b60606002825110156142d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156142ee576142ee615575565b604051908082528060200260200182016040528015614317578160200160208202803683370190505b50905082816001835161432a9190615976565b8151811061433a5761433a61598d565b6020026020010181815250506000600183516143569190615976565b90505b8015613a0d576000614371868561402c600186615976565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156143db57600080fd5b505af11580156143ef573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631125f13f8484815181106144215761442161598d565b6020026020010151866001866144379190615976565b815181106144475761444761598d565b60200260200101516040518363ffffffff1660e01b815260040161448b92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156144a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144cc91906159d9565b836144d8600185615976565b815181106144e8576144e861598d565b602090810291909101015250806144fe81615b47565b915050614359565b60005b600183516145179190615976565b811015613722576000808483815181106145335761453361598d565b6020026020010151858460016145499190615a7b565b815181106145595761455961598d565b602002602001015191509150600061457183836149b7565b50905060006145a17f00000000000000000000000000000000000000000000000000000000000000008585613a15565b90506000806000806000806145d77f00000000000000000000000000000000000000000000000000000000000000008b8b6151c8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa158015614653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467791906159d9565b6146819190615976565b61468b9190615976565b6040517ff140a35a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8c811660248301529197509088169063f140a35a90604401602060405180830381865afa158015614702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472691906159d9565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461476a5782600061476e565b6000835b91509150600060028c516147829190615976565b8a1061478e578a6147bf565b6147bf7f0000000000000000000000000000000000000000000000000000000000000000898e6138678e6002615a7b565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906148279086908690869060248101615acb565b600060405180830381600087803b15801561484157600080fd5b505af1158015614855573d6000803e3d6000fd5b50505050505050505050505050808061486d90615a93565b915050614509565b6000808411614906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610609565b6000831180156149165750600082115b6149a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610609565b826149ad8386615b7c565b61201e9190615bb9565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603614a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610609565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614aaf578284614ab2565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610609565b9250929050565b6060600282511015614bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff811115614c0f57614c0f615575565b604051908082528060200260200182016040528015614c38578160200160208202803683370190505b5090508281600081518110614c4f57614c4f61598d565b60200260200101818152505060005b60018351614c6c9190615976565b811015613a0d576000614c8b868584815181106138515761385161598d565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cfc91906159f2565b614d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b8073ffffffffffffffffffffffffffffffffffffffff1663f140a35a848481518110614d9057614d9061598d565b6020026020010151868581518110614daa57614daa61598d565b60200260200101516040518363ffffffff1660e01b8152600401614dee92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015614e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e2f91906159d9565b83614e3b846001615a7b565b81518110614e4b57614e4b61598d565b60209081029190910101525080614e6181615a93565b915050614c5e565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015614f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2a9190615bf4565b73ffffffffffffffffffffffffffffffffffffffff1603615001576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fff9190615bf4565b505b60008061502f7f00000000000000000000000000000000000000000000000000000000000000008b8b6151c8565b505091509150816000148015615043575080155b15615053578793508692506151bb565b6000615060898484614875565b905087811161510457858110156150f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b8894509250826151b9565b6000615111898486614875565b9050898111156151235761512361538b565b878110156151b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b94508793505b505b5050965096945050505050565b60008060008060006151da87876149b7565b50905060006151ea898989613a15565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561525457600080fd5b505af1158015615268573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156152bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152e19190615c2f565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614615367578284828461536c565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146153dc57600080fd5b50565b80356153ea816153ba565b919050565b60008060008060008060c0878903121561540857600080fd5b8635615413816153ba565b95506020870135945060408701359350606087013592506080870135615438816153ba565b8092505060a087013590509295509295509295565b60008060006060848603121561546257600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261548b57600080fd5b50813567ffffffffffffffff8111156154a357600080fd5b6020830191508360208260051b8501011115614b5a57600080fd5b60008060008060008060a087890312156154d757600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156154fc57600080fd5b61550889828a01615479565b909550935050606087013561551c816153ba565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156155695783518352928401929184019160010161554d565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156155b757600080fd5b8235915060208084013567ffffffffffffffff808211156155d757600080fd5b818601915086601f8301126155eb57600080fd5b8135818111156155fd576155fd615575565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561564057615640615575565b60405291825284820192508381018501918983111561565e57600080fd5b938501935b8285101561568357615674856153df565b84529385019392850192615663565b8096505050505050509250929050565b80151581146153dc57600080fd5b803560ff811681146153ea57600080fd5b60008060008060008060008060008060006101608c8e0312156156d457600080fd5b8b356156df816153ba565b9a5060208c01356156ef816153ba565b995060408c0135985060608c0135975060808c0135965060a08c0135615714816153ba565b955060c08c0135945060e08c013561572b81615693565b935061573a6101008d016156a1565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d03121561577c57600080fd5b8a35615787816153ba565b995060208b0135985060408b0135975060608b0135965060808b01356157ac816153ba565b955060a08b0135945060c08b01356157c381615693565b93506157d160e08c016156a1565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561580a57600080fd5b85359450602086013567ffffffffffffffff81111561582857600080fd5b61583488828901615479565b9095509350506040860135615848816153ba565b949793965091946060013592915050565b600080600080600080600060e0888a03121561587457600080fd5b873561587f816153ba565b9650602088013561588f816153ba565b955060408801359450606088013593506080880135925060a08801356158b4816153ba565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156158e857600080fd5b88356158f3816153ba565b97506020890135615903816153ba565b965060408901359550606089013594506080890135935060a0890135925060c089013561592f816153ba565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561598857615988615947565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156159ce57600080fd5b8135610bf3816153ba565b6000602082840312156159eb57600080fd5b5051919050565b600060208284031215615a0457600080fd5b8151610bf381615693565b60008060408385031215615a2257600080fd5b505080516020909101519092909150565b60005b83811015615a4e578181015183820152602001615a36565b83811115613ef55750506000910152565b60008251615a71818460208701615a33565b9190910192915050565b60008219821115615a8e57615a8e615947565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615ac457615ac4615947565b5060010190565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff831660408201526080606082015260008251806080840152615b128160a0850160208701615a33565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b600081615b5657615b56615947565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615bb457615bb4615947565b500290565b600082615bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615c0657600080fd5b8151610bf3816153ba565b80516dffffffffffffffffffffffffffff811681146153ea57600080fd5b60008060008060008060c08789031215615c4857600080fd5b615c5187615c11565b9550615c5f60208801615c11565b9450604087015163ffffffff81168114615c7857600080fd5b9350615c8660608801615c11565b9250615c9460808801615c11565b915060a08701519050929550929550929556fea26469706673582212207a375ad13797da9ba0e826e4624fa693dbc00bccb223e40756b2c0729342a00364736f6c634300080f003300000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101a55760003560e01c80638803dbee116100e1578063baa2abde1161008a578063ded9382a11610064578063ded9382a1461051e578063e8e337001461053e578063f305d71914610579578063fb3bdb411461058c57600080fd5b8063baa2abde146104aa578063c45a0155146104ca578063d06ca61f146104fe57600080fd5b8063af2979eb116100bb578063af2979eb14610457578063b66caf0614610477578063b6f9de951461049757600080fd5b80638803dbee146103be578063ad5c4648146103de578063ad615dec1461043757600080fd5b80634a25d94a1161014e578063704c32cf11610128578063704c32cf1461034b578063791ac9471461036b5780637ff36ab51461038b57806385f8c2591461039e57600080fd5b80634a25d94a146102eb5780635b0d59841461030b5780635c11d7951461032b57600080fd5b80631f00ca741161017f5780631f00ca741461028b5780632195995c146102ab57806338ed1739146102cb57600080fd5b806302751cec146101f6578063054d50d41461023057806318cbafe51461025e57600080fd5b366101f1573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101ef576101ef61538b565b005b600080fd5b34801561020257600080fd5b506102166102113660046153ef565b61059f565b604080519283526020830191909152015b60405180910390f35b34801561023c57600080fd5b5061025061024b36600461544d565b610707565b604051908152602001610227565b34801561026a57600080fd5b5061027e6102793660046154be565b61076c565b6040516102279190615531565b34801561029757600080fd5b5061027e6102a63660046155a4565b610bc6565b3480156102b757600080fd5b506102166102c63660046156b2565b610bfa565b3480156102d757600080fd5b5061027e6102e63660046154be565b610d31565b3480156102f757600080fd5b5061027e6103063660046154be565b610f09565b34801561031757600080fd5b5061025061032636600461575c565b611165565b34801561033757600080fd5b506101ef6103463660046154be565b6112b0565b34801561035757600080fd5b5061027e6103663660046155a4565b611619565b34801561037757600080fd5b506101ef6103863660046154be565b611646565b61027e6103993660046157f2565b6119d7565b3480156103aa57600080fd5b506102506103b936600461544d565b611e35565b3480156103ca57600080fd5b5061027e6103d93660046154be565b611e9a565b3480156103ea57600080fd5b506104127f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610227565b34801561044357600080fd5b5061025061045236600461544d565b612011565b34801561046357600080fd5b506102506104723660046153ef565b612026565b34801561048357600080fd5b5061027e6104923660046155a4565b61220b565b6101ef6104a53660046157f2565b612238565b3480156104b657600080fd5b506102166104c5366004615859565b6126a8565b3480156104d657600080fd5b506104127f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f81565b34801561050a57600080fd5b5061027e6105193660046155a4565b612a00565b34801561052a57600080fd5b5061021661053936600461575c565b612a2d565b34801561054a57600080fd5b5061055e6105593660046158cb565b612b7e565b60408051938452602084019290925290820152606001610227565b61055e6105873660046153ef565b612cec565b61027e61059a3660046157f2565b612fee565b6000808242811015610612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b610641897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a6126a8565b9093509150610651898685613482565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156106d957600080fd5b505af11580156106ed573d6000803e3d6000fd5b505050506106fb8583613618565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f75740000006044820152600090606401610609565b606081428110156107d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216868661081d600182615976565b81811061082c5761082c61598d565b905060200201602081019061084191906159bc565b73ffffffffffffffffffffffffffffffffffffffff16146108be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b61091c7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b915086826001845161092e9190615976565b8151811061093e5761093e61598d565b602002602001015110156109d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610a99868660008181106109ea576109ea61598d565b90506020020160208101906109ff91906159bc565b33610a797f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8a8a6000818110610a3757610a3761598d565b9050602002016020810190610a4c91906159bc565b8b8b6001818110610a5f57610a5f61598d565b9050602002016020810190610a7491906159bc565b613a15565b85600081518110610a8c57610a8c61598d565b6020026020010151613b4a565b610ad882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ce9915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610b239190615976565b81518110610b3357610b3361598d565b60200260200101516040518263ffffffff1660e01b8152600401610b5991815260200190565b600060405180830381600087803b158015610b7357600080fd5b505af1158015610b87573d6000803e3d6000fd5b50505050610bbb848360018551610b9e9190615976565b81518110610bae57610bae61598d565b6020026020010151613618565b509695505050505050565b6060610bf37f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8484613efb565b9392505050565b6000806000610c2a7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8f8f613a15565b9050600087610c39578c610c5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610cf057600080fd5b505af1158015610d04573d6000803e3d6000fd5b50505050610d178f8f8f8f8f8f8f6126a8565b809450819550505050509b509b9950505050505050505050565b60608142811015610d9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b610dfc7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b9150868260018451610e0e9190615976565b81518110610e1e57610e1e61598d565b60200260200101511015610eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b610eca868660008181106109ea576109ea61598d565b610bbb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b60608142811015610f76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686610fba600182615976565b818110610fc957610fc961598d565b9050602002016020810190610fde91906159bc565b73ffffffffffffffffffffffffffffffffffffffff161461105b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6110b97f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b915086826000815181106110cf576110cf61598d565b602002602001015111156109d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b6000806111b37f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613a15565b90506000866111c2578b6111e4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b15801561127957600080fd5b505af115801561128d573d6000803e3d6000fd5b5050505061129f8d8d8d8d8d8d612026565b9d9c50505050505050505050505050565b804281101561131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b6113ac858560008181106113315761133161598d565b905060200201602081019061134691906159bc565b336113a67f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8989600081811061137e5761137e61598d565b905060200201602081019061139391906159bc565b8a8a6001818110610a5f57610a5f61598d565b8a613b4a565b600085856113bb600182615976565b8181106113ca576113ca61598d565b90506020020160208101906113df91906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa15801561144d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147191906159d9565b90506114b1868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250614506915050565b868187876114c0600182615976565b8181106114cf576114cf61598d565b90506020020160208101906114e491906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa158015611553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157791906159d9565b6115819190615976565b101561160f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b5050505050505050565b6060610bf37f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8484613727565b80428110156116b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856116f5600182615976565b8181106117045761170461598d565b905060200201602081019061171991906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6117ac858560008181106113315761133161598d565b6117ea858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614506915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b91906159d9565b90508681101561192d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156119b557600080fd5b505af11580156119c9573d6000803e3d6000fd5b5050505061160f8482613618565b60608142811015611a44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1686866000818110611a8e57611a8e61598d565b9050602002016020810190611aa391906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614611b20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b611b7e7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f3488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061372792505050565b9150868260018451611b909190615976565b81518110611ba057611ba061598d565b60200260200101511015611c36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611c8557611c8561598d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611cb857600080fd5b505af1158015611ccc573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d447f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8989600081811061137e5761137e61598d565b84600081518110611d5757611d5761598d565b60200260200101516040518363ffffffff1660e01b8152600401611d9d92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de091906159f2565b611dec57611dec61538b565b611e2b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e000000006044820152600090606401610609565b60608142811015611f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b611f657f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b91508682600081518110611f7b57611f7b61598d565b60200260200101511115610eb4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b600061201e848484614875565b949350505050565b60008142811015612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b6120c2887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898930896126a8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290935061216191508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215c91906159d9565b613482565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b1580156121e957600080fd5b505af11580156121fd573d6000803e3d6000fd5b50505050610bbb8483613618565b6060610bf37f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8484614240565b80428110156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16858560008181106122ed576122ed61598d565b905060200201602081019061230291906159bc565b73ffffffffffffffffffffffffffffffffffffffff161461237f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156123ec57600080fd5b505af1158015612400573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124787f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8989600081811061137e5761137e61598d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af11580156124ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250e91906159f2565b61251a5761251a61538b565b60008686612529600182615976565b8181106125385761253861598d565b905060200201602081019061254d91906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa1580156125bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125df91906159d9565b905061261f878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614506915050565b8781888861262e600182615976565b81811061263d5761263d61598d565b905060200201602081019061265291906159bc565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a0823190602401611536565b6000808242811015612716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b60006127437f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8c8c613a15565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af11580156127bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e391906159f2565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af1158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190615a0f565b91509150600061288a8e8e6149b7565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146128c75781836128ca565b82825b90975095508a87101561295f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b898610156129ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b505050505097509795505050505050565b6060610bf37f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8484614b61565b6000806000612a7d7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613a15565b9050600087612a8c578c612aae565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612b4357600080fd5b505af1158015612b57573d6000803e3d6000fd5b50505050612b698e8e8e8e8e8e61059f565b909f909e509c50505050505050505050505050565b60008060008342811015612bee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612bfc8c8c8c8c8c8c614e69565b90945092506000612c2e7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8e8e613a15565b9050612c3c8d338388613b4a565b612c488c338387613b4a565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612cb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cda91906159d9565b92505050985098509895505050505050565b60008060008342811015612d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b612d8a8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c614e69565b90945092506000612ddc7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613a15565b9050612dea8b338388613b4a565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e5257600080fd5b505af1158015612e66573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb925060440190506020604051808303816000875af1158015612f01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2591906159f2565b612f3157612f3161538b565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc391906159d9565b925083341115612fe057612fe033612fdb8634615976565b613618565b505096509650969350505050565b6060814281101561305b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610609565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16868660008181106130a5576130a561598d565b90506020020160208101906130ba91906159bc565b73ffffffffffffffffffffffffffffffffffffffff1614613137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610609565b6131957f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061424092505050565b915034826000815181106131ab576131ab61598d565b60200260200101511115613241576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610609565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106132905761329061598d565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156132c357600080fd5b505af11580156132d7573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61334f7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8989600081811061137e5761137e61598d565b846000815181106133625761336261598d565b60200260200101516040518363ffffffff1660e01b81526004016133a892919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af11580156133c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133eb91906159f2565b6133f7576133f761538b565b61343682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613ce9915050565b816000815181106134495761344961598d565b6020026020010151341115611e2b57611e2b338360008151811061346f5761346f61598d565b602002602001015134612fdb9190615976565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135199190615a5f565b6000604051808303816000865af19150503d8060008114613556576040519150601f19603f3d011682016040523d82523d6000602084013e61355b565b606091505b509150915081801561358557508051158061358557508080602001905181019061358591906159f2565b613611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610609565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff841690839060405161364f9190615a5f565b60006040518083038185875af1925050503d806000811461368c576040519150601f19603f3d011682016040523d82523d6000602084013e613691565b606091505b5050905080613722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610609565b505050565b60606002825110156137bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156137d5576137d5615575565b6040519080825280602002602001820160405280156137fe578160200160208202803683370190505b50905082816000815181106138155761381561598d565b60200260200101818152505060005b600183516138329190615976565b811015613a0d576000613884868584815181106138515761385161598d565b6020026020010151868560016138679190615a7b565b815181106138775761387761598d565b6020026020010151613a15565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156138ee57600080fd5b505af1158015613902573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a8484815181106139345761393461598d565b602002602001015186858151811061394e5761394e61598d565b60200260200101516040518363ffffffff1660e01b815260040161399292919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d391906159d9565b836139df846001615a7b565b815181106139ef576139ef61598d565b60209081029190910101525080613a0581615a93565b915050613824565b509392505050565b6000806000613a2485856149b7565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b1660348201529193509150869060480160405160208183030381529060405280519060200120604051602001613b0a9291907fff00000000000000000000000000000000000000000000000000000000000000815260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016600183015260158201527f4ce0b4ab368f39e4bd03ec712dfc405eb5a36cdb0294b3887b441cd1c743ced3603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613be99190615a5f565b6000604051808303816000865af19150503d8060008114613c26576040519150601f19603f3d011682016040523d82523d6000602084013e613c2b565b606091505b5091509150818015613c55575080511580613c55575080806020019051810190613c5591906159f2565b613ce1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610609565b505050505050565b60005b60018351613cfa9190615976565b811015613ef557600080848381518110613d1657613d1661598d565b602002602001015185846001613d2c9190615a7b565b81518110613d3c57613d3c61598d565b6020026020010151915091506000613d5483836149b7565b509050600087613d65866001615a7b565b81518110613d7557613d7561598d565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613dbd57826000613dc1565b6000835b91509150600060028a51613dd59190615976565b8810613de15788613e12565b613e127f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f878c6138678c6002615a7b565b9050613e3f7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8888613a15565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e89576020820181803683370190505b506040518563ffffffff1660e01b8152600401613ea99493929190615acb565b600060405180830381600087803b158015613ec357600080fd5b505af1158015613ed7573d6000803e3d6000fd5b50505050505050505050508080613eed90615a93565b915050613cec565b50505050565b6060600282511015613f8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff811115613fa957613fa9615575565b604051908082528060200260200182016040528015613fd2578160200160208202803683370190505b509050828160018351613fe59190615976565b81518110613ff557613ff561598d565b6020026020010181815250506000600183516140119190615976565b90505b8015613a0d576000614056868561402c600186615976565b8151811061403c5761403c61598d565b60200260200101518685815181106138775761387761598d565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140c791906159f2565b61412d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b8073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061415b5761415b61598d565b6020026020010151866001866141719190615976565b815181106141815761418161598d565b60200260200101516040518363ffffffff1660e01b81526004016141c592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156141e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420691906159d9565b83614212600185615976565b815181106142225761422261598d565b6020908102919091010152508061423881615b47565b915050614014565b60606002825110156142d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff8111156142ee576142ee615575565b604051908082528060200260200182016040528015614317578160200160208202803683370190505b50905082816001835161432a9190615976565b8151811061433a5761433a61598d565b6020026020010181815250506000600183516143569190615976565b90505b8015613a0d576000614371868561402c600186615976565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156143db57600080fd5b505af11580156143ef573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631125f13f8484815181106144215761442161598d565b6020026020010151866001866144379190615976565b815181106144475761444761598d565b60200260200101516040518363ffffffff1660e01b815260040161448b92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156144a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144cc91906159d9565b836144d8600185615976565b815181106144e8576144e861598d565b602090810291909101015250806144fe81615b47565b915050614359565b60005b600183516145179190615976565b811015613722576000808483815181106145335761453361598d565b6020026020010151858460016145499190615a7b565b815181106145595761455961598d565b602002602001015191509150600061457183836149b7565b50905060006145a17f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8585613a15565b90506000806000806000806145d77f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8b8b6151c8565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa158015614653573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061467791906159d9565b6146819190615976565b61468b9190615976565b6040517ff140a35a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8c811660248301529197509088169063f140a35a90604401602060405180830381865afa158015614702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061472691906159d9565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461476a5782600061476e565b6000835b91509150600060028c516147829190615976565b8a1061478e578a6147bf565b6147bf7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f898e6138678e6002615a7b565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906148279086908690869060248101615acb565b600060405180830381600087803b15801561484157600080fd5b505af1158015614855573d6000803e3d6000fd5b50505050505050505050505050808061486d90615a93565b915050614509565b6000808411614906576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610609565b6000831180156149165750600082115b6149a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610609565b826149ad8386615b7c565b61201e9190615bb9565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603614a75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610609565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614aaf578284614ab2565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614b5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610609565b9250929050565b6060600282511015614bf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610609565b815167ffffffffffffffff811115614c0f57614c0f615575565b604051908082528060200260200182016040528015614c38578160200160208202803683370190505b5090508281600081518110614c4f57614c4f61598d565b60200260200101818152505060005b60018351614c6c9190615976565b811015613a0d576000614c8b868584815181106138515761385161598d565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614cfc91906159f2565b614d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610609565b8073ffffffffffffffffffffffffffffffffffffffff1663f140a35a848481518110614d9057614d9061598d565b6020026020010151868581518110614daa57614daa61598d565b60200260200101516040518363ffffffff1660e01b8152600401614dee92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015614e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e2f91906159d9565b83614e3b846001615a7b565b81518110614e4b57614e4b61598d565b60209081029190910101525080614e6181615a93565b915050614c5e565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f9091169063e6a4390590604401602060405180830381865afa158015614f06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f2a9190615bf4565b73ffffffffffffffffffffffffffffffffffffffff1603615001576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f169063c9c65396906044016020604051808303816000875af1158015614fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fff9190615bf4565b505b60008061502f7f00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f8b8b6151c8565b505091509150816000148015615043575080155b15615053578793508692506151bb565b6000615060898484614875565b905087811161510457858110156150f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b8894509250826151b9565b6000615111898486614875565b9050898111156151235761512361538b565b878110156151b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610609565b94508793505b505b5050965096945050505050565b60008060008060006151da87876149b7565b50905060006151ea898989613a15565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561525457600080fd5b505af1158015615268573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156152bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152e19190615c2f565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff1614615367578284828461536c565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146153dc57600080fd5b50565b80356153ea816153ba565b919050565b60008060008060008060c0878903121561540857600080fd5b8635615413816153ba565b95506020870135945060408701359350606087013592506080870135615438816153ba565b8092505060a087013590509295509295509295565b60008060006060848603121561546257600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261548b57600080fd5b50813567ffffffffffffffff8111156154a357600080fd5b6020830191508360208260051b8501011115614b5a57600080fd5b60008060008060008060a087890312156154d757600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156154fc57600080fd5b61550889828a01615479565b909550935050606087013561551c816153ba565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b818110156155695783518352928401929184019160010161554d565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156155b757600080fd5b8235915060208084013567ffffffffffffffff808211156155d757600080fd5b818601915086601f8301126155eb57600080fd5b8135818111156155fd576155fd615575565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561564057615640615575565b60405291825284820192508381018501918983111561565e57600080fd5b938501935b8285101561568357615674856153df565b84529385019392850192615663565b8096505050505050509250929050565b80151581146153dc57600080fd5b803560ff811681146153ea57600080fd5b60008060008060008060008060008060006101608c8e0312156156d457600080fd5b8b356156df816153ba565b9a5060208c01356156ef816153ba565b995060408c0135985060608c0135975060808c0135965060a08c0135615714816153ba565b955060c08c0135945060e08c013561572b81615693565b935061573a6101008d016156a1565b92506101208c013591506101408c013590509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d03121561577c57600080fd5b8a35615787816153ba565b995060208b0135985060408b0135975060608b0135965060808b01356157ac816153ba565b955060a08b0135945060c08b01356157c381615693565b93506157d160e08c016156a1565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561580a57600080fd5b85359450602086013567ffffffffffffffff81111561582857600080fd5b61583488828901615479565b9095509350506040860135615848816153ba565b949793965091946060013592915050565b600080600080600080600060e0888a03121561587457600080fd5b873561587f816153ba565b9650602088013561588f816153ba565b955060408801359450606088013593506080880135925060a08801356158b4816153ba565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b0312156158e857600080fd5b88356158f3816153ba565b97506020890135615903816153ba565b965060408901359550606089013594506080890135935060a0890135925060c089013561592f816153ba565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561598857615988615947565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156159ce57600080fd5b8135610bf3816153ba565b6000602082840312156159eb57600080fd5b5051919050565b600060208284031215615a0457600080fd5b8151610bf381615693565b60008060408385031215615a2257600080fd5b505080516020909101519092909150565b60005b83811015615a4e578181015183820152602001615a36565b83811115613ef55750506000910152565b60008251615a71818460208701615a33565b9190910192915050565b60008219821115615a8e57615a8e615947565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615ac457615ac4615947565b5060010190565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff831660408201526080606082015260008251806080840152615b128160a0850160208701615a33565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b600081615b5657615b56615947565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615bb457615bb4615947565b500290565b600082615bef577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615c0657600080fd5b8151610bf3816153ba565b80516dffffffffffffffffffffffffffff811681146153ea57600080fd5b60008060008060008060c08789031215615c4857600080fd5b615c5187615c11565b9550615c5f60208801615c11565b9450604087015163ffffffff81168114615c7857600080fd5b9350615c8660608801615c11565b9250615c9460808801615c11565b915060a08701519050929550929550929556fea26469706673582212207a375ad13797da9ba0e826e4624fa693dbc00bccb223e40756b2c0729342a00364736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0x43eC799eAdd63848443E2347C49f5f52e8Fe0F6f
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000043ec799eadd63848443e2347c49f5f52e8fe0f6f
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode Sourcemap
24478:19019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24930:10;:18;24944:4;24930:18;;24923:26;;;;:::i;:::-;24478:19019;;;;;29130:673;;;;;;;;;;-1:-1:-1;29130:673:0;;;;;:::i;:::-;;:::i;:::-;;;;1343:25:1;;;1399:2;1384:18;;1377:34;;;;1316:18;29130:673:0;;;;;;;;42050:246;;;;;;;;;;-1:-1:-1;42050:246:0;;;;;:::i;:::-;;:::i;:::-;;;1889:25:1;;;1877:2;1862:18;42050:246:0;1743:177:1;36381:851:0;;;;;;;;;;-1:-1:-1;36381:851:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42802:238::-;;;;;;;;;;-1:-1:-1;42802:238:0;;;;;:::i;:::-;;:::i;29809:687::-;;;;;;;;;;-1:-1:-1;29809:687:0;;;;;:::i;:::-;;:::i;33560:648::-;;;;;;;;;;-1:-1:-1;33560:648:0;;;;;:::i;:::-;;:::i;35546:829::-;;;;;;;;;;-1:-1:-1;35546:829:0;;;;;:::i;:::-;;:::i;31966:728::-;;;;;;;;;;-1:-1:-1;31966:728:0;;;;;:::i;:::-;;:::i;39408:717::-;;;;;;;;;;-1:-1:-1;39408:717:0;;;;;:::i;:::-;;:::i;43048:219::-;;;;;;;;;;-1:-1:-1;43048:219:0;;;;;:::i;:::-;;:::i;40971:834::-;;;;;;;;;;-1:-1:-1;40971:834:0;;;;;:::i;:::-;;:::i;34846:694::-;;;;;;:::i;:::-;;:::i;42304:244::-;;;;;;;;;;-1:-1:-1;42304:244:0;;;;;:::i;:::-;;:::i;34214:626::-;;;;;;;;;;-1:-1:-1;34214:626:0;;;;;:::i;:::-;;:::i;24583:38::-;;;;;;;;;;;;;;;;;;8503:42:1;8491:55;;;8473:74;;8461:2;8446:18;24583:38:0;8327:226:1;41849:193:0;;;;;;;;;;-1:-1:-1;41849:193:0;;;;;:::i;:::-;;:::i;31260:700::-;;;;;;;;;;-1:-1:-1;31260:700:0;;;;;:::i;:::-;;:::i;43275:219::-;;;;;;;;;;-1:-1:-1;43275:219:0;;;;;:::i;:::-;;:::i;40131:834::-;;;;;;:::i;:::-;;:::i;28249:875::-;;;;;;;;;;-1:-1:-1;28249:875:0;;;;;:::i;:::-;;:::i;24535:41::-;;;;;;;;;;;;;;;42556:238;;;;;;;;;;-1:-1:-1;42556:238:0;;;;;:::i;:::-;;:::i;30502:679::-;;;;;;;;;;-1:-1:-1;30502:679:0;;;;;:::i;:::-;;:::i;26480:742::-;;;;;;;;;;-1:-1:-1;26480:742:0;;;;;:::i;:::-;;:::i;:::-;;;;10449:25:1;;;10505:2;10490:18;;10483:34;;;;10533:18;;;10526:34;10437:2;10422:18;26480:742:0;10247:319:1;27228:978:0;;;;;;:::i;:::-;;:::i;37238:807::-;;;;;;:::i;:::-;;:::i;29130:673::-;29367:16;29385:14;29348:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;;;;;;;;;29439:196:::1;29469:5;29489:4;29508:9;29532:14;29561:12;29596:4;29616:8;29439:15;:196::i;:::-;29412:223:::0;;-1:-1:-1;29412:223:0;-1:-1:-1;29646:51:0::1;29674:5:::0;29681:2;29412:223;29646:27:::1;:51::i;:::-;29708:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;29714:4:0::1;29708:20;;::::0;::::1;::::0;1862:18:1;;29708:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29750:45;29781:2;29785:9;29750:30;:45::i;:::-;29130:673:::0;;;;;;;;;;:::o;42050:246::-;42215:39;;;;;11127:2:1;42215:39:0;;;11109:21:1;11166:2;11146:18;;;11139:30;11205:31;11185:18;;;11178:59;42183:14:0;;11254:18:1;;42215:39:0;10925:353:1;36381:851:0;36575:21;36551:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;36622:29:::1;36647:4;36622:29;:4:::0;;36627:15:::1;36641:1;36622:4:::0;36627:15:::1;:::i;:::-;36622:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;36614:72;;;::::0;::::1;::::0;;12245:2:1;36614:72:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;36614:72:0::1;12043:354:1::0;36614:72:0::1;36707:69;36752:7;36761:8;36771:4;;36707:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36707:44:0::1;::::0;-1:-1:-1;;;36707:69:0:i:1;:::-;36697:79;;36826:12;36795:7;36820:1;36803:7;:14;:18;;;;:::i;:::-;36795:27;;;;;;;;:::i;:::-;;;;;;;:43;;36787:100;;;::::0;::::1;::::0;;12604:2:1;36787:100:0::1;::::0;::::1;12586:21:1::0;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12753:14;12733:18;;;12726:42;12785:19;;36787:100:0::1;12402:408:1::0;36787:100:0::1;36898:146;36944:4;;36949:1;36944:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36953:10;36965:56;36995:7;37004:4;;37009:1;37004:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37013:4;;37018:1;37013:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;36965:29;:56::i;:::-;37023:7;37031:1;37023:10;;;;;;;;:::i;:::-;;;;;;;36898:31;:146::i;:::-;37055:35;37061:7;37070:4;;37055:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37084:4:0::1;::::0;-1:-1:-1;37055:5:0::1;::::0;-1:-1:-1;;37055:35:0:i:1;:::-;37107:4;37101:20;;;37122:7;37147:1;37130:7;:14;:18;;;;:::i;:::-;37122:27;;;;;;;;:::i;:::-;;;;;;;37101:49;;;;;;;;;;;;;1889:25:1::0;;1877:2;1862:18;;1743:177;37101:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37161:63;37192:2;37196:7;37221:1;37204:7;:14;:18;;;;:::i;:::-;37196:27;;;;;;;;:::i;:::-;;;;;;;37161:30;:63::i;:::-;36381:851:::0;;;;;;;;;:::o;42802:238::-;42926:21;42972:60;43007:7;43016:9;43027:4;42972:34;:60::i;:::-;42965:67;42802:238;-1:-1:-1;;;42802:238:0:o;29809:687::-;30115:12;30129;30154;30169:54;30199:7;30208:6;30216;30169:29;:54::i;:::-;30154:69;;30234:10;30247;:39;;30277:9;30247:39;;;30260:14;30247:39;30297:79;;;;;30324:10;30297:79;;;13187:34:1;30344:4:0;13237:18:1;;;13230:43;13289:18;;;13282:34;;;13332:18;;;13325:34;;;13408:4;13396:17;;13375:19;;;13368:46;13430:19;;;13423:35;;;13474:19;;;13467:35;;;30234:52:0;;-1:-1:-1;30297:26:0;;;;;;13098:19:1;;30297:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30408:80;30424:6;30432;30440:9;30451:10;30463;30475:2;30479:8;30408:15;:80::i;:::-;30387:101;;;;;;;;30143:353;;29809:687;;;;;;;;;;;;;;:::o;33560:648::-;33784:21;33765:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;33828:69:::1;33873:7;33882:8;33892:4;;33828:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33828:44:0::1;::::0;-1:-1:-1;;;33828:69:0:i:1;:::-;33818:79;;33947:12;33916:7;33941:1;33924:7;:14;:18;;;;:::i;:::-;33916:27;;;;;;;;:::i;:::-;;;;;;;:43;;33908:100;;;::::0;::::1;::::0;;12604:2:1;33908:100:0::1;::::0;::::1;12586:21:1::0;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12753:14;12733:18;;;12726:42;12785:19;;33908:100:0::1;12402:408:1::0;33908:100:0::1;34019:146;34065:4;;34070:1;34065:7;;;;;;;:::i;34019:146::-;34176:24;34182:7;34191:4;;34176:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34197:2:0;;-1:-1:-1;34176:5:0::1;::::0;-1:-1:-1;;34176:24:0:i:1;35546:829::-:0;35740:21;35716:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;35787:29:::1;35812:4;35787:29;:4:::0;;35792:15:::1;35806:1;35787:4:::0;35792:15:::1;:::i;:::-;35787:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;35779:72;;;::::0;::::1;::::0;;12245:2:1;35779:72:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;35779:72:0::1;12043:354:1::0;35779:72:0::1;35872:69;35916:7;35925:9;35936:4;;35872:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35872:43:0::1;::::0;-1:-1:-1;;;35872:69:0:i:1;:::-;35862:79;;35974:11;35960:7;35968:1;35960:10;;;;;;;;:::i;:::-;;;;;;;:25;;35952:78;;;::::0;::::1;::::0;;13715:2:1;35952:78:0::1;::::0;::::1;13697:21:1::0;13754:2;13734:18;;;13727:30;13793:34;13773:18;;;13766:62;13864:10;13844:18;;;13837:38;13892:19;;35952:78:0::1;13513:404:1::0;31966:728:0;32284:14;32311:12;32326:51;32356:7;32365:5;32372:4;32326:29;:51::i;:::-;32311:66;;32388:10;32401;:39;;32431:9;32401:39;;;32414:14;32401:39;32451:79;;;;;32478:10;32451:79;;;13187:34:1;32498:4:0;13237:18:1;;;13230:43;13289:18;;;13282:34;;;13332:18;;;13325:34;;;13408:4;13396:17;;13375:19;;;13368:46;13430:19;;;13423:35;;;13474:19;;;13467:35;;;32388:52:0;;-1:-1:-1;32451:26:0;;;;;;13098:19:1;;32451:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32553:133;32615:5;32622:9;32633:14;32649:12;32663:2;32667:8;32553:47;:133::i;:::-;32541:145;31966:728;-1:-1:-1;;;;;;;;;;;;;31966:728:0:o;39408:717::-;39642:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;39663:144:::1;39709:4;;39714:1;39709:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39718:10;39730:56;39760:7;39769:4;;39774:1;39769:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39778:4;;39783:1;39778:7;;;;;;;:::i;39730:56::-;39788:8;39663:31;:144::i;:::-;39818:18;39846:4:::0;;39851:15:::1;39865:1;39846:4:::0;39851:15:::1;:::i;:::-;39846:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39839:43;::::0;;;;:39:::1;8491:55:1::0;;;39839:43:0::1;::::0;::::1;8473:74:1::0;39839:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;39839:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39818:64;;39893:44;39928:4;;39893:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39934:2:0;;-1:-1:-1;39893:34:0::1;::::0;-1:-1:-1;;39893:44:0:i:1;:::-;40033:12:::0;40016:13;39977:4;;39982:15:::1;39996:1;39977:4:::0;39982:15:::1;:::i;:::-;39977:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;39970:43;::::0;;;;:39:::1;8491:55:1::0;;;39970:43:0::1;::::0;::::1;8473:74:1::0;39970:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;39970:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;39948:169;;;::::0;::::1;::::0;;12604:2:1;39948:169:0::1;::::0;::::1;12586:21:1::0;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12753:14;12733:18;;;12726:42;12785:19;;39948:169:0::1;12402:408:1::0;39948:169:0::1;39652:473;39408:717:::0;;;;;;;:::o;43048:219::-;43144:21;43190:69;43235:7;43244:8;43254:4;43190:44;:69::i;40971:834::-;41222:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;41256:29:::1;41281:4;41256:29;:4:::0;;41261:15:::1;41275:1;41256:4:::0;41261:15:::1;:::i;:::-;41256:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;41248:72;;;::::0;::::1;::::0;;12245:2:1;41248:72:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;41248:72:0::1;12043:354:1::0;41248:72:0::1;41331:144;41377:4;;41382:1;41377:7;;;;;;;:::i;41331:144::-;41486:55;41521:4;;41486:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41535:4:0::1;::::0;-1:-1:-1;41486:34:0::1;::::0;-1:-1:-1;;41486:55:0:i:1;:::-;41569:37;::::0;;;;41600:4:::1;41569:37;::::0;::::1;8473:74:1::0;41552:14:0::1;::::0;41576:4:::1;41569:22;;::::0;::::1;::::0;8446:18:1;;41569:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41552:54;;41638:12;41625:9;:25;;41617:82;;;::::0;::::1;::::0;;12604:2:1;41617:82:0::1;::::0;::::1;12586:21:1::0;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12753:14;12733:18;;;12726:42;12785:19;;41617:82:0::1;12402:408:1::0;41617:82:0::1;41710:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;41716:4:0::1;41710:20;;::::0;::::1;::::0;1862:18:1;;41710:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41752:45;41783:2;41787:9;41752:30;:45::i;34846:694::-:0;35038:21;35014:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;35096:4:::1;35085:15;;:4;;35090:1;35085:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;35077:58;;;::::0;::::1;::::0;;12245:2:1;35077:58:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;35077:58:0::1;12043:354:1::0;35077:58:0::1;35156:70;35201:7;35210:9;35221:4;;35156:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35156:44:0::1;::::0;-1:-1:-1;;;35156:70:0:i:1;:::-;35146:80;;35276:12;35245:7;35270:1;35253:7;:14;:18;;;;:::i;:::-;35245:27;;;;;;;;:::i;:::-;;;;;;;:43;;35237:100;;;::::0;::::1;::::0;;12604:2:1;35237:100:0::1;::::0;::::1;12586:21:1::0;12643:2;12623:18;;;12616:30;12682:34;12662:18;;;12655:62;12753:14;12733:18;;;12726:42;12785:19;;35237:100:0::1;12402:408:1::0;35237:100:0::1;35354:4;35348:19;;;35375:7;35383:1;35375:10;;;;;;;;:::i;:::-;;;;;;;35348:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;35412:4;35406:20;;;35427:56;35457:7;35466:4;;35471:1;35466:7;;;;;;;:::i;35427:56::-;35485:7;35493:1;35485:10;;;;;;;;:::i;:::-;;;;;;;35406:90;;;;;;;;;;;;;;;14315:42:1::0;14303:55;;;;14285:74;;14390:2;14375:18;;14368:34;14273:2;14258:18;;14111:297;35406:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35399:98;;;;:::i;:::-;35508:24;35514:7;35523:4;;35508:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35529:2:0;;-1:-1:-1;35508:5:0::1;::::0;-1:-1:-1;;35508:24:0:i:1;:::-;34846:694:::0;;;;;;;;:::o;42304:244::-;42468:38;;;;;14865:2:1;42468:38:0;;;14847:21:1;14904:2;14884:18;;;14877:30;14943;14923:18;;;14916:58;42437:13:0;;14991:18:1;;42468:38:0;14663:352:1;34214:626:0;34438:21;34419:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;34482:69:::1;34526:7;34535:9;34546:4;;34482:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34482:43:0::1;::::0;-1:-1:-1;;;34482:69:0:i:1;:::-;34472:79;;34584:11;34570:7;34578:1;34570:10;;;;;;;;:::i;:::-;;;;;;;:25;;34562:78;;;::::0;::::1;::::0;;13715:2:1;34562:78:0::1;::::0;::::1;13697:21:1::0;13754:2;13734:18;;;13727:30;13793:34;13773:18;;;13766:62;13864:10;13844:18;;;13837:38;13892:19;;34562:78:0::1;13513:404:1::0;41849:193:0;41946:12;41978:56;42006:7;42015:8;42025;41978:27;:56::i;:::-;41971:63;41849:193;-1:-1:-1;;;;41849:193:0:o;31260:700::-;31526:14;31507:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;31569:196:::1;31599:5;31619:4;31638:9;31662:14;31691:12;31726:4;31746:8;31569:15;:196::i;:::-;31815:38;::::0;;;;31847:4:::1;31815:38;::::0;::::1;8473:74:1::0;31553:212:0;;-1:-1:-1;31776:78:0::1;::::0;-1:-1:-1;31804:5:0;;31811:2;;31815:23:::1;::::0;::::1;::::0;::::1;::::0;8446:18:1;;31815:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31776:27;:78::i;:::-;31865:31;::::0;;;;::::1;::::0;::::1;1889:25:1::0;;;31871:4:0::1;31865:20;;::::0;::::1;::::0;1862:18:1;;31865:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31907:45;31938:2;31942:9;31907:30;:45::i;43275:219::-:0;43371:21;43417:69;43461:7;43470:9;43481:4;43417:43;:69::i;40131:834::-;40371:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;40416:4:::1;40405:15;;:4;;40410:1;40405:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;40397:58;;;::::0;::::1;::::0;;12245:2:1;40397:58:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;40397:58:0::1;12043:354:1::0;40397:58:0::1;40466:13;40482:9;40466:25;;40508:4;40502:19;;;40529:8;40502:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;40564:4;40558:20;;;40579:56;40609:7;40618:4;;40623:1;40618:7;;;;;;;:::i;40579:56::-;40558:88;::::0;;::::1;::::0;;;;;;14315:42:1;14303:55;;;40558:88:0::1;::::0;::::1;14285:74:1::0;14375:18;;;14368:34;;;14258:18;;40558:88:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40551:96;;;;:::i;:::-;40658:18;40686:4:::0;;40691:15:::1;40705:1;40686:4:::0;40691:15:::1;:::i;:::-;40686:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40679:43;::::0;;;;:39:::1;8491:55:1::0;;;40679:43:0::1;::::0;::::1;8473:74:1::0;40679:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;40679:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40658:64;;40733:44;40768:4;;40733:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;40774:2:0;;-1:-1:-1;40733:34:0::1;::::0;-1:-1:-1;;40733:44:0:i:1;:::-;40873:12:::0;40856:13;40817:4;;40822:15:::1;40836:1;40817:4:::0;40822:15:::1;:::i;:::-;40817:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;40810:43;::::0;;;;:39:::1;8491:55:1::0;;;40810:43:0::1;::::0;::::1;8473:74:1::0;40810:39:0;;;::::1;::::0;::::1;::::0;8446:18:1;;40810:43:0::1;8327:226:1::0;28249:875:0;28503:12;28517;28484:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;28542:12:::1;28557:54;28587:7;28596:6;28604;28557:29;:54::i;:::-;28622:61;::::0;;;;28655:10:::1;28622:61;::::0;::::1;15283:34:1::0;28622:32:0::1;::::0;::::1;15333:18:1::0;;;15326:43;;;15385:18;;;15378:34;;;28542:69:0;;-1:-1:-1;28622:32:0::1;::::0;15195:18:1;;28622:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;28751:28:0::1;::::0;;;;:24:::1;8491:55:1::0;;;28751:28:0::1;::::0;::::1;8473:74:1::0;28721:12:0::1;::::0;;;28751:24;::::1;::::0;::::1;::::0;8446:18:1;;28751:28:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28720:59;;;;28791:14;28810:48;28843:6;28851;28810:32;:48::i;:::-;28790:68;;;28900:6;28890:16;;:6;:16;;;:58;;28931:7;28940;28890:58;;;28910:7;28919;28890:58;28869:79:::0;;-1:-1:-1;28869:79:0;-1:-1:-1;28967:21:0;;::::1;;28959:73;;;::::0;::::1;::::0;;15875:2:1;28959:73:0::1;::::0;::::1;15857:21:1::0;15914:2;15894:18;;;15887:30;15953:34;15933:18;;;15926:62;16024:9;16004:18;;;15997:37;16051:19;;28959:73:0::1;15673:403:1::0;28959:73:0::1;29062:10;29051:7;:21;;29043:73;;;::::0;::::1;::::0;;16283:2:1;29043:73:0::1;::::0;::::1;16265:21:1::0;16322:2;16302:18;;;16295:30;16361:34;16341:18;;;16334:62;16432:9;16412:18;;;16405:37;16459:19;;29043:73:0::1;16081:403:1::0;29043:73:0::1;28531:593;;;;28249:875:::0;;;;;;;;;;;:::o;42556:238::-;42680:21;42726:60;42762:7;42771:8;42781:4;42726:35;:60::i;30502:679::-;30791:16;30809:14;30836:12;30851:51;30881:7;30890:5;30897:4;30851:29;:51::i;:::-;30836:66;;30913:10;30926;:39;;30956:9;30926:39;;;30939:14;30926:39;30976:79;;;;;31003:10;30976:79;;;13187:34:1;31023:4:0;13237:18:1;;;13230:43;13289:18;;;13282:34;;;13332:18;;;13325:34;;;13408:4;13396:17;;13375:19;;;13368:46;13430:19;;;13423:35;;;13474:19;;;13467:35;;;30913:52:0;;-1:-1:-1;30976:26:0;;;;;;13098:19:1;;30976:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31093:80;31112:5;31119:9;31130:14;31146:12;31160:2;31164:8;31093:18;:80::i;:::-;31066:107;;;;-1:-1:-1;30502:679:0;-1:-1:-1;;;;;;;;;;;;;30502:679:0:o;26480:742::-;26768:12;26782;26796:14;26749:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;26844:85:::1;26858:6;26866;26874:14;26890;26906:10;26918;26844:13;:85::i;:::-;26823:106:::0;;-1:-1:-1;26823:106:0;-1:-1:-1;26940:12:0::1;26955:54;26985:7;26994:6:::0;27002;26955:29:::1;:54::i;:::-;26940:69;;27020:66;27052:6;27060:10;27072:4;27078:7;27020:31;:66::i;:::-;27097;27129:6;27137:10;27149:4;27155:7;27097:31;:66::i;:::-;27186:28;::::0;;;;:24:::1;8491:55:1::0;;;27186:28:0::1;::::0;::::1;8473:74:1::0;27186:24:0;::::1;::::0;::::1;::::0;8446:18:1;;27186:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27174:40;;26812:410;26480:742:::0;;;;;;;;;;;;;:::o;27228:978::-;27481:16;27499:14;27515;27462:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;27569:176:::1;27597:5;27617:4;27636:18;27669:9;27693:14;27722:12;27569:13;:176::i;:::-;27542:203:::0;;-1:-1:-1;27542:203:0;-1:-1:-1;27756:12:0::1;27771:51;27801:7;27810:5:::0;27817:4:::1;27771:29;:51::i;:::-;27756:66;;27833:69;27865:5;27872:10;27884:4;27890:11;27833:31;:69::i;:::-;27919:4;27913:19;;;27940:9;27913:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27970:37:0::1;::::0;;;;:20:::1;14303:55:1::0;;;27970:37:0::1;::::0;::::1;14285:74:1::0;14375:18;;;14368:34;;;27976:4:0::1;27970:20;::::0;-1:-1:-1;27970:20:0::1;::::0;-1:-1:-1;14258:18:1;;;-1:-1:-1;27970:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27963:45;;;;:::i;:::-;28031:28;::::0;;;;:24:::1;8491:55:1::0;;;28031:28:0::1;::::0;::::1;8473:74:1::0;28031:24:0;::::1;::::0;::::1;::::0;8446:18:1;;28031:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28019:40;;28122:9;28110;:21;28106:92;;;28133:65;28164:10;28176:21;28188:9:::0;28176::::1;:21;:::i;:::-;28133:30;:65::i;:::-;27531:675;27228:978:::0;;;;;;;;;;;:::o;37238:807::-;37427:21;37403:8;24692:15;24680:8;:27;;24672:65;;;;;;;10773:2:1;24672:65:0;;;10755:21:1;10812:2;10792:18;;;10785:30;10851:27;10831:18;;;10824:55;10896:18;;24672:65:0;10571:349:1;24672:65:0;37485:4:::1;37474:15;;:4;;37479:1;37474:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;37466:58;;;::::0;::::1;::::0;;12245:2:1;37466:58:0::1;::::0;::::1;12227:21:1::0;12284:2;12264:18;;;12257:30;12323:32;12303:18;;;12296:60;12373:18;;37466:58:0::1;12043:354:1::0;37466:58:0::1;37545:69;37589:7;37598:9;37609:4;;37545:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37545:43:0::1;::::0;-1:-1:-1;;;37545:69:0:i:1;:::-;37535:79;;37647:9;37633:7;37641:1;37633:10;;;;;;;;:::i;:::-;;;;;;;:23;;37625:76;;;::::0;::::1;::::0;;13715:2:1;37625:76:0::1;::::0;::::1;13697:21:1::0;13754:2;13734:18;;;13727:30;13793:34;13773:18;;;13766:62;13864:10;13844:18;;;13837:38;13892:19;;37625:76:0::1;13513:404:1::0;37625:76:0::1;37718:4;37712:19;;;37739:7;37747:1;37739:10;;;;;;;;:::i;:::-;;;;;;;37712:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37776:4;37770:20;;;37791:56;37821:7;37830:4;;37835:1;37830:7;;;;;;;:::i;37791:56::-;37849:7;37857:1;37849:10;;;;;;;;:::i;:::-;;;;;;;37770:90;;;;;;;;;;;;;;;14315:42:1::0;14303:55;;;;14285:74;;14390:2;14375:18;;14368:34;14273:2;14258:18;;14111:297;37770:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37763:98;;;;:::i;:::-;37872:24;37878:7;37887:4;;37872:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37893:2:0;;-1:-1:-1;37872:5:0::1;::::0;-1:-1:-1;;37872:24:0:i:1;:::-;37959:7;37967:1;37959:10;;;;;;;;:::i;:::-;;;;;;;37947:9;:22;37943:94;;;37971:66;38002:10;38026:7;38034:1;38026:10;;;;;;;;:::i;:::-;;;;;;;38014:9;:22;;;;:::i;8860:449::-:0;9092:45;;;9081:10;14303:55:1;;;9092:45:0;;;14285:74:1;14375:18;;;;14368:34;;;9092:45:0;;;;;;;;;;14258:18:1;;;;9092:45:0;;;;;;;;;;;;;9081:57;;-1:-1:-1;;;;9081:10:0;;;;:57;;9092:45;9081:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9045:93;;;;9171:7;:57;;;;-1:-1:-1;9183:11:0;;:16;;:44;;;9214:4;9203:24;;;;;;;;;;;;:::i;:::-;9149:152;;;;;;;17233:2:1;9149:152:0;;;17215:21:1;17272:2;17252:18;;;17245:30;17311:34;17291:18;;;17284:62;17382:15;17362:18;;;17355:43;17415:19;;9149:152:0;17031:409:1;9149:152:0;8967:342;;8860:449;;;:::o;9823:217::-;9936:12;;;9896;9936;;;;;;;;;9914:7;;;;9929:5;;9914:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9895:54;;;9968:7;9960:72;;;;;;;17647:2:1;9960:72:0;;;17629:21:1;17686:2;17666:18;;;17659:30;17725:34;17705:18;;;17698:62;17796:22;17776:18;;;17769:50;17836:19;;9960:72:0;17445:416:1;9960:72:0;9884:156;9823:217;;:::o;20644:586::-;20749:21;20806:1;20791:4;:11;:16;;20783:64;;;;;;;18068:2:1;20783:64:0;;;18050:21:1;18107:2;18087:18;;;18080:30;18146:34;18126:18;;;18119:62;18217:5;18197:18;;;18190:33;18240:19;;20783:64:0;17866:399:1;20783:64:0;20879:4;:11;20868:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20868:23:0;;20858:33;;20915:8;20902:7;20910:1;20902:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;20939:6;20934:289;20965:1;20951:4;:11;:15;;;;:::i;:::-;20947:1;:19;20934:289;;;20988:18;21023:60;21053:7;21062:4;21067:1;21062:7;;;;;;;;:::i;:::-;;;;;;;21071:4;21076:1;21080;21076:5;;;;:::i;:::-;21071:11;;;;;;;;:::i;:::-;;;;;;;21023:29;:60::i;:::-;21099:42;;;;;21125:15;21099:42;;;1889:25:1;20988:96:0;;-1:-1:-1;21099:25:0;;;;;;1862:18:1;;21099:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21173:4;:17;;;21191:7;21199:1;21191:10;;;;;;;;:::i;:::-;;;;;;;21203:4;21208:1;21203:7;;;;;;;;:::i;:::-;;;;;;;21173:38;;;;;;;;;;;;;;;18577:25:1;;;18650:42;18638:55;18633:2;18618:18;;18611:83;18565:2;18550:18;;18403:297;21173:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21156:7;21164:5;:1;21168;21164:5;:::i;:::-;21156:14;;;;;;;;:::i;:::-;;;;;;;;;;:55;-1:-1:-1;20968:3:0;;;;:::i;:::-;;;;20934:289;;;;20644:586;;;;;:::o;17121:494::-;17210:12;17236:14;17252;17270:26;17281:6;17289;17270:10;:26::i;:::-;17442:32;;19072:66:1;19167:2;19163:15;;;19159:24;;17442:32:0;;;19147:37:1;19218:15;;;19214:24;19200:12;;;19193:46;17235:61:0;;-1:-1:-1;17235:61:0;-1:-1:-1;17406:7:0;;19255:12:1;;17442:32:0;;;;;;;;;;;;17432:43;;;;;;17345:258;;;;;;;;19649:66:1;19637:79;;19753:2;19749:15;;;;19766:66;19745:88;19741:1;19732:11;;19725:109;19859:2;19850:12;;19843:28;19901:66;19896:2;19887:12;;19880:88;19993:2;19984:12;;19278:724;17345:258:0;;;;;;;;;;;;;;17335:269;;17345:258;17335:269;;;;;17121:494;-1:-1:-1;;;;;;17121:494:0:o;9317:498::-;9588:51;;;9577:10;15301:15:1;;;9588:51:0;;;15283:34:1;15353:15;;;15333:18;;;15326:43;15385:18;;;;15378:34;;;9588:51:0;;;;;;;;;;15195:18:1;;;;9588:51:0;;;;;;;;;;;;;9577:63;;-1:-1:-1;;;;9577:10:0;;;;:63;;9588:51;9577:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9541:99;;;;9673:7;:57;;;;-1:-1:-1;9685:11:0;;:16;;:44;;;9716:4;9705:24;;;;;;;;;;;;:::i;:::-;9651:156;;;;;;;20209:2:1;9651:156:0;;;20191:21:1;20248:2;20228:18;;;20221:30;20287:34;20267:18;;;20260:62;20358:19;20338:18;;;20331:47;20395:19;;9651:156:0;20007:413:1;9651:156:0;9451:364;;9317:498;;;;:::o;32805:749::-;32912:6;32907:640;32938:1;32924:4;:11;:15;;;;:::i;:::-;32920:1;:19;32907:640;;;32962:13;32977:14;32996:4;33001:1;32996:7;;;;;;;;:::i;:::-;;;;;;;33005:4;33010:1;33014;33010:5;;;;:::i;:::-;33005:11;;;;;;;;:::i;:::-;;;;;;;32961:56;;;;33033:14;33052:47;33085:5;33092:6;33052:32;:47::i;:::-;-1:-1:-1;33032:67:0;-1:-1:-1;33114:14:0;33131:7;33139:5;:1;33143;33139:5;:::i;:::-;33131:14;;;;;;;;:::i;:::-;;;;;;;33114:31;;33161:15;33178;33206:6;33197:15;;:5;:15;;;:61;;33239:9;33255:1;33197:61;;;33221:1;33225:9;33197:61;33160:98;;;;33273:10;33304:1;33290:4;:11;:15;;;;:::i;:::-;33286:1;:19;:87;;33370:3;33286:87;;;33308:59;33338:7;33347:6;33355:4;33360:5;:1;33364;33360:5;:::i;33308:59::-;33273:100;;33402:53;33432:7;33441:5;33448:6;33402:29;:53::i;:::-;33388:73;;;33480:10;33492;33504:2;33518:1;33508:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33508:12:0;;33388:147;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32946:601;;;;;;;32941:3;;;;;:::i;:::-;;;;32907:640;;;;32805:749;;;:::o;19936:615::-;20037:21;20094:1;20079:4;:11;:16;;20071:64;;;;;;;18068:2:1;20071:64:0;;;18050:21:1;18107:2;18087:18;;;18080:30;18146:34;18126:18;;;18119:62;18217:5;18197:18;;;18190:33;18240:19;;20071:64:0;17866:399:1;20071:64:0;20167:4;:11;20156:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20156:23:0;;20146:33;;20220:9;20190:7;20215:1;20198:7;:14;:18;;;;:::i;:::-;20190:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;20245:6;20268:1;20254:4;:11;:15;;;;:::i;:::-;20245:24;;20240:304;20271:5;;20240:304;;20298:18;20333:60;20363:7;20372:4;20377:5;20381:1;20377;:5;:::i;:::-;20372:11;;;;;;;;:::i;:::-;;;;;;;20385:4;20390:1;20385:7;;;;;;;;:::i;20333:60::-;20298:96;;20417:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20409:50;;;;;;;21338:2:1;20409:50:0;;;21320:21:1;21377:2;21357:18;;;21350:30;21416:19;21396:18;;;21389:47;21453:18;;20409:50:0;21136:341:1;20409:50:0;20491:4;:16;;;20508:7;20516:1;20508:10;;;;;;;;:::i;:::-;;;;;;;20520:4;20529:1;20525;:5;;;;:::i;:::-;20520:11;;;;;;;;:::i;:::-;;;;;;;20491:41;;;;;;;;;;;;;;;18577:25:1;;;18650:42;18638:55;18633:2;18618:18;;18611:83;18565:2;18550:18;;18403:297;20491:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20474:7;20482:5;20486:1;20482;:5;:::i;:::-;20474:14;;;;;;;;:::i;:::-;;;;;;;;;;:58;-1:-1:-1;20278:3:0;;;;:::i;:::-;;;;20240:304;;21322:611;21427:21;21484:1;21469:4;:11;:16;;21461:64;;;;;;;18068:2:1;21461:64:0;;;18050:21:1;18107:2;18087:18;;;18080:30;18146:34;18126:18;;;18119:62;18217:5;18197:18;;;18190:33;18240:19;;21461:64:0;17866:399:1;21461:64:0;21557:4;:11;21546:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21546:23:0;;21536:33;;21610:9;21580:7;21605:1;21588:7;:14;:18;;;;:::i;:::-;21580:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;21635:6;21658:1;21644:4;:11;:15;;;;:::i;:::-;21635:24;;21630:296;21661:5;;21630:296;;21688:18;21723:60;21753:7;21762:4;21767:5;21771:1;21767;:5;:::i;21723:60::-;21799:42;;;;;21825:15;21799:42;;;1889:25:1;21688:96:0;;-1:-1:-1;21799:25:0;;;;;;1862:18:1;;21799:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21873:4;:16;;;21890:7;21898:1;21890:10;;;;;;;;:::i;:::-;;;;;;;21902:4;21911:1;21907;:5;;;;:::i;:::-;21902:11;;;;;;;;:::i;:::-;;;;;;;21873:41;;;;;;;;;;;;;;;18577:25:1;;;18650:42;18638:55;18633:2;18618:18;;18611:83;18565:2;18550:18;;18403:297;21873:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21856:7;21864:5;21868:1;21864;:5;:::i;:::-;21856:14;;;;;;;;:::i;:::-;;;;;;;;;;:58;-1:-1:-1;21668:3:0;;;;:::i;:::-;;;;21630:296;;38192:1210;38305:6;38300:1095;38331:1;38317:4;:11;:15;;;;:::i;:::-;38313:1;:19;38300:1095;;;38355:13;38370:14;38389:4;38394:1;38389:7;;;;;;;;:::i;:::-;;;;;;;38398:4;38403:1;38407;38403:5;;;;:::i;:::-;38398:11;;;;;;;;:::i;:::-;;;;;;;38354:56;;;;38426:14;38445:47;38478:5;38485:6;38445:32;:47::i;:::-;38425:67;;;38507:18;38542:53;38572:7;38581:5;38588:6;38542:29;:53::i;:::-;38507:89;;38611:16;38642:17;38734;38753:18;38773:22;38797:23;38825:66;38868:7;38877:5;38884:6;38825:42;:66::i;:::-;38924:38;;;;;:23;8491:55:1;;;38924:38:0;;;8473:74:1;38733:158:0;;-1:-1:-1;38733:158:0;;-1:-1:-1;38733:158:0;;-1:-1:-1;38733:158:0;-1:-1:-1;38733:158:0;;;;38924:23;;;;;;8446:18:1;;38924:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;:73;;;;:::i;:::-;39031:37;;;;;;;;18577:25:1;;;39031:17:0;18638:55:1;;;18618:18;;;18611:83;38910:87:0;;-1:-1:-1;39031:17:0;;;;;;18550:18:1;;39031:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39016:52;;38674:410;;;;39099:15;39116;39144:6;39135:15;;:5;:15;;;:67;;39180:12;39199:1;39135:67;;;39159:1;39163:12;39135:67;39098:104;;;;39217:10;39248:1;39234:4;:11;:15;;;;:::i;:::-;39230:1;:19;:87;;39314:3;39230:87;;;39252:59;39282:7;39291:6;39299:4;39304:5;:1;39308;39304:5;:::i;39252:59::-;39370:12;;;39380:1;39370:12;;;;;;;;;39332:51;;;;39217:100;;-1:-1:-1;39332:9:0;;;;;;:51;;39342:10;;39354;;39217:100;;39332:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38339:1056;;;;;;;;;38334:3;;;;;:::i;:::-;;;;38300:1095;;18855:328;18937:12;18980:1;18970:7;:11;18962:66;;;;;;;21885:2:1;18962:66:0;;;21867:21:1;21924:2;21904:18;;;21897:30;21963:34;21943:18;;;21936:62;22034:12;22014:18;;;22007:40;22064:19;;18962:66:0;21683:406:1;18962:66:0;19058:1;19047:8;:12;:28;;;;;19074:1;19063:8;:12;19047:28;19039:86;;;;;;;22296:2:1;19039:86:0;;;22278:21:1;22335:2;22315:18;;;22308:30;22374:34;22354:18;;;22347:62;22445:15;22425:18;;;22418:43;22478:19;;19039:86:0;22094:409:1;19039:86:0;19167:8;19146:18;19156:8;19146:7;:18;:::i;:::-;:29;;;;:::i;16670:359::-;16745:14;16761;16806:6;16796:16;;:6;:16;;;16788:71;;;;;;;23222:2:1;16788:71:0;;;23204:21:1;23261:2;23241:18;;;23234:30;23300:34;23280:18;;;23273:62;23371:12;23351:18;;;23344:40;23401:19;;16788:71:0;23020:406:1;16788:71:0;16898:6;16889:15;;:6;:15;;;:53;;16927:6;16935;16889:53;;;16908:6;16916;16889:53;16870:72;;-1:-1:-1;16870:72:0;-1:-1:-1;16961:20:0;;;16953:68;;;;;;;23633:2:1;16953:68:0;;;23615:21:1;23672:2;23652:18;;;23645:30;23711:34;23691:18;;;23684:62;23782:5;23762:18;;;23755:33;23805:19;;16953:68:0;23431:399:1;16953:68:0;16670:359;;;;;:::o;19265:590::-;19366:21;19423:1;19408:4;:11;:16;;19400:64;;;;;;;18068:2:1;19400:64:0;;;18050:21:1;18107:2;18087:18;;;18080:30;18146:34;18126:18;;;18119:62;18217:5;18197:18;;;18190:33;18240:19;;19400:64:0;17866:399:1;19400:64:0;19496:4;:11;19485:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19485:23:0;;19475:33;;19532:8;19519:7;19527:1;19519:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;19556:6;19551:297;19582:1;19568:4;:11;:15;;;;:::i;:::-;19564:1;:19;19551:297;;;19605:18;19640:60;19670:7;19679:4;19684:1;19679:7;;;;;;;;:::i;19640:60::-;19605:96;;19724:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19716:50;;;;;;;21338:2:1;19716:50:0;;;21320:21:1;21377:2;21357:18;;;21350:30;21416:19;21396:18;;;21389:47;21453:18;;19716:50:0;21136:341:1;19716:50:0;19798:4;:17;;;19816:7;19824:1;19816:10;;;;;;;;:::i;:::-;;;;;;;19828:4;19833:1;19828:7;;;;;;;;:::i;:::-;;;;;;;19798:38;;;;;;;;;;;;;;;18577:25:1;;;18650:42;18638:55;18633:2;18618:18;;18611:83;18565:2;18550:18;;18403:297;19798:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19781:7;19789:5;:1;19793;19789:5;:::i;:::-;19781:14;;;;;;;;:::i;:::-;;;;;;;;;;:55;-1:-1:-1;19585:3:0;;;;:::i;:::-;;;;19551:297;;25052:1422;25365:52;;;;;:66;24088:15:1;;;25365:52:0;;;24070:34:1;24140:15;;;24120:18;;;24113:43;-1:-1:-1;;;;;;25385:7:0;25365:36;;;;;;23982:18:1;;25365:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;25361:154;;25448:55;;;;;:39;24088:15:1;;;25448:55:0;;;24070:34:1;24140:15;;;24120:18;;;24113:43;25468:7:0;25448:39;;;;23982:18:1;;25448:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25361:154;25526:13;25541;25560:67;25603:7;25612:6;25620;25560:42;:67::i;:::-;25525:102;;;;;;25642:8;25654:1;25642:13;:30;;;;-1:-1:-1;25659:13:0;;25642:30;25638:829;;;25711:14;;-1:-1:-1;25727:14:0;;-1:-1:-1;25638:829:0;;;25775:19;25797:63;25825:14;25841:8;25851;25797:27;:63::i;:::-;25775:85;;25897:14;25879;:32;25875:581;;25958:10;25940:14;:28;;25932:80;;;;;;;16283:2:1;25932:80:0;;;16265:21:1;16322:2;16302:18;;;16295:30;16361:34;16341:18;;;16334:62;16432:9;16412:18;;;16405:37;16459:19;;25932:80:0;16081:403:1;25932:80:0;26053:14;;-1:-1:-1;26069:14:0;-1:-1:-1;26069:14:0;25875:581;;;26125:19;26147:63;26175:14;26191:8;26201;26147:27;:63::i;:::-;26125:85;;26254:14;26236;:32;;26229:40;;;;:::i;:::-;26314:10;26296:14;:28;;26288:80;;;;;;;15875:2:1;26288:80:0;;;15857:21:1;15914:2;15894:18;;;15887:30;15953:34;15933:18;;;15926:62;16024:9;16004:18;;;15997:37;16051:19;;26288:80:0;15673:403:1;26288:80:0;26409:14;-1:-1:-1;26425:14:0;;-1:-1:-1;25875:581:0;25760:707;25638:829;25298:1176;;25052:1422;;;;;;;;;:::o;18075:667::-;18172:13;18187;18202:18;18222;18254:14;18273:26;18284:6;18292;18273:10;:26::i;:::-;18253:46;;;18312:18;18347:32;18355:7;18364:6;18372;18347:7;:32::i;:::-;18393:42;;;;;18419:15;18393:42;;;1889:25:1;18312:68:0;;-1:-1:-1;18393:25:0;;;;;;1862:18:1;;18393:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18449:13;18464;18479:18;18499;18523:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18448:98;;;;;;;;;;;;;;;;;;18622:6;18612:16;;:6;:16;;;:122;;18685:8;18695;18705:13;18720;18612:122;;;18632:8;18642;18652:13;18667;18612:122;18559:175;;;;;;;;;;;;;;;;18242:500;;;;;;18075:667;;;;;;;:::o;14:184:1:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:134::-;430:20;;459:31;430:20;459:31;:::i;:::-;362:134;;;:::o;501:663::-;605:6;613;621;629;637;645;698:3;686:9;677:7;673:23;669:33;666:53;;;715:1;712;705:12;666:53;754:9;741:23;773:31;798:5;773:31;:::i;:::-;823:5;-1:-1:-1;875:2:1;860:18;;847:32;;-1:-1:-1;926:2:1;911:18;;898:32;;-1:-1:-1;977:2:1;962:18;;949:32;;-1:-1:-1;1033:3:1;1018:19;;1005:33;1047;1005;1047;:::i;:::-;1099:7;1089:17;;;1153:3;1142:9;1138:19;1125:33;1115:43;;501:663;;;;;;;;:::o;1422:316::-;1499:6;1507;1515;1568:2;1556:9;1547:7;1543:23;1539:32;1536:52;;;1584:1;1581;1574:12;1536:52;-1:-1:-1;;1607:23:1;;;1677:2;1662:18;;1649:32;;-1:-1:-1;1728:2:1;1713:18;;;1700:32;;1422:316;-1:-1:-1;1422:316:1:o;1925:367::-;1988:8;1998:6;2052:3;2045:4;2037:6;2033:17;2029:27;2019:55;;2070:1;2067;2060:12;2019:55;-1:-1:-1;2093:20:1;;2136:18;2125:30;;2122:50;;;2168:1;2165;2158:12;2122:50;2205:4;2197:6;2193:17;2181:29;;2265:3;2258:4;2248:6;2245:1;2241:14;2233:6;2229:27;2225:38;2222:47;2219:67;;;2282:1;2279;2272:12;2297:778;2419:6;2427;2435;2443;2451;2459;2512:3;2500:9;2491:7;2487:23;2483:33;2480:53;;;2529:1;2526;2519:12;2480:53;2565:9;2552:23;2542:33;;2622:2;2611:9;2607:18;2594:32;2584:42;;2677:2;2666:9;2662:18;2649:32;2704:18;2696:6;2693:30;2690:50;;;2736:1;2733;2726:12;2690:50;2775:70;2837:7;2828:6;2817:9;2813:22;2775:70;:::i;:::-;2864:8;;-1:-1:-1;2749:96:1;-1:-1:-1;;2949:2:1;2934:18;;2921:32;2962:31;2921:32;2962:31;:::i;:::-;3012:5;3002:15;;;3064:3;3053:9;3049:19;3036:33;3026:43;;2297:778;;;;;;;;:::o;3080:632::-;3251:2;3303:21;;;3373:13;;3276:18;;;3395:22;;;3222:4;;3251:2;3474:15;;;;3448:2;3433:18;;;3222:4;3517:169;3531:6;3528:1;3525:13;3517:169;;;3592:13;;3580:26;;3661:15;;;;3626:12;;;;3553:1;3546:9;3517:169;;;-1:-1:-1;3703:3:1;;3080:632;-1:-1:-1;;;;;;3080:632:1:o;3717:184::-;3769:77;3766:1;3759:88;3866:4;3863:1;3856:15;3890:4;3887:1;3880:15;3906:1248;3999:6;4007;4060:2;4048:9;4039:7;4035:23;4031:32;4028:52;;;4076:1;4073;4066:12;4028:52;4112:9;4099:23;4089:33;;4141:2;4194;4183:9;4179:18;4166:32;4217:18;4258:2;4250:6;4247:14;4244:34;;;4274:1;4271;4264:12;4244:34;4312:6;4301:9;4297:22;4287:32;;4357:7;4350:4;4346:2;4342:13;4338:27;4328:55;;4379:1;4376;4369:12;4328:55;4415:2;4402:16;4437:2;4433;4430:10;4427:36;;;4443:18;;:::i;:::-;4489:2;4486:1;4482:10;4521:2;4515:9;4580:66;4575:2;4571;4567:11;4563:84;4555:6;4551:97;4698:6;4686:10;4683:22;4678:2;4666:10;4663:18;4660:46;4657:72;;;4709:18;;:::i;:::-;4745:2;4738:22;4795:18;;;4829:15;;;;-1:-1:-1;4871:11:1;;;4867:20;;;4899:19;;;4896:39;;;4931:1;4928;4921:12;4896:39;4955:11;;;;4975:148;4991:6;4986:3;4983:15;4975:148;;;5057:23;5076:3;5057:23;:::i;:::-;5045:36;;5008:12;;;;5101;;;;4975:148;;;5142:6;5132:16;;;;;;;;3906:1248;;;;;:::o;5159:118::-;5245:5;5238:13;5231:21;5224:5;5221:32;5211:60;;5267:1;5264;5257:12;5282:156;5348:20;;5408:4;5397:16;;5387:27;;5377:55;;5428:1;5425;5418:12;5443:1152;5587:6;5595;5603;5611;5619;5627;5635;5643;5651;5659;5667:7;5721:3;5709:9;5700:7;5696:23;5692:33;5689:53;;;5738:1;5735;5728:12;5689:53;5777:9;5764:23;5796:31;5821:5;5796:31;:::i;:::-;5846:5;-1:-1:-1;5903:2:1;5888:18;;5875:32;5916:33;5875:32;5916:33;:::i;:::-;5968:7;-1:-1:-1;6022:2:1;6007:18;;5994:32;;-1:-1:-1;6073:2:1;6058:18;;6045:32;;-1:-1:-1;6124:3:1;6109:19;;6096:33;;-1:-1:-1;6181:3:1;6166:19;;6153:33;6195;6153;6195;:::i;:::-;6247:7;-1:-1:-1;6301:3:1;6286:19;;6273:33;;-1:-1:-1;6358:3:1;6343:19;;6330:33;6372:30;6330:33;6372:30;:::i;:::-;6421:7;-1:-1:-1;6447:37:1;6479:3;6464:19;;6447:37;:::i;:::-;6437:47;;6531:3;6520:9;6516:19;6503:33;6493:43;;6584:3;6573:9;6569:19;6556:33;6545:44;;5443:1152;;;;;;;;;;;;;;:::o;6600:1008::-;6735:6;6743;6751;6759;6767;6775;6783;6791;6799;6807;6860:3;6848:9;6839:7;6835:23;6831:33;6828:53;;;6877:1;6874;6867:12;6828:53;6916:9;6903:23;6935:31;6960:5;6935:31;:::i;:::-;6985:5;-1:-1:-1;7037:2:1;7022:18;;7009:32;;-1:-1:-1;7088:2:1;7073:18;;7060:32;;-1:-1:-1;7139:2:1;7124:18;;7111:32;;-1:-1:-1;7195:3:1;7180:19;;7167:33;7209;7167;7209;:::i;:::-;7261:7;-1:-1:-1;7315:3:1;7300:19;;7287:33;;-1:-1:-1;7372:3:1;7357:19;;7344:33;7386:30;7344:33;7386:30;:::i;:::-;7435:7;-1:-1:-1;7461:37:1;7493:3;7478:19;;7461:37;:::i;:::-;7451:47;;7545:3;7534:9;7530:19;7517:33;7507:43;;7597:3;7586:9;7582:19;7569:33;7559:43;;6600:1008;;;;;;;;;;;;;:::o;7613:709::-;7726:6;7734;7742;7750;7758;7811:3;7799:9;7790:7;7786:23;7782:33;7779:53;;;7828:1;7825;7818:12;7779:53;7864:9;7851:23;7841:33;;7925:2;7914:9;7910:18;7897:32;7952:18;7944:6;7941:30;7938:50;;;7984:1;7981;7974:12;7938:50;8023:70;8085:7;8076:6;8065:9;8061:22;8023:70;:::i;:::-;8112:8;;-1:-1:-1;7997:96:1;-1:-1:-1;;8197:2:1;8182:18;;8169:32;8210:31;8169:32;8210:31;:::i;:::-;7613:709;;;;-1:-1:-1;7613:709:1;;8312:2;8297:18;8284:32;;7613:709;-1:-1:-1;;7613:709:1:o;8558:805::-;8671:6;8679;8687;8695;8703;8711;8719;8772:3;8760:9;8751:7;8747:23;8743:33;8740:53;;;8789:1;8786;8779:12;8740:53;8828:9;8815:23;8847:31;8872:5;8847:31;:::i;:::-;8897:5;-1:-1:-1;8954:2:1;8939:18;;8926:32;8967:33;8926:32;8967:33;:::i;:::-;9019:7;-1:-1:-1;9073:2:1;9058:18;;9045:32;;-1:-1:-1;9124:2:1;9109:18;;9096:32;;-1:-1:-1;9175:3:1;9160:19;;9147:33;;-1:-1:-1;9232:3:1;9217:19;;9204:33;9246;9204;9246;:::i;:::-;9298:7;9288:17;;;9352:3;9341:9;9337:19;9324:33;9314:43;;8558:805;;;;;;;;;;:::o;9368:874::-;9490:6;9498;9506;9514;9522;9530;9538;9546;9599:3;9587:9;9578:7;9574:23;9570:33;9567:53;;;9616:1;9613;9606:12;9567:53;9655:9;9642:23;9674:31;9699:5;9674:31;:::i;:::-;9724:5;-1:-1:-1;9781:2:1;9766:18;;9753:32;9794:33;9753:32;9794:33;:::i;:::-;9846:7;-1:-1:-1;9900:2:1;9885:18;;9872:32;;-1:-1:-1;9951:2:1;9936:18;;9923:32;;-1:-1:-1;10002:3:1;9987:19;;9974:33;;-1:-1:-1;10054:3:1;10039:19;;10026:33;;-1:-1:-1;10111:3:1;10096:19;;10083:33;10125;10083;10125;:::i;:::-;10177:7;10167:17;;;10231:3;10220:9;10216:19;10203:33;10193:43;;9368:874;;;;;;;;;;;:::o;11283:184::-;11335:77;11332:1;11325:88;11432:4;11429:1;11422:15;11456:4;11453:1;11446:15;11472:125;11512:4;11540:1;11537;11534:8;11531:34;;;11545:18;;:::i;:::-;-1:-1:-1;11582:9:1;;11472:125::o;11602:184::-;11654:77;11651:1;11644:88;11751:4;11748:1;11741:15;11775:4;11772:1;11765:15;11791:247;11850:6;11903:2;11891:9;11882:7;11878:23;11874:32;11871:52;;;11919:1;11916;11909:12;11871:52;11958:9;11945:23;11977:31;12002:5;11977:31;:::i;13922:184::-;13992:6;14045:2;14033:9;14024:7;14020:23;14016:32;14013:52;;;14061:1;14058;14051:12;14013:52;-1:-1:-1;14084:16:1;;13922:184;-1:-1:-1;13922:184:1:o;14413:245::-;14480:6;14533:2;14521:9;14512:7;14508:23;14504:32;14501:52;;;14549:1;14546;14539:12;14501:52;14581:9;14575:16;14600:28;14622:5;14600:28;:::i;15423:245::-;15502:6;15510;15563:2;15551:9;15542:7;15538:23;15534:32;15531:52;;;15579:1;15576;15569:12;15531:52;-1:-1:-1;;15602:16:1;;15658:2;15643:18;;;15637:25;15602:16;;15637:25;;-1:-1:-1;15423:245:1:o;16489:258::-;16561:1;16571:113;16585:6;16582:1;16579:13;16571:113;;;16661:11;;;16655:18;16642:11;;;16635:39;16607:2;16600:10;16571:113;;;16702:6;16699:1;16696:13;16693:48;;;-1:-1:-1;;16737:1:1;16719:16;;16712:27;16489:258::o;16752:274::-;16881:3;16919:6;16913:13;16935:53;16981:6;16976:3;16969:4;16961:6;16957:17;16935:53;:::i;:::-;17004:16;;;;;16752:274;-1:-1:-1;;16752:274:1:o;18270:128::-;18310:3;18341:1;18337:6;18334:1;18331:13;18328:39;;;18347:18;;:::i;:::-;-1:-1:-1;18383:9:1;;18270:128::o;18705:195::-;18744:3;18775:66;18768:5;18765:77;18762:103;;18845:18;;:::i;:::-;-1:-1:-1;18892:1:1;18881:13;;18705:195::o;20425:706::-;20656:6;20645:9;20638:25;20699:6;20694:2;20683:9;20679:18;20672:34;20754:42;20746:6;20742:55;20737:2;20726:9;20722:18;20715:83;20834:3;20829:2;20818:9;20814:18;20807:31;20619:4;20867:6;20861:13;20911:6;20905:3;20894:9;20890:19;20883:35;20927:67;20987:6;20981:3;20970:9;20966:19;20961:2;20953:6;20949:15;20927:67;:::i;:::-;21046:2;21034:15;21051:66;21030:88;21015:104;;;;21121:3;21011:114;;20425:706;-1:-1:-1;;;;;20425:706:1:o;21482:196::-;21521:3;21549:5;21539:39;;21558:18;;:::i;:::-;-1:-1:-1;21605:66:1;21594:78;;21482:196::o;22508:228::-;22548:7;22674:1;22606:66;22602:74;22599:1;22596:81;22591:1;22584:9;22577:17;22573:105;22570:131;;;22681:18;;:::i;:::-;-1:-1:-1;22721:9:1;;22508:228::o;22741:274::-;22781:1;22807;22797:189;;22842:77;22839:1;22832:88;22943:4;22940:1;22933:15;22971:4;22968:1;22961:15;22797:189;-1:-1:-1;23000:9:1;;22741:274::o;24167:251::-;24237:6;24290:2;24278:9;24269:7;24265:23;24261:32;24258:52;;;24306:1;24303;24296:12;24258:52;24338:9;24332:16;24357:31;24382:5;24357:31;:::i;24423:188::-;24502:13;;24555:30;24544:42;;24534:53;;24524:81;;24601:1;24598;24591:12;24616:684;24730:6;24738;24746;24754;24762;24770;24823:3;24811:9;24802:7;24798:23;24794:33;24791:53;;;24840:1;24837;24830:12;24791:53;24863:40;24893:9;24863:40;:::i;:::-;24853:50;;24922:49;24967:2;24956:9;24952:18;24922:49;:::i;:::-;24912:59;;25014:2;25003:9;24999:18;24993:25;25058:10;25051:5;25047:22;25040:5;25037:33;25027:61;;25084:1;25081;25074:12;25027:61;25107:5;-1:-1:-1;25131:49:1;25176:2;25161:18;;25131:49;:::i;:::-;25121:59;;25199:50;25244:3;25233:9;25229:19;25199:50;:::i;:::-;25189:60;;25289:3;25278:9;25274:19;25268:26;25258:36;;24616:684;;;;;;;;:::o
Swarm Source
ipfs://7a375ad13797da9ba0e826e4624fa693dbc00bccb223e40756b2c0729342a003
Loading...
Loading
Loading...
Loading
OVERVIEW
The Frax Protocol introduced the world to the concept of a cryptocurrency being partially backed by collateral and partially stabilized algorithmically. With the vision to create highly scalable, decentralized money in place of fixed-supply digital assets.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.