More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 12,798,378 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Liquidity... | 59496355 | 8 mins ago | IN | 0 ETH | 0.00001797 | ||||
Remove Liquidity... | 59495160 | 55 mins ago | IN | 0 ETH | 0.00005873 | ||||
Remove Liquidity... | 59493545 | 2 hrs ago | IN | 0 ETH | 0.00001172 | ||||
Remove Liquidity... | 59493421 | 2 hrs ago | IN | 0 ETH | 0.00001519 | ||||
Remove Liquidity... | 59493258 | 2 hrs ago | IN | 0 ETH | 0.00001177 | ||||
Remove Liquidity... | 59493187 | 2 hrs ago | IN | 0 ETH | 0.00001177 | ||||
Remove Liquidity... | 59493159 | 2 hrs ago | IN | 0 ETH | 0.00001851 | ||||
Remove Liquidity... | 59491155 | 3 hrs ago | IN | 0 ETH | 0.00001796 | ||||
Remove Liquidity... | 59490388 | 4 hrs ago | IN | 0 ETH | 0.00001284 | ||||
Add Liquidity ET... | 59490316 | 4 hrs ago | IN | 0.00025358 ETH | 0.00001082 | ||||
Remove Liquidity... | 59490145 | 4 hrs ago | IN | 0 ETH | 0.00001249 | ||||
Remove Liquidity... | 59489833 | 4 hrs ago | IN | 0 ETH | 0.00001381 | ||||
Remove Liquidity... | 59489622 | 4 hrs ago | IN | 0 ETH | 0.00002351 | ||||
Remove Liquidity... | 59489004 | 5 hrs ago | IN | 0 ETH | 0.00001022 | ||||
Remove Liquidity... | 59488622 | 5 hrs ago | IN | 0 ETH | 0.00001376 | ||||
Swap Exact Token... | 59488543 | 5 hrs ago | IN | 0 ETH | 0.00001009 | ||||
Remove Liquidity... | 59488340 | 5 hrs ago | IN | 0 ETH | 0.00001344 | ||||
Swap Exact Token... | 59488259 | 5 hrs ago | IN | 0 ETH | 0.00002111 | ||||
Remove Liquidity... | 59484238 | 7 hrs ago | IN | 0 ETH | 0.00002158 | ||||
Remove Liquidity... | 59483415 | 8 hrs ago | IN | 0 ETH | 0.00002782 | ||||
Remove Liquidity... | 59482225 | 9 hrs ago | IN | 0 ETH | 0.00002921 | ||||
Remove Liquidity... | 59480169 | 10 hrs ago | IN | 0 ETH | 0.00001452 | ||||
Remove Liquidity... | 59476801 | 12 hrs ago | IN | 0 ETH | 0.00003438 | ||||
Remove Liquidity... | 59475727 | 13 hrs ago | IN | 0 ETH | 0.00004554 | ||||
Remove Liquidity... | 59475588 | 13 hrs ago | IN | 0 ETH | 0.00001579 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
59496355 | 8 mins ago | 0.00055846 ETH | ||||
59496355 | 8 mins ago | 0.00055846 ETH | ||||
59495160 | 55 mins ago | 0.00005513 ETH | ||||
59495160 | 55 mins ago | 0.00005513 ETH | ||||
59493545 | 2 hrs ago | 0.0038605 ETH | ||||
59493545 | 2 hrs ago | 0.0038605 ETH | ||||
59493421 | 2 hrs ago | 0.00386059 ETH | ||||
59493421 | 2 hrs ago | 0.00386059 ETH | ||||
59493258 | 2 hrs ago | 0.00553368 ETH | ||||
59493258 | 2 hrs ago | 0.00553368 ETH | ||||
59493187 | 2 hrs ago | 0.00547803 ETH | ||||
59493187 | 2 hrs ago | 0.00547803 ETH | ||||
59493159 | 2 hrs ago | 0.00112035 ETH | ||||
59493159 | 2 hrs ago | 0.00112035 ETH | ||||
59491178 | 3 hrs ago | 0.00458202 ETH | ||||
59491178 | 3 hrs ago | 0.00458202 ETH | ||||
59491155 | 3 hrs ago | 0.00540997 ETH | ||||
59491155 | 3 hrs ago | 0.00540997 ETH | ||||
59490388 | 4 hrs ago | 0.00185351 ETH | ||||
59490388 | 4 hrs ago | 0.00185351 ETH | ||||
59490316 | 4 hrs ago | 0.00025358 ETH | ||||
59490316 | 4 hrs ago | 0.00025358 ETH | ||||
59490145 | 4 hrs ago | 0.00270492 ETH | ||||
59490145 | 4 hrs ago | 0.00270492 ETH | ||||
59489833 | 4 hrs ago | 0.00270271 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MuteSwitchRouterDynamic
Compiler Version
v0.8.12+commit.f00d7308
ZkSolc Version
v1.3.5
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@matterlabs/signature-checker/contracts/SignatureChecker.sol"; import '../interfaces/IMuteSwitchFactoryDynamic.sol'; import '../libraries/TransferHelper.sol'; import '../interfaces/IMuteSwitchPairDynamic.sol'; import '../interfaces/IMuteSwitchRouterDynamic.sol'; import '../libraries/SafeMath.sol'; import '../interfaces/IERC20.sol'; import '../interfaces/IWETH.sol'; contract MuteSwitchRouterDynamic is IMuteSwitchRouterDynamic { using SafeMath for uint; address public immutable override factory; address public WETH; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'MuteSwitch: EXPIRED'); _; } constructor(address _factory, address _weth) { factory = _factory; WETH = _weth; } receive() external payable { require(msg.sender == address(WETH), "MuteSwitch::receive callback not WETH"); // only accept ETH via fallback from the WETH contract } fallback() external payable { } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, uint feeType, bool stable ) internal virtual returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet if (IMuteSwitchFactoryDynamic(factory).getPair(tokenA, tokenB, stable) == address(0)) { IMuteSwitchFactoryDynamic(factory).createPair(tokenA, tokenB, feeType, stable); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'MuteSwitch: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = quote(amountBDesired, reserveB, reserveA); require(amountAOptimal <= amountADesired, "MuteSwitch: INSUFFICIENT_OPTIMAL"); require(amountAOptimal >= amountAMin, 'MuteSwitch: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline, uint feeType, bool stable ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, feeType, stable); address pair = pairFor(tokenA, tokenB, stable); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IMuteSwitchPairDynamic(pair).mint(to); } function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline, uint feeType, bool stable ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin, feeType, stable ); address pair = pairFor(token, WETH, stable); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); require(IWETH(WETH).transfer(pair, amountETH), "MuteSwitch::addLiquidityETH: FAILED_WETH_TRANSFER"); liquidity = IMuteSwitchPairDynamic(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool stable ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); IMuteSwitchPairDynamic(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint amount0, uint amount1) = IMuteSwitchPairDynamic(pair).burn(to); (address token0,) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'MuteSwitch: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'MuteSwitch: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool stable ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline, stable ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } /* function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, bytes memory sig ) external returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; IMuteSwitchPairDynamic(pair).permit(msg.sender, address(this), value, deadline, sig); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline, stable); } function removeLiquidityETHWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bytes memory sig ) public returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(WETH), stable); IMuteSwitchPairDynamic(pair).permit(msg.sender, address(this), liquidity, deadline, sig); (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline, stable); } */ // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool stable ) public virtual override ensure(deadline) returns (uint amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline, stable ); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, address[] memory path, address _to, bool[] memory stable) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); bool _stable = stable[i]; (address token0,) = sortTokens(input, output); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < path.length - 2 ? pairFor(output, path[i + 2], stable[i + 1]) : _to; IMuteSwitchPairDynamic(pairFor(input, output, _stable)).swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external virtual override ensure(deadline) returns (uint[] memory amounts) { (amounts, , ) = getAmountsOut(amountIn, path, stable); require(amounts[amounts.length - 1] >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1], stable[0]), amounts[0] ); _swap(amounts, path, to, stable); } function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable) external virtual override payable ensure(deadline) returns (uint[] memory amounts) { require(path[0] == WETH, 'MuteSwitch: INVALID_PATH'); (amounts, , ) = getAmountsOut(msg.value, path, stable); require(amounts[amounts.length - 1] >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(WETH).deposit{value: amounts[0]}(); require(IWETH(WETH).transfer(pairFor(path[0], path[1], stable[0]), amounts[0]), "MuteSwitch::swapExactETHForTokens: FAILED_WETH_TRANSFER"); _swap(amounts, path, to, stable); } function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable) external virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[path.length - 1] == WETH, 'MuteSwitch: INVALID_PATH'); (amounts, , ) = getAmountsOut(amountIn, path, stable); require(amounts[amounts.length - 1] >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1], stable[0]), amounts[0] ); _swap(amounts, path, address(this), stable); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to, bool[] memory stable) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0,) = sortTokens(input, output); IMuteSwitchPairDynamic pair = IMuteSwitchPairDynamic(pairFor(input, output, stable[i])); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1,) = pair.getReserves(); (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput); amountOutput = pair.getAmountOut(amountInput, input); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < path.length - 2 ? pairFor(output, path[i + 2], stable[i + 1]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1], stable[0]), amountIn ); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to, stable); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external virtual override payable ensure(deadline) { require(path[0] == WETH, 'MuteSwitch: INVALID_PATH'); uint amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); require(IWETH(WETH).transfer(pairFor(path[0], path[1], stable[0]), amountIn), "MuteSwitch::swapExactETHForTokens: FAILED_WETH_TRANSFER"); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to, stable); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, 'MuteSwitch: INVALID_PATH'); TransferHelper.safeTransferFrom( path[0], msg.sender, pairFor(path[0], path[1], stable[0]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this), stable); uint amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, 'MuteSwitch: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } function getPairInfo(address[] memory path, bool stable) public view returns(address tokenA, address tokenB, address pair, uint reserveA, uint reserveB, uint fee) { (tokenA, tokenB) = sortTokens(path[0], path[1]); (reserveA, reserveB) = getReserves(path[0], path[1], stable); pair = pairFor(path[0], path[1], stable); fee = IMuteSwitchPairDynamic(pair).pairFee(); } // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, 'MuteSwitchLibrary: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'MuteSwitchLibrary: ZERO_ADDRESS'); } // fetches pair address for tokens from factory function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { pair = IMuteSwitchFactoryDynamic(factory).getPair(tokenA, tokenB, stable); } // calculates the CREATE2 address for a pair without making any external calls function pairForIndirect(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1, stable)), IMuteSwitchFactoryDynamic(factory).pairCodeHash() // init code hash ))))); } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IMuteSwitchPairDynamic(pairFor(tokenA, tokenB, stable)).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(uint amountA, uint reserveA, uint reserveB) public pure returns (uint amountB) { require(amountA > 0, 'MuteSwitchLibrary: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'MuteSwitchLibrary: INSUFFICIENT_LIQUIDITY'); amountB = amountA.mul(reserveB).div(reserveA); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amountOut, bool stable, uint fee) { address pair = pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; uint feeStable; uint feeVolatile; if (pair != address(0)) { amountStable = IMuteSwitchPairDynamic(pair).getAmountOut(amountIn, tokenIn); feeStable = IMuteSwitchPairDynamic(pair).pairFee(); } pair = pairFor(tokenIn, tokenOut, false); if (pair != address(0)) { amountVolatile = IMuteSwitchPairDynamic(pair).getAmountOut(amountIn, tokenIn); feeVolatile = IMuteSwitchPairDynamic(pair).pairFee(); } return amountStable > amountVolatile ? (amountStable, true, feeStable) : (amountVolatile, false, feeVolatile); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOutExpanded(uint amountIn, address[] memory path) public view returns (uint[] memory amounts, bool[] memory stable, uint[] memory fees) { require(path.length >= 2, 'MuteSwitchLibrary: INVALID_PATH'); amounts = new uint[](path.length); stable = new bool[](path.length); fees = new uint[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { (uint _am, bool _stable, uint _fee) = getAmountOut(amounts[i], path[i], path[i + 1]); amounts[i+1] = _am; stable[i] = _stable; fees[i] = _fee; } } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint amountIn, address[] memory path, bool[] memory stable) public view returns (uint[] memory amounts, bool[] memory _stable, uint[] memory fees) { require(path.length >= 2, 'MuteSwitchLibrary: INVALID_PATH'); amounts = new uint[](path.length); fees = new uint[](path.length); _stable = new bool[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { address pair = pairFor(path[i], path[i + 1], stable[i]); if (pair != address(0)) { amounts[i+1] = IMuteSwitchPairDynamic(pair).getAmountOut(amounts[i], path[i]); _stable[i] = stable[i]; fees[i] = IMuteSwitchPairDynamic(pair).pairFee(); } } } }
pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/interfaces/IERC1271.sol"; library SignatureChecker { /** * @dev Checks the signature of an account using ecrecover. * In the future, it will use EIP-1271 to validate signatures of AA contracts. */ function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature); if (error == ECDSA.RecoverError.NoError && recovered == signer) { return true; } (bool success, bytes memory result) = signer.staticcall( abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature) ); return (success && result.length == 32 && abi.decode(result, (bytes32)) == bytes32(IERC1271.isValidSignature.selector)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271 { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMuteSwitchFactoryDynamic { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function protocolFeeFixed() external view returns (uint256); function protocolFeeDynamic() external view returns (uint256); function getPair(address tokenA, address tokenB, bool stable) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB, uint feeType, bool stable) external returns (address pair); function setFeeTo(address) external; function pairCodeHash() external pure returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMuteSwitchPairDynamic { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function stable() external pure returns (bool); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, bytes memory sig) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function pairFee() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function claimFees() external returns (uint claimed0, uint claimed1); function claimFeesView(address recipient) external view returns (uint claimed0, uint claimed1); function initialize(address, address, uint, bool) external; function getAmountOut(uint, address) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMuteSwitchRouterDynamic { function WETH() external view returns (address); function factory() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline, uint feeType, bool stable ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline, uint feeType, bool stable ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool stable ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool stable ) external returns (uint amountToken, uint amountETH); function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool stable ) external returns (uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable) external payable returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable) external returns (uint[] memory amounts); function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external; function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline, bool[] calldata stable ) external; function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amountOut, bool stable, uint fee); function getAmountsOutExpanded(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts, bool[] memory stable, uint[] memory fees); function getAmountsOut(uint amountIn, address[] calldata path, bool[] calldata stable) external view returns (uint[] memory amounts, bool[] memory _stable, uint[] memory fees); function getPairInfo(address[] calldata path, bool stable) external view returns(address tokenA, address tokenB, address pair, uint reserveA, uint reserveB, uint fee); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
{ "optimizer": { "enabled": true } }
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"},{"stateMutability":"payable","type":"fallback"},{"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"},{"internalType":"uint256","name":"feeType","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"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"},{"internalType":"uint256","name":"feeType","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool[]","name":"_stable","type":"bool[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOutExpanded","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool[]","name":"stable","type":"bool[]"},{"internalType":"uint256[]","name":"fees","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getPairInfo","outputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairForIndirect","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"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"},{"internalType":"bool","name":"stable","type":"bool"}],"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"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"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"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"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"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"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"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"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"},{"internalType":"bool[]","name":"stable","type":"bool[]"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000711928a98370fd2e9d9284080c99b8fd2b776c00196401c68e16481bf3e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004000000000000000000000000040be1cba6c5b47cdf9da7f963b6f761f4c60627d0000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
Deployed Bytecode
0x0004000000000002000100000000000200000000030100190000006003300270000006ba0430019700030000004103550002000000010355000006ba0030019d000100000000001f00000001012001900000004d0000c13d0000008001000039000000400010043f0000000001000031000000040210008c0000005f0000413d0000000202000367000000000202043b000000e002200270000006c00320009c000000ad0000613d000006c10320009c000000b80000613d000006c20320009c000000c60000613d000006c30320009c000001cf0000613d000006c40320009c000000d00000613d000006c50320009c000000dc0000613d000006c60320009c000000e60000613d000006c70320009c000000f20000613d000006c80120009c000000f80000613d000006c90120009c000001080000613d000006ca0120009c0000011c0000613d000006cb0120009c0000012a0000613d000006cc0120009c0000013e0000613d000006cd0120009c0000014a0000613d000006ce0120009c000001590000613d000006cf0120009c000001650000613d000006d00120009c000001710000613d000006d10120009c0000018b0000613d000006d20120009c000001a00000613d000006d30120009c000001af0000613d000006d40120009c000001c30000613d000006d50120009c000000660000c13d0000000001000416000000000110004c000000930000c13d00000000010000311ae304f80000040f1ae309610000040f000000400300043d0000002004300039000000000024043500000000001304350000004002000039000000000103001900000000030000191ae302760000040f000000a001000039000000400010043f0000000001000416000000000110004c000000930000c13d0000000001000031000000bf02100039000000200300008a000000000232016f0000009f0320008c0000006a0000213d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000110004c000000660000c13d1ae3059c0000040f0000000001000019000000000200001900000000030000191ae302760000040f0000000001000019000000000200001900000000030000191ae302760000040f000000400020043f0000001f0210018f00000002030003670000000504100272000000780000613d00000000050000190000000506500210000000000763034f000000000707043b000000a00660003900000000007604350000000105500039000000000645004b000000700000413d000000000520004c000000870000613d0000000504400210000000000343034f0000000302200210000000a004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000006bb02000041000000400310008c00000000030000190000000003024019000006bb01100197000000000410004c000000000200a019000006bb0110009c00000000010300190000000001026019000000000110004c000000960000613d000000000100001900000000020000191ae302800000040f000000a0010000391ae302890000040f000100000001001d000000c0010000391ae302890000040f0000000102000029000000800020043f000006bc01100197000000000200041a000006bd02200197000000000112019f000000000010041b000000800100043d00000140000004430000016000100443000000200100003900000100001004430000000101000039000001200010044300000100010000390000008002000039000006be030000411ae302760000040f1ae302ad0000040f1ae30cce0000040f0000000002010019000000400100043d000100000001001d1ae302e60000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae302f50000040f1ae308970000040f000000400300043d0000002004300039000000000024043500000000001304350000004002000039000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303220000040f1ae30f1e0000040f000000400100043d000000000200001900000000030000191ae302760000040f1ae303900000040f1ae307660000040f000000400400043d000000200540003900000000002504350000004002400039000000000032043500000000001404350000006002000039000000000104001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303220000040f1ae3130a0000040f000000400100043d000000000200001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303bb0000040f1ae314c60000040f000006bc02100197000000400100043d0000000000210435000000200200003900000000030000191ae302760000040f1ae302ad0000040f1ae311930000040f000000400100043d000000000200001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303dc0000040f1ae3149a0000040f000006bc02200197000000400300043d00000020043000390000000000240435000006bc0110019700000000001304350000004002000039000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303f60000040f1ae3165d0000040f000000000401001900000000050200190000000006030019000000400100043d000100000001001d0000000002040019000000000305001900000000040600191ae304120000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303bb0000040f1ae315cb0000040f000000400300043d0000002004300039000000000024043500000000001304350000004002000039000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae3048d0000040f1ae3188c0000040f000000000401001900000000050200190000000006030019000000400100043d000100000001001d0000000002040019000000000305001900000000040600191ae304c90000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae304f80000040f1ae30a720000040f000000400300043d00000000001304350000002002000039000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303220000040f1ae30e270000040f0000000002010019000000400100043d000100000001001d1ae302e60000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae305210000040f000000000100041a000006bc02100197000000400100043d0000000000210435000000200200003900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae305340000040f1ae316270000040f000000400300043d00000000001304350000002002000039000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae3054c0000040f1ae314090000040f000000000701001900000000080200190000000009030019000000000a040019000000000b050019000000000c060019000000400100043d000100000001001d00000000020700190000000003080019000000000409001900000000050a001900000000060b001900000000070c00191ae3056d0000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae305210000040f000000400100043d000100000001001d000006d6010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391ae302640000040f000006bc0210019700000001010000290000000000210435000000200200003900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303220000040f1ae30b290000040f0000000002010019000000400100043d000100000001001d1ae302e60000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae3057d0000040f1ae3181b0000040f000000000401001900000000050200190000000006030019000000400100043d000100000001001d0000000002040019000000000305001900000000040600191ae304c90000040f00000001030000290000000002310049000000000103001900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae303bb0000040f1ae315390000040f000006bc02100197000000400100043d0000000000210435000000200200003900000000030000191ae302760000040f0000000001000416000000000110004c000000930000c13d00000000010000311ae3035f0000040f1ae305c40000040f000000400400043d000000200540003900000000002504350000004002400039000000000032043500000000001404350000006002000039000000000104001900000000030000191ae302760000040f0002000000000002000200000006001d000100000005001d000006ba05000041000006ba0630009c00000000030580190000004003300210000006ba0640009c00000000040580190000006004400210000000000334019f000006ba0410009c0000000001058019000000c001100210000000000113019f1ae31ad90000040f000000010900002900000000030100190000006003300270000006ba033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000002020000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000001fa0000413d000000010220018f000000000640004c000002120000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d000006ba05000041000006ba0630009c00000000030580190000004003300210000006ba0640009c00000000040580190000006004400210000000000334019f000006ba0410009c0000000001058019000000c001100210000000000113019f1ae31ade0000040f000000010900002900000000030100190000006003300270000006ba033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000002390000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000002310000413d000000010220018f000000000640004c000002490000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d000006ba03000041000006ba0410009c00000000010380190000004001100210000006ba0420009c00000000020380190000006002200210000000000112019f0000000002000414000006ba0420009c0000000002038019000000c002200210000000000112019f000006d7011001c700008010020000391ae31ade0000040f0000000102200190000002610000613d000000000101043b000000000001042d000000000100001900000000020000191ae302800000040f0000000003010019000006ba010000410000000004000414000006ba0540009c0000000001044019000000c00110021000000060022002100000000001120019000006d80110004100000000020300191ae31ade0000040f0000000102200190000002730000613d000000000101043b000000000001042d000000000100001900000000020000191ae302800000040f000006ba04000041000006ba0510009c000000000104801900000040011002100000000001310019000006ba0320009c00000000020480190000006002200210000000000121001900001ae40001042e000006ba03000041000006ba0420009c0000000002038019000006ba0410009c000000000103801900000040011002100000006002200210000000000112019f00001ae5000104300000000001010433000006d90210009c0000028d0000813d000000000001042d000000000100001900000000020000191ae302800000040f0000001f03100039000006bb04000041000000000523004b00000000050000190000000005044019000006bb06200197000006bb03300197000000000763004b000000000400a019000000000363013f000006bb0330009c00000000030500190000000003046019000000000330004c000002aa0000613d0000000203100367000000000303043b000006da0430009c000002aa0000213d000000050430021000000020011000390000000004410019000000000224004b000002aa0000213d0000000002030019000000000001042d000000000100001900000000020000191ae302800000040f00060000000000020000000005010019000000040150008a000006bb020000410000009f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000002e30000613d00000002010003670000000402100370000000000202043b000500000002001d0000002401100370000000000101043b000006da0210009c000002e30000213d00000004011000390000000002050019000600000005001d1ae302900000040f0000000604000029000400000001001d000300000002001d00000002010003670000004402100370000000000202043b000200000002001d000006bc0220009c000002e30000213d0000008402100370000000000202043b000006da0320009c000002e30000213d0000006401100370000000000101043b000100000001001d000000040120003900000000020400191ae302900000040f0000000006010019000000000702001900000005010000290000000402000029000000030300002900000002040000290000000105000029000000000001042d000000000100001900000000020000191ae302800000040f0000002003000039000000000031043500000020011000390000000003020433000000000031043500000000040000190000002001100039000000000534004b000002f40000813d0000002002200039000000000502043300000000005104350000000104400039000002ec0000013d000000000001042d000000040110008a000006bb02000041000000ff0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c0000031f0000613d00000002070003670000000401700370000000000101043b000006bc0210009c0000031f0000213d0000002402700370000000000202043b000006bc0320009c0000031f0000213d0000008403700370000000000503043b0000006403700370000000000403043b0000004403700370000000000303043b000000a406700370000000000606043b000006bc0860009c0000031f0000213d000000e408700370000000000808043b000000000980004c0000000009000019000000010900c039000000000998004b0000031f0000c13d000000c407700370000000000707043b000000000001042d000000000100001900000000020000191ae302800000040f00070000000000020000000005010019000000040150008a000006bb02000041000000bf0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c0000035c0000613d00000002010003670000002402100370000000000202043b000600000002001d0000000402100370000000000202043b000500000002001d0000004401100370000000000101043b000006da0210009c0000035c0000213d00000004011000390000000002050019000700000005001d1ae302900000040f0000000704000029000400000001001d000300000002001d00000002010003670000006402100370000000000202043b000200000002001d000006bc0220009c0000035c0000213d000000a402100370000000000202043b000006da0320009c0000035c0000213d0000008401100370000000000101043b000100000001001d000000040120003900000000020400191ae302900000040f00000000070100190000000008020019000000050100002900000006020000290000000403000029000000030400002900000002050000290000000106000029000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb020000410000013f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c0000038d0000613d00000002080003670000000401800370000000000101043b000006bc0210009c0000038d0000213d0000002402800370000000000202043b000006bc0320009c0000038d0000213d000000a403800370000000000603043b0000008403800370000000000503043b0000006403800370000000000403043b0000004403800370000000000303043b000000c407800370000000000707043b000006bc0970009c0000038d0000213d0000012409800370000000000a09043b0000000009a0004c0000000009000019000000010900c03900000000099a004b0000038d0000c13d0000010409800370000000e408800370000000000808043b000000000909043b000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb02000041000000ff0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000003b80000613d00000002060003670000000401600370000000000101043b000006bc0210009c000003b80000213d0000006402600370000000000402043b0000004402600370000000000302043b0000002402600370000000000202043b0000008405600370000000000505043b000006bc0750009c000003b80000213d000000e407600370000000000807043b000000000780004c0000000007000019000000010700c039000000000778004b000003b80000c13d000000c407600370000000a406600370000000000606043b000000000707043b000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb020000410000005f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000003d90000613d00000002030003670000000401300370000000000101043b000006bc0210009c000003d90000213d0000002402300370000000000202043b000006bc0420009c000003d90000213d0000004403300370000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000003d90000c13d000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb020000410000003f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000003f30000613d00000002020003670000000401200370000000000101043b000006bc0310009c000003f30000213d0000002402200370000000000202043b000006bc0320009c000003f30000213d000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb020000410000005f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c0000040f0000613d00000002030003670000000401300370000000000101043b0000002402300370000000000202043b000006bc0420009c0000040f0000213d0000004403300370000000000303043b000006bc0430009c0000040f0000213d000000000001042d000000000100001900000000020000191ae302800000040f00000040051000390000000000450435000000000330004c0000000003000019000000010300c0390000002004100039000000000034043500000000002104350000006001100039000000000001042d000006db0420009c000004400000813d00000005052002100000003f04500039000000200600008a000000000664016f000000400400043d0000000006640019000000000746004b00000000070000190000000107004039000006da0860009c000004400000213d0000000107700190000004400000c13d000000400060043f00000000002404350000000002150019000000000332004b0000043d0000213d0000000003040019000000000521004b0000043b0000813d0000000205100367000000000505043b000006bc0650009c0000043d0000213d000000200330003900000000005304350000002001100039000004310000013d0000000001040019000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f00000000030200190000001f02100039000006bb04000041000000000532004b00000000050000190000000005044019000006bb06300197000006bb02200197000000000762004b000000000400a019000000000262013f000006bb0220009c00000000020500190000000002046019000000000220004c0000045c0000613d0000000202100367000000000202043b00000020011000391ae3041c0000040f000000000001042d000000000100001900000000020000191ae302800000040f000006db0420009c000004860000813d00000005052002100000003f04500039000000200600008a000000000664016f000000400400043d0000000006640019000000000746004b00000000070000190000000107004039000006da0860009c000004860000213d0000000107700190000004860000c13d000000400060043f00000000002404350000000002150019000000000332004b000004830000213d0000000003040019000000000521004b000004810000813d0000000205100367000000000505043b000000000650004c0000000006000019000000010600c039000000000665004b000004830000c13d000000200330003900000000005304350000002001100039000004740000013d0000000001040019000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f00030000000000020000000005010019000000040150008a000006bb020000410000005f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000004c60000613d00000002010003670000000402100370000000000202043b000200000002001d0000002401100370000000000101043b000006da0210009c000004c60000213d00000004011000390000000002050019000300000005001d1ae304470000040f0000000303000029000100000001001d00000002020003670000004401200370000000000101043b000006da0410009c000004c60000213d0000002307100039000006bb04000041000000000537004b00000000050000190000000005048019000006bb06300197000006bb08700197000000000768004b0000000004008019000000000668013f000006bb0660009c000000000405c019000000000440004c000004c60000c13d0000000404100039000000000242034f000000000202043b00000024011000391ae3045f0000040f000000000301001900000002010000290000000102000029000000000001042d000000000100001900000000020000191ae302800000040f00000000050100190000006001000039000000000015043500000060015000390000000006020433000000000061043500000000070000190000002001100039000000000867004b000004d80000813d0000002002200039000000000802043300000000008104350000000107700039000004d00000013d0000000002510049000000200650003900000000002604350000000002030433000000000021043500000000060000190000002001100039000000000726004b000004e90000813d00000020033000390000000007030433000000000770004c0000000007000019000000010700c03900000000007104350000000106600039000004de0000013d0000000002510049000000400350003900000000002304350000000002040433000000000021043500000000030000190000002001100039000000000523004b000004f70000813d0000002004400039000000000504043300000000005104350000000103300039000004ef0000013d000000000001042d000000040110008a000006bb02000041000000df0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c0000051e0000613d00000002060003670000000401600370000000000101043b000006bc0210009c0000051e0000213d0000006402600370000000000402043b0000004402600370000000000302043b0000002402600370000000000202043b0000008405600370000000000505043b000006bc0750009c0000051e0000213d000000c407600370000000000707043b000000000870004c0000000008000019000000010800c039000000000887004b0000051e0000c13d000000a406600370000000000606043b000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000000010200008a000006bb03000041000000000221004b00000000020000190000000002032019000006bb01100197000006bb0410009c0000000003008019000006bb01100167000006bb0110009c00000000010200190000000001036019000000000110004c000005310000613d000000000001042d000000000100001900000000020000191ae302800000040f000000040110008a000006bb020000410000005f0310008c00000000030000190000000003022019000006bb01100197000000000410004c0000000002008019000006bb0110009c00000000010300190000000001026019000000000110004c000005490000613d00000002030003670000000401300370000000000101043b0000002402300370000000000202043b0000004403300370000000000303043b000000000001042d000000000100001900000000020000191ae302800000040f0000000002010019000000040120008a000006bb030000410000003f0410008c00000000040000190000000004032019000006bb01100197000000000510004c0000000003008019000006bb0110009c00000000010400190000000001036019000000000110004c0000056a0000613d00000004010000390000000201100367000000000101043b000006da0310009c0000056a0000213d00000004011000391ae304470000040f00000024020000390000000202200367000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b0000056a0000c13d000000000001042d000000000100001900000000020000191ae302800000040f000000a00810003900000000007804350000008007100039000000000067043500000060061000390000000000560435000006bc0440019700000040051000390000000000450435000006bc0330019700000020041000390000000000340435000006bc022001970000000000210435000000c001100039000000000001042d00010000000000020000000002010019000000040120008a000006bb030000410000003f0410008c00000000040000190000000004032019000006bb01100197000000000510004c0000000003008019000006bb0110009c00000000010400190000000001036019000000000110004c000005990000613d00000002030003670000002401300370000000000101043b000006da0410009c000005990000213d0000000403300370000000000303043b000100000003001d00000004011000391ae304470000040f00000000020100190000000101000029000000000001042d000000000100001900000000020000191ae302800000040f000000000100041a000006bc011001970000000002000411000000000112004b000005a20000c13d000000000001042d000000400100043d0000006402100039000006dc0300004100000000003204350000004402100039000006dd030000410000000000320435000000240210003900000025030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000000110004c000005b60000613d000000000001042d000000400100043d0000004402100039000006df030000410000000000320435000000240210003900000013030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000064020000391ae302800000040f000a00000000000200080000000a001d000700000009001d000100000008001d000500000007001d000600000006001d000400000005001d000300000004001d000200000003001d000a00000002001d000900000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000102000029000000000121004b0000000001000019000000010100a0391ae305b30000040f00000009010000290000000a020000290000000203000029000000030400002900000004050000290000000606000029000000070700002900000008080000291ae306770000040f000700000001001d000600000002001d00000009010000290000000a0200002900000008030000291ae314c60000040f0000000003010019000800000003001d0000000002000411000400000002001d000000090100002900000007040000291ae31a350000040f0000000a010000290000000402000029000000080300002900000006040000291ae31a350000040f000006e101000041000000400300043d00000000001304350000000501000029000006bc011001970000000402300039000000000012043500000000010004140000000802000029000006bc02200197000000040420008c000006080000613d00000024040000390000002006000039000a00000003001d0000000a050000291ae301df0000040f0000000a03000029000000000110004c0000062f0000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000006250000213d0000000102200190000006250000c13d000000400010043f000006bb0100004100000001020000310000001f0420008c00000000050000190000000005012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000105c019000000000110004c0000062c0000613d000000000303043300000007010000290000000602000029000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000100001900000000020000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000063e0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000006360000413d000000000530004c0000064d0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000000000110004c000006520000613d000000000001042d000000400100043d0000006402100039000006e20300004100000000003204350000004402100039000006e3030000410000000000320435000000240210003900000021030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000000110004c000006660000613d000000000001042d000000400100043d0000006402100039000006e20300004100000000003204350000004402100039000006e4030000410000000000320435000000240210003900000021030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000d000000000002000d00000008001d000800000007001d000700000006001d000600000005001d000a00000004001d000900000003001d000c00000002001d000b00000001001d000006d6010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391ae302640000040f000006e502000041000000400300043d00000000002304350000000d02000029000000000220004c0000000006000019000000010600c03900000000020100190000004404300039000000000100041400000000006404350000000c04000029000006bc08400197000000240430003900000000008404350000000b04000029000006bc0940019700000004043000390000000000940435000006bc07200197000000040270008c000006af0000613d0000006404000039000400000006001d000000200600003900000000020700190000000005030019000500000007001d000300000008001d000200000009001d000100000003001d1ae302160000040f00000001030000290000000209000029000000030800002900000004060000290000000507000029000000000110004c000007390000613d0000001f0a0000390000000101a00031000000200b00008a0000000001b1016f0000000005310019000000000115004b00000000010000190000000101004039000006da0250009c000007320000213d0000000101100190000007320000c13d000000400050043f000006bb0100004100000001020000310000001f0420008c000000000c000019000000000c012019000006bb02200197000000000420004c0000000001008019000006bb0220009c00000000010cc019000000000110004c0000072f0000613d0000000001030433000006bc0210009c0000072f0000213d000000000110004c000007030000c13d000006e60100004100000000001504350000006402500039000000000100041400000000006204350000004402500039000000080300002900000000003204350000002402500039000000000082043500000004025000390000000000920435000000040270008c000006e90000613d0000008404000039000000200600003900000000020700190000000003050019000800000005001d000000080500002900050000000a001d00040000000b001d1ae301df0000040f000000040b000029000000050a0000290000000805000029000000000110004c000007390000613d0000000101a000310000000002b1016f0000000001520019000000000221004b00000000020000190000000102004039000006da0310009c000007320000213d0000000102200190000007320000c13d000000400010043f000006bb010000410000000102000031000000200320008c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c0000072f0000c13d0000000001050433000006bc0110009c0000072f0000213d0000000b010000290000000c020000290000000d030000291ae315cb0000040f0000000003010019000000000402001900000000014301a000000009010000290000072d0000613d000d00000003001d0000000002030019000c00000004001d00000000030400191ae316270000040f00000000030100190000000a01000029000000000213004b000007240000a13d0000000c020000290000000d030000291ae316270000040f00000000020100190000000901000029000000000112004b000007590000213d0000000601000029000000000112004b00000000010000190000000101008039000d00000002001d1ae3064f0000040f0000000d010000290000072d0000013d0000000701000029000000000113004b00000000010000190000000101008039000d00000003001d1ae306630000040f0000000d01000029000a00000001001d00000009010000290000000a02000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000007480000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000007400000413d000000000530004c000007570000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000000400100043d0000004402100039000006e7030000410000000000320435000006de0200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000064020000391ae302800000040f0008000000000002000600000008001d000700000007001d000200000006001d000100000005001d000500000004001d000400000003001d000300000002001d000800000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000202000029000000000121004b0000000001000019000000010100a0391ae305b30000040f000000000100041a0000000004000416000006bc021001970000000801000029000000030300002900000004050000290000000506000029000000070700002900000006080000291ae306770000040f000500000001001d000700000002001d000000000100041a000006bc02100197000000080100002900000006030000291ae314c60000040f000000000301001900000000020004110000000801000029000300000002001d000600000003001d00000005040000291ae31a350000040f000006e801000041000000000200041a0000000000100439000006bc01200197000800000001001d0000000400100443000080020100003900000024020000391ae302640000040f0000000705000029000000000110004c000008550000613d000000400300043d000006e901000041000000000013043500000000010004140000000806000029000000040260008c000007c40000613d000000000250004c000200000003001d000007bb0000613d000006ba02000041000006ba0410009c0000000001028019000006ba0430009c00000000020340190000004002200210000000c001100210000000000121019f000006ea011001c700008009020000390000000003050019000000000406001900000000050000191ae31ad90000040f00000000030100190000006003300270000106ba0030019d0003000000010355000000010120018f000007c00000013d00000004040000390000000002060019000000000503001900000000060000191ae301df0000040f000000000110004c000000070500002900000002030000290000085f0000613d0000001f060000390000000101600031000000200700008a000000000171016f0000000009310019000000000119004b00000000010000190000000101004039000006da0290009c000008580000213d0000000101100190000008580000c13d000000400090043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c000008550000c13d000000000200041a000006eb0100004100000000001904350000002403900039000000000100041400000000005304350000000603000029000006bc0a30019700000004039000390000000000a30435000006bc02200197000000040320008c000800000006001d000400000007001d000007fa0000613d0000004404000039000000200600003900000000030900190000000005090019000600000009001d00020000000a001d1ae301df0000040f000000020a0000290000000609000029000000040700002900000008060000290000000705000029000000000110004c0000085f0000613d0000000101600031000000000171016f0000000003910019000000000113004b00000000010000190000000101004039000006da0230009c000008580000213d0000000101100190000008580000c13d000000400030043f000006bb010000410000000102000031000000200420008c00000000080000190000000008014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000108c019000000000110004c000008550000c13d0000000001090433000000000210004c0000000002000019000000010200c039000000000221004b000008550000c13d000000000110004c0000087f0000613d000006e10100004100000000001304350000000101000029000006bc021001970000000404300039000000000100041400000000002404350000000402a0008c0000082e0000613d0000002404000039000000200600003900000000020a00190000000005030019000600000003001d1ae301df0000040f0000000603000029000000040700002900000008060000290000000705000029000000000110004c0000085f0000613d0000000101600031000000000271016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000008580000213d0000000102200190000008580000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000060000190000000006014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000106c019000000000110004c000008550000c13d00000000030304330000000001000416000000000151004b000008520000a13d000800000003001d0000000001000416000000000251004b000008900000413d000000000251004900000003010000291ae31a8e0000040f0000000705000029000000080300002900000005010000290000000002050019000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000086e0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000008660000413d000000000530004c0000087d0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0000006401300039000006ec0200004100000000002104350000004401300039000006ed020000410000000000210435000000240130003900000031020000390000000000210435000006de010000410000000000130435000000040130003900000020020000390000000000210435000000840200003900000000010300191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0008000000000002000500000008001d000400000007001d000300000006001d000200000005001d000100000004001d000600000003001d000700000002001d000800000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000402000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000801000029000000070200002900000005030000291ae314c60000040f000006ee02000041000000400700043d00000000002704350000000002000411000006bc0220019700000004037000390000000000230435000000440270003900000006030000290000000000320435000006bc02100197000000240170003900000000002104350000000001000414000000040320008c000008c90000613d0000006404000039000000200600003900000000030700190000000005070019000600000002001d000500000007001d1ae301df0000040f00000005070000290000000602000029000000000110004c000009410000613d0000001f080000390000000101800031000000200900008a000000000191016f0000000003710019000000000113004b00000000010000190000000101004039000006da0430009c0000093a0000213d00000001011001900000093a0000c13d000000400030043f000006bb0100004100000001060000310000001f0460008c00000000050000190000000005012019000006bb06600197000000000460004c0000000001008019000006bb0460009c000000000105c019000000000110004c000009370000613d0000000001070433000000000410004c0000000004000019000000010400c039000000000141004b000009370000c13d000006ef0100004100000000001304350000000301000029000006bc05100197000000040430003900000000010004140000000000540435000000040420008c000008fd0000613d00000024040000390000004006000039000600000003001d0000000605000029000500000008001d000400000009001d1ae301df0000040f000000040900002900000005080000290000000603000029000000000110004c000009410000613d0000000101800031000000000291016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c0000093a0000213d00000001022001900000093a0000c13d000000400010043f000006bb010000410000000102000031000000400420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000009370000c13d0000000001030433000600000001001d00000020013000390000000001010433000500000001001d000000080100002900000007020000291ae3149a0000040f0000000802000029000000000121013f000006bc01100198000700000001001d000000060100002900000005020000290000000002016019000800000002001d0000000101000029000000000112004b000000000100001900000001010080391ae3064f0000040f0000000701000029000000000110004c00000006010000290000000502000029000000000201c019000700000002001d0000000201000029000000000112004b000000000100001900000001010080391ae306630000040f00000008010000290000000702000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000009500000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000009480000413d000000000530004c0000095f0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000a000000000002000800000007001d000700000006001d000600000005001d000300000004001d000200000003001d000900000002001d000a00000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000702000029000000000121004b0000000001000019000000010100a039000500000001001d1ae305b30000040f000000000100041a000700000001001d00000005010000291ae305b30000040f0000000701000029000006bc021001970000000a01000029000400000002001d00000008030000291ae314c60000040f000006ee02000041000000400800043d0000000000280435000000000201001900000044038000390000000001000414000000090400002900000000004304350000000003000411000006bc0330019700000004048000390000000000340435000006bc0720019700000024028000390000000000720435000000040270008c0000099b0000613d00000064040000390000002006000039000000000207001900000000030800190000000005080019000900000007001d000800000008001d1ae301df0000040f00000008080000290000000907000029000000000110004c00000a520000613d0000001f01000039000800000001001d0000000101100031000000200200008a000700000002001d000000000121016f0000000003810019000000000113004b00000000010000190000000101004039000006da0230009c00000a4b0000213d000000010110019000000a4b0000c13d000000400030043f000006bb0100004100000001020000310000001f0420008c00000000050000190000000005012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000105c019000000000110004c00000a480000613d0000000001080433000000000210004c0000000002000019000000010200c039000000000121004b00000a480000c13d000006ef0100004100000000001304350000000001000410000006bc02100197000000040430003900000000010004140000000000240435000000040270008c000009ce0000613d000000240400003900000040060000390000000002070019000900000003001d00000009050000291ae301df0000040f0000000903000029000000000110004c00000a520000613d000000080100002900000001011000310000000702000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c00000a4b0000213d000000010220019000000a4b0000c13d000000400010043f000006bb010000410000000102000031000000400420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c00000a480000c13d0000000001030433000900000001001d00000020013000390000000001010433000500000001001d0000000a0100002900000004020000291ae3149a0000040f0000000a02000029000000000121013f000006bc01100198000100000001001d000000090100002900000005020000290000000002016019000400000002001d0000000201000029000000000112004b000000000100001900000001010080391ae3064f0000040f0000000101000029000000000110004c00000009010000290000000502000029000000000201c019000900000002001d0000000301000029000000000112004b000000000100001900000001010080391ae306630000040f0000000a01000029000000060200002900000004030000291ae319df0000040f000006e801000041000000000200041a0000000000100439000006bc01200197000a00000001001d0000000400100443000080020100003900000024020000391ae302640000040f0000000905000029000000000110004c00000a480000613d000000400300043d000006f00100004100000000001304350000000402300039000000000100041400000000005204350000000a02000029000000040420008c00000a290000613d00000024040000390000000005030019000a00000003001d00000000060000191ae301df0000040f0000000a030000290000000905000029000000000110004c00000a520000613d000000080100002900000001011000310000000702000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0310009c00000a4b0000213d000000010220019000000a4b0000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c00000a480000c13d000000060100002900000000020500191ae31a8e0000040f00000004010000290000000902000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000a610000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000a590000413d000000000530004c00000a700000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0008000000000002000500000007001d000700000006001d000600000005001d000400000004001d000300000003001d000200000002001d000800000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000702000029000000000121004b0000000001000019000000010100a0391ae305b30000040f000000000100041a000006bc021001970000000006000410000100000006001d0000000801000029000000020300002900000003040000290000000405000029000000070700002900000005080000291ae308970000040f000006f101000041000000400300043d00000000001304350000000101000029000006bc04100197000700000002001d0000000402300039000000000100041400000000004204350000000802000029000006bc02200197000000040420008c00000aa40000613d000000240400003900000020060000390000000005030019000500000003001d1ae302160000040f0000000503000029000000000110004c00000b090000613d0000001f040000390000000101400031000000200500008a000000000251016f0000000001320019000000000221004b00000000020000190000000102004039000006da0610009c00000b020000213d000000010220019000000b020000c13d000400000005001d000500000004001d000000400010043f000006bb0100004100000001020000310000001f0420008c00000000050000190000000005012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000105c019000000000110004c00000aff0000613d0000000003030433000000080100002900000006020000291ae319df0000040f000000000100041a000006e8020000410000000000200439000006bc01100197000800000001001d0000000400100443000080020100003900000024020000391ae302640000040f000000000110004c00000aff0000613d000000400500043d000006f001000041000000000015043500000004025000390000000001000414000000070300002900000000003204350000000802000029000000040320008c00000ae10000613d00000024040000390000000003050019000800000005001d000000080500002900000000060000191ae301df0000040f0000000805000029000000000110004c00000b090000613d000000050100002900000001011000310000000402000029000000000221016f0000000001520019000000000221004b00000000020000190000000102004039000006da0310009c00000b020000213d000000010220019000000b020000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c00000aff0000c13d000000060100002900000007020000291ae31a8e0000040f0000000701000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000b180000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000b100000413d000000000530004c00000b270000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0009000000000002000600000008001d000500000007001d000400000006001d000100000005001d000800000004001d000900000003001d000200000002001d000700000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000402000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000003000031000300000003001d000000090100002900000008020000291ae3041c0000040f000400000001001d0000000501000029000000060200002900000003030000291ae3045f0000040f0000000003010019000000070100002900000004020000291ae3188c0000040f0000000003010433000000000230004c00000b9c0000613d0000000502300210000700000001001d000000000112001900000000010104330000000202000029000000000121004b000000000100001900000001010080391ae30ba30000040f0000000804000029000000000140004c00000b920000613d00000002050003670000000902000029000000000225034f000000000102043b000006d90210009c00000b990000813d000000020240008c00000b920000413d00000009020000290000002002200039000000000225034f000000000202043b000006bc0320009c00000b990000213d0000000603000029000000000330004c00000b920000613d0000000503000029000000000335034f000000000303043b000000000530004c0000000005000019000000010500c039000000000553004b00000b990000c13d000400000001001d1ae314c60000040f00000004050000290000000802000029000000000301001900000007010000290000000001010433000000000110004c00000b920000613d000000070100002900000020011000390000000004010433000000000200041100000000010500191ae31a350000040f0000000003000031000400000003001d000000090100002900000008020000291ae3041c0000040f000900000001001d0000000501000029000000060200002900000004030000291ae3045f0000040f00000000040100190000000701000029000000090200002900000001030000291ae30be40000040f0000000701000029000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000110004c00000ba60000613d000000000001042d000000400100043d0000006402100039000006f20300004100000000003204350000004402100039000006f3030000410000000000320435000000240210003900000026030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000400100043d000006f40210009c00000bbe0000813d0000002002100039000000400020043f0000000000010435000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000600610003900000080070000390000000000760435000006bc0440019700000040061000390000000000460435000000200410003900000000003404350000000000210435000000000205043300000080031000390000000000230435000000a0011000390000000003000019000000000423004b00000bdb0000813d0000000004310019000000200330003900000000065300190000000006060433000000000064043500000bd30000013d000000000323004b00000bdf0000a13d000000000321001900000000000304350000001f02200039000000200300008a000000000232016f0000000001210019000000000001042d000f000000000002000100000003001d000300000001001d0000002001100039000200000001001d000600000004001d0000002001400039000500000001001d000b00000002001d0000002001200039000e00000001001d00000000060000190000000b010000290000000001010433000000000210004c00000ca00000613d000000010210008a000000000226004b00000c980000813d000000000261004b00000c990000a13d00000005056002100000000e0300002900000000033500190000000002030433000a00000002001d000006bc042001970000000103600039000000000131004b00000c990000a13d00000005073002100000000e0100002900000000011700190000000001010433000006bc0210019700000006010000290000000001010433000000000161004b00000c990000a13d000000050100002900000000011500190000000001010433000700000001001d0000000001040019000f00000003001d000d00000004001d000c00000002001d000900000006001d000800000007001d1ae3149a0000040f000000080900002900000009070000290000000c060000290000000d040000290000000702000029000000000220004c0000000008000019000000010800c039000000030200002900000000020204330000000f03000029000000000232004b00000c990000a13d000000020200002900000000029200190000000a03000029000000000131013f000006bc01100198000000000102043300000000030000190000000003016019000000000501001900000000050060190000000b01000029000000000a0104330000000202a0008c00000ca00000413d000700000005001d000a00000003001d0000000202a0008a000000000227004b000000010100002900000c500000813d000000020270003900000000012a004b0000000f0300002900000c990000a13d00000006010000290000000001010433000000000131004b00000c990000a13d00000005012002100000000e020000290000000001210019000000050200002900000000022900190000000002020433000000000220004c0000000003000019000000010300c0390000000001010433000006bc021001970000000001060019000900000008001d1ae314c60000040f00000009080000290000000c060000290000000d04000029000c00000001001d0000000001040019000000000206001900000000030800191ae314c60000040f000d00000001001d1ae30bb70000040f000006e80200004100000000002004390000000d02000029000006bc02200197000900000002001d0000000400200443000800000001001d000080020100003900000024020000391ae302640000040f000000000110004c00000c950000613d000000400200043d000006f50100004100000000001204350000000001000414000400000001001d000d00000002001d000000040120003900000007020000290000000a030000290000000c0400002900000008050000291ae30bc50000040f0000000902000029000000040320008c00000c7a0000613d0000000d0300002900000000043100490000000401000029000000000503001900000000060000191ae301df0000040f000000000110004c00000cae0000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000d010000290000000001120019000000000221004b00000000020000190000000102004039000006da0310009c00000ca70000213d000000010220019000000ca70000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c0000000f0600002900000bf00000613d000000000100001900000000020000191ae302800000040f000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000cbd0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000cb50000413d000000000530004c00000ccc0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000a000000000002000700000007001d000600000006001d000900000005001d000200000004001d000800000003001d000a00000002001d000400000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000902000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000801000029000000000110004c00000dcd0000613d0000000a010000290000000201100367000000000101043b000006d90210009c00000dca0000813d000000000200041a000006bc02200197000500000002001d000000000121004b000000000100001900000001010060391ae30e020000040f00000000030000310000000a0100002900000008020000291ae3041c0000040f000900000001001d0000000001000416000300000001001d0000000003000031000000060100002900000007020000291ae3045f0000040f0000000003010019000000030100002900000009020000291ae3188c0000040f00000000030100190000000001030433000000000210004c00000ddb0000613d0000000501100210000000000131001900000000010104330000000402000029000000000121004b00000000010000190000000101008039000900000003001d1ae30ba30000040f00000009010000290000000001010433000000000110004c00000dcd0000613d00000009010000290000002001100039000400000001001d0000000001010433000300000001001d000006e801000041000000000010043900000005010000290000000400100443000080020100003900000024020000391ae302640000040f000000000110004c00000dca0000613d000000400300043d000006e901000041000000000013043500000000010004140000000505000029000000040250008c00000d440000613d0000000306000029000000000260004c000100000003001d00000d3c0000613d000006ba02000041000006ba0410009c0000000001028019000006ba0430009c00000000020340190000004002200210000000c001100210000000000121019f000006ea011001c700008009020000390000000003060019000000000405001900000000050000191ae31ad90000040f00000000030100190000006003300270000106ba0030019d0003000000010355000000010120018f00000d410000013d00000004040000390000000002050019000000000503001900000000060000191ae301df0000040f000000000110004c000000010300002900000de20000613d0000001f01000039000500000001001d0000000101100031000000200200008a000300000002001d000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0310009c00000dd40000213d000000010220019000000dd40000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c00000dca0000c13d00000002030003670000000a01000029000000000113034f000000000200041a000006bc05200197000000000101043b000006bc0210009c00000dca0000213d0000000802000029000000020220008c00000dcd0000413d0000000a020000290000002002200039000000000223034f000000000202043b000006bc0420009c00000dca0000213d0000000704000029000000000440004c00000dcd0000613d0000000604000029000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b00000dca0000c13d000100000005001d1ae314c60000040f000000010500002900000009020000290000000002020433000000000220004c00000dcd0000613d00000004020000290000000006020433000000400300043d000006eb020000410000000000230435000000240430003900000000020004140000000000640435000006bc0110019700000004043000390000000000140435000000040150008c00000d990000613d00000044040000390000002006000039000000000102001900000000020500190000000005030019000400000003001d1ae301df0000040f0000000403000029000000000110004c00000de20000613d000000050100002900000001011000310000000302000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c00000dd40000213d000000010220019000000dd40000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c00000dca0000c13d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b00000dca0000c13d1ae30e130000040f0000000003000031000500000003001d0000000a0100002900000008020000291ae3041c0000040f000a00000001001d0000000601000029000000070200002900000005030000291ae3045f0000040f000000000401001900000009010000290000000a0200002900000002030000291ae30be40000040f0000000901000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000df10000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000de90000413d000000000530004c00000e000000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000000000110004c00000e050000613d000000000001042d000000400100043d0000004402100039000006f6030000410000000000320435000000240210003900000018030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000064020000391ae302800000040f000000000110004c00000e160000613d000000000001042d000000400100043d0000006402100039000006f70300004100000000003204350000004402100039000006f8030000410000000000320435000000240210003900000037030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f0009000000000002000600000008001d000500000007001d000900000006001d000100000005001d000800000004001d000700000003001d000300000002001d000400000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000902000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000803000029000000000130004c00000ee90000613d000000050130021000000007040000290000000001140019000000200110008a0000000201100367000000000101043b000006d90210009c00000ee60000813d000000000200041a000006bc02200197000000000121004b000000000100001900000001010060391ae30e020000040f0000000003000031000200000003001d000000070100002900000008020000291ae3041c0000040f000900000001001d0000000501000029000000060200002900000002030000291ae3045f0000040f0000000003010019000000040100002900000009020000291ae3188c0000040f0000000003010433000000000230004c00000ee90000613d0000000502300210000900000001001d000000000112001900000000010104330000000302000029000000000121004b000000000100001900000001010080391ae30ba30000040f00000002060003670000000705000029000000000256034f000000000102043b000006bc0210009c000000080400002900000ee60000213d000000010240008c00000ef00000a13d0000002002500039000000000226034f000000000202043b000006bc0320009c00000ee60000213d0000000603000029000000000330004c00000ef00000613d0000000503000029000000000336034f000000000303043b000000000630004c0000000006000019000000010600c039000000000663004b00000ee60000c13d000400000001001d1ae314c60000040f000000040600002900000007050000290000000802000029000000000301001900000009010000290000000001010433000000000110004c00000ef00000613d000000090100002900000020011000390000000004010433000000000200041100000000010600191ae31a350000040f0000000003000031000400000003001d000000070100002900000008020000291ae3041c0000040f000800000001001d0000000501000029000000060200002900000004030000291ae3045f0000040f00000000040100190000000003000410000000090100002900000008020000291ae30be40000040f0000000903000029000000000100041a000006bc041001970000000001030433000000000210004c00000ee90000613d000000050110021000000000013100190000000001010433000700000001001d000006e8010000410000000000100439000800000004001d0000000400400443000080020100003900000024020000391ae302640000040f000000000110004c00000ee60000613d000000400300043d000006f001000041000000000013043500000004023000390000000001000414000000070400002900000000004204350000000802000029000000040420008c00000ec20000613d0000002404000039000800000003001d000000080500002900000000060000191ae301df0000040f0000000803000029000000000110004c00000efe0000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0310009c00000ef70000213d000000010220019000000ef70000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c00000ee60000c13d00000009030000290000000001030433000000000210004c00000ee90000613d00000005011002100000000001310019000000000201043300000001010000291ae31a8e0000040f0000000901000029000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000f0d0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000f050000413d000000000530004c00000f1c0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000c000000000002000a00000008001d000900000007001d000700000006001d000800000005001d000b00000004001d000c00000003001d000400000002001d000600000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000702000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000b04000029000000000140004c00000fdc0000613d00000002050003670000000c02000029000000000225034f000000000102043b000006d90210009c00000fd90000813d000000020240008c00000fdc0000413d0000000c020000290000002002200039000000000225034f000000000202043b000006bc0320009c00000fd90000213d0000000a03000029000000000330004c00000fdc0000613d0000000903000029000000000335034f000000000303043b000000000530004c0000000005000019000000010500c039000000000553004b00000fd90000c13d0000000005000411000700000005001d000500000001001d1ae314c60000040f00000000030100190000000501000029000000070200002900000006040000291ae31a350000040f0000000b0500002900000005015002100000000c020000290000000001120019000000200110008a000700000001001d0000000201100367000000000201043b000006bc0120009c00000fd90000213d000000400300043d000006f10100004100000000001304350000000801000029000006bc0410019700000004063000390000000001000414000600000004001d0000000000460435000000040420008c00000f740000613d000000240400003900000020060000390000000005030019000500000003001d1ae302160000040f00000005030000290000000b05000029000000000110004c00000fea0000613d0000001f040000390000000101400031000000200600008a000000000261016f0000000001320019000000000221004b00000000020000190000000102004039000006da0710009c00000fe30000213d000000010220019000000fe30000c13d000200000006001d000300000004001d000000400010043f000006bb010000410000000102000031000000200420008c00000000060000190000000006014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000106c019000000000110004c00000fd90000c13d0000000001030433000100000001001d0000000003000031000500000003001d0000000c0100002900000000020500191ae3041c0000040f000c00000001001d00000009010000290000000a0200002900000005030000291ae3045f0000040f00000000030100190000000c0100002900000008020000291ae3102e0000040f00000007010000290000000201100367000000000201043b000006bc0120009c00000fd90000213d000000400300043d000006f10100004100000000001304350000000405300039000000000100041400000006040000290000000000450435000000040420008c00000fb50000613d00000024040000390000002006000039000c00000003001d0000000c050000291ae302160000040f0000000c03000029000000000110004c00000fea0000613d000000030100002900000001011000310000000202000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c00000fe30000213d000000010220019000000fe30000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c00000fd90000c13d00000000010304330000000103000029000000000231004b0000100a0000413d00000000013100490000000402000029000000000121004b000000000100001900000001010080391ae30ba30000040f000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000ff90000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000ff10000413d000000000530004c000010080000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000002120049000006bb030000410000005f0420008c00000000040000190000000004032019000006bb02200197000000000520004c0000000003008019000006bb0220009c00000000020400190000000002036019000000000220004c0000102b0000613d0000000004010433000006f90240009c0000102b0000213d00000020021000390000000002020433000006f90320009c0000102b0000213d00000040011000390000000003010433000006ba0130009c0000102b0000213d0000000001040019000000000001042d000000000100001900000000020000191ae302800000040f0010000000000002000200000002001d000500000003001d0000002002300039000400000002001d000800000001001d0000002001100039000b00000001001d000000000400001900000008010000290000000001010433000000000210004c0000116c0000613d000000010210008a000000000224004b0000115d0000813d000000000241004b0000115e0000a13d00000005034002100000000b02000029001000000003001d00000000022300190000000002020433000006bc052001970000000103400039000000000131004b0000115e0000a13d00000005023002100000000b01000029000300000002001d00000000011200190000000001010433000006bc021001970000000001050019000a00000002001d000900000003001d000c00000004001d000f00000005001d1ae3149a0000040f0000000f0400002900000005020000290000000002020433000700000001001d0000000c01000029000000000112004b0000115e0000a13d0000000401000029000000100200002900000000011200190000000001010433000000000110004c0000000003000019000000010300c03900000000010400190000000a020000291ae314c60000040f000006fa02000041000000400500043d000000000025043500000000020100190000000001000414000006bc02200197001000000002001d000000040220008c000010790000613d0000000404000039000000600600003900000010020000290000000003050019000e00000005001d0000000e050000291ae302160000040f0000000e05000029000000000110004c000011730000613d0000001f01000039000e00000001001d0000000101100031000000200200008a000d00000002001d000000000221016f0000000001520019000000000221004b00000000020000190000000102004039000006da0310009c000011650000213d0000000102200190000011650000c13d000000400010043f000000010250003100000000010500191ae310110000040f000006f103000041000000400700043d0000000000370435000000000301001900000004047000390000000001000414000000100500002900000000005404350000000704000029000006bc044001970000000f05000029000700000004001d000000000445004b0000000002036019000006f906200197000000040250008c000010a80000613d0000002404000039000600000006001d00000020060000390000000f0200002900000000030700190000000005070019000100000007001d1ae302160000040f00000001070000290000000606000029000000000110004c000011730000613d0000000e0100002900000001011000310000000d02000029000000000121016f0000000003710019000000000113004b00000000010000190000000101004039000006da0230009c000011650000213d0000000101100190000011650000c13d000000400030043f000006bb0100004100000001020000310000001f0420008c00000000050000190000000005012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000105c019000000000110004c0000115a0000613d0000000002070433000000000162004b0000000f040000290000116c0000413d000006fb0100004100000000001304350000002405300039000000000100041400000000004504350000000002620049000000040430003900000000002404350000001002000029000000040220008c000010d90000613d000000440400003900000020060000390000001002000029000600000003001d00000006050000291ae302160000040f0000000603000029000000000110004c000011730000613d0000000e0100002900000001011000310000000d02000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000011650000213d0000000102200190000011650000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c0000000c050000290000115a0000c13d00000000010304330000000f020000290000000704000029000000000242004b000000000300001900000000030160190000000004010019000000000400601900000008010000290000000006010433000000020260008c0000116c0000413d000600000004001d000700000003001d000000020260008a000000000225004b00000002010000290000111b0000813d0000000202500039000000000126004b00000009030000290000115e0000a13d00000005010000290000000001010433000000000131004b0000115e0000a13d00000005012002100000000b0200002900000000012100190000000402000029000000030300002900000000022300190000000002020433000000000220004c0000000003000019000000010300c0390000000001010433000006bc021001970000000a010000291ae314c60000040f000c00000001001d1ae30bb70000040f000006e802000041000000000020043900000010020000290000000400200443000a00000001001d000080020100003900000024020000391ae302640000040f000000000110004c0000115a0000613d000000400200043d000006f50100004100000000001204350000000001000414000300000001001d000f00000002001d0000000401200039000000060200002900000007030000290000000c040000290000000a050000291ae30bc50000040f0000001002000029000000040220008c0000113f0000613d0000000f03000029000000000431004900000003010000290000001002000029000000000503001900000000060000191ae301df0000040f000000000110004c000011730000613d0000000e0100002900000001011000310000000d02000029000000000221016f0000000f010000290000000001120019000000000221004b00000000020000190000000102004039000006da0310009c000011650000213d0000000102200190000011650000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c0000000904000029000010370000613d000000000100001900000000020000191ae302800000040f000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000011820000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000117a0000413d000000000530004c000011910000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000c000000000002000800000007001d000700000006001d000a00000005001d000600000004001d000b00000003001d000c00000002001d000400000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000a02000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000b01000029000000000110004c000012dc0000613d0000000c010000290000000201100367000000000101043b000006d90210009c000012d20000813d000000000200041a000006bc02200197000a00000002001d000000000121004b000000000100001900000001010060391ae30e020000040f000006e80100004100000000001004390000000a010000290000000400100443000080020100003900000024020000391ae302640000040f000000000110004c000012d20000613d000000400500043d000006e9010000410000000000150435000000000100041400000000030004160000000a06000029000000040260008c000011e30000613d000000000230004c000500000005001d000011db0000613d000006ba02000041000006ba0410009c0000000001028019000006ba0450009c00000000020540190000004002200210000000c001100210000000000121019f000006ea011001c70000800902000039000000000406001900000000050000191ae31ad90000040f00000000030100190000006003300270000106ba0030019d0003000000010355000000010120018f000011e00000013d00000004040000390000000002060019000000000305001900000000060000191ae301df0000040f000000000110004c0000000505000029000012e30000613d0000001f01000039000a00000001001d0000000101100031000000200200008a000900000002001d000000000221016f0000000001520019000000000221004b00000000020000190000000102004039000006da0310009c000012d50000213d0000000102200190000012d50000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c000012d20000c13d00000002030003670000000c01000029000000000113034f000000000200041a000006bc02200197000500000002001d000000000101043b000006bc0210009c000012d20000213d0000000b02000029000000020220008c000012dc0000413d0000000c020000290000002002200039000000000223034f000000000202043b000006bc0420009c000012d20000213d0000000804000029000000000440004c000012dc0000613d0000000704000029000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000012d20000c13d1ae314c60000040f000006eb02000041000000400300043d000000000023043500000000020100190000002405300039000000000100041400000000040004160000000000450435000006bc02200197000000040430003900000000002404350000000502000029000000040420008c000012320000613d00000044040000390000002006000039000500000003001d00000005050000291ae301df0000040f0000000503000029000000000110004c000012e30000613d0000000a0100002900000001011000310000000902000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000012d50000213d0000000102200190000012d50000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000012d20000c13d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b000012d20000c13d1ae30e130000040f0000000b0100002900000005011002100000000c020000290000000001120019000000200110008a000500000001001d0000000201100367000000000201043b000006bc0120009c000012d20000213d000000400300043d000006f10100004100000000001304350000000601000029000006bc0410019700000004053000390000000001000414000300000004001d0000000000450435000000040420008c0000126f0000613d00000024040000390000002006000039000200000003001d00000002050000291ae302160000040f0000000203000029000000000110004c000012e30000613d0000000a0100002900000001011000310000000902000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000012d50000213d0000000102200190000012d50000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000012d20000c13d0000000001030433000100000001001d0000000003000031000200000003001d0000000c010000290000000b020000291ae3041c0000040f000c00000001001d0000000701000029000000080200002900000002030000291ae3045f0000040f00000000030100190000000c0100002900000006020000291ae3102e0000040f00000005010000290000000201100367000000000201043b000006bc0120009c000012d20000213d000000400300043d000006f10100004100000000001304350000000405300039000000000100041400000003040000290000000000450435000000040420008c000012ae0000613d00000024040000390000002006000039000c00000003001d0000000c050000291ae302160000040f0000000c03000029000000000110004c000012e30000613d0000000a0100002900000001011000310000000902000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000012d50000213d0000000102200190000012d50000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000012d20000c13d00000000010304330000000103000029000000000231004b000013030000413d00000000013100490000000402000029000000000121004b000000000100001900000001010080391ae30ba30000040f000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000012f20000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000012ea0000413d000000000530004c000013010000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0009000000000002000700000008001d000600000007001d000500000006001d000200000005001d000900000004001d000800000003001d000300000002001d000400000001001d000006e00100004100000000001004390000800b0100003900000004020000391ae302640000040f0000000502000029000000000121004b0000000001000019000000010100a0391ae305b30000040f0000000903000029000000000130004c000013e20000613d000000050130021000000008040000290000000001140019000000200110008a0000000201100367000000000101043b000006d90210009c000013d10000813d000000000200041a000006bc02200197000000000121004b000000000100001900000001010060391ae30e020000040f000000080500002900000009040000290000000206000367000000000256034f000000000102043b000006bc0210009c000013d10000213d000000010240008c000013d40000a13d0000002002500039000000000226034f000000000202043b000006bc0320009c000013d10000213d0000000703000029000000000330004c000013d40000613d0000000603000029000000000336034f000000000303043b000000000630004c0000000006000019000000010600c039000000000663004b000013d10000c13d0000000006000411000500000006001d000100000001001d1ae314c60000040f00000000030100190000000101000029000000050200002900000004040000291ae31a350000040f0000000003000031000500000003001d000000080100002900000009020000291ae3041c0000040f000900000001001d0000000601000029000000070200002900000005030000291ae3045f0000040f00000000030100190000000002000410000800000002001d00000009010000291ae3102e0000040f000006f101000041000000000200041a000000400300043d00000000001304350000000801000029000006bc05100197000000040430003900000000010004140000000000540435000006bc02200197000000040420008c000900000002001d000013750000613d000000240400003900000020060000390000000005030019000800000003001d1ae302160000040f00000008030000290000000902000029000000000110004c000013e90000613d0000001f050000390000000101500031000000200600008a000000000461016f0000000001340019000000000441004b00000000040000190000000104004039000006da0710009c000013db0000213d0000000104400190000013db0000c13d000600000006001d000700000005001d000000400010043f000006bb010000410000000104000031000000200540008c00000000060000190000000006014019000006bb05400197000000000450004c000000000100a019000006bb0450009c000000000106c019000000000110004c000013d10000c13d0000000002030433000800000002001d0000000301000029000000000112004b000000000100001900000001010080391ae30ba30000040f000006e801000041000000000010043900000009010000290000000400100443000080020100003900000024020000391ae302640000040f0000000805000029000000000110004c000013d10000613d000000400300043d000006f00100004100000000001304350000000402300039000000000100041400000000005204350000000904000029000000040240008c0000000002040019000013b40000613d00000024040000390000000005030019000900000003001d00000000060000191ae301df0000040f00000009030000290000000805000029000000000110004c000013e90000613d000000070100002900000001011000310000000602000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0310009c000013db0000213d0000000102200190000013db0000c13d000000400010043f000006bb010000410000000102000031000000000320004c00000000030000190000000003014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000103c019000000000110004c000013d10000c13d000000020100002900000000020500191ae31a8e0000040f000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000013f80000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000013f00000413d000000000530004c000014070000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0008000000000002000700000002001d000800000001001d0000000001010433000000000210004c000014690000613d000000010110008c000014690000613d00000008020000290000002001200039000600000001001d00000000010104330000004002200039000500000002001d0000000002020433000006bc01100197000006bc022001971ae3149a0000040f000400000001001d000300000002001d00000008010000290000000001010433000000020110008c000014690000413d0000000501000029000000000201043300000006010000290000000001010433000006bc01100197000006bc0220019700000007030000291ae315cb0000040f000200000001001d000100000002001d00000008010000290000000001010433000000020110008c000014690000413d0000000501000029000000000201043300000006010000290000000001010433000006bc01100197000006bc0220019700000007030000291ae314c60000040f000006fc02000041000000400300043d000000000023043500000000050100190000000001000414000006bc02500197000000040420008c000014490000613d00000004040000390000002006000039000800000005001d0000000005030019000700000003001d1ae302160000040f00000007030000290000000805000029000000000110004c0000147a0000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000014700000213d0000000102200190000014700000c13d000000400010043f000006bb0100004100000001020000310000001f0420008c00000000060000190000000006012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000106c019000000000110004c000014770000613d000000000603043300000004010000290000000302000029000000000305001900000002040000290000000105000029000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000100001900000000020000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000014890000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000014810000413d000000000530004c000014980000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000006bc04100197000006bc05200197000000000354004b000014a70000613d000000000354004b00000000030200190000000003014019000006bc06300198000014b80000613d000000000454004b00000000020180190000000001030019000000000001042d000000400100043d0000006402100039000006fe0300004100000000003204350000004402100039000006ff030000410000000000320435000000240210003900000026030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000400100043d0000004402100039000006fd03000041000000000032043500000024021000390000001f030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000064020000391ae302800000040f0005000000000002000200000003001d000300000002001d000400000001001d000000400200043d000500000002001d000006e50100004100000000001204350000000001000414000100000001001d000006d6010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391ae302640000040f00000005030000290000000202000029000000000220004c0000000002000019000000010200c039000000440430003900000000002404350000000302000029000006bc02200197000000240430003900000000002404350000000402000029000006bc0220019700000004043000390000000000240435000006bc02100197000000040120008c000014f20000613d00000064040000390000002006000039000000010100002900000005050000291ae302160000040f0000000503000029000000000110004c000015190000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000015120000213d0000000102200190000015120000c13d000000400010043f000006bb0100004100000001020000310000001f0420008c00000000050000190000000005012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000105c019000000000110004c0000150f0000613d0000000001030433000006bc0210009c0000150f0000213d000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000015280000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000015200000413d000000000530004c000015370000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0003000000000002000300000003001d1ae3149a0000040f000006d6030000410000000000300439000000000300041200000004003004430000002400000443000100000001001d000200000002001d000080050100003900000044020000391ae302640000040f00000001020000290000006004200210000000400200043d00000020032000390000000000430435000000020400002900000060044002100000003405200039000000000045043500000700040000410000000305000029000000000550004c00000000040060190000004805200039000000000045043500000029040000390000000000420435000300000001001d000007010120009c000015a10000813d0000006001200039000000400010043f000000000202043300000000010300191ae3024d0000040f0000070202000041000000400300043d0000000000230435000000000601001900000000010004140000000302000029000006bc02200197000000040420008c000015720000613d0000000404000039000200000006001d00000020060000390000000005030019000100000003001d1ae302160000040f00000001030000290000000206000029000000000110004c000015ab0000613d0000001f010000390000000101100031000000200200008a000000000121016f0000000002310019000000000112004b00000000010000190000000101004039000006da0420009c000015a10000213d0000000101100190000015a10000c13d000000400020043f000006bb0100004100000001050000310000001f0450008c00000000040000190000000004012019000006bb07500197000000000570004c0000000001008019000006bb0570009c000000000104c019000000000110004c000015a80000613d00000000030304330000002001200039000007030400004100000000004104350000000304000029000000600440021000000021052000390000000000450435000000550420003900000000003404350000003503200039000000000063043500000055030000390000000000320435000007040320009c000015a10000213d0000008003200039000000400030043f00000000020204331ae3024d0000040f000006bc01100197000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000100001900000000020000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000015ba0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000015b20000413d000000000530004c000015c90000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f0004000000000002000300000003001d000200000002001d000400000001001d1ae3149a0000040f000100000001001d0000000401000029000000020200002900000003030000291ae314c60000040f000006fa02000041000000400500043d000000000025043500000000020100190000000001000414000006bc02200197000000040320008c000015e60000613d000000040400003900000060060000390000000003050019000300000005001d00000003050000291ae302160000040f0000000305000029000000000110004c000016070000613d0000001f010000390000000101100031000000200200008a000000000221016f0000000001520019000000000221004b00000000020000190000000102004039000006da0310009c000016000000213d0000000102200190000016000000c13d000000400010043f000000010250003100000000010500191ae310110000040f00000004030000290000000104000029000000000334013f000006bc03300198000006f902200197000006f90310019700000000010200190000000001036019000000000203c019000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000016160000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000160e0000413d000000000530004c000016250000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000000000410004c000016340000613d000000000420004c000016450000613d000000000430004c000016450000613d000000010400008a00000000541400d9000000000434004b000016560000413d00000000311300a900000000212100d9000000000001042d000000400100043d0000006402100039000006f2030000410000000000320435000000440210003900000706030000410000000000320435000000240210003900000026030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000400100043d000000640210003900000705030000410000000000320435000000440210003900000706030000410000000000320435000000240210003900000029030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0009000000000002000400000001001d000000400500043d000000440150003900000001040000390000000000410435000006e5010000410000000000150435000006bc033001970000002401500039000200000003001d0000000000310435000006bc02200197000700000005001d0000000401500039000600000002001d00000000002104350000000001000414000900000001001d000006d60100004100000000001004390000000001000412000300000001001d00000004001004430000002400000443000080050100003900000044020000391ae302640000040f000006bc02100197000000040120008c000016840000613d000000640400003900000020060000390000000901000029000000070300002900000000050300191ae302160000040f000000000110004c000017b20000613d0000001f01000039000900000001001d0000000101100031000000200200008a000800000002001d000000000121016f00000007060000290000000005610019000000000115004b00000000010000190000000101004039000006da0250009c000017ab0000213d0000000101100190000017ab0000c13d000000400050043f000006bb0100004100000001020000310000001f0320008c00000000030000190000000003012019000006bb02200197000000000420004c0000000001008019000006bb0220009c000000000103c019000000000110004c000017a80000613d0000000007060433000006bc0170009c000017a80000213d000000000170004c000500000000001d0000000001000019000017010000613d000006fb0100004100000000001504350000002402500039000000000100041400000006030000290000000000320435000000040250003900000004030000290000000000320435000000040270008c000016be0000613d0000004404000039000000200600003900000000020700190000000003050019000700000005001d0000000705000029000500000007001d1ae302160000040f00000005070000290000000705000029000000000110004c000017b20000613d000000090100002900000001011000310000000802000029000000000121016f0000000003510019000000000113004b00000000010000190000000101004039000006da0230009c000017ab0000213d0000000101100190000017ab0000c13d000000400030043f000006bb010000410000000102000031000000200420008c00000000060000190000000006014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000106c019000000000110004c000017a80000c13d0000000001050433000500000001001d000006fc0100004100000000001304350000000001000414000000040270008c000016e70000613d0000000404000039000000200600003900000000020700190000000005030019000700000003001d1ae302160000040f0000000703000029000000000110004c000017b20000613d000000090100002900000001011000310000000802000029000000000121016f0000000005310019000000000115004b00000000010000190000000101004039000006da0250009c000017ab0000213d0000000101100190000017ab0000c13d000000400050043f000006bb010000410000000102000031000000200420008c00000000060000190000000006014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000106c019000000000110004c000017a80000c13d0000000001030433000700000005001d000100000001001d000000240150003900000002020000290000000000210435000006e5010000410000000000150435000000040150003900000006020000290000000000210435000000440150003900000000000104350000000001000414000200000001001d000006d6010000410000000000100439000000030100002900000004001004430000002400000443000080050100003900000044020000391ae302640000040f0000000703000029000006bc02100197000000040120008c000017230000613d00000064040000390000002006000039000000020100002900000007050000291ae302160000040f0000000703000029000000000110004c000017b20000613d000000090100002900000001011000310000000802000029000000000121016f0000000007310019000000000117004b00000000010000190000000101004039000006da0270009c000017ab0000213d0000000101100190000017ab0000c13d000000400070043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000017a80000c13d0000000005030433000006bc0150009c000017a80000213d000000000150004c000000000600001900000000010000190000179e0000613d000006fb0100004100000000001704350000002402700039000000000100041400000006030000290000000000320435000000040270003900000004030000290000000000320435000000040250008c0000175a0000613d0000004404000039000000200600003900000000020500190000000003070019000600000005001d0000000005070019000700000007001d1ae302160000040f00000006050000290000000707000029000000000110004c000017b20000613d000000090100002900000001011000310000000802000029000000000121016f0000000003710019000000000113004b00000000010000190000000101004039000006da0230009c000017ab0000213d0000000101100190000017ab0000c13d000000400030043f000006bb010000410000000102000031000000200420008c00000000060000190000000006014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000106c019000000000110004c000017a80000c13d0000000006070433000006fc0100004100000000001304350000000001000414000000040250008c000017840000613d0000000404000039000600000006001d000000200600003900000000020500190000000005030019000700000003001d1ae302160000040f00000006060000290000000703000029000000000110004c000017b20000613d000000090100002900000001011000310000000802000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000017ab0000213d0000000102200190000017ab0000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000050000190000000005014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000105c019000000000110004c000017a80000c13d00000000010304330000000504000029000000000264004b0000000102000029000000000301001900000000030220190000000001060019000000000104201900000000020000190000000102002039000000000001042d000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000017c10000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000017b90000413d000000000530004c000017d00000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f000000000110004c000017d50000613d000000000001042d000000400100043d00000044021000390000070703000041000000000032043500000024021000390000001f030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000064020000391ae302800000040f0000000002010019000006db0120009c000018140000813d00000005052002100000003f01500039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b00000000040000190000000104004039000006da0630009c000018140000213d0000000104400190000018140000c13d000000400030043f00000000002104350000001f0250018f0000002003100039000000000400003100000002044003670000000505500272000018040000613d000000000600001900000005076002100000000008730019000000000774034f000000000707043b00000000007804350000000106600039000000000756004b000017fc0000413d000000000620004c000018130000613d0000000505500210000000000454034f00000000035300190000000302200210000000000503043300000000052501cf000000000525022f000000000404043b0000010002200089000000000424022f00000000022401cf000000000252019f0000000000230435000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000a000000000002000500000002001d000900000001001d0000000001020433000000010110008c000000000100001900000001010020391ae317d20000040f000000050100002900000000010104331ae317e30000040f000400000001001d000000050100002900000000010104331ae317e30000040f00000005020000290000000002020433000a00000001001d00000000010200191ae317e30000040f000000040500002900000000060100190000000001050433000000000110004c0000187e0000613d00000020075000390000000901000029000000000017043500000005010000290000002001100039000100000001001d0000000004000019000300000006001d000200000007001d00000005010000290000000001010433000000000210004c000018850000613d000000010210008a000000000224004b0000187a0000813d0000000002050433000000000242004b0000187e0000a13d000000000241004b0000187e0000a13d0000000108400039000000000181004b0000187e0000a13d0000000502400210000000000172001900000000010104330000000103000029000600000002001d00000000023200190000000002020433000006bc022001970000000509800210000700000009001d00000000033900190000000003030433000006bc03300197000900000004001d000800000008001d1ae3165d0000040f000000080900002900000009080000290000000207000029000000030600002900000004050000290000000004050433000000000494004b0000187e0000a13d0000000704000029000000000474001900000000001404350000000a010000290000000001010433000000000181004b0000187e0000a13d000000060100002900000020011000390000000a040000290000000004410019000000000220004c0000000002000019000000010200c03900000000002404350000000002060433000000000282004b0000187e0000a13d0000000001610019000000000031043500000000040900190000183d0000013d00000000010500190000000a020000290000000003060019000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f000e000000000002000e00000003001d000900000002001d000d00000001001d0000000001020433000000010110008c000000000100001900000001010020391ae317d20000040f000000090100002900000000010104331ae317e30000040f000400000001001d000000090100002900000000010104331ae317e30000040f00000009020000290000000002020433000200000001001d00000000010200191ae317e30000040f000300000001001d00000004010000290000000001010433000000000110004c000019700000613d00000004010000290000002001100039000100000001001d0000000d02000029000000000021043500000009010000290000002001100039000a00000001001d0000000006000019000000000306001900000009010000290000000002010433000000000120004c000019810000613d000000010120008a000000000113004b0000196c0000813d000000000132004b000019700000a13d00000005053002100000000a010000290000000001150019000800000001001d0000000001010433000006bc011001970000000104300039000000000242004b000019700000a13d0000000e020000290000000002020433000000000232004b000019700000a13d000c00000003001d00000005034002100000000a02000029000600000003001d00000000022300190000000002020433000006bc02200197000700000005001d00000020055000390000000e03000029000b00000005001d0000000003350019000500000003001d0000000003030433000000000330004c0000000003000019000000010300c039000d00000004001d1ae314c60000040f0000000d06000029000006bc07100198000018af0000613d000000040100002900000000010104330000000c05000029000000000151004b0000000702000029000019700000a13d00000009010000290000000001010433000000000151004b000019700000a13d00000001010000290000000001120019000000000201043300000008010000290000000001010433000000400300043d000006fb040000410000000000430435000006bc0810019700000024043000390000000001000414000000000084043500000004043000390000000000240435000000040270008c000019030000613d0000004404000039000000200600003900000000020700190000000005030019000800000007001d000700000003001d1ae302160000040f000000070300002900000008070000290000000d060000290000000c05000029000000000110004c000019880000613d0000001f080000390000000101800031000000200900008a000000000291016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000019770000213d0000000102200190000019770000c13d000000400010043f000006bb0100004100000001020000310000001f0420008c000000000a000019000000000a012019000006bb02200197000000000420004c0000000001008019000006bb0220009c00000000010ac019000000000110004c0000197e0000613d00000004010000290000000001010433000000000161004b000019700000a13d0000000101000029000000060200002900000000011200190000000002030433000000000021043500000003010000290000000001010433000000000151004b000019700000a13d0000000e010000290000000001010433000000000151004b000019700000a13d00000003010000290000000b02000029000000000112001900000005020000290000000002020433000000000220004c0000000002000019000000010200c0390000000000210435000006fc01000041000000400300043d00000000001304350000000001000414000000040270008c0000194b0000613d0000000404000039000000200600003900000000020700190000000005030019000800000008001d000700000009001d000600000003001d1ae302160000040f0000000603000029000000070900002900000008080000290000000d060000290000000c05000029000000000110004c000019880000613d0000000101800031000000000291016f0000000001320019000000000221004b00000000020000190000000102004039000006da0410009c000019770000213d0000000102200190000019770000c13d000000400010043f000006bb010000410000000102000031000000200420008c00000000070000190000000007014019000006bb02200197000000000420004c000000000100a019000006bb0220009c000000000107c019000000000110004c0000197e0000c13d00000002010000290000000001010433000000000151004b000019700000a13d00000002010000290000000b02000029000000000112001900000000020304330000000000210435000018af0000013d000000040100002900000003020000290000000203000029000000000001042d000006bf0100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191ae302800000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000019970000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000198f0000413d000000000530004c000019a60000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311ae302800000040f00000060010000390000000102000032000019d70000613d0000003f01200039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b00000000040000190000000104004039000006da0530009c000019d80000213d0000000104400190000019d80000c13d000000400030043f00000000002104350000002002100039000000030300036700000001050000310000001f0450018f0000000505500272000019c80000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000019c00000413d000000000640004c000019d70000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f00010000000000020000000005010019000000400400043d000000440140003900000000003104350000002003400039000006eb010000410000000000130435000006bc012001970000002402400039000000000012043500000044010000390000000000140435000007080140009c00001a2e0000813d0000008001400039000000400010043f0000000001000414000000040250008c0000000002000019000019fc0000613d00000000040404330000000002050019000000000500001900000000060000191ae301df0000040f000000000110004c00000000020000190000000102006039000100000002001d1ae319a80000040f0000000102000029000000010220019000001a1a0000c13d0000000002010433000000000320004c00001a190000613d000006bb030000410000001f0420008c00000000040000190000000004032019000006bb02200197000000000520004c0000000003008019000006bb0220009c00000000020400190000000002036019000000000220004c00001a2b0000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b00001a2b0000c13d000000000110004c00001a1a0000613d000000000001042d000000400100043d00000064021000390000070903000041000000000032043500000044021000390000070a03000041000000000032043500000024021000390000002d030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f00010000000000020000000005010019000000400600043d00000064016000390000000000410435000006bc01300197000000440360003900000000001304350000002003600039000006ee010000410000000000130435000006bc0120019700000024026000390000000000120435000000640100003900000000001604350000070b0160009c00001a870000813d000000a001600039000000400010043f0000000001000414000000040250008c000000000200001900001a550000613d00000000040604330000000002050019000000000500001900000000060000191ae301df0000040f000000000110004c00000000020000190000000102006039000100000002001d1ae319a80000040f0000000102000029000000010220019000001a730000c13d0000000002010433000000000320004c00001a720000613d000006bb030000410000001f0420008c00000000040000190000000004032019000006bb02200197000000000520004c0000000003008019000006bb0220009c00000000020400190000000002036019000000000220004c00001a840000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b00001a840000c13d000000000110004c00001a730000613d000000000001042d000000400100043d00000064021000390000070c03000041000000000032043500000044021000390000070d030000410000000000320435000000240210003900000031030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f000000000100001900000000020000191ae302800000040f000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000100000000000200000000050200190000000006010019000000400200043d000006f40120009c00001ac10000813d00000001070000390000002003200039000000400030043f00000000000204350000000001000414000000040460008c00001abb0000613d0000000004020433000000000250004c00001ab60000613d000006ba02000041000006ba0730009c00000000030280190000004003300210000006ba0740009c00000000040280190000006004400210000000000334019f000006ba0410009c0000000001028019000000c001100210000000000113019f000006d7011001c700008009020000390000000003050019000000000406001900000000050000191ae31ad90000040f00000000030100190000006003300270000106ba0030019d0003000000010355000000010720018f00001abb0000013d0000000002060019000000000500001900000000060000191ae301df0000040f0000000007010019000100000007001d1ae319a80000040f0000000101000029000000000110004c00001ac80000613d000000000001042d000006bf0100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191ae302800000040f000000400100043d00000064021000390000070e03000041000000000032043500000044021000390000070f030000410000000000320435000000240210003900000034030000390000000000320435000006de02000041000000000021043500000004021000390000002003000039000000000032043500000084020000391ae302800000040f00001adc002104210000000102000039000000000001042d000000000200001900001adb0000013d00001ae1002104230000000102000039000000000001042d000000000200001900001ae00000013d00001ae30000043200001ae40001042e00001ae5000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bbaa8d2000000000000000000000000000000000000000000000000000000000fc87d250000000000000000000000000000000000000000000000000000000019a13c5c000000000000000000000000000000000000000000000000000000001ead1418000000000000000000000000000000000000000000000000000000003a8e53ff000000000000000000000000000000000000000000000000000000003f464b16000000000000000000000000000000000000000000000000000000004c1ee03e0000000000000000000000000000000000000000000000000000000051cbf10f00000000000000000000000000000000000000000000000000000000544caa56000000000000000000000000000000000000000000000000000000005e1e6325000000000000000000000000000000000000000000000000000000005e60dab50000000000000000000000000000000000000000000000000000000084e21aff00000000000000000000000000000000000000000000000000000000aac57b1900000000000000000000000000000000000000000000000000000000acc8723d00000000000000000000000000000000000000000000000000000000ad5c464800000000000000000000000000000000000000000000000000000000ad615dec00000000000000000000000000000000000000000000000000000000ad97ec1b00000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000c694d55d00000000000000000000000000000000000000000000000000000000cad9446c00000000000000000000000000000000000000000000000000000000ced058cd00000000000000000000000000000000000000000000000000000000e43b4ee2310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e020000000000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000001000000000000000020574554480000000000000000000000000000000000000000000000000000004d7574655377697463683a3a726563656976652063616c6c6261636b206e6f7408c379a0000000000000000000000000000000000000000000000000000000004d7574655377697463683a204558504952454400000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391326a6278420000000000000000000000000000000000000000000000000000000054000000000000000000000000000000000000000000000000000000000000004d7574655377697463683a20494e53554646494349454e545f415f414d4f554e4d7574655377697463683a20494e53554646494349454e545f425f414d4f554e6801cc3000000000000000000000000000000000000000000000000000000000b2e916d6000000000000000000000000000000000000000000000000000000004d7574655377697463683a20494e53554646494349454e545f4f5054494d414c1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000a9059cbb000000000000000000000000000000000000000000000000000000004c45445f574554485f5452414e534645520000000000000000000000000000004d7574655377697463683a3a6164644c69717569646974794554483a2046414923b872dd0000000000000000000000000000000000000000000000000000000089afcb44000000000000000000000000000000000000000000000000000000002e1a7d4d0000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000414d4f554e5400000000000000000000000000000000000000000000000000004d7574655377697463683a20494e53554646494349454e545f4f55545055545f000000000000000000000000000000000000000000000000ffffffffffffffe0022c0d9f000000000000000000000000000000000000000000000000000000004d7574655377697463683a20494e56414c49445f504154480000000000000000733a204641494c45445f574554485f5452414e534645520000000000000000004d7574655377697463683a3a737761704578616374455448466f72546f6b656e000000000000000000000000000000000000ffffffffffffffffffffffffffff0902f1ac00000000000000000000000000000000000000000000000000000000f140a35a00000000000000000000000000000000000000000000000000000000218cf69a000000000000000000000000000000000000000000000000000000004d7574655377697463684c6962726172793a205a45524f5f414444524553530052455353455300000000000000000000000000000000000000000000000000004d7574655377697463684c6962726172793a204944454e544943414c5f4144440100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa09aab924800000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f4c495155494449545900000000000000000000000000000000000000000000004d7574655377697463684c6962726172793a20494e53554646494349454e545f4d7574655377697463684c6962726172793a20494e56414c49445f5041544800000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a207472000000000000000000000000000000000000000000000000ffffffffffffff60616e7366657246726f6d206661696c65640000000000000000000000000000005472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747220455448207472616e73666572206661696c65640000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665724554483a0000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0x00000000000000000000000040be1cba6c5b47cdf9da7f963b6f761f4c60627d0000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
-----Decoded View---------------
Arg [0] : _factory (address): 0x40be1cBa6C5B47cDF9da7f963B6F761F4C60627D
Arg [1] : _weth (address): 0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
-----Encoded View---------------
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ZKSYNC | 50.13% | $1,783.69 | 7.1337 | $12,724.22 | |
ETH | 31.65% | $1,783.69 | 4.5042 | $8,034.01 | |
ARB | 11.72% | $1,783.09 | 1.6688 | $2,975.64 | |
ZKEVM | 5.67% | $1,783.13 | 0.8067 | $1,438.45 | |
BSC | 0.47% | $617 | 0.1951 | $120.38 | |
ARBNOVA | 0.11% | $1,783.87 | 0.0164 | $29.18 | |
SCROLL | 0.11% | $1,783.13 | 0.016 | $28.53 | |
LINEA | 0.11% | $1,783.13 | 0.0155 | $27.69 | |
BASE | 0.02% | $1,782.81 | 0.002314 | $4.13 | |
OP | <0.01% | $1,783.05 | 0.0005 | $0.891524 | |
POL | <0.01% | $0.217662 | 0.121 | $0.026338 |
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.