More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,116,639 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 106984320 | 1 min ago | IN | 0 FTM | 0.00313342 | ||||
Swap Exact Token... | 106984188 | 3 mins ago | IN | 0 FTM | 0.00313342 | ||||
Swap Exact Token... | 106984132 | 4 mins ago | IN | 0 FTM | 0.00313342 | ||||
Swap Exact Token... | 106983850 | 8 mins ago | IN | 0 FTM | 0.00313442 | ||||
Swap Exact Token... | 106981084 | 44 mins ago | IN | 0 FTM | 0.00313442 | ||||
Swap Exact Token... | 106980746 | 48 mins ago | IN | 0 FTM | 0.00313442 | ||||
Add Liquidity ET... | 106980166 | 55 mins ago | IN | 132 FTM | 0.00047351 | ||||
Swap Exact ETH F... | 106980085 | 56 mins ago | IN | 133 FTM | 0.00027266 | ||||
Swap Exact Token... | 106978295 | 1 hr ago | IN | 0 FTM | 0.00156858 | ||||
Swap Exact Token... | 106978271 | 1 hr ago | IN | 0 FTM | 0.00313422 | ||||
Swap Exact Token... | 106978256 | 1 hr ago | IN | 0 FTM | 0.00156858 | ||||
Swap Exact ETH F... | 106978195 | 1 hr ago | IN | 0.1 FTM | 0.00052339 | ||||
Swap Tokens For ... | 106976668 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106976661 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106976160 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975820 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975710 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975701 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975694 | 2 hrs ago | IN | 0 FTM | 0.05016095 | ||||
Swap Tokens For ... | 106975690 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975686 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975682 | 2 hrs ago | IN | 0 FTM | 0.05016095 | ||||
Swap Tokens For ... | 106975679 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975675 | 2 hrs ago | IN | 0 FTM | 0.053438 | ||||
Swap Tokens For ... | 106975673 | 2 hrs ago | IN | 0 FTM | 0.0701604 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
106980166 | 55 mins ago | 1 wei | ||||
106980166 | 55 mins ago | 131.99999999 FTM | ||||
106980085 | 56 mins ago | 133 FTM | ||||
106978195 | 1 hr ago | 0.1 FTM | ||||
106976668 | 2 hrs ago | 766.8 FTM | ||||
106976668 | 2 hrs ago | 766.8 FTM | ||||
106976661 | 2 hrs ago | 766.8 FTM | ||||
106976661 | 2 hrs ago | 766.8 FTM | ||||
106976160 | 2 hrs ago | 764.8 FTM | ||||
106976160 | 2 hrs ago | 764.8 FTM | ||||
106975820 | 2 hrs ago | 766.8 FTM | ||||
106975820 | 2 hrs ago | 766.8 FTM | ||||
106975710 | 2 hrs ago | 769.2 FTM | ||||
106975710 | 2 hrs ago | 769.2 FTM | ||||
106975707 | 2 hrs ago | 208.2271389 FTM | ||||
106975707 | 2 hrs ago | 208.2271389 FTM | ||||
106975701 | 2 hrs ago | 768.4 FTM | ||||
106975701 | 2 hrs ago | 768.4 FTM | ||||
106975694 | 2 hrs ago | 768.8 FTM | ||||
106975694 | 2 hrs ago | 768.8 FTM | ||||
106975690 | 2 hrs ago | 768.8 FTM | ||||
106975690 | 2 hrs ago | 768.8 FTM | ||||
106975686 | 2 hrs ago | 768.8 FTM | ||||
106975686 | 2 hrs ago | 768.8 FTM | ||||
106975682 | 2 hrs ago | 768.4 FTM |
Loading...
Loading
Contract Name:
WigoswapRouter
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-01-24 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IWigoswapRouter01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IWigoswapRouter is IWigoswapRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } interface IWigoswapFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IWigoswapPair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } library WigoswapLibrary { using SafeMath for uint256; // 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, "WigoswapLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "WigoswapLibrary: 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( uint256( keccak256( abi.encodePacked( hex"ff", factory, keccak256(abi.encodePacked(token0, token1)), hex"55c39e9406ff3c89a193882b4752879e73c8a0ce1222fe1de34c5e8f6482d9b6" // init code hash ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IWigoswapPair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "WigoswapLibrary: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "WigoswapLibrary: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "WigoswapLibrary: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "WigoswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(9981); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(10000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "WigoswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "WigoswapLibrary: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(10000); uint256 denominator = reserveOut.sub(amountOut).mul(9981); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "WigoswapLibrary: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i], path[i + 1] ); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "WigoswapLibrary: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } // 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: 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: 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: TRANSFER_FROM_FAILED" ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } } interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } contract WigoswapRouter is IWigoswapRouter { using SafeMath for uint256; address public immutable override factory; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "WigoswapRouter: 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, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IWigoswapFactory(factory).getPair(tokenA, tokenB) == address(0)) { IWigoswapFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = WigoswapLibrary.getReserves( factory, tokenA, tokenB ); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = WigoswapLibrary.quote( amountADesired, reserveA, reserveB ); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "WigoswapRouter: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = WigoswapLibrary.quote( amountBDesired, reserveB, reserveA ); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "WigoswapRouter: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB) = _addLiquidity( tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin ); address pair = WigoswapLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IWigoswapPair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = WigoswapLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IWigoswapPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = WigoswapLibrary.pairFor(factory, tokenA, tokenB); IWigoswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IWigoswapPair(pair).burn(to); (address token0, ) = WigoswapLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "WigoswapRouter: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "WigoswapRouter: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = WigoswapLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? uint256(-1) : liquidity; IWigoswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountA, amountB) = removeLiquidity( tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline ); } function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountETH) { address pair = WigoswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IWigoswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); (amountToken, amountETH) = removeLiquidityETH( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer( token, to, IERC20(token).balanceOf(address(this)) ); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountETH) { address pair = WigoswapLibrary.pairFor(factory, token, WETH); uint256 value = approveMax ? uint256(-1) : liquidity; IWigoswapPair(pair).permit( msg.sender, address(this), value, deadline, v, r, s ); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = WigoswapLibrary.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? WigoswapLibrary.pairFor(factory, output, path[i + 2]) : _to; IWigoswapPair(WigoswapLibrary.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = WigoswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = WigoswapLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "WigoswapRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "WigoswapRouter: INVALID_PATH"); amounts = WigoswapLibrary.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "WigoswapRouter: INVALID_PATH"); amounts = WigoswapLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= amountInMax, "WigoswapRouter: EXCESSIVE_INPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, "WigoswapRouter: INVALID_PATH"); amounts = WigoswapLibrary.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, "WigoswapRouter: INVALID_PATH"); amounts = WigoswapLibrary.getAmountsIn(factory, amountOut, path); require( amounts[0] <= msg.value, "WigoswapRouter: EXCESSIVE_INPUT_AMOUNT" ); IWETH(WETH).deposit{value: amounts[0]}(); assert( IWETH(WETH).transfer( WigoswapLibrary.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens( address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = WigoswapLibrary.sortTokens(input, output); IWigoswapPair pair = IWigoswapPair( WigoswapLibrary.pairFor(factory, input, output) ); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub( reserveInput ); amountOutput = WigoswapLibrary.getAmountOut( amountInput, reserveInput, reserveOutput ); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? WigoswapLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == WETH, "WigoswapRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert( IWETH(WETH).transfer( WigoswapLibrary.pairFor(factory, path[0], path[1]), amountIn ) ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, "WigoswapRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, WigoswapLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require( amountOut >= amountOutMin, "WigoswapRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return WigoswapLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return WigoswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return WigoswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return WigoswapLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) public view virtual override returns (uint256[] memory amounts) { return WigoswapLibrary.getAmountsIn(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":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b506040516200560d3803806200560d8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61548862000185600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f15280614342528061438552806146cf528061489a5280614dbd5280614eaa5280614f8452506154886000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fbe565b8560008151811061124a57fe5b60200260200101516140a9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614279915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144ea565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fbe565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140a9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614678915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b5051906149f5565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614678915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b5095945050505050565b6000610f44848484614a67565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b73565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614678915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fbe565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c4d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153726025913960400191505060405180910390fd5b89861015612fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061542e6025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e58565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614da0565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fbe565b90506132438d3383886140a9565b61324f8c3383876140a9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614da0565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fbe565b90506133fc8b3383886140a9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153e76023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806152f9602a913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b6000613e19856126fd6150cd565b90506000613e2782856150cd565b90506000613e4183613e3b886127106150cd565b90615153565b9050808281613e4c57fe5b04979650505050505050565b6060600282511015613ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ee357600080fd5b50604051908082528060200260200182016040528015613f0d578160200160208202803683370190505b5090508281600081518110613f1e57fe5b60200260200101818152505060005b6001835103811015613fb657600080613f7087868581518110613f4c57fe5b6020026020010151878660010181518110613f6357fe5b60200260200101516151c5565b91509150613f92848481518110613f8357fe5b60200260200101518383613d4c565b848460010181518110613fa157fe5b60209081029190910101525050600101613f2d565b509392505050565b6000806000613fcd8585614c4d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f55c39e9406ff3c89a193882b4752879e73c8a0ce1222fe1de34c5e8f6482d9b6609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061418757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141e9576040519150601f19603f3d011682016040523d82523d6000602084013e6141ee565b606091505b509150915081801561421c57508051158061421c575080806020019051602081101561421957600080fd5b50515b614271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061540a6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144e45760008084838151811061429757fe5b60200260200101518584600101815181106142ae57fe5b60200260200101519150915060006142c68383614c4d565b50905060008785600101815181106142da57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461432257826000614326565b6000835b91509150600060028a5103881061433d578861437e565b61437e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061437157fe5b6020026020010151613fbe565b90506143ab7f00000000000000000000000000000000000000000000000000000000000000008888613fbe565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143f5576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561446a578181015183820152602001614452565b50505050905090810190601f1680156144975780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144b957600080fd5b505af11580156144cd573d6000803e3d6000fd5b50506001909901985061427c975050505050505050565b50505050565b606060028251101561455d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561457557600080fd5b5060405190808252806020026020018201604052801561459f578160200160208202803683370190505b50905082816001835103815181106145b357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fb657600080614613878660018603815181106145ff57fe5b6020026020010151878681518110613f6357fe5b9150915061463584848151811061462657fe5b60200260200101518383614a67565b84600185038151811061464457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145e3565b60005b6001835103811015613d475760008084838151811061469657fe5b60200260200101518584600101815181106146ad57fe5b60200260200101519150915060006146c58383614c4d565b50905060006146f57f00000000000000000000000000000000000000000000000000000000000000008585613fbe565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561474357600080fd5b505afa158015614757573d6000803e3d6000fd5b505050506040513d606081101561476d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147b75782846147ba565b83835b91509150614829828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614836868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461487a5782600061487e565b6000835b91509150600060028c51038a10614895578a6148c9565b6148c97f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061437157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614979578181015183820152602001614961565b50505050905090810190601f1680156149a65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149c857600080fd5b505af11580156149dc573d6000803e3d6000fd5b50506001909b019a5061467b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615347602b913960400191505060405180910390fd5b600083118015614ad15750600082115b614b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b6000614b3e612710614b3886886150cd565b906150cd565b90506000614b526126fd614b3886896149f5565b9050614b696001828481614b6257fe5b0490615153565b9695505050505050565b6000808411614bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806152ae6024913960400191505060405180910390fd5b600083118015614bdd5750600082115b614c32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b82614c3d85846150cd565b81614c4457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153236024913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d0f578284614d12565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614d9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e6057600080fd5b505afa158015614e74573d6000803e3d6000fd5b505050506040513d6020811015614e8a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f7c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f4f57600080fd5b505af1158015614f63573d6000803e3d6000fd5b505050506040513d6020811015614f7957600080fd5b50505b600080614faa7f00000000000000000000000000000000000000000000000000000000000000008b8b6151c5565b91509150816000148015614fbc575080155b15614fcc578793508692506150c0565b6000614fd9898484614b73565b9050878111615046578581101561503b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061542e6025913960400191505060405180910390fd5b8894509250826150be565b6000615053898486614b73565b90508981111561505f57fe5b878110156150b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153726025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150e8575050808202828282816150e557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151d48585614c4d565b5090506000806151e5888888613fbe565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561522a57600080fd5b505afa15801561523e573d6000803e3d6000fd5b505050506040513d606081101561525457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461529b57808261529e565b81815b9099909850965050505050505056fe5769676f737761704c6962726172793a20494e53554646494349454e545f414d4f554e545769676f737761704c6962726172793a20494e53554646494349454e545f4c49515549444954595769676f737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545769676f737761704c6962726172793a204944454e544943414c5f4144445245535345535769676f737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545769676f73776170526f757465723a20494e53554646494349454e545f415f414d4f554e545769676f73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545769676f73776170526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45445769676f73776170526f757465723a20494e53554646494349454e545f425f414d4f554e54a26469706673582212203f25df4fa337c12b68fc9bc6709648cad51ca3f8c4c697c26477052d93a1406564736f6c634300060c0033000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba700000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8316146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838a8a8a308a612ccd565b9093509150610e96898685613a32565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c831686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6111207f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fbe565b8560008151811061124a57fe5b60200260200101516140a9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614279915050565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba784846144ea565b90505b92915050565b60008060006113ca7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78f8f613fbe565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c831686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61183d7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b6000806118fa7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78d7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83613fbe565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140a9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614678915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b5051906149f5565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c831685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614678915050565b60007f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b61227f7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba734888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e5892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615397602a913960400191505060405180910390fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b5095945050505050565b6000610f44848484614a67565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6125b37f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b6000610f44848484614b73565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b60003490507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614678915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6000612d6d7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78c8c613fbe565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c4d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153726025913960400191505060405180910390fd5b89861015612fc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061542e6025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba781565b60606113917f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78484613e58565b60008060006130787f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78e7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83613fbe565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614da0565b909450925060006132357f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78e8e613fbe565b90506132438d3383886140a9565b61324f8c3383876140a9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c838b348c8c614da0565b909450925060006133ee7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78c7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83613fbe565b90506133fc8b3383886140a9565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5769676f73776170526f757465723a2045585049524544000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5769676f73776170526f757465723a20494e56414c49445f5041544800000000604482015290519081900360640190fd5b6137ac7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144ea92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806153c16026913960400191505060405180910390fd5b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba789896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614279915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153e76023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806152f9602a913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b6000613e19856126fd6150cd565b90506000613e2782856150cd565b90506000613e4183613e3b886127106150cd565b90615153565b9050808281613e4c57fe5b04979650505050505050565b6060600282511015613ecb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ee357600080fd5b50604051908082528060200260200182016040528015613f0d578160200160208202803683370190505b5090508281600081518110613f1e57fe5b60200260200101818152505060005b6001835103811015613fb657600080613f7087868581518110613f4c57fe5b6020026020010151878660010181518110613f6357fe5b60200260200101516151c5565b91509150613f92848481518110613f8357fe5b60200260200101518383613d4c565b848460010181518110613fa157fe5b60209081029190910101525050600101613f2d565b509392505050565b6000806000613fcd8585614c4d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f55c39e9406ff3c89a193882b4752879e73c8a0ce1222fe1de34c5e8f6482d9b6609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061418757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161414a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141e9576040519150601f19603f3d011682016040523d82523d6000602084013e6141ee565b606091505b509150915081801561421c57508051158061421c575080806020019051602081101561421957600080fd5b50515b614271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061540a6024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144e45760008084838151811061429757fe5b60200260200101518584600101815181106142ae57fe5b60200260200101519150915060006142c68383614c4d565b50905060008785600101815181106142da57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461432257826000614326565b6000835b91509150600060028a5103881061433d578861437e565b61437e7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7878c8b6002018151811061437157fe5b6020026020010151613fbe565b90506143ab7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78888613fbe565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156143f5576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561446a578181015183820152602001614452565b50505050905090810190601f1680156144975780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144b957600080fd5b505af11580156144cd573d6000803e3d6000fd5b50506001909901985061427c975050505050505050565b50505050565b606060028251101561455d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561457557600080fd5b5060405190808252806020026020018201604052801561459f578160200160208202803683370190505b50905082816001835103815181106145b357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fb657600080614613878660018603815181106145ff57fe5b6020026020010151878681518110613f6357fe5b9150915061463584848151811061462657fe5b60200260200101518383614a67565b84600185038151811061464457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145e3565b60005b6001835103811015613d475760008084838151811061469657fe5b60200260200101518584600101815181106146ad57fe5b60200260200101519150915060006146c58383614c4d565b50905060006146f57f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78585613fbe565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561474357600080fd5b505afa158015614757573d6000803e3d6000fd5b505050506040513d606081101561476d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147b75782846147ba565b83835b91509150614829828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614836868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461487a5782600061487e565b6000835b91509150600060028c51038a10614895578a6148c9565b6148c97f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7898e8d6002018151811061437157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614979578181015183820152602001614961565b50505050905090810190601f1680156149a65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149c857600080fd5b505af11580156149dc573d6000803e3d6000fd5b50506001909b019a5061467b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ac1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180615347602b913960400191505060405180910390fd5b600083118015614ad15750600082115b614b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b6000614b3e612710614b3886886150cd565b906150cd565b90506000614b526126fd614b3886896149f5565b9050614b696001828481614b6257fe5b0490615153565b9695505050505050565b6000808411614bcd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806152ae6024913960400191505060405180910390fd5b600083118015614bdd5750600082115b614c32576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152d26027913960400191505060405180910390fd5b82614c3d85846150cd565b81614c4457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cd5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153236024913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d0f578284614d12565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614d9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f5769676f737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba773ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e6057600080fd5b505afa158015614e74573d6000803e3d6000fd5b505050506040513d6020811015614e8a57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f7c577f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba773ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f4f57600080fd5b505af1158015614f63573d6000803e3d6000fd5b505050506040513d6020811015614f7957600080fd5b50505b600080614faa7f000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba78b8b6151c5565b91509150816000148015614fbc575080155b15614fcc578793508692506150c0565b6000614fd9898484614b73565b9050878111615046578581101561503b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061542e6025913960400191505060405180910390fd5b8894509250826150be565b6000615053898486614b73565b90508981111561505f57fe5b878110156150b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806153726025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806150e8575050808202828282816150e557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151d48585614c4d565b5090506000806151e5888888613fbe565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561522a57600080fd5b505afa15801561523e573d6000803e3d6000fd5b505050506040513d606081101561525457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff8781169084161461529b57808261529e565b81815b9099909850965050505050505056fe5769676f737761704c6962726172793a20494e53554646494349454e545f414d4f554e545769676f737761704c6962726172793a20494e53554646494349454e545f4c49515549444954595769676f737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e545769676f737761704c6962726172793a204944454e544943414c5f4144445245535345535769676f737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545769676f73776170526f757465723a20494e53554646494349454e545f415f414d4f554e545769676f73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545769676f73776170526f757465723a204558434553534956455f494e5055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45445769676f73776170526f757465723a20494e53554646494349454e545f425f414d4f554e54a26469706673582212203f25df4fa337c12b68fc9bc6709648cad51ca3f8c4c697c26477052d93a1406564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba700000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
-----Decoded View---------------
Arg [0] : _factory (address): 0xC831A5cBfb4aC2Da5ed5B194385DFD9bF5bFcBa7
Arg [1] : _WETH (address): 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c831a5cbfb4ac2da5ed5b194385dfd9bf5bfcba7
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Deployed Bytecode Sourcemap
18144:21865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18625:10;:18;18639:4;18625:18;;18618:26;;;;18144:21865;;;;;23571:741;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23571:741:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38953:257;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38953:257:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32391:986;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32391:986:0;-1:-1:-1;32391:986:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39748:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39748:258:0;;-1:-1:-1;39748:258:0;;-1:-1:-1;;;;;39748:258:0:i;24320:930::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24320:930:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29036:763::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29036:763:0;-1:-1:-1;29036:763:0;;;;;;;;;:::i;31419:964::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31419:964:0;-1:-1:-1;31419:964:0;;;;;;;;;:::i;27060:931::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27060:931:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36086:780::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36086:780:0;-1:-1:-1;36086:780:0;;;;;;;;;:::i;37781:887::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37781:887:0;-1:-1:-1;37781:887:0;;;;;;;;;:::i;30556:855::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30556:855:0;-1:-1:-1;30556:855:0;;;;;;;;;:::i;39218:256::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39218:256:0;;;;;;;;;;;;:::i;29807:741::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29807:741:0;-1:-1:-1;29807:741:0;;;;;;;;;:::i;18277:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;38712:233;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38712:233:0;;;;;;;;;;;;:::i;26287:765::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26287:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36874:899::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36874:899:0;-1:-1:-1;36874:899:0;;;;;;;;;:::i;22603:960::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22603:960:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18229:41::-;;;;;;;;;;;;;:::i;39482:258::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39482:258:0;;-1:-1:-1;39482:258:0;;-1:-1:-1;;;;;39482:258:0:i;25258:950::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25258:950:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20488:949::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20488:949:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;21445:1115;;;;;;;;;;;;;;;;-1:-1:-1;21445:1115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33385:981::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33385:981:0;-1:-1:-1;33385:981:0;;;;;;;;;:::i;23571:741::-;23865:19;23886:17;23837:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23948:196:::1;23978:5;23998:4;24017:9;24041:14;24070:12;24105:4;24125:8;23948:15;:196::i;:::-;23921:223:::0;;-1:-1:-1;23921:223:0;-1:-1:-1;24155:51:0::1;24183:5:::0;24190:2;23921:223;24155:27:::1;:51::i;:::-;24223:4;24217:20;;;24238:9;24217:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24259:45;24290:2;24294:9;24259:30;:45::i;:::-;23571:741:::0;;;;;;;;;;:::o;38953:257::-;39104:17;39141:61;39170:8;39180:9;39191:10;39141:28;:61::i;:::-;39134:68;38953:257;-1:-1:-1;;;;38953:257:0:o;32391:986::-;32666:24;32638:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32716:29:::1;32741:4;32716:29;:4:::0;;32721:15;;;32716:21;;::::1;;;;;;;;;;;;;:29;;;32708:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32799:54;32829:7;32838:8;32848:4;;32799:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;32799:29:0::1;::::0;-1:-1:-1;;;32799:54:0:i:1;:::-;32789:64;;32917:12;32886:7;32911:1;32894:7;:14;:18;32886:27;;;;;;;;;;;;;;:43;;32864:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33010:179;33056:4;;33061:1;33056:7;;;;;;;;;;;;;;;33078:10;33103:50;33127:7;33136:4;;33141:1;33136:7;;;;;;;;;;;;;;;33145:4;;33150:1;33145:7;;;;;;;;;;;;;;;33103:23;:50::i;:::-;33168:7;33176:1;33168:10;;;;;;;;;;;;;;33010:31;:179::i;:::-;33200:35;33206:7;33215:4;;33200:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33229:4:0::1;::::0;-1:-1:-1;33200:5:0::1;::::0;-1:-1:-1;;33200:35:0:i:1;:::-;33252:4;33246:20;;;33267:7;33292:1;33275:7;:14;:18;33267:27;;;;;;;;;;;;;;33246:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33306:63;33337:2;33341:7;33366:1;33349:7;:14;:18;33341:27;;;;;;;;;;;;;;33306:30;:63::i;:::-;32391:986:::0;;;;;;;;;:::o;39748:258::-;39895:24;39944:54;39973:7;39982:9;39993:4;39944:28;:54::i;:::-;39937:61;;39748:258;;;;;:::o;24320:930::-;24665:15;24682;24710:12;24725:48;24749:7;24758:6;24766;24725:23;:48::i;:::-;24710:63;;24784:13;24800:10;:36;;24827:9;24800:36;;;24821:2;24800:36;24847:181;;;;;;24888:10;24847:181;;;;24921:4;24847:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24784:52;;-1:-1:-1;24847:26:0;;;;;;:181;;;;;-1:-1:-1;;24847:181:0;;;;;;;;-1:-1:-1;24847:26:0;:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25060:182;25090:6;25111;25132:9;25156:10;25181;25206:2;25223:8;25060:15;:182::i;:::-;25039:203;;;;;;;;24320:930;;;;;;;;;;;;;;;;:::o;29036:763::-;29314:24;29286:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29366:54:::1;29396:7;29405:8;29415:4;;29366:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29366:29:0::1;::::0;-1:-1:-1;;;29366:54:0:i:1;:::-;29356:64;;29484:12;29453:7;29478:1;29461:7;:14;:18;29453:27;;;;;;;;;;;;;;:43;;29431:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29577:179;29623:4;;29628:1;29623:7;;;;;;29577:179;29767:24;29773:7;29782:4;;29767:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;29788:2:0;;-1:-1:-1;29767:5:0::1;::::0;-1:-1:-1;;29767:24:0:i:1;31419:964::-:0;31694:24;31666:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31744:29:::1;31769:4;31744:29;:4:::0;;31749:15;;;31744:21;;::::1;;;;;;;;;;;;;:29;;;31736:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31827:54;31856:7;31865:9;31876:4;;31827:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31827:28:0::1;::::0;-1:-1:-1;;;31827:54:0:i:1;:::-;31817:64;;31928:11;31914:7;31922:1;31914:10;;;;;;;;;;;;;;:25;;31892:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27060:931:::0;27417:17;27447:12;27462:45;27486:7;27495:5;27502:4;27462:23;:45::i;:::-;27447:60;;27518:13;27534:10;:36;;27561:9;27534:36;;;27555:2;27534:36;27581:181;;;;;;27622:10;27581:181;;;;27655:4;27581:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27518:52;;-1:-1:-1;27581:26:0;;;;;;:181;;;;;-1:-1:-1;;27581:181:0;;;;;;;;-1:-1:-1;27581:26:0;:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27785:198;27847:5;27867:9;27891:14;27920:12;27947:2;27964:8;27785:47;:198::i;:::-;27773:210;27060:931;-1:-1:-1;;;;;;;;;;;;;27060:931:0:o;36086:780::-;36329:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36350:177:::1;36396:4;;36401:1;36396:7;;;;;;;;;;;;;;;36418:10;36443:50;36467:7;36476:4;;36481:1;36476:7;;;;;;;;;;;;;;;36485:4;;36490:1;36485:7;;;;;;36443:50;36508:8;36350:31;:177::i;:::-;36538:21;36569:4:::0;;36574:15;;;36569:21;;::::1;;;;;;;;;;;;;36562:39;;;36602:2;36562:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36562:43:0;36616:44:::1;::::0;;36562:43:::1;36616:44:::0;;::::1;::::0;;;;;;;;;;;36562:43;;-1:-1:-1;36616:44:0::1;::::0;;;36651:4;;;;;;36616:44;::::1;::::0;36651:4;;36616:44;36651:4;36616:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;36657:2:0;;-1:-1:-1;36616:34:0::1;::::0;-1:-1:-1;;36616:44:0:i:1;:::-;36776:12:::0;36693:62:::1;36741:13:::0;36700:4;;36705:15;;;36700:21;;::::1;;;;;;;;;;;;;36693:39;;;36733:2;36693:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;36693:43:0;;:47:::1;:62::i;:::-;:95;;36671:187;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18443:1;36086:780:::0;;;;;;;:::o;37781:887::-;38021:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38050:29:::1;38075:4;38050:29;:4:::0;;38055:15;;;38050:21;;::::1;;;;;;;;;;;;;:29;;;38042:70;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38123:177;38169:4;;38174:1;38169:7;;;;;;38123:177;38311:55;38346:4;;38311:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38360:4:0::1;::::0;-1:-1:-1;38311:34:0::1;::::0;-1:-1:-1;;38311:55:0:i:1;:::-;38377:17;38404:4;38397:22;;;38428:4;38397:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;38397:37:0;;-1:-1:-1;38467:25:0;;::::1;;38445:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38579:4;38573:20;;;38594:9;38573:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38615:45;38646:2;38650:9;38615:30;:45::i;30556:855::-:0;30821:24;30793:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30882:4:::1;30871:15;;:4;;30876:1;30871:7;;;;;;;;;;;;;;;:15;;;30863:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30940:55;30970:7;30979:9;30990:4;;30940:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30940:29:0::1;::::0;-1:-1:-1;;;30940:55:0:i:1;:::-;30930:65;;31059:12;31028:7;31053:1;31036:7;:14;:18;31028:27;;;;;;;;;;;;;;:43;;31006:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:4;31152:19;;;31179:7;31187:1;31179:10;;;;;;;;;;;;;;31152:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;31230:4;31224:20;;;31263:50;31287:7;31296:4;;31301:1;31296:7;;;;;;31263:50;31332:7;31340:1;31332:10;;;;;;;;;;;;;;31224:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;31224:133:0;31203:165:::1;;;;31379:24;31385:7;31394:4;;31379:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;31400:2:0;;-1:-1:-1;31379:5:0::1;::::0;-1:-1:-1;;31379:24:0:i:1;:::-;30556:855:::0;;;;;;;;:::o;39218:256::-;39369:16;39405:61;39433:9;39444;39455:10;39405:27;:61::i;29807:741::-;30085:24;30057:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30137:54:::1;30166:7;30175:9;30186:4;;30137:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;30137:28:0::1;::::0;-1:-1:-1;;;30137:54:0:i:1;:::-;30127:64;;30238:11;30224:7;30232:1;30224:10;;;;;;;;;;;;;;:25;;30202:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18277:38:::0;;;:::o;38712:233::-;38852:15;38887:50;38909:7;38918:8;38928;38887:21;:50::i;26287:765::-;26565:17;26546:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26611:196:::1;26641:5;26661:4;26680:9;26704:14;26733:12;26768:4;26788:8;26611:15;:196::i;:::-;26595:212;;;;;;26818:128;26860:5;26880:2;26904:5;26897:23;;;26929:4;26897:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26897:38:0;26818:27:::1;:128::i;:::-;26963:4;26957:20;;;26978:9;26957:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;26999:45;27030:2;27034:9;26999:30;:45::i;36874:899::-:0;37095:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37135:4:::1;37124:15;;:4;;37129:1;37124:7;;;;;;;;;;;;;;;:15;;;37116:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37183:16;37202:9;37183:28;;37228:4;37222:19;;;37249:8;37222:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37298:4;37292:20;;;37331:50;37355:7;37364:4;;37369:1;37364:7;;;;;;37331:50;37400:8;37292:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37292:131:0;37271:163:::1;;;;37445:21;37476:4:::0;;37481:15;;;37476:21;;::::1;;;;;;;;;;;;;37469:39;;;37509:2;37469:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;37469:43:0;37523:44:::1;::::0;;37469:43:::1;37523:44:::0;;::::1;::::0;;;;;;;;;;;37469:43;;-1:-1:-1;37523:44:0::1;::::0;;;37558:4;;;;;;37523:44;::::1;::::0;37558:4;;37523:44;37558:4;37523:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;37564:2:0;;-1:-1:-1;37523:34:0::1;::::0;-1:-1:-1;;37523:44:0:i:1;:::-;37683:12:::0;37600:62:::1;37648:13:::0;37607:4;;37612:15;;;37607:21;;::::1;;;;;;;;;;;;;37600:39;;;37640:2;37600:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;22603:960:::0;22914:15;22931;22886:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22964:12:::1;22979:48;23003:7;23012:6;23020;22979:23;:48::i;:::-;23038:61;::::0;;;;;23071:10:::1;23038:61;::::0;::::1;::::0;:32:::1;::::0;::::1;:61:::0;;;;;;;;;;;;;;22964:63;;-1:-1:-1;23038:32:0;;::::1;::::0;:61;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;23038:32:0;:61;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;23173:28:0::1;::::0;;;;;:24:::1;:28:::0;;::::1;;::::0;::::1;::::0;;;23137:15:::1;::::0;;;23173:24;;::::1;::::0;::::1;::::0;:28;;;;;;;;;;;23137:15;23173:24;:28;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23173:28:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;23173:28:0;-1:-1:-1;23213:14:0::1;23233:42;23260:6:::0;23268;23233:26:::1;:42::i;:::-;23212:63;;;23317:6;23307:16;;:6;:16;;;:84;;23374:7;23383;23307:84;;;23340:7;23349;23307:84;23286:105:::0;;-1:-1:-1;23286:105:0;-1:-1:-1;23410:21:0;;::::1;;23402:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23503:10;23492:7;:21;;23484:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18443:1;;;;22603:960:::0;;;;;;;;;;;:::o;18229:41::-;;;:::o;39482:258::-;39629:24;39678:54;39708:7;39717:8;39727:4;39678:29;:54::i;25258:950::-;25622:19;25643:17;25678:12;25693:45;25717:7;25726:5;25733:4;25693:23;:45::i;:::-;25678:60;;25749:13;25765:10;:36;;25792:9;25765:36;;;25786:2;25765:36;25812:181;;;;;;25853:10;25812:181;;;;25886:4;25812:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25749:52;;-1:-1:-1;25812:26:0;;;;;;:181;;;;;-1:-1:-1;;25812:181:0;;;;;;;;-1:-1:-1;25812:26:0;:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26031:169;26064:5;26084:9;26108:14;26137:12;26164:2;26181:8;26031:18;:169::i;:::-;26004:196;;;;-1:-1:-1;25258:950:0;-1:-1:-1;;;;;;;;;;;;;25258:950:0:o;20488:949::-;20850:15;20880;20910:17;20808:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20976:174:::1;21004:6;21025;21046:14;21075;21104:10;21129;20976:13;:174::i;:::-;20955:195:::0;;-1:-1:-1;20955:195:0;-1:-1:-1;21161:12:0::1;21176:48;21200:7;21209:6:::0;21217;21176:23:::1;:48::i;:::-;21161:63;;21235:66;21267:6;21275:10;21287:4;21293:7;21235:31;:66::i;:::-;21312;21344:6;21352:10;21364:4;21370:7;21312:31;:66::i;:::-;21415:4;21401:24;;;21426:2;21401:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;21401:28:0;20488:949;;;;-1:-1:-1;21401:28:0;;-1:-1:-1;20488:949:0;;-1:-1:-1;;;;;;;;;20488:949:0:o;21445:1115::-;21778:19;21812:17;21844;21736:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:176:::1;21944:5;21964:4;21983:18;22016:9;22040:14;22069:12;21916:13;:176::i;:::-;21889:203:::0;;-1:-1:-1;21889:203:0;-1:-1:-1;22103:12:0::1;22118:45;22142:7;22151:5:::0;22158:4:::1;22118:23;:45::i;:::-;22103:60;;22174:69;22206:5;22213:10;22225:4;22231:11;22174:31;:69::i;:::-;22260:4;22254:19;;;22281:9;22254:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;22317:4;22311:20;;;22332:4;22338:9;22311:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22311:37:0;22304:45:::1;;;;22386:4;22372:24;;;22397:2;22372:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;22372:28:0;;-1:-1:-1;22451:9:0::1;:21:::0;-1:-1:-1;22447:105:0::1;;;22487:65;22518:10;22542:9;22530;:21;22487:30;:65::i;:::-;18443:1;21445:1115:::0;;;;;;;;;;;:::o;33385:981::-;33647:24;33619:8;18389:15;18377:8;:27;;18369:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33708:4:::1;33697:15;;:4;;33702:1;33697:7;;;;;;;;;;;;;;;:15;;;33689:56;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33766:54;33795:7;33804:9;33815:4;;33766:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;33766:28:0::1;::::0;-1:-1:-1;;;33766:54:0:i:1;:::-;33756:64;;33867:9;33853:7;33861:1;33853:10;;;;;;;;;;;;;;:23;;33831:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33959:4;33953:19;;;33980:7;33988:1;33980:10;;;;;;;;;;;;;;33953:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;34031:4;34025:20;;;34064:50;34088:7;34097:4;;34102:1;34097:7;;;;;;34064:50;34133:7;34141:1;34133:10;;;;;;;;;;;;;;34025:133;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;34025:133:0;34004:165:::1;;;;34180:24;34186:7;34195:4;;34180:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;34201:2:0;;-1:-1:-1;34180:5:0::1;::::0;-1:-1:-1;;34180:24:0:i:1;:::-;34267:7;34275:1;34267:10;;;;;;;;;;;;;;34255:9;:22;34251:107;;;34292:66;34323:10;34347:7;34355:1;34347:10;;;;;;;;;;;;;;34335:9;:22;34292:30;:66::i;15819:459::-:0;16065:45;;;16040:10;16065:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16040:81;;;;16005:12;;16019:17;;16040:10;;;;16065:45;16040:81;;;16065:45;16040:81;;16065:45;16040:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16004:117;;;;16154:7;:57;;;;-1:-1:-1;16166:11:0;;:16;;:44;;;16197:4;16186:24;;;;;;;;;;;;;;;-1:-1:-1;16186:24:0;16166:44;16132:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15819:459;;;;;:::o;16803:200::-;16916:12;;;16876;16916;;;;;;;;;16894:7;;;;16909:5;;16894:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16875:54;;;16948:7;16940:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16803:200;;;:::o;12475:609::-;12611:17;12660:1;12649:8;:12;12641:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12753:1;12741:9;:13;:31;;;;;12771:1;12758:10;:14;12741:31;12719:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12850:23;12876:18;:8;12889:4;12876:12;:18::i;:::-;12850:44;-1:-1:-1;12905:17:0;12925:31;12850:44;12945:10;12925:19;:31::i;:::-;12905:51;-1:-1:-1;12967:19:0;12989:41;13014:15;12989:20;:9;13003:5;12989:13;:20::i;:::-;:24;;:41::i;:::-;12967:63;;13065:11;13053:9;:23;;;;;;;12475:609;-1:-1:-1;;;;;;;12475:609:0:o;13848:628::-;13986:24;14046:1;14031:4;:11;:16;;14023:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14116:4;:11;14102:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14102:26:0;;14092:36;;14152:8;14139:7;14147:1;14139:10;;;;;;;;;;;;;:21;;;;;14176:9;14171:298;14205:1;14191:4;:11;:15;14187:1;:19;14171:298;;;14229:17;14248:18;14270:108;14300:7;14326:4;14331:1;14326:7;;;;;;;;;;;;;;14352:4;14357:1;14361;14357:5;14352:11;;;;;;;;;;;;;;14270;:108::i;:::-;14228:150;;;;14410:47;14423:7;14431:1;14423:10;;;;;;;;;;;;;;14435:9;14446:10;14410:12;:47::i;:::-;14393:7;14401:1;14405;14401:5;14393:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;14208:3:0;;14171:298;;;;13848:628;;;;;:::o;10641:651::-;10764:12;10790:14;10806;10824:26;10835:6;10843;10824:10;:26::i;:::-;11069:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11059:43;;;;;;10948:291;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10916:342;;;;;;;;;10641:651;-1:-1:-1;;;;;10641:651:0:o;16286:509::-;16571:51;;;16546:10;16571:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16546:87;;;;16511:12;;16525:17;;16546:10;;;;16571:51;16546:87;;;16571:51;16546:87;;16571:51;16546:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16510:123;;;;16666:7;:57;;;;-1:-1:-1;16678:11:0;;:16;;:44;;;16709:4;16698:24;;;;;;;;;;;;;;;-1:-1:-1;16698:24:0;16678:44;16644:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16286:509;;;;;;:::o;28102:926::-;28246:9;28241:780;28275:1;28261:4;:11;:15;28257:1;:19;28241:780;;;28299:13;28314:14;28333:4;28338:1;28333:7;;;;;;;;;;;;;;28342:4;28347:1;28351;28347:5;28342:11;;;;;;;;;;;;;;28298:56;;;;28370:14;28390:41;28417:5;28424:6;28390:26;:41::i;:::-;28369:62;;;28446:17;28466:7;28474:1;28478;28474:5;28466:14;;;;;;;;;;;;;;28446:34;;28496:18;28516;28547:6;28538:15;;:5;:15;;;:101;;28617:9;28636:1;28538:101;;;28582:1;28586:9;28538:101;28495:144;;;;28654:10;28685:1;28671:4;:11;:15;28667:1;:19;:115;;28779:3;28667:115;;;28706:53;28730:7;28739:6;28747:4;28752:1;28756;28752:5;28747:11;;;;;;;;;;;;;;28706:23;:53::i;:::-;28654:128;;28811:47;28835:7;28844:5;28851:6;28811:23;:47::i;:::-;28797:67;;;28887:10;28920;28953:2;28988:1;28978:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28978:12:0;;28797:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28278:3:0;;;;;-1:-1:-1;28241:780:0;;-1:-1:-1;;;;;;;;28241:780:0;;;28102:926;;;:::o;14557:649::-;14695:24;14755:1;14740:4;:11;:16;;14732:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14825:4;:11;14811:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14811:26:0;;14801:36;;14878:9;14848:7;14873:1;14856:7;:14;:18;14848:27;;;;;;;;;;;;;;;;;:39;14915:11;;:15;;14898:301;14932:5;;14898:301;;14960:17;14979:18;15001:108;15031:7;15057:4;15066:1;15062;:5;15057:11;;;;;;;;;;;;;;15087:4;15092:1;15087:7;;;;;;;15001:108;14959:150;;;;15141:46;15153:7;15161:1;15153:10;;;;;;;;;;;;;;15165:9;15176:10;15141:11;:46::i;:::-;15124:7;15136:1;15132;:5;15124:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;14939:3:0;;14898:301;;34513:1565;34651:9;34646:1425;34680:1;34666:4;:11;:15;34662:1;:19;34646:1425;;;34704:13;34719:14;34738:4;34743:1;34738:7;;;;;;;;;;;;;;34747:4;34752:1;34756;34752:5;34747:11;;;;;;;;;;;;;;34703:56;;;;34775:14;34795:41;34822:5;34829:6;34795:26;:41::i;:::-;34774:62;;;34851:18;34904:47;34928:7;34937:5;34944:6;34904:23;:47::i;:::-;34851:115;;34981:19;35015:20;35127:16;35145;35167:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35167:18:0;;;;;;;35126:59;;;;;-1:-1:-1;35126:59:0;;-1:-1:-1;35205:20:0;;35252:15;;;;;;;;:103;;35336:8;35346;35252:103;;;35292:8;35302;35252:103;35204:151;;;;35388:96;35453:12;35395:5;35388:23;;;35420:4;35388:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:96;35374:110;;35518:152;35569:11;35603:12;35638:13;35518:28;:152::i;:::-;35503:167;;34646:1425;;;;35701:18;35721;35752:6;35743:15;;:5;:15;;;:107;;35825:12;35847:1;35743:107;;;35787:1;35791:12;35743:107;35700:150;;;;35865:10;35896:1;35882:4;:11;:15;35878:1;:19;:115;;35990:3;35878:115;;;35917:53;35941:7;35950:6;35958:4;35963:1;35967;35963:5;35958:11;;;;;;;35917:53;36046:12;;;36056:1;36046:12;;;;;;;;;;36008:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;35865:128;;-1:-1:-1;36008:9:0;;;;;;36018:10;;36030;;35865:128;;36046:12;;36008:51;;;;;;;;36046:12;;36008:51;;;;36046:12;;36008:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34683:3:0;;;;;-1:-1:-1;34646:1425:0;;-1:-1:-1;;;;;;;;;;34646:1425:0;9673:138;9766:5;;;9761:16;;;;9753:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13205:561;13341:16;13390:1;13378:9;:13;13370:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13484:1;13472:9;:13;:31;;;;;13502:1;13489:10;:14;13472:31;13450:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13581:17;13601:35;13630:5;13601:24;:9;13615;13601:13;:24::i;:::-;:28;;:35::i;:::-;13581:55;-1:-1:-1;13647:19:0;13669:35;13699:4;13669:25;:10;13684:9;13669:14;:25::i;:35::-;13647:57;;13726:32;13756:1;13739:11;13727:9;:23;;;;;;;13726:29;:32::i;:::-;13715:43;13205:561;-1:-1:-1;;;;;;13205:561:0:o;11951:402::-;12076:15;12122:1;12112:7;:11;12104:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12208:1;12197:8;:12;:28;;;;;12224:1;12213:8;:12;12197:28;12175:117;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12337:8;12313:21;:7;12325:8;12313:11;:21::i;:::-;:32;;;;;;;11951:402;-1:-1:-1;;;;11951:402:0:o;10144:405::-;10246:14;10262;10312:6;10302:16;;:6;:16;;;;10294:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10398:6;10389:15;;:6;:15;;;:79;;10453:6;10461;10389:79;;;10421:6;10429;10389:79;10370:98;;-1:-1:-1;10370:98:0;-1:-1:-1;10487:20:0;;;10479:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10144:405;;;;;:::o;18747:1733::-;18977:15;18994;19139:1;19078:63;;19095:7;19078:33;;;19112:6;19120;19078:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19078:49:0;:63;;;19074:148;;;19175:7;19158:36;;;19195:6;19203;19158:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19074:148:0;19233:16;19251;19271:102;19313:7;19335:6;19356;19271:27;:102::i;:::-;19232:141;;;;19388:8;19400:1;19388:13;:30;;;;-1:-1:-1;19405:13:0;;19388:30;19384:1089;;;19457:14;;-1:-1:-1;19473:14:0;;-1:-1:-1;19384:1089:0;;;19521:22;19546:123;19586:14;19619:8;19646;19546:21;:123::i;:::-;19521:148;;19706:14;19688;:32;19684:778;;19789:10;19771:14;:28;;19741:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19921:14;;-1:-1:-1;19937:14:0;-1:-1:-1;19937:14:0;19684:778;;;19993:22;20018:139;20062:14;20099:8;20130;20018:21;:139::i;:::-;19993:164;;20201:14;20183;:32;;20176:40;;;;20283:10;20265:14;:28;;20235:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20415:14;-1:-1:-1;20431:14:0;;-1:-1:-1;19684:778:0;19384:1089;;18747:1733;;;;;;;;;;;:::o;9819:151::-;9877:9;9907:6;;;:30;;-1:-1:-1;;9922:5:0;;;9936:1;9931;9922:5;9931:1;9917:15;;;;;:20;9907:30;9899:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9528:137;9621:5;;;9616:16;;;;9608:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11350:488;11477:16;11495;11525:14;11545:26;11556:6;11564;11545:10;:26::i;:::-;11524:47;;;11583:16;11601;11651:32;11659:7;11668:6;11676;11651:7;:32::i;:::-;11623:83;;;:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11623:85:0;;;;;;;11582:126;;;;;-1:-1:-1;11582:126:0;;-1:-1:-1;11742:16:0;;;;;;;;:88;;11811:8;11821;11742:88;;;11775:8;11785;11742:88;11719:111;;;;-1:-1:-1;11350:488:0;-1:-1:-1;;;;;;;11350:488:0:o
Swarm Source
ipfs://3f25df4fa337c12b68fc9bc6709648cad51ca3f8c4c697c26477052d93a14065
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.