More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 360 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Fee | 55501747 | 19 hrs ago | IN | 0 ETH | 0.0000053 | ||||
Claim Fee | 55432652 | 43 hrs ago | IN | 0 ETH | 0.0000053 | ||||
Claim Fee | 55361803 | 2 days ago | IN | 0 ETH | 0.00000655 | ||||
Repay Principal | 55297849 | 3 days ago | IN | 0 ETH | 0.00000995 | ||||
Repay Principal | 55297758 | 3 days ago | IN | 0 ETH | 0.00000995 | ||||
Repay Principal | 55297710 | 3 days ago | IN | 0 ETH | 0.00001804 | ||||
Claim Fee | 55289074 | 3 days ago | IN | 0 ETH | 0.00000545 | ||||
Claim Fee | 55211305 | 4 days ago | IN | 0 ETH | 0.00000554 | ||||
Claim Fee | 55129909 | 5 days ago | IN | 0 ETH | 0.00000636 | ||||
Claim Fee | 55055613 | 6 days ago | IN | 0 ETH | 0.00000538 | ||||
Claim Fee | 54989487 | 7 days ago | IN | 0 ETH | 0.00000535 | ||||
Claim Fee | 54919996 | 8 days ago | IN | 0 ETH | 0.00000659 | ||||
Claim Fee | 54851913 | 9 days ago | IN | 0 ETH | 0.00000538 | ||||
Claim Fee | 54780829 | 10 days ago | IN | 0 ETH | 0.00000552 | ||||
Claim Fee | 54706433 | 11 days ago | IN | 0 ETH | 0.00000556 | ||||
Repay Weekly Len... | 54633989 | 12 days ago | IN | 0 ETH | 0.00002463 | ||||
Claim Fee | 54625738 | 12 days ago | IN | 0 ETH | 0.00000553 | ||||
Claim Fee | 54550701 | 13 days ago | IN | 0 ETH | 0.00000541 | ||||
Claim Fee | 54474640 | 14 days ago | IN | 0 ETH | 0.0000087 | ||||
Claim Fee | 54402083 | 15 days ago | IN | 0 ETH | 0.00000548 | ||||
Claim Fee | 54328082 | 16 days ago | IN | 0 ETH | 0.00000596 | ||||
Claim Fee | 54252221 | 17 days ago | IN | 0 ETH | 0.00000574 | ||||
Claim Fee | 54171643 | 18 days ago | IN | 0 ETH | 0.00000582 | ||||
Claim Fee | 54089118 | 19 days ago | IN | 0 ETH | 0.00000984 | ||||
Claim Fee | 54007491 | 20 days ago | IN | 0 ETH | 0.0000056 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
33471538 | 276 days ago | Contract Creation | 0 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:
WooPPV2
Compiler Version
v0.8.14+commit.80d49f37
ZkSolc Version
v1.3.5
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import "./interfaces/IWooracleV2_2.sol"; import "./interfaces/IWooPPV2.sol"; import "./interfaces/AggregatorV3Interface.sol"; import "./interfaces/IWooLendingManager.sol"; import {TransferHelper} from "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; // OpenZeppelin contracts import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; // REMOVE IT IN PROD // import "hardhat/console.sol"; /// @title Woo pool for token swap, version 2. /// @notice the implementation class for interface IWooPPV2, mainly for query and swap tokens. contract WooPPV2 is Ownable, ReentrancyGuard, Pausable, IWooPPV2 { /* ----- Type declarations ----- */ struct DecimalInfo { uint64 priceDec; // 10**(price_decimal) uint64 quoteDec; // 10**(quote_decimal) uint64 baseDec; // 10**(base_decimal) } struct TokenInfo { uint192 reserve; // balance reserve uint16 feeRate; // 1 in 100000; 10 = 1bp = 0.01%; max = 65535 uint128 maxGamma; // max range of `balance * k` uint128 maxNotionalSwap; // max volume per swap } /* ----- State variables ----- */ address constant ETH_PLACEHOLDER_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 public unclaimedFee; // NOTE: in quote token // wallet address --> is admin mapping(address => bool) public isAdmin; // wallet address --> is pause role mapping(address => bool) public isPauseRole; // token address --> fee rate mapping(address => TokenInfo) public tokenInfos; /// @inheritdoc IWooPPV2 address public immutable override quoteToken; IWooracleV2_2 public wooracle; address public feeAddr; mapping(address => IWooLendingManager) public lendManagers; /* ----- Modifiers ----- */ modifier onlyAdmin() { require(msg.sender == owner() || isAdmin[msg.sender], "WooPPV2: !admin"); _; } modifier onlyAdminOrPauseRole() { require(msg.sender == owner() || isAdmin[msg.sender] || isPauseRole[msg.sender], "WooPPV2: !isPauseRole"); _; } constructor(address _quoteToken) { quoteToken = _quoteToken; } function init(address _wooracle, address _feeAddr) external onlyOwner { require(address(wooracle) == address(0), "WooPPV2: INIT_INVALID"); wooracle = IWooracleV2_2(_wooracle); feeAddr = _feeAddr; } /* ----- External Functions ----- */ /// @inheritdoc IWooPPV2 function tryQuery( address fromToken, address toToken, uint256 fromAmount ) external view override returns (uint256 toAmount) { if (fromToken == quoteToken) { toAmount = _tryQuerySellQuote(toToken, fromAmount); } else if (toToken == quoteToken) { toAmount = _tryQuerySellBase(fromToken, fromAmount); } else { (toAmount, ) = _tryQueryBaseToBase(fromToken, toToken, fromAmount); } } /// @inheritdoc IWooPPV2 function query( address fromToken, address toToken, uint256 fromAmount ) external view override returns (uint256 toAmount) { if (fromToken == quoteToken) { toAmount = _tryQuerySellQuote(toToken, fromAmount); } else if (toToken == quoteToken) { toAmount = _tryQuerySellBase(fromToken, fromAmount); } else { uint256 swapFee; (toAmount, swapFee) = _tryQueryBaseToBase(fromToken, toToken, fromAmount); require(swapFee <= tokenInfos[quoteToken].reserve, "WooPPV2: INSUFF_QUOTE_FOR_SWAPFEE"); } require(toAmount <= tokenInfos[toToken].reserve, "WooPPV2: INSUFF_BALANCE"); } /// @inheritdoc IWooPPV2 function swap( address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo ) external override returns (uint256 realToAmount) { if (fromToken == quoteToken) { // case 1: quoteToken --> baseToken realToAmount = _sellQuote(toToken, fromAmount, minToAmount, to, rebateTo); } else if (toToken == quoteToken) { // case 2: fromToken --> quoteToken realToAmount = _sellBase(fromToken, fromAmount, minToAmount, to, rebateTo); } else { // case 3: fromToken --> toToken (base to base) realToAmount = _swapBaseToBase(fromToken, toToken, fromAmount, minToAmount, to, rebateTo); } } /// @dev OKAY to be public method function claimFee() external nonReentrant { require(feeAddr != address(0), "WooPPV2: !feeAddr"); uint256 amountToTransfer = unclaimedFee; unclaimedFee = 0; TransferHelper.safeTransfer(quoteToken, feeAddr, amountToTransfer); } /// @inheritdoc IWooPPV2 /// @dev pool size = tokenInfo.reserve function poolSize(address token) public view override returns (uint256) { return tokenInfos[token].reserve; } /// @dev User pool balance (substracted unclaimed fee) function balance(address token) public view returns (uint256) { return token == quoteToken ? _rawBalance(token) - unclaimedFee : _rawBalance(token); } function decimalInfo(address baseToken) public view returns (DecimalInfo memory) { return DecimalInfo({ priceDec: uint64(10)**(IWooracleV2_2(wooracle).decimals(baseToken)), // 8 quoteDec: uint64(10)**(IERC20Metadata(quoteToken).decimals()), // 18 or 6 baseDec: uint64(10)**(IERC20Metadata(baseToken).decimals()) // 18 or 8 }); } /* ----- Admin Functions ----- */ function setWooracle(address _wooracle) external onlyAdmin { wooracle = IWooracleV2_2(_wooracle); emit WooracleUpdated(_wooracle); } function setFeeAddr(address _feeAddr) external onlyAdmin { feeAddr = _feeAddr; emit FeeAddrUpdated(_feeAddr); } function setFeeRate(address token, uint16 rate) external onlyAdmin { require(rate <= 1e5, "!rate"); tokenInfos[token].feeRate = rate; } function setMaxGamma(address token, uint128 maxGamma) external onlyAdmin { tokenInfos[token].maxGamma = maxGamma; } function setMaxNotionalSwap(address token, uint128 maxNotionalSwap) external onlyAdmin { tokenInfos[token].maxNotionalSwap = maxNotionalSwap; } function setTokenInfo( address token, uint16 _feeRate, uint128 _maxGamma, uint128 _maxNotionalSwap ) external onlyAdmin { tokenInfos[token].feeRate = _feeRate; tokenInfos[token].maxGamma = _maxGamma; tokenInfos[token].maxNotionalSwap = _maxNotionalSwap; } function pause() external onlyAdminOrPauseRole { super._pause(); } function unpause() external onlyAdmin { super._unpause(); } function setAdmin(address addr, bool flag) external onlyAdmin { require(addr != address(0), "WooPPV2: !admin"); isAdmin[addr] = flag; emit AdminUpdated(addr, flag); } function setPauseRole(address addr, bool flag) external onlyAdmin { isPauseRole[addr] = flag; emit PauseRoleUpdated(addr, flag); } function deposit(address token, uint256 amount) public override nonReentrant onlyAdmin { uint256 balanceBefore = balance(token); TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount); uint256 amountReceived = balance(token) - balanceBefore; require(amountReceived >= amount, "AMOUNT_INSUFF"); tokenInfos[token].reserve = uint192(tokenInfos[token].reserve + amount); emit Deposit(token, msg.sender, amount); } function depositAll(address token) external onlyAdmin { deposit(token, IERC20(token).balanceOf(msg.sender)); } function repayWeeklyLending(address wantToken) external nonReentrant onlyAdmin returns (uint256 repaidAmount) { IWooLendingManager lendManager = lendManagers[wantToken]; lendManager.accureInterest(); uint256 amount = lendManager.weeklyRepayment(); address repaidToken = lendManager.want(); if (amount > 0) { tokenInfos[repaidToken].reserve = uint192(tokenInfos[repaidToken].reserve - amount); TransferHelper.safeApprove(repaidToken, address(lendManager), amount); repaidAmount = lendManager.repayWeekly(); TransferHelper.safeApprove(repaidToken, address(lendManager), 0); } emit Withdraw(repaidToken, address(lendManager), amount); } function repayPrincipal(address repaidToken, uint256 principalAmount) external nonReentrant onlyAdmin returns (uint256 repaidAmount) { IWooLendingManager lendManager = lendManagers[repaidToken]; lendManager.accureInterest(); uint256 interest = lendManager.borrowedInterest(); uint256 perfFee = (lendManager.perfRate() * interest) / 10000; uint256 amount = principalAmount + interest + perfFee; if (amount > 0) { tokenInfos[repaidToken].reserve = uint192(tokenInfos[repaidToken].reserve - amount); TransferHelper.safeApprove(repaidToken, address(lendManager), amount); repaidAmount = lendManager.repayPrincipal(principalAmount); TransferHelper.safeApprove(repaidToken, address(lendManager), 0); } emit Withdraw(repaidToken, address(lendManager), amount); } /// NOTE: Used for legacy lending manager only support `repay(amount)` method. /// e.g. lending managers on arbitrum, OP and etc /// https://arbiscan.io/address/0x5c7ff24fa7af62bc25ad6747a6193183b4bb7bc5#code function repayLegacy(address repaidToken, uint256 amount) external nonReentrant onlyAdmin { IWooLendingManager lendManager = lendManagers[repaidToken]; if (amount > 0) { tokenInfos[repaidToken].reserve = uint192(tokenInfos[repaidToken].reserve - amount); TransferHelper.safeApprove(repaidToken, address(lendManager), amount); lendManager.repay(amount); TransferHelper.safeApprove(repaidToken, address(lendManager), 0); } emit Withdraw(repaidToken, address(lendManager), amount); } function withdraw(address token, uint256 amount) public nonReentrant onlyAdmin { require(tokenInfos[token].reserve >= amount, "WooPPV2: !amount"); tokenInfos[token].reserve = uint192(tokenInfos[token].reserve - amount); TransferHelper.safeTransfer(token, owner(), amount); emit Withdraw(token, owner(), amount); } function withdrawAll(address token) external onlyAdmin { withdraw(token, poolSize(token)); } function skim(address token) public nonReentrant onlyAdmin { TransferHelper.safeTransfer(token, owner(), balance(token) - tokenInfos[token].reserve); } function skimMulTokens(address[] memory tokens) external onlyAdmin { unchecked { uint256 len = tokens.length; for (uint256 i = 0; i < len; i++) { skim(tokens[i]); } } } function sync(address token) external nonReentrant onlyAdmin { tokenInfos[token].reserve = uint192(balance(token)); } /* ----- Owner Functions ----- */ function setLendManager(IWooLendingManager _lendManager) external onlyOwner { lendManagers[_lendManager.want()] = _lendManager; isAdmin[address(_lendManager)] = true; emit AdminUpdated(address(_lendManager), true); } function migrateToNewPool(address token, address newPool) external onlyOwner { require(token != address(0), "WooPPV2: !token"); require(newPool != address(0), "WooPPV2: !newPool"); tokenInfos[token].reserve = 0; uint256 bal = balance(token); TransferHelper.safeApprove(token, newPool, bal); WooPPV2(newPool).depositAll(token); emit Migrate(token, newPool, bal); } function inCaseTokenGotStuck(address stuckToken) external onlyOwner { if (stuckToken == ETH_PLACEHOLDER_ADDR) { TransferHelper.safeTransferETH(msg.sender, address(this).balance); } else { uint256 amount = IERC20(stuckToken).balanceOf(address(this)); TransferHelper.safeTransfer(stuckToken, msg.sender, amount); } } /* ----- Private Functions ----- */ function _tryQuerySellBase(address baseToken, uint256 baseAmount) private view whenNotPaused returns (uint256 quoteAmount) { IWooracleV2_2.State memory state = IWooracleV2_2(wooracle).state(baseToken); (quoteAmount, ) = _calcQuoteAmountSellBase(baseToken, baseAmount, state); uint256 fee = (quoteAmount * tokenInfos[baseToken].feeRate) / 1e5; quoteAmount = quoteAmount - fee; } function _tryQuerySellQuote(address baseToken, uint256 quoteAmount) private view whenNotPaused returns (uint256 baseAmount) { uint256 swapFee = (quoteAmount * tokenInfos[baseToken].feeRate) / 1e5; quoteAmount = quoteAmount - swapFee; IWooracleV2_2.State memory state = IWooracleV2_2(wooracle).state(baseToken); (baseAmount, ) = _calcBaseAmountSellQuote(baseToken, quoteAmount, state); } function _tryQueryBaseToBase( address baseToken1, address baseToken2, uint256 base1Amount ) private view whenNotPaused returns (uint256 base2Amount, uint256 swapFee) { if ( baseToken1 == address(0) || baseToken2 == address(0) || baseToken1 == quoteToken || baseToken2 == quoteToken ) { return (0, 0); } IWooracleV2_2.State memory state1 = IWooracleV2_2(wooracle).state(baseToken1); IWooracleV2_2.State memory state2 = IWooracleV2_2(wooracle).state(baseToken2); uint64 spread = _maxUInt64(state1.spread, state2.spread) / 2; uint16 feeRate = _maxUInt16(tokenInfos[baseToken1].feeRate, tokenInfos[baseToken2].feeRate); state1.spread = spread; state2.spread = spread; (uint256 quoteAmount, ) = _calcQuoteAmountSellBase(baseToken1, base1Amount, state1); swapFee = (quoteAmount * feeRate) / 1e5; quoteAmount = quoteAmount - swapFee; (base2Amount, ) = _calcBaseAmountSellQuote(baseToken2, quoteAmount, state2); } function _sellBase( address baseToken, uint256 baseAmount, uint256 minQuoteAmount, address to, address rebateTo ) private nonReentrant whenNotPaused returns (uint256 quoteAmount) { require(baseToken != address(0), "WooPPV2: !baseToken"); require(to != address(0), "WooPPV2: !to"); require(baseToken != quoteToken, "WooPPV2: baseToken==quoteToken"); require(balance(baseToken) - tokenInfos[baseToken].reserve >= baseAmount, "WooPPV2: !BASE"); { uint256 newPrice; IWooracleV2_2.State memory state = IWooracleV2_2(wooracle).state(baseToken); (quoteAmount, newPrice) = _calcQuoteAmountSellBase(baseToken, baseAmount, state); IWooracleV2_2(wooracle).postPrice(baseToken, uint128(newPrice)); // console.log('Post new price:', newPrice, newPrice/1e8); } uint256 swapFee = (quoteAmount * tokenInfos[baseToken].feeRate) / 1e5; quoteAmount = quoteAmount - swapFee; require(quoteAmount >= minQuoteAmount, "WooPPV2: quoteAmount_LT_minQuoteAmount"); unclaimedFee = unclaimedFee + swapFee; tokenInfos[baseToken].reserve = uint192(tokenInfos[baseToken].reserve + baseAmount); tokenInfos[quoteToken].reserve = uint192(tokenInfos[quoteToken].reserve - quoteAmount - swapFee); if (to != address(this)) { TransferHelper.safeTransfer(quoteToken, to, quoteAmount); } emit WooSwap( baseToken, quoteToken, baseAmount, quoteAmount, msg.sender, to, rebateTo, quoteAmount + swapFee, swapFee ); } function _sellQuote( address baseToken, uint256 quoteAmount, uint256 minBaseAmount, address to, address rebateTo ) private nonReentrant whenNotPaused returns (uint256 baseAmount) { require(baseToken != address(0), "WooPPV2: !baseToken"); require(to != address(0), "WooPPV2: !to"); require(baseToken != quoteToken, "WooPPV2: baseToken==quoteToken"); require(balance(quoteToken) - tokenInfos[quoteToken].reserve >= quoteAmount, "WooPPV2: !QUOTE"); uint256 swapFee = (quoteAmount * tokenInfos[baseToken].feeRate) / 1e5; quoteAmount = quoteAmount - swapFee; unclaimedFee = unclaimedFee + swapFee; { uint256 newPrice; IWooracleV2_2.State memory state = IWooracleV2_2(wooracle).state(baseToken); (baseAmount, newPrice) = _calcBaseAmountSellQuote(baseToken, quoteAmount, state); IWooracleV2_2(wooracle).postPrice(baseToken, uint128(newPrice)); // console.log('Post new price:', newPrice, newPrice/1e8); require(baseAmount >= minBaseAmount, "WooPPV2: baseAmount_LT_minBaseAmount"); } tokenInfos[baseToken].reserve = uint192(tokenInfos[baseToken].reserve - baseAmount); tokenInfos[quoteToken].reserve = uint192(tokenInfos[quoteToken].reserve + quoteAmount); if (to != address(this)) { TransferHelper.safeTransfer(baseToken, to, baseAmount); } emit WooSwap( quoteToken, baseToken, quoteAmount + swapFee, baseAmount, msg.sender, to, rebateTo, quoteAmount + swapFee, swapFee ); } function _swapBaseToBase( address baseToken1, address baseToken2, uint256 base1Amount, uint256 minBase2Amount, address to, address rebateTo ) private nonReentrant whenNotPaused returns (uint256 base2Amount) { require(baseToken1 != address(0) && baseToken1 != quoteToken, "WooPPV2: !baseToken1"); require(baseToken2 != address(0) && baseToken2 != quoteToken, "WooPPV2: !baseToken2"); require(baseToken1 != baseToken2, "WooPPV2: base1==base2"); require(to != address(0), "WooPPV2: !to"); require(balance(baseToken1) - tokenInfos[baseToken1].reserve >= base1Amount, "WooPPV2: !BASE1_BALANCE"); IWooracleV2_2.State memory state1 = IWooracleV2_2(wooracle).state(baseToken1); IWooracleV2_2.State memory state2 = IWooracleV2_2(wooracle).state(baseToken2); uint256 swapFee; uint256 quoteAmount; { uint64 spread = _maxUInt64(state1.spread, state2.spread) / 2; uint16 feeRate = _maxUInt16(tokenInfos[baseToken1].feeRate, tokenInfos[baseToken2].feeRate); state1.spread = spread; state2.spread = spread; uint256 newBase1Price; (quoteAmount, newBase1Price) = _calcQuoteAmountSellBase(baseToken1, base1Amount, state1); IWooracleV2_2(wooracle).postPrice(baseToken1, uint128(newBase1Price)); // console.log('Post new base1 price:', newBase1Price, newBase1Price/1e8); swapFee = (quoteAmount * feeRate) / 1e5; } quoteAmount = quoteAmount - swapFee; unclaimedFee = unclaimedFee + swapFee; tokenInfos[quoteToken].reserve = uint192(tokenInfos[quoteToken].reserve - swapFee); tokenInfos[baseToken1].reserve = uint192(tokenInfos[baseToken1].reserve + base1Amount); { uint256 newBase2Price; (base2Amount, newBase2Price) = _calcBaseAmountSellQuote(baseToken2, quoteAmount, state2); IWooracleV2_2(wooracle).postPrice(baseToken2, uint128(newBase2Price)); // console.log('Post new base2 price:', newBase2Price, newBase2Price/1e8); require(base2Amount >= minBase2Amount, "WooPPV2: base2Amount_LT_minBase2Amount"); } tokenInfos[baseToken2].reserve = uint192(tokenInfos[baseToken2].reserve - base2Amount); if (to != address(this)) { TransferHelper.safeTransfer(baseToken2, to, base2Amount); } emit WooSwap( baseToken1, baseToken2, base1Amount, base2Amount, msg.sender, to, rebateTo, quoteAmount + swapFee, swapFee ); } /// @dev Get the pool's balance of the specified token /// @dev This function is gas optimized to avoid a redundant extcodesize check in addition to the returndatasize /// @dev forked and curtesy by Uniswap v3 core function _rawBalance(address token) private view returns (uint256) { (bool success, bytes memory data) = token.staticcall( abi.encodeWithSelector(IERC20.balanceOf.selector, address(this)) ); require(success && data.length >= 32, "WooPPV2: !BALANCE"); return abi.decode(data, (uint256)); } function _calcQuoteAmountSellBase( address baseToken, uint256 baseAmount, IWooracleV2_2.State memory state ) private view returns (uint256 quoteAmount, uint256 newPrice) { require(state.woFeasible, "WooPPV2: !ORACLE_FEASIBLE"); require(state.price > 0, "WooPPV2: !ORACE_PRICE"); DecimalInfo memory decs = decimalInfo(baseToken); // gamma = k * price * base_amount; and decimal 18 uint256 gamma; { uint256 notionalSwap = (baseAmount * state.price * decs.quoteDec) / decs.baseDec / decs.priceDec; require(notionalSwap <= tokenInfos[baseToken].maxNotionalSwap, "WooPPV2: !maxNotionalValue"); gamma = (baseAmount * state.price * state.coeff) / decs.priceDec / decs.baseDec; require(gamma <= tokenInfos[baseToken].maxGamma, "WooPPV2: !gamma"); // Formula: quoteAmount = baseAmount * oracle.price * (1 - oracle.k * baseAmount * oracle.price - oracle.spread) quoteAmount = (((baseAmount * state.price * decs.quoteDec) / decs.priceDec) * (uint256(1e18) - gamma - state.spread)) / 1e18 / decs.baseDec; } // newPrice = oracle.price * (1 - k * oracle.price * baseAmount) newPrice = ((uint256(1e18) - gamma) * state.price) / 1e18; } function _calcBaseAmountSellQuote( address baseToken, uint256 quoteAmount, IWooracleV2_2.State memory state ) private view returns (uint256 baseAmount, uint256 newPrice) { require(state.woFeasible, "WooPPV2: !ORACLE_FEASIBLE"); require(state.price > 0, "WooPPV2: !ORACE_PRICE"); DecimalInfo memory decs = decimalInfo(baseToken); // gamma = k * quote_amount; and decimal 18 uint256 gamma; { require(quoteAmount <= tokenInfos[baseToken].maxNotionalSwap, "WooPPV2: !maxNotionalValue"); gamma = (quoteAmount * state.coeff) / decs.quoteDec; require(gamma <= tokenInfos[baseToken].maxGamma, "WooPPV2: !gamma"); // Formula: baseAmount = quoteAmount / oracle.price * (1 - oracle.k * quoteAmount - oracle.spread) baseAmount = (((quoteAmount * decs.baseDec * decs.priceDec) / state.price) * (uint256(1e18) - gamma - state.spread)) / 1e18 / decs.quoteDec; } // new_price = oracle.price / (1 - k * quoteAmount) newPrice = (uint256(1e18) * state.price) / (uint256(1e18) - gamma); } function _maxUInt16(uint16 a, uint16 b) private pure returns (uint16) { return a > b ? a : b; } function _maxUInt64(uint64 a, uint64 b) private pure returns (uint64) { return a > b ? a : b; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } }
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); /// getRoundData and latestRoundData should both raise "No data present" /// if they do not have data to report, instead of returning unset values /// which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2022 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Interface for WooLendingManager interface IWooLendingManager { function want() external returns (address); function repayWeekly() external returns (uint256 repaidAmount); function repayAll() external returns (uint256 repaidAmount); function repay(uint256 amount) external; /// @notice Borrow the fund from super charger and then deposit directly into WooPP. /// @param amount the borrowing amount function borrow(uint256 amount) external; function accureInterest() external; function weeklyRepayment() external view returns (uint256 repayAmount); function weeklyRepaymentBreakdown() external view returns ( uint256 repayAmount, uint256 principal, uint256 interest, uint256 perfFee ); function borrowedInterest() external view returns (uint256); function perfRate() external view returns (uint256); function repayPrincipal(uint256 _principal) external returns (uint256 repaidAmount); }
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title Woo private pool for swap. /// @notice Use this contract to directly interfact with woo's synthetic proactive /// marketing making pool. /// @author woo.network interface IWooPPV2 { /* ----- Events ----- */ event Deposit(address indexed token, address indexed sender, uint256 amount); event Withdraw(address indexed token, address indexed receiver, uint256 amount); event Migrate(address indexed token, address indexed receiver, uint256 amount); event AdminUpdated(address indexed addr, bool flag); event PauseRoleUpdated(address indexed addr, bool flag); event FeeAddrUpdated(address indexed newFeeAddr); event WooracleUpdated(address indexed newWooracle); event WooSwap( address indexed fromToken, address indexed toToken, uint256 fromAmount, uint256 toAmount, address from, address indexed to, address rebateTo, uint256 swapVol, uint256 swapFee ); /* ----- External Functions ----- */ /// @notice The quote token address (immutable). /// @return address of quote token function quoteToken() external view returns (address); /// @notice Gets the pool size of the specified token (swap liquidity). /// @param token the token address /// @return the pool size function poolSize(address token) external view returns (uint256); /// @notice Query the amount to swap `fromToken` to `toToken`, without checking the pool reserve balance. /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of `fromToken` to swap /// @return toAmount the swapped amount of `toToken` function tryQuery( address fromToken, address toToken, uint256 fromAmount ) external view returns (uint256 toAmount); /// @notice Query the amount to swap `fromToken` to `toToken`, with checking the pool reserve balance. /// @dev tx reverts when 'toToken' balance is insufficient. /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of `fromToken` to swap /// @return toAmount the swapped amount of `toToken` function query( address fromToken, address toToken, uint256 fromAmount ) external view returns (uint256 toAmount); /// @notice Swap `fromToken` to `toToken`. /// @param fromToken the from token /// @param toToken the to token /// @param fromAmount the amount of `fromToken` to swap /// @param minToAmount the minimum amount of `toToken` to receive /// @param to the destination address /// @param rebateTo the rebate address (optional, can be address ZERO) /// @return realToAmount the amount of toToken to receive function swap( address fromToken, address toToken, uint256 fromAmount, uint256 minToAmount, address to, address rebateTo ) external returns (uint256 realToAmount); /// @notice Deposit the specified token into the liquidity pool of WooPPV2. /// @param token the token to deposit /// @param amount the deposit amount function deposit(address token, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; /* ░██╗░░░░░░░██╗░█████╗░░█████╗░░░░░░░███████╗██╗ ░██║░░██╗░░██║██╔══██╗██╔══██╗░░░░░░██╔════╝██║ ░╚██╗████╗██╔╝██║░░██║██║░░██║█████╗█████╗░░██║ ░░████╔═████║░██║░░██║██║░░██║╚════╝██╔══╝░░██║ ░░╚██╔╝░╚██╔╝░╚█████╔╝╚█████╔╝░░░░░░██║░░░░░██║ ░░░╚═╝░░░╚═╝░░░╚════╝░░╚════╝░░░░░░░╚═╝░░░░░╚═╝ * * MIT License * =========== * * Copyright (c) 2020 WooTrade * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /// @title The oracle V2.2 interface by Woo.Network. /// @notice update and posted the latest price info by Woo. interface IWooracleV2_2 { struct State { uint128 price; uint64 spread; uint64 coeff; bool woFeasible; } // /// @notice Wooracle spread value // function woSpread(address base) external view returns (uint64); // /// @notice Wooracle coeff value // function woCoeff(address base) external view returns (uint64); // /// @notice Wooracle state for the specified base token // function woState(address base) external view returns (State memory); // /// @notice Chainlink oracle address for the specified base token // function cloAddress(address base) external view returns (address clo); // /// @notice Wooracle price of the base token // function woPrice(address base) external view returns (uint128 price, uint256 timestamp); /// @notice ChainLink price of the base token / quote token function cloPrice(address base) external view returns (uint256 price, uint256 timestamp); /// @notice Returns Woooracle price if available, otherwise fallback to ChainLink function price(address base) external view returns (uint256 priceNow, bool feasible); /// @notice Updates the Wooracle price for the specified base token function postPrice(address base, uint128 _price) external; /// Updates the state of the given base token. /// @param _base baseToken address /// @param _price the new prices /// @param _spread the new spreads /// @param _coeff the new slippage coefficent function postState( address _base, uint128 _price, uint64 _spread, uint64 _coeff ) external; /// @notice State of the specified base token. function state(address base) external view returns (State memory); /// @notice The price decimal for the specified base token (e.g. 8) function decimals(address base) external view returns (uint8); /// @notice The quote token for calculating WooPP query price function quoteToken() external view returns (address); /// @notice last updated timestamp function timestamp() external view returns (uint256); /// @notice Flag for Wooracle price feasible function isWoFeasible(address base) external view returns (bool); // /// @notice Flag for account admin // function isAdmin(address account) external view returns (bool); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// @title TransferHelper /// @notice Contains helper methods for interacting with ERC20 and native tokens that do not consistently return true/false /// @dev implementation from https://github.com/Uniswap/v3-periphery/blob/main/contracts/libraries/TransferHelper.sol library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "STF"); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "ST"); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "SA"); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "STE"); } }
{ "optimizer": { "enabled": true, "mode": "3" }, "outputSelection": { "*": { "*": [ "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_quoteToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"AdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeAddr","type":"address"}],"name":"FeeAddrUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"flag","type":"bool"}],"name":"PauseRoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromToken","type":"address"},{"indexed":true,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"rebateTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"swapVol","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"WooSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWooracle","type":"address"}],"name":"WooracleUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"baseToken","type":"address"}],"name":"decimalInfo","outputs":[{"components":[{"internalType":"uint64","name":"priceDec","type":"uint64"},{"internalType":"uint64","name":"quoteDec","type":"uint64"},{"internalType":"uint64","name":"baseDec","type":"uint64"}],"internalType":"struct WooPPV2.DecimalInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stuckToken","type":"address"}],"name":"inCaseTokenGotStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wooracle","type":"address"},{"internalType":"address","name":"_feeAddr","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPauseRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lendManagers","outputs":[{"internalType":"contract IWooLendingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"newPool","type":"address"}],"name":"migrateToNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"poolSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"}],"name":"query","outputs":[{"internalType":"uint256","name":"toAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoteToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"repaidToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayLegacy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"repaidToken","type":"address"},{"internalType":"uint256","name":"principalAmount","type":"uint256"}],"name":"repayPrincipal","outputs":[{"internalType":"uint256","name":"repaidAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wantToken","type":"address"}],"name":"repayWeeklyLending","outputs":[{"internalType":"uint256","name":"repaidAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddr","type":"address"}],"name":"setFeeAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint16","name":"rate","type":"uint16"}],"name":"setFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWooLendingManager","name":"_lendManager","type":"address"}],"name":"setLendManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"maxGamma","type":"uint128"}],"name":"setMaxGamma","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint128","name":"maxNotionalSwap","type":"uint128"}],"name":"setMaxNotionalSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setPauseRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint16","name":"_feeRate","type":"uint16"},{"internalType":"uint128","name":"_maxGamma","type":"uint128"},{"internalType":"uint128","name":"_maxNotionalSwap","type":"uint128"}],"name":"setTokenInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wooracle","type":"address"}],"name":"setWooracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"skimMulTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"minToAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"rebateTo","type":"address"}],"name":"swap","outputs":[{"internalType":"uint256","name":"realToAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenInfos","outputs":[{"internalType":"uint192","name":"reserve","type":"uint192"},{"internalType":"uint16","name":"feeRate","type":"uint16"},{"internalType":"uint128","name":"maxGamma","type":"uint128"},{"internalType":"uint128","name":"maxNotionalSwap","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fromToken","type":"address"},{"internalType":"address","name":"toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"}],"name":"tryQuery","outputs":[{"internalType":"uint256","name":"toAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unclaimedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wooracle","outputs":[{"internalType":"contract IWooracleV2_2","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010007b59d85566e8f227dfc77c67d3932f8f93e1b838ca206d882d0015eab4a000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d4
Deployed Bytecode
0x000400000000000200000000030100190000006003300270000007250430019700030000004103550002000000010355000007250030019d000100000000001f00000001012001900000000b0000c13d1c8f010d0000040f0000000001000416000000000110004c000000470000c13d0000000001000031000000bf02100039000000200300008a000000000232016f0000009f0320008c0000001b0000213d000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f000000400020043f0000001f0210018f00000002030003670000000504100272000000290000613d00000000050000190000000506500210000000000763034f000000000707043b000000a00660003900000000007604350000000105500039000000000645004b000000210000413d000000000520004c000000380000613d0000000504400210000000000343034f0000000302200210000000a004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c000000470000c13d000000a00100043d000007270210009c0000004a0000a13d000000000100001900000000020000191c8f01040000040f1c8f156e0000040f000000800100043d0000014000000443000001600010044300000020010000390000010000100443000000010100003900000120001004430000010001000039000000800200003900000728030000411c8f00fa0000040f000000000201001900000001010000390000000a03000039000000000420004c000000620000613d00000001042001900000000004030019000000010400603900000000411400a9000000010220027000000000433300a9000000590000013d000000000001042d0002000000000002000200000006001d000100000005001d0000072505000041000007250630009c00000000030580190000004003300210000007250640009c00000000040580190000006004400210000000000334019f000007250410009c0000000001058019000000c001100210000000000113019f1c8f1c850000040f00000001090000290000000003010019000000600330027000000725033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000860000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000007e0000413d000000010220018f000000000640004c000000960000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d0000072505000041000007250630009c00000000030580190000004003300210000007250640009c00000000040580190000006004400210000000000334019f000007250410009c0000000001058019000000c001100210000000000113019f1c8f1c8a0000040f00000001090000290000000003010019000000600330027000000725033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000bd0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000000b50000413d000000010220018f000000000640004c000000cd0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0000072503000041000007250410009c00000000010380190000004001100210000007250420009c00000000020380190000006002200210000000000112019f0000000002000414000007250420009c0000000002038019000000c002200210000000000112019f0000072a011001c700008010020000391c8f1c8a0000040f0000000102200190000000e50000613d000000000101043b000000000001042d000000000100001900000000020000191c8f01040000040f000000000301001900000725010000410000000004000414000007250540009c0000000001044019000000c001100210000000600220021000000000011200190000072b0110004100000000020300191c8f1c8a0000040f0000000102200190000000f70000613d000000000101043b000000000001042d000000000100001900000000020000191c8f01040000040f0000072504000041000007250510009c000000000104801900000040011002100000000001310019000007250320009c00000000020480190000006002200210000000000121001900001c900001042e0000072503000041000007250420009c0000000002038019000007250410009c000000000103801900000040011002100000006002200210000000000112019f00001c910001043000140000000000020000008001000039000000400010043f0000000001000031000000040110008c0000115c0000413d0000000201000367000000000101043b000000e0011002700000072c0210009c000006120000613d0000072d0210009c000002970000613d0000072e0210009c00000000030004120000022b0000613d0000072f0210009c00000bd40000613d000007300210009c000002b00000613d000007310210009c0000000005000411000003b40000613d000007320210009c0000098a0000613d000007330210009c00000aad0000613d000007340210009c00000aef0000613d000007350210009c00000bb90000613d000007360210009c0000024c0000613d000007370210009c000003e70000613d000007380210009c000004230000613d000007390210009c000006390000613d0000073a0210009c000009ec0000613d0000073b0210009c00000b2d0000613d0000073c0210009c000002e10000613d0000073d0210009c000002c90000613d0000073e0210009c000009120000613d0000073f0210009c00000a6f0000613d000007400210009c000004680000613d000007410210009c000005700000613d000007420210009c000005b00000613d000007430210009c000007d60000613d000007440210009c000003180000613d000007450210009c000003430000613d000007460210009c0000054b0000613d000007470210009c000003830000613d000007480210009c00000b760000613d000007490210009c00000a940000613d0000074a0210009c0000044e0000613d0000074b0210009c0000070d0000613d0000074c0210009c000005da0000613d0000074d0210009c0000096c0000613d0000074e0210009c000005330000613d0000074f0210009c000008170000613d000007500210009c000006660000613d000007510210009c000008c10000613d000007520210009c000006820000613d000007530210009c000006f10000613d000007540210009c000007750000613d000007550210009c000008ed0000613d000007560110009c0000115c0000c13d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000400310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002401100370000000000101043b001100000001001d001400000005001d1c8f16330000040f00000014030000290000000101000039000000000200041a0000072702200197000000000223004b000001980000613d00000000003004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000901000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000007570200004100000000002004390000072701100197001400000001001d0000000400100443000080020100003900000024020000391c8f00e80000040f000000000110004c0000115c0000613d000000400300043d0000075801000041000000000013043500000000010004140000001402000029000000040420008c000001bb0000613d0000000404000039001200000003001d000000120500002900000000060000191c8f00630000040f00000012030000290000001402000029000000000110004c00000e430000613d000007590130009c0000140c0000213d000000400030043f0000075a0100004100000000001304350000000001000414000000040420008c000001cb0000613d00000004040000390000002006000039001200000003001d00000012050000291c8f009a0000040f0000001203000029000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000004320019000007590240009c0000140c0000213d001200000004001d000000400040043f000000200110008c0000115c0000413d0000000001030433001000000001001d0000075b010000410000001202000029000000000012043500000000010004140000001402000029000000040320008c000001e80000613d00000004040000390000002006000039000000120300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f00000012030000290000000001310019000007590310009c0000140c0000213d000000400010043f000000200220008c0000115c0000413d000000010200008a0000001003000029000000000323013f0000001104000029000000000334004b000013ce0000213d00000012030000290000000003030433000000000430004c000002030000613d00000000543200d90000001005000029000000000454004b000013ce0000413d00000011040000290000001005000029000000000445001900000000535300a9000027105330011a000000000223013f000000000224004b000013ce0000213d000000000243001a001200000002001d001000000000001d000013b80000c13d0000001202000029000000000021043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d0200003900000003030000390000076004000041000000130500002900000014060000291c8f1c850000040f00000001012001900000115c0000613d0000000101000039000000000011041b000000400100043d00000010020000290000000000210435000000200200003900000000030000191c8f00fa0000040f00000000050300190000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d000000400100043d001400000001001d0000076101000041000000000010043900000004005004430000002400000443000080050100003900000044020000391c8f00e80000040f000007270210019700000014010000290000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000400310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002401100370000000000101043b001200000001001d001400000005001d1c8f16330000040f00000014030000290000000101000039000000000200041a0000072702200197000000000223004b000002760000613d00000000003004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000901000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a00000727061001970000001204000029000000000140004c00000dbf0000c13d000000400100043d000000000041043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d020000390000000303000039000007600400004100000013050000291c8f1c850000040f000000010120019000000e9a0000c13d0000115c0000013d0000000001000416000000000110004c0000115c0000c13d00000000010000311c8f15a20000040f001400000001001d001300000002001d1c8f160f0000040f0000001401000029000007270110019800000bfc0000c13d000000400100043d00000044021000390000079b03000041000000000032043500000024021000390000000f0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000801000039000000000101041a0000072702100197000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d000000000100041a0000072702100197000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d000000000100041a0000072701100197000000000115004b00000c340000613d00000000005004350000000401000039000000200010043f00000040020000390000000001000019001400000005001d1c8f00d10000040f0000001402000029000000000101041a000000ff0110019000000c340000c13d00000000002004350000000501000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110019000000c340000c13d000000400100043d0000004402100039000007800300004100000000003204350000002402100039000000150300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d0000000001000031001400000005001d1c8f15d90000040f00000014040000290000000103000039001200000001001d001300000002001d000000000100041a0000072701100197000000000114004b0000032e0000613d00000000004004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0310018f00000000010300191c8f17e20000040f0000001201000029000007270110019700000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000130200002900000080022002100000000101100039000000000301041a0000077603300197000000000223019f000000000021041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004020000390000000201200367000000000101043b001300000001001d000007270110009c0000115c0000213d0000000101000039000000000300041a0000072703300197000000000335004b000003660000613d0000000000500435000000200020043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f0000000801000039000000000201041a00000768022001970000001305000029000000000252019f000000000021041b000000400400043d00000725010000410000000002000414000007250320009c0000000002018019000007250340009c001400000004001d00000000010440190000004001100210000000c002200210000000000112019f0000072a011001c70000800d02000039000000020300003900000777040000411c8f1c850000040f00000001012001900000115c0000613d0000001401000029000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f0000001401000029000007270110019700000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f0000000102100039000000000202041a000000000301041a000000c0013002700000ffff0410018f000000400100043d000000200510003900000000004504350000004004100039000007760520019700000000005404350000008002200270000000600410003900000000002404350000075c023001970000000000210435000000800200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000101000039000000000200041a0000072702200197001400000005001d000000000225004b000003d40000613d000000140100002900000000001004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f0000000201000039000000000201041a000000ff0320019000000c7f0000c13d000000400100043d0000004402100039000007960300004100000000003204350000002402100039000000140300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000400310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002401100370000000000101043b001200000001001d0000ffff0110008c0000115c0000213d0000000101000039000000000200041a0000072702200197000000000225004b000004100000613d00000000005004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f0000001202000029000000c0022002100000077d02200197000000000301041a0000077e03300197000000000223019f000000000021041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d0000000001000031001400000005001d1c8f15d90000040f00000014040000290000000103000039001200000001001d001300000002001d000000000100041a0000072701100197000000000114004b000004390000613d00000000004004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0310018f00000000010300191c8f17e20000040f0000001201000029000007270110019700000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000130200002900000776022001970000000101100039000000000301041a0000077f03300197000000000223019f000000000021041b000000400100043d000000000200001900000000030000191c8f00fa0000040f001300000003001d0000000001000416000000000110004c0000115c0000c13d00000000010000311c8f15f30000040f00000761040000410000000000400439000000130400002900000004004004430000002400000443001400000001001d001100000002001d001200000003001d000080050100003900000044020000391c8f00e80000040f000000140200002900000727032001970000072701100197000000000213004b00000c0d0000c13d000000110100002900000012020000291c8f19f20000040f00000c150000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001200000001001d0000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d0000000101000039000000000200041a0000072702200197000000000225004b001400000005001d0000048f0000613d000000140100002900000000001004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f0000077101000041000000400300043d000000000013043500000004013000390000001405000029000000000051043500000000010004140000001302000029000000040420008c000004a30000613d000000240400003900000020060000390000000005030019001100000003001d1c8f009a0000040f00000011030000290000001405000029000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000060000190000000106004039000007590420009c0000140c0000213d00000001046001900000140c0000c13d000000400020043f000000200110008c0000115c0000413d0000000001030433001100000001001d1c8f16330000040f0000000101000039000000000200041a00000727022001970000001403000029000000000223004b000004c60000613d000000140100002900000000001004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f00000013010000291c8f16d20000040f0000001305000029000000400200043d000000440320003900000000040004100000000000430435000000640320003900000011040000290000000000430435000000200320003900000779040000410000000000430435000000240420003900000014060000290000000000640435000000640400003900000000004204350000077a0420009c0000140c0000213d001000000001001d000000a001200039000000400010043f0000000001000414000000040450008c001200000000001d000004eb0000613d00000000040204330000001302000029000000000500001900000000060000191c8f00630000040f000000000110004c00000000010000190000000101006039001200000001001d1c8f16480000040f00000012020000290000000102200190000009de0000c13d0000000002010433000000000320004c0000104d0000c13d00000013010000291c8f16d20000040f0000001002000029000000000221004b000013ce0000413d000000100200002900000000012100490000001102000029000000000121004b000000000100001900000001010080391c8f18240000040f000000130100002900000000001004350000000601000039001000000001001d000000200010043f0000004002000039001200000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001002000029000000200020043f001000000001001d000000000100001900000012020000291c8f00d10000040f000000010200008a0000001103000029000000000223013f000000000101041a0000075c03100197000000000223004b000013ce0000213d000000110300002900000000013100190000075c011001970000001004000029000000000204041a0000075d02200197000000000112019f000000000014041b000000400100043d000000000031043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d0200003900000003030000390000077b04000041000000130500002900000014060000291c8f1c850000040f000000010120019000000e9a0000c13d0000115c0000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000301000039000000000201041a000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f0000001401000029000007270110019700000000001004350000000901000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a0000072702100197000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004020000390000000201200367000000000101043b001300000001001d000007270110009c0000115c0000213d0000000101000039000000000300041a0000072703300197000000000335004b000005930000613d0000000000500435000000200020043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f0000000701000039000000000201041a00000768022001970000001305000029000000000252019f000000000021041b000000400400043d00000725010000410000000002000414000007250320009c0000000002018019000007250340009c001400000004001d00000000010440190000004001100210000000c002200210000000000112019f0000072a011001c70000800d02000039000000020300003900000778040000411c8f1c850000040f00000001012001900000115c0000613d0000001401000029000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f00000014010000291c8f171b0000040f00000000020104330000075902200197000000400300043d000000000023043500000020021000390000000002020433000007590220019700000020043000390000000000240435000000400110003900000000010104330000075901100197000000400230003900000000001204350000006002000039000000000103001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d001400000005001d1c8f160f0000040f0000001302000029000007700120009c00000e310000c13d00000772010000410000000000100439000000000100041000000004001004430000800a0100003900000024020000391c8f00e80000040f0000000004010019000000400100043d000007730210009c00000014060000290000140c0000213d0000002003100039000000400030043f000000000001043500000001050000390000000001000414000000040260008c00000fd50000613d000000000240004c00000fc20000c13d00000000020600190000000004000019000000000500001900000000060000191c8f00630000040f000000000501001900000fd50000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f0000001401000029000007270110019700000000001004350000000501000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff011001900000000002000019000000010200c039000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d1c8f160f0000040f000000000100041a0000076802100197000000000020041b000000400500043d00000725020000410000000003000414000007250430009c0000000003028019000007250450009c001400000005001d00000000020540190000004002200210000000c003300210000000000223019f00000727051001970000072a012001c70000800d020000390000000303000039000007690400004100000000060000191c8f1c850000040f00000001012001900000115c0000613d0000001401000029000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d00000000010000311c8f15a20000040f001300000001001d001400000002001d1c8f160f0000040f0000000701000039000000000201041a000007270320019800000c1b0000c13d000000130300002900000727033001970000076802200197000000000232019f000000000021041b000000140100002900000727011001970000000802000039000000000302041a0000076803300197000000000113019f000000000012041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000400310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002401100370000000000101043b001200000001001d001400000005001d1c8f16330000040f00000014030000290000000101000039000000000200041a0000072702200197000000000223004b000006ac0000613d00000000003004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000601000039001400000001001d000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c011001970000001202000029000000000121004b000007c80000413d000000130100002900000000001004350000001401000029000000200010043f0000004002000039001100000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001402000029000000200020043f001400000001001d000000000100001900000011020000291c8f00d10000040f0000001203000029000000000101041a0000075c02100197000000000232004b000013ce0000413d00000000013100490000075c011001970000001404000029000000000204041a0000075d02200197000000000112019f000000000014041b000000000100041a000007270210019700000013010000291c8f167f0000040f000000000200041a000000400100043d0000001203000029000000000031043500000725030000410000000004000414000007250540009c0000000004038019000007250510009c00000000010380190000004001100210000000c003400210000000000113019f0000075f011001c700000727062001970000800d020000390000000303000039000007600400004100000013050000291c8f1c850000040f000000010120019000000e9a0000c13d0000115c0000013d001300000003001d0000000001000416000000000110004c0000115c0000c13d00000000010000311c8f15f30000040f00000761040000410000000000400439000000130400002900000004004004430000002400000443001400000001001d001200000002001d001100000003001d000080050100003900000044020000391c8f00e80000040f000000140200002900000727042001970000072702100197000000000124004b00000c290000c13d000000120100002900000011020000291c8f19f20000040f001400000001001d000000120100002900000d9a0000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001300000001001d0000000201100367000000000101043b001400000001001d000007270110009c0000115c0000213d1c8f160f0000040f0000076e01000041000000400300043d000000000013043500000000010004140000001402000029000000040420008c000007350000613d00000004040000390000002006000039001200000003001d00000012050000291c8f00630000040f0000001203000029000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c0000140c0000213d00000001045001900000140c0000c13d000000400020043f000000200110008c0000115c0000413d0000000001030433000007270210009c0000115c0000213d00000000001004350000000901000039000000200010043f0000004002000039001200000002001d00000000010000191c8f00d10000040f000000000201041a00000768022001970000001403000029000000000232019f000000000021041b00000000003004350000001301000029000000200010043f000000000100001900000012020000291c8f00d10000040f000001000200008a000000000301041a000000000223016f00000001022001bf000000000021041b0000000101000039000000400200043d000000000012043500000725010000410000000003000414000007250430009c0000000003018019000007250420009c00000000010240190000004001100210000000c002300210000000000112019f0000075f011001c70000800d020000390000000203000039000007750400004100000014050000291c8f1c850000040f000000010120019000000c950000c13d0000115c0000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001100000001001d0000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d0000000102000039000000000100041a0000072701100197000000000115004b000e00000002001d0000000001020019001400000005001d0000079e0000613d000000140100002900000000001004350000001101000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000601000039001200000001001d000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000f00000001001d1c8f16330000040f0000000f010000290000075c01100197001000000001001d000000000100041a00000727011001970000001402000029000000000112004b0000000e01000029000007bb0000613d00000000002004350000001101000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c011001970000001002000029000000000121004b00000e630000813d000000400100043d0000004402100039000007670300004100000000003204350000002402100039000000100300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001200000001001d0000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d001400000005001d1c8f16330000040f00000014020000290000000103000039000000000100041a0000072701100197000000000112004b001100000003001d0000000001030019000008000000613d00000000002004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f00000013010000291c8f16d20000040f000000130200002900000000002004350000000602000039000000200020043f001400000001001d000000400200003900000000010000191c8f00d10000040f00000014020000290000075c02200197000000000301041a0000075d03300197000000000223019f000000000021041b0000001101000029000000000011041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001200000001001d0000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d001400000005001d1c8f16330000040f00000014030000290000000101000039000000000200041a0000072702200197000000000223004b0000083f0000613d00000000003004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000901000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000007570200004100000000002004390000072701100197001400000001001d0000000400100443000080020100003900000024020000391c8f00e80000040f000000000110004c0000115c0000613d000000400300043d0000075801000041000000000013043500000000010004140000001402000029000000040420008c000008620000613d0000000404000039001300000003001d000000130500002900000000060000191c8f00630000040f00000013030000290000001402000029000000000110004c00000e430000613d000007590130009c0000140c0000213d000000400030043f0000076d0100004100000000001304350000000001000414000000040420008c000008720000613d00000004040000390000002006000039001300000003001d00000013050000291c8f009a0000040f0000001303000029000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000004320019000007590240009c0000140c0000213d001300000004001d000000400040043f000000200110008c0000115c0000413d0000000001030433001200000001001d0000076e010000410000001302000029000000000012043500000000010004140000001402000029000000040320008c0000088f0000613d00000004040000390000002006000039000000130300002900000000050300191c8f00630000040f000000000110004c00000e430000613d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f00000013030000290000000001310019000007590310009c0000140c0000213d000000400010043f000000200220008c0000115c0000413d00000013020000290000000002020433001300000002001d000007270220009c0000115c0000213d0000001202000029000000000220004c001100000000001d000011a10000c13d0000001202000029000000000021043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d0200003900000003030000390000076004000041000000130500002900000014060000291c8f1c850000040f00000001012001900000115c0000613d0000000101000039000000000011041b000000400100043d00000011020000290000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d000007270110009c0000115c0000213d1c8f160f0000040f0000001406000029000000000160004c00000ea00000c13d000000400100043d00000064021000390000076a03000041000000000032043500000044021000390000076b0300004100000000003204350000002402100039000000260300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000084020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f0000001401000029000007270110019700000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c02100197000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000800310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002402100370000000000202043b001200000002001d0000ffff0220008c0000115c0000213d0000004402100370000000000202043b001100000002001d000007760220009c0000115c0000213d0000006401100370000000000101043b001000000001001d000007760110009c0000115c0000213d0000000101000039000000000200041a0000072702200197000000000225004b000009450000613d00000000005004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f000000130100002900000000001004350000000601000039000000200010043f0000004002000039001400000002001d00000000010000191c8f00d10000040f0000001202000029000000c0022002100000077d02200197000000000301041a0000077e03300197000000000223019f000000000021041b000000000100001900000014020000291c8f00d10000040f0000000101100039000000000201041a0000077f022001970000001103000029000000000232019f000000000021041b000000000100001900000014020000291c8f00d10000040f000000100200002900000080022002100000000101100039000000000301041a0000077603300197000000000223019f000000000021041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000004010000390000000201100367000000000101043b001400000001001d1c8f15940000040f00000014010000291c8f16d20000040f000000400300043d00000000001304350000002002000039000000000103001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000400310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b001300000002001d000007270220009c0000115c0000213d0000002401100370000000000101043b001200000001001d001400000005001d1c8f16330000040f0000000101000039000000000200041a00000727022001970000001403000029000000000223004b000009b50000613d000000140100002900000000001004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f00000013010000291c8f16d20000040f000000400200043d000000440320003900000000040004100000000000430435000000640320003900000012040000290000000000430435000000200320003900000779040000410000000000430435000000240420003900000014050000290000000000540435000000640400003900000000004204350000077a0420009c0000140c0000213d001000000001001d000000a001200039000000400010043f00000000010004140000001304000029000000040440008c0000000004000019000009d90000613d00000000040204330000001302000029000000000500001900000000060000191c8f00630000040f000000000110004c00000000040000190000000104006039001100000004001d1c8f16480000040f0000001102000029000000010220019000000ed10000613d000000400100043d0000004402100039000007940300004100000000003204350000002402100039000000030300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f001300000003001d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000c00310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d00000002010003670000000402100370000000000202043b000007270220009c0000115c0000213d0000002402100370000000000202043b000007270220009c0000115c0000213d0000008402100370000000000202043b000007270220009c0000115c0000213d000000a401100370000000000101043b000007270110009c0000115c0000213d001400000005001d0000076101000041000000000010043900000013010000290000000400100443000000240000044300008005010000390000004402000039001100000002001d1c8f00e80000040f00000002050003670000002409500370000000000709043b0000072704100197000000040a50037000000000080a043b0000072706800197000000000146004b000000a40350037000000064025003700000004401500370000000840550037000000fe80000c13d000000000303043b000a00000003001d000000000202043b000c00000002001d000000000101043b000e00000001001d000000000105043b001100000001001d001000000007001d1c8f16330000040f1c8f18110000040f00000010010000290000072701100198001200000001001d0000000001000019000000010100c0391c8f1a690000040f00000011010000290000072701100198000b00000001001d0000000001000019000000010100c0391c8f1a7a0000040f00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f000f00000001001d0000072702100197001300000002001d0000001201000029000000000121004b0000000001000019000000010100c0391c8f1a8b0000040f0000000f010000291c8f16d20000040f000000130200002900000000002004350000000602000039000d00000002001d000000200020043f000f00000001001d000000400200003900000000010000191c8f00d10000040f0000000f03000029000000000101041a0000075c01100197000000000213004b000013ce0000413d00000000011300490000000e02000029000000000121004b000010630000813d000000400100043d00000044021000390000078e03000041000000000032043500000024021000390000000f0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f001300000003001d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d1c8f16330000040f0000000801000039000000000101041a000007270210019800000da90000c13d000000400100043d00000044021000390000077c0300004100000000003204350000002402100039000000110300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000701000039000000000101041a0000072702100197000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d0000000001000031001400000005001d1c8f15bc0000040f00000014040000290000000103000039001200000001001d001300000002001d000000000100041a0000072701100197000000000114004b00000ac30000613d00000000004004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0310018f00000000010300191c8f17e20000040f00000012010000290000072701100198001400000001001d0000000001000019000000010100c0391c8f17e20000040f000000140100002900000000001004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000001000200008a000000000301041a000000000223016f0000001303000029000000000330004c0000000003000019000000010300c039000000000232019f000000000021041b000000400100043d000000000031043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d020000390000000203000039000007750400004100000014050000291c8f1c850000040f000000010120019000000c950000c13d0000115c0000013d0000000001000416000000000110004c0000115c0000c13d0000000001000031001400000005001d1c8f15bc0000040f00000014040000290000000103000039001200000001001d001300000002001d000000000100041a0000072701100197000000000114004b00000b050000613d00000000004004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0310018f00000000010300191c8f17e20000040f00000012010000290000072701100197001400000001001d00000000001004350000000501000039000000200010043f000000400200003900000000010000191c8f00d10000040f000001000200008a000000000301041a000000000223016f0000001303000029000000000330004c0000000003000019000000010300c039000000000232019f000000000021041b000000400100043d000000000031043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d020000390000000203000039000007930400004100000014050000291c8f1c850000040f000000010120019000000c950000c13d0000115c0000013d0000000001000416000000000110004c0000115c0000c13d0000000001000031000000040210008a0000072603000041000000200420008c000000000400001900000000040340190000072602200197000000000520004c000000000300a019000007260220009c00000000020400190000000002036019000000000220004c0000115c0000c13d00000002030003670000000402300370000000000202043b000007590420009c0000115c0000213d00000023042000390000072605000041000000000614004b0000000006000019000000000605801900000726011001970000072604400197000000000714004b0000000005008019000000000114013f000007260110009c00000000010600190000000001056019000000000110004c0000115c0000c13d0000000401200039000000000113034f000000000301043b000007590130009c0000140c0000213d00000005043002100000003f01400039000000200500008a000000000551016f000000400100043d0000000005510019000000000615004b00000000060000190000000106004039000007590750009c0000140c0000213d00000001066001900000140c0000c13d000000400050043f0000000000310435000000240220003900000000032400190000000004000031000000000443004b0000115c0000213d0000000004010019000000000532004b00000fbd0000813d0000000205200367000000000505043b000007270650009c0000115c0000213d00000020044000390000000000540435000000200220003900000b6c0000013d0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001200000001001d0000000201100367000000000101043b001300000001001d000007270110009c0000115c0000213d001400000005001d1c8f16330000040f00000014030000290000000101000039000000000200041a0000072702200197001100000002001d000000000223004b00000b9f0000613d00000000003004350000001201000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f00000013010000291c8f16d20000040f000000130200002900000000002004350000000602000039000000200020043f001400000001001d000000400200003900000000010000191c8f00d10000040f0000001403000029000000000101041a0000075c01100197000000000213004b000013ce0000413d0000000003130049000000130100002900000011020000291c8f167f0000040f0000000101000039000000000011041b000000400100043d000000000200001900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000000310004c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000201000039000000000101041a000000ff011001900000000002000019000000010200c039000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000000001000416000000000110004c0000115c0000c13d000000040100008a00000000011000310000072602000041000000200310008c000000000300001900000000030240190000072601100197000000000410004c000000000200a019000007260110009c00000000010300190000000001026019000000000110004c0000115c0000c13d0000000401000039001400000001001d0000000201100367000000000101043b001300000001001d1c8f15940000040f0000001301000029000007270110019700000000001004350000001401000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff011001900000000002000019000000010200c039000000400100043d0000000000210435000000200200003900000000030000191c8f00fa0000040f0000001302000029000007270320019800000c390000c13d000000400100043d00000044021000390000079a0300004100000000003204350000002402100039000000110300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000120200002900000011040000290000072702400197000000000112004b00000c990000c13d000000140100002900000012020000291c8f19450000040f000000400300043d00000000001304350000002002000039000000000103001900000000030000191c8f00fa0000040f000000400100043d00000044021000390000076c0300004100000000003204350000002402100039000000150300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000110100002900000012010000290000072703100197000000000123004b00000d4f0000c13d000000140100002900000011020000291c8f19450000040f001400000001001d000000120100002900000d9a0000013d1c8f17f30000040f000000400100043d000000000200001900000000030000191c8f00fa0000040f001100000001001d00000000001004350000000601000039000000200010043f00000040020000390000000001000019001200000003001d1c8f00d10000040f000000000201041a0000075d02200197000000000021041b00000014010000291c8f16d20000040f000000000301001900000014010000290000001302000029001400000003001d1c8f18880000040f0000075701000041000000000010043900000012010000290000000400100443000080020100003900000024020000391c8f00e80000040f000000000110004c0000115c0000613d000000400300043d0000079701000041000000000013043500000004023000390000000001000414000000110500002900000000005204350000001206000029000000040260008c00000c690000613d0000002404000039000000000206001900000000050300190000000006000019001300000003001d1c8f00630000040f000000130300002900000012060000290000001105000029000000000110004c00000e430000613d000007980130009c0000140c0000813d000000400030043f0000001401000029000000000013043500000725010000410000000002000414000007250420009c0000000002018019000007250430009c00000000010340190000004001100210000000c002200210000000000112019f0000075f011001c70000800d02000039000000030300003900000799040000411c8f1c850000040f00000001012001900000115c0000613d00000c950000013d000001000300008a000000000232016f000000000021041b000000400100043d0000001402000029000000000021043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d02000039000000010300003900000795040000411c8f1c850000040f00000001012001900000115c0000613d000000400100043d000000000200001900000000030000191c8f00fa0000040f000f00000002001d001000000003001d1c8f18110000040f0000001001000029000000000110004c000000000100001900000c150000613d0000000f01000029000000000110004c000000000100001900000c150000613d00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f00000727011001970000001002000029000000000112004b000000000100001900000c150000613d00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f00000010040000290000001102000029000000000121013f0000072701100198000000000100001900000c150000613d0000000701000039000000000201041a000000400300043d000007620100004100000000001304350000000405300039000000000100041400000000004504350000072702200197000000040420008c001300000002001d00000cd40000613d00000024040000390000008006000039000e00000003001d0000000e050000291c8f009a0000040f0000000e030000290000001302000029000000000110004c00000e430000613d0000000101000031000000800210008c00000080010080390000001f02100039000001e00420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c0000140c0000213d00000001045001900000140c0000c13d000000400020043f000000000231001900000000010300191c8f19bb0000040f0000076202000041000000400300043d0000000000230435000d00000001001d000e00000003001d000000040230003900000000010004140000000f0300002900000000003204350000001302000029000000040320008c00000cf80000613d000000240400003900000080060000390000000e0300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f0000000e0200002900000000010200190000000002230019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f00000000021500191c8f19bb0000040f000800000001001d0000002001100039001300000001001d0000000001010433000c00000001001d0000000d010000290000002001100039000e00000001001d0000000001010433000b00000001001d000000100100002900000000001004350000000601000039000900000001001d000000200010043f0000004002000039000a00000002001d00000000010000191c8f00d10000040f000000000101041a001000000001001d0000000f0100002900000000001004350000000901000029000000200010043f00000000010000190000000a020000291c8f00d10000040f0000000b0200002900000759022001970000000c030000290000075903300197000000000432004b000000000203a0190000000102200270000000000101041a000f00000001001d0000000e01000029000000000021043500000013010000290000000000210435000000140100002900000012020000290000000d030000291c8f1b290000040f0000001002000029000000c0022002700000ffff0220018f0000000f03000029000000c0033002700000ffff0330018f000000000432004b000000000203a019000000000310004c00000d460000613d000000010300008a00000000431300d9000000000323004b000013ce0000413d00000000322100a9000007633220012a000000000321004b000013ce0000413d0000000002210049000000110100002900000008030000291c8f1bf40000040f00000c150000013d000e00000003001d000f00000002001d001000000004001d1c8f18110000040f0000001001000029000000000110004c0000000001000019000000000200001900000d7a0000613d0000000e01000029000000000110004c0000000001000019000000000200001900000d7a0000613d00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f00000727011001970000001002000029000000000112004b0000000001000019000000000200001900000d7a0000613d00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f00000010040000290000001202000029000000000121013f00000727011001980000000001000019000000000200001900000f140000c13d001300000002001d001400000001001d0000000f0100002900000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c011001970000001302000029000000000112004b000000120100002900000d9a0000a13d000000400100043d0000006402100039000007640300004100000000003204350000004402100039000007650300004100000000003204350000002402100039000000210300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000084020000391c8f01040000040f1c8f159a0000040f000000000101041a0000075c011001970000001402000029001400000002001d000000000112004b0000000001000019000000010100a0391c8f16220000040f000000400100043d00000014020000290000000000210435000000200200003900000000030000191c8f00fa0000040f0000000301000039000000000301041a001400000003001d000000000001041b000007610100004100000000001004390000001301000029000000040010044300000024000004430000800501000039001300000002001d00000044020000391c8f00e80000040f000000130200002900000014030000291c8f167f0000040f0000000101000039000000000011041b000000400100043d000000000200001900000000030000191c8f00fa0000040f001400000006001d000000130100002900000000001004350000000601000039001000000001001d000000200010043f0000004002000039001100000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001002000029000000200020043f001000000001001d000000000100001900000011020000291c8f00d10000040f0000001203000029000000000101041a0000075c02100197000000000232004b000013ce0000413d00000000013100490000075c011001970000001004000029000000000204041a0000075d02200197000000000112019f000000000014041b000000130100002900000014020000291c8f18880000040f0000075701000041000000000010043900000014010000290000000400100443000080020100003900000024020000391c8f00e80000040f000000000110004c0000115c0000613d000000400500043d0000078f01000041000000000015043500000004025000390000000001000414000000120300002900000000003204350000001402000029000000040320008c00000dfd0000613d00000024040000390000000003050019001100000005001d000000110500002900000000060000191c8f00630000040f00000011050000290000001402000029000000000110004c00000e430000613d000007590150009c0000140c0000213d000000400050043f000000200350003900000790010000410000000000130435000000240150003900000000002104350000004401000039000000000015043500000044015000390000000000010435000007910150009c0000140c0000213d00000000040500190000008001500039000000400010043f00000000010004140000001302000029000000040220008c001100000000001d00000e1c0000613d00000000040404330000001302000029000000000500001900000000060000191c8f00630000040f000000000110004c00000000010000190000000101006039001100000001001d1c8f16480000040f00000011020000290000000102200190000000130200002900000012040000290000001406000029000011080000613d000000400100043d0000004402100039000007920300004100000000003204350000002402100039000000020300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000400300043d0000077101000041000000000013043500000000010004100000072704100197000000040530003900000000010004140000000000450435000000040420008c00000ebb0000613d00000024040000390000002006000039001400000003001d00000014050000291c8f009a0000040f0000001403000029000000000110004c00000ebb0000c13d0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000e520000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000e4a0000413d000000000530004c00000e610000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311c8f01040000040f000000130100002900000000001004350000001201000029000000200010043f0000004002000039001400000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001202000029000000200020043f001200000001001d000000000100001900000014020000291c8f00d10000040f0000001003000029000000000101041a0000075c02100197000000000232004b000013ce0000413d0000000f0200002900000000012100490000075c011001970000001204000029000000000204041a0000075d02200197000000000112019f000000000014041b000000000100041a000007270210019700000013010000291c8f167f0000040f000000000200041a000000400100043d0000001003000029000000000031043500000725030000410000000004000414000007250540009c0000000004038019000007250510009c00000000010380190000004001100210000000c003400210000000000113019f0000075f011001c700000727062001970000800d020000390000000303000039000007600400004100000013050000291c8f1c850000040f00000001012001900000115c0000613d0000000101000039000000000011041b000000400100043d000000000200001900000000030000191c8f00fa0000040f000000000100041a0000076802100197000000000262019f000000000020041b000000400500043d00000725020000410000000003000414000007250430009c0000000003028019000007250450009c001300000005001d00000000020540190000004002200210000000c003300210000000000223019f00000727051001970000072a012001c70000800d02000039000000030300003900000769040000411c8f1c850000040f00000001012001900000115c0000613d0000001301000029000000000200001900000000030000191c8f00fa0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c0000140c0000213d00000001045001900000140c0000c13d000000400020043f000000200110008c0000115c0000413d0000000003030433000000000200041100000013010000291c8f167f0000040f00000c950000013d0000000002010433000000000320004c00000fa70000c13d00000013010000291c8f16d20000040f0000001003000029000000000231004b000013ce0000413d00000000013100490000001202000029000000000121004b000000000100001900000001010080391c8f18240000040f000000130100002900000000001004350000000601000039001000000001001d000000200010043f0000004002000039001100000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001002000029000000200020043f001000000001001d000000000100001900000011020000291c8f00d10000040f000000010200008a0000001203000029000000000223013f000000000101041a0000075c03100197000000000223004b000013ce0000213d000000120300002900000000013100190000075c011001970000001004000029000000000204041a0000075d02200197000000000112019f000000000014041b000000400100043d000000000031043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f0000075f011001c70000800d0200003900000003030000390000077b04000041000000130500002900000014060000291c8f1c850000040f00000001012001900000115c0000613d00000e9a0000013d0000000701000039000000000201041a000000400300043d000007620100004100000000001304350000000405300039000000000100041400000000004504350000072702200197000000040420008c001300000002001d00000f290000613d00000024040000390000008006000039000d00000003001d0000000d050000291c8f009a0000040f0000000d030000290000001302000029000000000110004c00000e430000613d0000000101000031000000800210008c00000080010080390000001f02100039000001e00420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c0000140c0000213d00000001045001900000140c0000c13d000000400020043f000000000231001900000000010300191c8f19bb0000040f0000076202000041000000400300043d0000000000230435000c00000001001d000d00000003001d000000040230003900000000010004140000000e0300002900000000003204350000001302000029000000040320008c00000f4d0000613d000000240400003900000080060000390000000d0300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f0000000d0200002900000000010200190000000002230019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f00000000021500191c8f19bb0000040f000700000001001d0000002001100039001300000001001d0000000001010433000b00000001001d0000000c010000290000002001100039000d00000001001d0000000001010433000a00000001001d000000100100002900000000001004350000000601000039000800000001001d000000200010043f0000004002000039000900000002001d00000000010000191c8f00d10000040f000000000101041a001000000001001d0000000e0100002900000000001004350000000801000029000000200010043f000000000100001900000009020000291c8f00d10000040f0000000a0200002900000759022001970000000b030000290000075903300197000000000432004b000000000203a0190000000102200270000000000101041a000e00000001001d0000000d01000029000000000021043500000013010000290000000000210435000000140100002900000011020000290000000c030000291c8f1b290000040f0000001002000029000000c0022002700000ffff0220018f0000000e03000029000000c0033002700000ffff0330018f000000000432004b000000000203a019000000000310004c00000f9b0000613d000000010300008a00000000431300d9000000000323004b000013ce0000413d00000000322100a9000007632420012a0000000003040019000000000241004b000013ce0000413d001300000003001d0000000002310049000000120100002900000007030000291c8f1bf40000040f000000130200002900000d7a0000013d0000072603000041000000200420008c000000000400001900000000040340190000072602200197000000000520004c000000000300a019000007260220009c00000000020400190000000002036019000000000220004c0000115c0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b0000115c0000c13d000000000110004c000009de0000613d00000ed40000013d1c8f18db0000040f000000400100043d000000000200001900000000030000191c8f00fa0000040f0000072502000041000007250510009c0000000001028019000007250530009c00000000020340190000004002200210000000c001100210000000000121019f0000072a011001c700008009020000390000000003040019000000000406001900000000050000191c8f1c850000040f00000000030100190000006003300270000107250030019d0003000000010355000000010520018f001400000005001d1c8f16480000040f0000001401000029000000000110004c00000c950000c13d000000400100043d0000004402100039000007740300004100000000003204350000002402100039000000030300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000d0000000a0353000c000000090353000f000000050353000e00000008001d001200000006001d0000072705700197000000000445004b000010390000c13d000000000303043b000a00000003001d000000000202043b000d00000002001d000000000101043b001000000001001d0000000f0100035f000000000101043b001100000001001d1c8f16330000040f1c8f18110000040f0000001201000029000000000110004c0000000001000019000000010100c0391c8f1a690000040f00000011010000290000072701100198000b00000001001d0000000001000019000000010100c0391c8f1a7a0000040f00000761010000410000000000100439000000130100002900000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f000900000001001d0000072701100197000c00000001001d0000001202000029000000000112004b0000000001000019000000010100c0391c8f1a8b0000040f0000000e010000291c8f16d20000040f000000120200002900000000002004350000000602000039000f00000002001d000000200020043f001300000001001d000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c0110019700000013020000290000000003020019000000000212004b000013ce0000413d00000000011300490000001002000029000000000121004b000011240000813d000000400100043d00000044021000390000078b03000041000000000032043500000024021000390000000e0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f1c8f16330000040f1c8f18110000040f0000000d0100035f000000000101043b0000072702100198000010f60000c13d000000400100043d0000004402100039000007890300004100000000003204350000002402100039000000140300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000072603000041000000200420008c000000000400001900000000040340190000072602200197000000000520004c000000000300a019000007260220009c00000000020400190000000002036019000000000220004c0000115c0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b0000115c0000c13d000000000110004c000009de0000613d000004f20000013d000000120100002900000000001004350000000d01000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000c0011002700000ffff0110018f0000000e04000029000000000240004c000010740000613d000000010200008a00000000324200d9000000000212004b000013ce0000413d00000000214100a9000007631210012a000f00000002001d000000000124004b000013ce0000413d000000010200008a0000000f01000029000700000002001d000000000321013f0000000301000039000000000201041a000600000003001d000000000332004b000013ce0000213d0000000f030000290000000002320019000000000021041b0000000701000039000000000201041a000000400300043d00000762010000410000000000130435000900000003001d00000004033000390000000001000414000000120400002900000000004304350000072702200197000800000002001d000000040220008c0000109b0000613d000000240400003900000080060000390000000802000029000000090300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f00000009010000290000000002130019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d0000000e030000290000000f040000290000000001430049000500000001001d000000400020043f000000090100002900000000021500191c8f19bb0000040f0000000003010019000000100100002900000005020000291c8f1bf40000040f0000075703000041000000000030043900000008030000290000000400300443000400000001001d000900000002001d00008002010000390000002402000039000300000002001d1c8f00e80000040f000000000110004c0000115c0000613d000000400300043d000007810100004100000000001304350000000901000029000007760210019700000024043000390000000001000414000200000004001d0000000000240435000900000003001d00000004033000390000001202000029000100000003001d00000000002304350000000802000029000000040220008c000010db0000613d000000440400003900000008020000290000000903000029000000000503001900000000060000191c8f00630000040f000000000110004c00000e430000613d0000000901000029000007590110009c0000140c0000213d0000000901000029000000400010043f00000004010000290000000c02000029000000000121004b000014130000813d00000766010000410000000903000029000000000013043500000020010000390000000102000029000000000012043500000003010000290000000202000029000000000012043500000064013000390000078c02000041000000000021043500000044013000390000078d020000410000000000210435000000840200003900000000010300191c8f01040000040f0000000c0200035f000000000202043b00000727032001980000115f0000c13d000000400100043d0000004402100039000007880300004100000000003204350000002402100039000000140300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000002010433000000000320004c000002830000613d0000072603000041000000200420008c000000000400001900000000040340190000072602200197000000000520004c000000000300a019000007260220009c00000000020400190000000002036019000000000220004c0000115c0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b0000115c0000c13d000000000110004c00000013010000290000001204000029000000140600002900000e230000613d000002830000013d0000000701000039000000000201041a000000400300043d00000762010000410000000000130435001300000003001d00000004033000390000000001000414000000120400002900000000004304350000072702200197000800000002001d000000040220008c0000113a0000613d000000240400003900000080060000390000000802000029000000130300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f00000013010000290000000002130019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f000000130100002900000000021500191c8f19bb0000040f00000000030100190000000e0100002900000010020000291c8f1b290000040f0000075703000041000000000030043900000008030000290000000400300443000e00000001001d001300000002001d000080020100003900000024020000391c8f00e80000040f000000000110004c000011eb0000c13d000000000100001900000000020000191c8f01040000040f000000000112013f0000072701100198000011700000c13d000000400100043d0000004402100039000007870300004100000000003204350000002402100039000000150300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000f0100035f000000000101043b00000727011001980000000001000019000000010100c0391c8f1a7a0000040f0000000401000039001200000001001d0000000201100367000000000101043b1c8f16d20000040f00000012020000290000000202200367000000000202043b000007270220019700000000002004350000000602000039000f00000002001d000000200020043f001000000001001d000000400200003900000000010000191c8f00d10000040f000000000101041a0000075c0110019700000010020000290000000003020019000000000212004b000013ce0000413d000000000113004900000011020000290000000202200367000000000202043b000000000121004b000012370000813d000000400100043d0000004402100039000007860300004100000000003204350000002402100039000000170300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000130100002900000000001004350000000601000039001000000001001d000000200010043f0000004002000039001100000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000001002000029000000200020043f001000000001001d000000000100001900000011020000291c8f00d10000040f000000000101041a0000075c021001970000001203000029000000000232004b000013ce0000413d000000120300002900000000013100490000075c011001970000001004000029000000000204041a0000075d02200197000000000112019f000000000014041b000000130100002900000014020000291c8f18880000040f00000014020000290000076f01000041000000400300043d001100000003001d00000000001304350000000001000414000000040320008c000011d10000613d00000004040000390000002006000039000000110300002900000000050300191c8f00630000040f000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f000000200110008c0000115c0000413d00000011010000290000000001010433001100000001001d000000130100002900000014020000291c8f18350000040f000000400100043d000008a50000013d000000400400043d0000078101000041000000000014043500000013010000290000077602100197000000240340003900000000010004140000000000230435001300000004001d0000000402400039000000120300002900000000003204350000000802000029000000040220008c000012020000613d000000440400003900000008020000290000001303000029000000000503001900000000060000191c8f00630000040f000000000110004c00000e430000613d0000001301000029000007590110009c0000140c0000213d0000001301000029000000400010043f000000120100002900000000001004350000000f01000029000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000c0011002700000ffff0110018f0000000e02000029000000000220004c000012190000613d000000010200008a0000000e0300002900000000323200d9000000000212004b000013ce0000413d0000000e0300002900000000213100a9000007631210012a001300000002001d000000000123004b000013ce0000413d0000000e0100002900000013020000290000000001210049000400000001001d0000000d02000029000000000121004b000014890000813d000000400100043d00000064021000390000078403000041000000000032043500000044021000390000078a0300004100000000003204350000002402100039000000260300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000084020000391c8f01040000040f0000000701000039000e00000001001d000000000201041a000000400400043d00000762010000410000000000140435000000000100041400000012030000290000000203300367000000000303043b0000072703300197001100000004001d000000040440003900000000003404350000072702200197001000000002001d000000040220008c000012510000613d000000240400003900000080060000390000001002000029000000110300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f00000011010000290000000002130019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f000000110100002900000000021500191c8f19bb0000040f0000076202000041000000400300043d0000000000230435000c00000001001d00000000010004140000002402000039000d00000002001d0000000202200367000000000202043b0000072702200197001100000003001d000000040330003900000000002304350000001002000029000000040220008c0000127c0000613d000000240400003900000080060000390000001002000029000000110300002900000000050300191c8f009a0000040f000000000110004c00000e430000613d0000000101000031000000800210008c000000800500003900000000050140190000001f02500039000001e00320018f00000011010000290000000002130019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f000000110100002900000000021500191c8f19bb0000040f00000012020000290000000202200367000000000202043b0000072702200197000600000001001d0000002001100039000b00000001001d0000000001010433000900000001001d0000000c010000290000002001100039000a00000001001d0000000001010433000800000001001d00000000002004350000000f01000029000000200010043f0000004002000039000700000002001d00000000010000191c8f00d10000040f000000000101041a001100000001001d0000000d010000290000000201100367000000000101043b000007270110019700000000001004350000000f01000029000000200010043f000000000100001900000007020000291c8f00d10000040f0000000802000029000007590220019700000009030000290000075903300197000000000432004b000000000203a0190000000102200270000000000101041a000900000001001d0000000a0100002900000000002104350000000b01000029000000000021043500000002010003670000004402100370000000000202043b0000000401100370000000000101043b0000000c030000291c8f1b290000040f0000075703000041000000000030043900000010030000290000000400300443000b00000001001d000c00000002001d00008002010000390000000d020000291c8f00e80000040f0000001102000029000000c0022002700000ffff0220018f0000000903000029000000c0033002700000ffff0330018f000000000432004b000000000203a019000a00000002001d000000000110004c0000115c0000613d000000400500043d00000781010000410000000000150435000000000100041400000012020000290000000202200367000000000202043b0000000c030000290000077603300197000000240450003900000000003404350000072702200197001100000005001d000000040350003900000000002304350000001002000029000000040220008c000012f20000613d000000440400003900000010020000290000001103000029000000000503001900000000060000191c8f00630000040f000000000110004c00000e430000613d0000001101000029000007590110009c0000140c0000213d0000001101000029000000400010043f0000000b01000029000000000110004c000013000000613d000000010100008a0000000b0200002900000000212100d90000000a02000029000000000121004b000013ce0000413d0000000b030000290000000a0100002900000000211300a9000007631210012a001100000002001d000000000123004b000013ce0000413d000000010200008a0000001101000029001000000002001d000000000321013f0000000301000039000000000201041a000a00000003001d000000000332004b000013ce0000213d00000011030000290000000002320019000000000021041b0000076101000041000900000001001d00000000001004390000001301000029000000040010044300000024000004430000800501000039000800000001001d0000004402000039000c00000002001d1c8f00e80000040f000007270110019700000000001004350000000f01000029000000200010043f0000004002000039000700000002001d00000000010000191c8f00d10000040f00000009020000290000000000200439000000130200002900000004002004430000002400000443001300000001001d00000008010000290000000c020000291c8f00e80000040f000007270110019700000000001004350000000f01000029000000200010043f000000000100001900000007020000291c8f00d10000040f000000000101041a0000075c021001970000001103000029000000000232004b000013ce0000413d000000110200002900000000012100490000075c011001970000001303000029000000000203041a0000075d02200197000000000112019f000000000013041b00000012010000290000000201100367000000000101043b000007270110019700000000001004350000000f01000029000000200010043f0000004002000039001300000002001d00000000010000191c8f00d10000040f00000012020000290000000202200367000000000202043b000007270220019700000000002004350000000f02000029000000200020043f001200000001001d000000000100001900000013020000291c8f00d10000040f0000000c020000290000000202200367000000000502043b0000001002000029000000000325013f000000000101041a0000075c04100197000000000334004b000013ce0000213d0000000b030000290000001104000029000000000243004900000000011500190000075c011001970000001204000029000000000304041a0000075d03300197000000000113019f000000000014041b0000000d010000290000000201100367000000000101043b001000000002001d00000006030000291c8f1bf40000040f000400000001001d001200000002001d0000000e01000029000000000101041a000007570200004100000000002004390000072701100197001300000001001d000000040010044300008002010000390000000d020000291c8f00e80000040f000000000110004c0000115c0000613d000000400400043d0000078101000041000000000014043500000000010004140000000d020000290000000202200367000000000202043b000000120300002900000776033001970000002405400039000e00000005001d00000000003504350000072702200197001200000004001d0000000403400039000c00000003001d00000000002304350000001302000029000000040220008c0000139c0000613d000000440400003900000013020000290000001203000029000000000503001900000000060000191c8f00630000040f000000000110004c00000e430000613d0000001201000029000007590110009c0000140c0000213d0000001201000029000000400010043f00000002010003670000006402100370000000000202043b0000000403000029000000000223004b0000150a0000813d00000766020000410000001201000029000000000021043500000020020000390000000c03000029000000000023043500000026020000390000000e03000029000000000023043500000064031000390000078402000041000000000023043500000044031000390000078502000041000000000023043500000084020000391c8f01040000040f000000130100002900000000001004350000000601000039000f00000001001d000000200010043f0000004002000039001000000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000000f02000029000000200020043f000f00000001001d000000000100001900000010020000291c8f00d10000040f000000000101041a0000075c021001970000001203000029000000000232004b000013d50000813d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f000000120300002900000000013100490000075c011001970000000f04000029000000000204041a0000075d02200197000000000112019f000000000014041b000000130100002900000014020000291c8f18880000040f00000014020000290000075e01000041000000400300043d0000000000130435001000000003001d0000000403300039000000000100041400000011040000290000000000430435000000040320008c000013f20000613d00000024040000390000002006000039000000100300002900000000050300191c8f00630000040f000000000110004c00000e430000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000010020000290000000002230019000000000332004b00000000030000190000000103004039000007590420009c0000140c0000213d00000001033001900000140c0000c13d000000400020043f000000200110008c0000115c0000413d00000010010000290000000001010433001000000001001d000000130100002900000014020000291c8f18350000040f000000400100043d0000020f0000013d000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f000000120100002900000000001004350000000d01000029000000200010043f0000004002000039000c00000002001d00000000010000191c8f00d10000040f000000120200002900000000002004350000000d02000029000000200020043f000900000001001d00000000010000190000000c020000291c8f00d10000040f000000000101041a0000075c021001970000000403000029000000000232004b000013ce0000413d000000040200002900000000012100490000075c011001970000000903000029000000000203041a0000075d02200197000000000112019f000000000013041b000000130100002900000000001004350000000d01000029000000200010043f0000004002000039000c00000002001d00000000010000191c8f00d10000040f000000130200002900000000002004350000000d02000029000000200020043f000d00000001001d00000000010000190000000c020000291c8f00d10000040f00000007020000290000000503000029000000000223013f000000000101041a0000075c03100197000000000223004b000013ce0000213d000000050200002900000000012100190000075c011001970000000d03000029000000000203041a0000075d02200197000000000112019f000000000013041b00000000010004100000000b02000029000000000112004b000014570000613d0000001001000029000000110200002900000004030000291c8f167f0000040f00000006010000290000000502000029000000000112004b0000000e04000029000013ce0000213d000000400100043d000000a0021000390000000f0300002900000000003204350000000a02000029000007270220019700000060031000390000000000230435000000140200002900000727022001970000004003100039000000000023043500000020021000390000000403000029000000000032043500000080021000390000000000420435000000000041043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f00000782011001c70000800d0200003900000004030000390000078304000041000000130500002900000012060000290000000b070000291c8f1c850000040f00000001012001900000115c0000613d0000000101000039000000000011041b000000400100043d00000004020000290000000000210435000000200200003900000000030000191c8f00fa0000040f000000010200008a0000001301000029000d00000002001d000000000321013f0000000301000039000000000201041a000800000003001d000000000332004b000013ce0000213d00000013030000290000000002320019000000000021041b000000120100002900000000001004350000000f01000029000000200010043f0000004002000039000700000002001d00000000010000191c8f00d10000040f000000120200002900000000002004350000000f02000029000000200020043f000600000001001d000000000100001900000007020000291c8f00d10000040f00000010020000290000000d03000029000000000232013f000000000101041a0000075c03100197000000000223004b000013ce0000213d000000100200002900000000012100190000075c011001970000000603000029000000000203041a0000075d02200197000000000112019f000000000013041b0000000c0100002900000000001004350000000f01000029000000200010043f0000004002000039000d00000002001d00000000010000191c8f00d10000040f0000000c0200002900000000002004350000000f02000029000000200020043f000f00000001001d00000000010000190000000d020000291c8f00d10000040f000000000101041a0000075c011001970000000402000029000000000221004b000013ce0000413d000000040200002900000000012100490000001302000029000000000221004b000013ce0000413d000000130200002900000000012100490000075c011001970000000f03000029000000000203041a0000075d02200197000000000112019f000000000013041b00000000010004100000000b02000029000000000112004b000014de0000613d0000000901000029000000110200002900000004030000291c8f167f0000040f00000004010000290000000802000029000000000121004b000013ce0000213d000000400100043d000000a0021000390000001303000029000000000032043500000080021000390000000e0300002900000000003204350000000a0200002900000727022001970000006003100039000000000023043500000014020000290000072702200197000000400310003900000000002304350000002002100039000000040300002900000000003204350000001002000029000000000021043500000725020000410000000003000414000007250430009c0000000003028019000007250410009c00000000010280190000004001100210000000c002300210000000000112019f00000782011001c70000800d020000390000000403000039000007830400004100000012050000290000000c060000290000000b070000291c8f1c850000040f0000000101200190000014810000c13d0000115c0000013d0000002401100370000000000101043b000007270110019700000000001004350000000f01000029000000200010043f0000004002000039001300000002001d00000000010000191c8f00d10000040f0000000d020000290000000202200367000000000202043b000007270220019700000000002004350000000f02000029000000200020043f001200000001001d000000000100001900000013020000291c8f00d10000040f000000000101041a0000075c021001970000000403000029000000000232004b000013ce0000413d000000040200002900000000012100490000075c011001970000001203000029000000000203041a0000075d02200197000000000112019f000000000013041b00000002010003670000008402100370000000000202043b00000727032001970000000004000410000000000343004b000015370000613d0000002401100370000000000101043b00000004030000291c8f167f0000040f0000000a010000290000001002000029000000000112004b000013ce0000213d00000002010003670000004402100370000000000202043b000000a401100370000000000101043b000000400300043d000000a0043000390000001105000029000000000054043500000080043000390000000b050000290000000000540435000000140400002900000727044001970000004005300039000000000045043500000020043000390000000405000029000000000054043500000727011001970000006004300039000000000014043500000000002304350000072501000041000007250230009c0000000002010019000000000203401900000002030003670000008404300370000000000404043b0000002405300370000000000605043b0000000403300370000000000303043b0000000005000414000007250750009c00000000010540190000004002200210000000c001100210000000000121019f00000782011001c70000072705300197000007270660019700000727074001970000800d02000039000000040300003900000783040000411c8f1c850000040f0000000101200190000014810000c13d0000115c0000013d0001000000000002000100000001001d000000000100041a00000768021001970000000006000411000000000262019f000000000020041b000000400200043d00000725030000410000000004000414000007250540009c0000000004038019000007250520009c00000000020380190000004002200210000000c003400210000000000223019f00000727051001970000072a012001c70000800d02000039000000030300003900000769040000411c8f1c850000040f0000000101200190000015910000613d0000000101000039000000000011041b0000000201000039000000000201041a000001000300008a000000000232016f000000000021041b0000000101000029000000800010043f000000000001042d000000000100001900000000020000191c8f01040000040f0000079c0110009c000015970000813d000000000001042d000000000100001900000000020000191c8f01040000040f000007270110019700000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000001042d000000040110008a00000726020000410000003f0310008c000000000300001900000000030220190000072601100197000000000410004c0000000002008019000007260110009c00000000010300190000000001026019000000000110004c000015b90000613d00000002020003670000000401200370000000000101043b000007270310009c000015b90000213d0000002402200370000000000202043b000007270320009c000015b90000213d000000000001042d000000000100001900000000020000191c8f01040000040f000000040110008a00000726020000410000003f0310008c000000000300001900000000030220190000072601100197000000000410004c0000000002008019000007260110009c00000000010300190000000001026019000000000110004c000015d60000613d00000002020003670000000401200370000000000101043b000007270310009c000015d60000213d0000002402200370000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b000015d60000c13d000000000001042d000000000100001900000000020000191c8f01040000040f000000040110008a00000726020000410000003f0310008c000000000300001900000000030220190000072601100197000000000410004c0000000002008019000007260110009c00000000010300190000000001026019000000000110004c000015f00000613d00000002020003670000000401200370000000000101043b000007270310009c000015f00000213d0000002402200370000000000202043b000007760320009c000015f00000213d000000000001042d000000000100001900000000020000191c8f01040000040f000000040110008a00000726020000410000005f0310008c000000000300001900000000030220190000072601100197000000000410004c0000000002008019000007260110009c00000000010300190000000001026019000000000110004c0000160c0000613d00000002030003670000000401300370000000000101043b000007270210009c0000160c0000213d0000002402300370000000000202043b000007270420009c0000160c0000213d0000004403300370000000000303043b000000000001042d000000000100001900000000020000191c8f01040000040f000000000100041a00000727011001970000000002000411000000000121004b000016150000c13d000000000001042d000000400100043d00000044021000390000079d030000410000000000320435000007660200004100000000002104350000002402100039000000200300003900000000003204350000000402100039000000000032043500000064020000391c8f01040000040f000000000110004c000016250000613d000000000001042d000000400100043d00000044021000390000079e0300004100000000003204350000002402100039000000170300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f0000000101000039000000000201041a000000020220008c0000163a0000613d0000000202000039000000000021041b000000000001042d000000400100043d00000044021000390000079f03000041000000000032043500000024021000390000001f0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f00000060010000390000000102000032000016770000613d0000003f01200039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b00000000040000190000000104004039000007590530009c000016780000213d0000000104400190000016780000c13d000000400030043f00000000002104350000002002100039000000030300036700000001050000310000001f0450018f0000000505500272000016680000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000016600000413d000000000640004c000016770000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000000001042d000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f00010000000000020000000005010019000000400400043d000000440140003900000000003104350000002003400039000007a001000041000000000013043500000727012001970000002402400039000000000012043500000044010000390000000000140435000007a10140009c000016cb0000813d0000008001400039000000400010043f0000000001000414000000040250008c00000000020000190000169c0000613d00000000040404330000000002050019000000000500001900000000060000191c8f00630000040f000000000110004c00000000020000190000000102006039000100000002001d1c8f16480000040f00000001020000290000000102200190000016ba0000c13d0000000002010433000000000320004c000016b90000613d00000726030000410000001f0420008c000000000400001900000000040320190000072602200197000000000520004c0000000003008019000007260220009c00000000020400190000000002036019000000000220004c000016c80000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000016c80000c13d000000000110004c000016ba0000613d000000000001042d000000400100043d0000004402100039000007a20300004100000000003204350000002402100039000000020300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000100001900000000020000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f0002000000000002000200000001001d00000761010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f000100000001001d00000002010000291c8f1a9c0000040f00000002020000290000000103000029000000000223013f0000072702200198000016e90000c13d0000000302000039000000000202041a000000000321004b000016ea0000413d0000000001210049000000000001042d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f0000000102000039000000000310004c000017120000613d0000004e0210008c000016fb0000813d1c8f00560000040f0000000002010019000007980120009c000017120000413d000017140000013d0000000a020000390000000103000039000000020410008c0000170b0000413d000000000420004c000017040000613d0000075954200129000000000442004b000017140000213d00000001041001900000000004020019000000010400603900000000434300a9000000010110027000000000422200a9000016fd0000013d000000000120004c00000000010000190000170f0000613d0000075941200129000000000113004b000017140000213d00000000123200a90000000001020019000000000001042d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f0004000000000002000000400200043d000007a30320009c000017bb0000813d0000006003200039000000400030043f000000400320003900000000000304350000002003200039000000000003043500000000000204350000000702000039000000000202041a000000400300043d000007a4040000410000000000430435000007270410019700000004053000390000000001000414000300000004001d00000000004504350000072702200197000000040420008c0000173b0000613d00000024040000390000002006000039000400000003001d00000004050000291c8f009a0000040f0000000403000029000000000110004c000017c20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c000017bb0000213d0000000104500190000017bb0000c13d000000400020043f0000001f0110008c000017b80000a13d0000000001030433000000ff0210008c000017b80000213d1c8f16f10000040f000007a502000041000000400300043d000400000003001d0000000000230435000200000001001d0000000001000414000100000001001d00000761010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391c8f00e80000040f0000072702100197000000040120008c0000176a0000613d000000040400003900000020060000390000000101000029000000040300002900000000050300191c8f009a0000040f000000000110004c000017c20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000004050000290000000002530019000000000332004b00000000030000190000000103004039000007590420009c0000000004050019000017bb0000213d0000000103300190000017bb0000c13d000000400020043f000000200110008c000017b80000413d0000000001040433000000ff0210008c000017b80000213d1c8f16f10000040f000007a502000041000000400300043d0000000000230435000400000001001d00000000010004140000000302000029000000040220008c000017920000613d000000040400003900000020060000390000000302000029000300000003001d00000003050000291c8f009a0000040f0000000303000029000000000110004c000017c20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b00000000050000190000000105004039000007590420009c000017bb0000213d0000000104500190000017bb0000c13d000000400020043f000000200110008c000017b80000413d0000000001030433000000ff0210008c000017b80000213d1c8f16f10000040f0000000002010019000000400100043d000007a60310009c000017bb0000213d0000006003100039000000400030043f0000075902200197000000400310003900000000002304350000000402000029000007590220019700000020031000390000000000230435000000020200002900000759022001970000000000210435000000000001042d000000000100001900000000020000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000017d10000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000017c90000413d000000000530004c000017e00000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311c8f01040000040f000000000110004c000017e50000613d000000000001042d000000400100043d0000004402100039000007a703000041000000000032043500000024021000390000000f0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f1c8f18110000040f0000000201000039000000000201041a000001000300008a000000000232016f00000001022001bf000000000021041b0000000001000411000000400200043d000000000012043500000725010000410000000003000414000007250430009c0000000003018019000007250420009c00000000010240190000004001100210000000c002300210000000000112019f0000075f011001c70000800d020000390000000103000039000007a8040000411c8f1c850000040f00000001012001900000180e0000613d000000000001042d000000000100001900000000020000191c8f01040000040f0000000201000039000000000101041a000000ff01100190000018160000c13d000000000001042d000000400100043d0000004402100039000007a90300004100000000003204350000002402100039000000100300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c000018270000613d000000000001042d000000400100043d0000004402100039000007aa03000041000000000032043500000024021000390000000d0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f00010000000000020000000005010019000000400400043d0000002003400039000007900100004100000000001304350000072701200197000000240240003900000000001204350000004401000039000000000014043500000044014000390000000000010435000007a10140009c000018810000813d0000008001400039000000400010043f0000000001000414000000040250008c0000000002000019000018520000613d00000000040404330000000002050019000000000500001900000000060000191c8f00630000040f000000000110004c00000000020000190000000102006039000100000002001d1c8f16480000040f00000001020000290000000102200190000018700000c13d0000000002010433000000000320004c0000186f0000613d00000726030000410000001f0420008c000000000400001900000000040320190000072602200197000000000520004c0000000003008019000007260220009c00000000020400190000000002036019000000000220004c0000187e0000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b0000187e0000c13d000000000110004c000018700000613d000000000001042d000000400100043d0000004402100039000007920300004100000000003204350000002402100039000000020300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000100001900000000020000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f00010000000000020000000005010019000000400400043d0000004401400039000000000031043500000020034000390000079001000041000000000013043500000727012001970000002402400039000000000012043500000044010000390000000000140435000007a10140009c000018d40000813d0000008001400039000000400010043f0000000001000414000000040250008c0000000002000019000018a50000613d00000000040404330000000002050019000000000500001900000000060000191c8f00630000040f000000000110004c00000000020000190000000102006039000100000002001d1c8f16480000040f00000001020000290000000102200190000018c30000c13d0000000002010433000000000320004c000018c20000613d00000726030000410000001f0420008c000000000400001900000000040320190000072602200197000000000520004c0000000003008019000007260220009c00000000020400190000000002036019000000000220004c000018d10000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000018d10000c13d000000000110004c000018c30000613d000000000001042d000000400100043d0000004402100039000007920300004100000000003204350000002402100039000000020300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000100001900000000020000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f000c000000000002000500000001001d0000000102000039000000000100041a00000727011001970000000003000411000700000003001d000000000113004b000b00000002001d0000000001020019000018ef0000613d000000070100002900000000001004350000000401000039000000200010043f000000400200003900000000010000191c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f00000005010000290000002002100039000300000002001d0000000001010433000400000001001d0000000601000039000200000001001d0000004001000039000600000001001d0000000401000039000100000001001d00000000020000190000000401000029000000000112004b000019360000813d00000005010000290000000001010433000000000112004b000019370000813d000900000002001d0000000501200210000000030200002900000000011200190000000001010433000c00000001001d1c8f16330000040f0000000c010000290000072701100197000c00000001001d000000000100041a00000727021001970000000701000029000800000002001d000000000121004b0000000b010000290000191d0000613d000000070100002900000000001004350000000101000029000000200010043f000000000100001900000006020000291c8f00d10000040f000000000101041a000000ff0110018f1c8f17e20000040f0000000c010000291c8f16d20000040f0000000c0200002900000000002004350000000202000029000000200020043f000a00000001001d000000000100001900000006020000291c8f00d10000040f0000000a03000029000000000101041a0000075c01100197000000000213004b0000193e0000413d00000000031300490000000c0100002900000008020000291c8f167f0000040f0000000b01000029000000000011041b00000009020000290000000102200039000018fc0000013d000000000001042d000007290100004100000000001004350000003201000039000000040010043f000000240200003900000000010000191c8f01040000040f000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f0004000000000002000300000002001d000400000001001d1c8f18110000040f0000000701000039000000000201041a000000400500043d00000762010000410000000000150435000000040100002900000727031001970000000401500039000200000003001d000000000031043500000000010004140000072702200197000000040320008c000019600000613d000000240400003900000080060000390000000003050019000100000005001d00000001050000291c8f009a0000040f0000000105000029000000000110004c0000199b0000613d0000000101000031000000800210008c00000080010080390000001f02100039000001e00320018f0000000002530019000000000332004b00000000030000190000000103004039000007590420009c000019940000213d0000000103300190000019940000c13d000000400020043f000000000251001900000000010500191c8f19bb0000040f0000000003010019000000040100002900000003020000291c8f1b290000040f000000020200002900000000002004350000000602000039000000200020043f000400000001001d000000400200003900000000010000191c8f00d10000040f0000000404000029000000000101041a000000c0011002700000ffff0110018f000000000240004c000019870000613d000000010200008a00000000324200d9000000000212004b0000198d0000413d00000000214100a9000007632110012a000000000214004b0000198d0000413d0000000001140049000000000001042d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000019aa0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000019a20000413d000000000530004c000019b90000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311c8f01040000040f000000000212004900000726030000410000007f0420008c000000000400001900000000040320190000072602200197000000000520004c0000000003008019000007260220009c00000000020400190000000002036019000000000220004c000019e80000613d000000400200043d000007a10320009c000019eb0000813d0000008003200039000000400030043f0000000003010433000007760430009c000019e80000213d000000000032043500000020031000390000000003030433000007590430009c000019e80000213d0000002004200039000000000034043500000040031000390000000003030433000007590430009c000019e80000213d0000004004200039000000000034043500000060011000390000000001010433000000000310004c0000000003000019000000010300c039000000000331004b000019e80000c13d000000600320003900000000001304350000000001020019000000000001042d000000000100001900000000020000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f0004000000000002000300000002001d000400000001001d1c8f18110000040f00000004010000290000072701100197000200000001001d00000000001004350000000601000039000000200010043f000000400200003900000000010000191c8f00d10000040f0000000304000029000000000101041a000000c0011002700000ffff0110018f000000000240004c00001a090000613d000000010200008a00000000324200d9000000000212004b00001a3b0000413d00000000214100a9000007631210012a000000000142004b00001a3b0000213d000100000002001d0000000701000039000000000201041a000000400500043d0000076201000041000000000015043500000004035000390000000001000414000000020400002900000000004304350000072702200197000000040320008c00001a230000613d000000240400003900000080060000390000000003050019000200000005001d00000002050000291c8f009a0000040f0000000205000029000000000110004c00001a490000613d0000000101000031000000800210008c00000080010080390000001f02100039000001e00320018f0000000002530019000000000332004b00000000030000190000000103004039000007590420009c00001a420000213d000000010330019000001a420000c13d000000400020043f000000000251001900000000010500191c8f19bb0000040f000000030200002900000001030000290000000002320049000000000301001900000004010000291c8f1bf40000040f000000000001042d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001a580000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001a500000413d000000000530004c00001a670000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f000000000024043500000001020000311c8f01040000040f000000000110004c00001a6c0000613d000000000001042d000000400100043d0000004402100039000007ab0300004100000000003204350000002402100039000000130300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c00001a7d0000613d000000000001042d000000400100043d0000004402100039000007ac03000041000000000032043500000024021000390000000c0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c00001a8e0000613d000000000001042d000000400100043d0000004402100039000007ad03000041000000000032043500000024021000390000001e0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f00010000000000020000000002010019000000400400043d00000020034000390000077101000041000000000013043500000024014000390000000005000410000000000051043500000024010000390000000000140435000007a30140009c00001adb0000813d0000006001400039000000400010043f0000000001000414000000040520008c000000000500001900001ab60000613d0000000004040433000000000500001900000000060000191c8f009a0000040f000000000110004c00000000050000190000000105006039000100000005001d1c8f16480000040f0000000102000029000000010220019000001acd0000c13d00000000020104330000001f0320008c00001acd0000a13d00000726030000410000001f0420008c000000000400001900000000040320190000072602200197000000000520004c0000000003008019000007260220009c00000000020400190000000002036019000000000220004c00001ae20000613d00000020011000390000000001010433000000000001042d000000400100043d0000004402100039000007ae0300004100000000003204350000002402100039000000110300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000007290100004100000000001004350000004101000039000000040010043f000000240200003900000000010000191c8f01040000040f000000000100001900000000020000191c8f01040000040f000000000110004c00001ae80000613d000000000001042d000000400100043d0000004402100039000007af0300004100000000003204350000002402100039000000190300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c00001af90000613d000000000001042d000000400100043d0000004402100039000007b00300004100000000003204350000002402100039000000150300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c00001b0a0000613d000000000001042d000000400100043d0000004402100039000007b103000041000000000032043500000024021000390000001a0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000000000110004c00001b1b0000613d000000000001042d000000400100043d0000004402100039000007b203000041000000000032043500000024021000390000000f0300003900000000003204350000076602000041000000000021043500000004021000390000002003000039000000000032043500000064020000391c8f01040000040f000b000000000002000b00000003001d000a00000002001d000900000001001d00000060013000390000000001010433000000000110004c0000000001000019000000010100c0391c8f1ae50000040f0000000b01000029000000000101043300000776011001980000000001000019000000010100c0391c8f1af60000040f00000009010000291c8f171b0000040f0000000a0400002900000000050100190000000b0100002900000000010104330000077601100197000000000240004c00001b460000613d000000010200008a00000000324200d9000000000212004b00001bed0000413d00000000134100aa0000002001500039000300000001001d0000000001010433000007590610019700001b500000613d000000010100008a00000000213100d9000000000161004b00001bed0000413d000600000006001d000700000003001d0000004001500039000800000001001d00000000010104330000075901100198000500000001001d00001be60000613d00000000010504330000075901100198000400000001001d00001be60000613d00000009010000290000072701100197000200000001001d00000000001004350000000601000039000100000001001d000000200010043f00000040020000390000000001000019000900000005001d1c8f00d10000040f0000000702000029000000060300002900000000322300a9000000050300002900000000323200d9000000040300002900000000323200d90000000101100039000000000101041a0000008001100270000000000112004b0000000001000019000000010100a0391c8f1b070000040f00000009050000290000000b01000029000000000101043300000776011001970000000a04000029000000000240004c00001b800000613d000000010200008a00000000324200d9000000000212004b00001bed0000413d00000000134100aa0000000b0100002900000040011000390000000001010433000007590410019700001b8a0000613d000000010100008a00000000213100d9000000000141004b00001bed0000413d000600000004001d000700000003001d00000000010504330000075901100198000500000001001d00001be60000613d000000080100002900000000010104330000075901100198000400000001001d00001be60000613d000000020100002900000000001004350000000101000029000000200010043f000000400200003900000000010000191c8f00d10000040f0000000702000029000000060300002900000000322300a9000000050300002900000000323200d9000000040300002900000000233200d9000700000003001d0000000101100039000000000101041a0000077601100197000000000113004b0000000001000019000000010100a0391c8f1b180000040f000000070800002900000009060000290000000b01000029000000000101043300000776021001970000000a04000029000000000140004c00001bb70000613d000000010100008a00000000314100d9000000000121004b00001bed0000413d00000000314200aa00000003030000290000000003030433000007590430019700001bc00000613d000000010300008a00000000531300d9000000000343004b00001bed0000413d0000000003060433000007590530019800001be60000613d000007b30380009c00001bed0000213d000007b30300004100000000038300490000000b06000029000000200660003900000000060604330000075906600197000000000763004b00001bed0000413d00000000171400a900000000415700d90000000004630049000000000575004b00001bd60000213d000000010500008a00000000651500d9000000000545004b00001bed0000413d00000008050000290000000005050433000007590550019800001be60000613d000007b30680009c00001be00000613d000000010600008a00000000763600d9000000000626004b00001bed0000413d00000000411400a9000007b34110012a00000000415100d900000000323200a9000007b33220012a000000000001042d000007290100004100000000001004350000001201000039000000040010043f000000240200003900000000010000191c8f01040000040f000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f0008000000000002000700000003001d000800000002001d000600000001001d00000060013000390000000001010433000000000110004c0000000001000019000000010100c0391c8f1ae50000040f0000000701000029000000000101043300000776011001980000000001000019000000010100c0391c8f1af60000040f00000006010000291c8f171b0000040f00000006020000290000072702200197000500000002001d00000000002004350000000602000039000400000002001d000000200020043f000600000001001d000000400200003900000000010000191c8f00d10000040f0000000101100039000000000101041a00000080011002700000000802000029000000000121004b000000000100001900000001010080391c8f1b070000040f000000060400002900000008030000290000000701000029000000400110003900000000010104330000075905100197000000000130004c00001c250000613d000000010100008a00000000213100d9000000000151004b00001c770000413d000300000005001d0000002001400039000100000001001d00000000010104330000075901100198000200000001001d00001c7e0000613d000000050100002900000000001004350000000401000029000000200010043f000000400200003900000000010000191c8f00d10000040f0000000803000029000000030200002900000000323200a9000000020300002900000000233200d9000500000003001d0000000101100039000000000101041a0000077601100197000000000113004b0000000001000019000000010100a0391c8f1b180000040f000000050700002900000008040000290000000605000029000000400150003900000000010104330000075901100197000000000240004c00001c4c0000613d000000010200008a00000000324200d9000000000212004b00001c770000413d00000000134100aa0000000001050433000007590410019700001c540000613d000000010100008a00000000213100d9000000000141004b00001c770000413d00000007010000290000000001010433000007760110019800001c7e0000613d000007b30270009c00001c770000213d000007b30200004100000000027200490000000705000029000000200550003900000000050504330000075905500197000000000652004b00001c770000413d00000000363400a900000000431600d90000000004520049000000000561004b00001c6b0000213d000000010500008a00000000653500d9000000000545004b00001c770000413d00000001050000290000000005050433000007590550019800001c7e0000613d000007b30670009c00001c7e0000613d000007b3611000d100000000122100d900000000313400a9000007b33110012a00000000315100d9000000000001042d000007290100004100000000001004350000001101000039000000040010043f000000240200003900000000010000191c8f01040000040f000007290100004100000000001004350000001201000039000000040010043f000000240200003900000000010000191c8f01040000040f00001c88002104210000000102000039000000000001042d000000000200001900001c870000013d00001c8d002104230000000102000039000000000001042d000000000200001900001c8c0000013d00001c8f0000043200001c900001042e00001c91000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002259b4000000000000000000000000000000000000000000000000000000000426d97500000000000000000000000000000000000000000000000000000000217a4b700000000000000000000000000000000000000000000000000000000024d7806c0000000000000000000000000000000000000000000000000000000039e7fddc000000000000000000000000000000000000000000000000000000003f4ba83a0000000000000000000000000000000000000000000000000000000047e7ef24000000000000000000000000000000000000000000000000000000004b0bddd2000000000000000000000000000000000000000000000000000000005905d23c000000000000000000000000000000000000000000000000000000005c975abb00000000000000000000000000000000000000000000000000000000637e10cb0000000000000000000000000000000000000000000000000000000068078eed00000000000000000000000000000000000000000000000000000000686f30b000000000000000000000000000000000000000000000000000000000715018a6000000000000000000000000000000000000000000000000000000007dc20382000000000000000000000000000000000000000000000000000000007f0eec02000000000000000000000000000000000000000000000000000000008456cb59000000000000000000000000000000000000000000000000000000008da5cb5b00000000000000000000000000000000000000000000000000000000966fb4c30000000000000000000000000000000000000000000000000000000099d32fc4000000000000000000000000000000000000000000000000000000009f0d5f2700000000000000000000000000000000000000000000000000000000a1ae849000000000000000000000000000000000000000000000000000000000a26db1a700000000000000000000000000000000000000000000000000000000a584119400000000000000000000000000000000000000000000000000000000a8a4ff6a00000000000000000000000000000000000000000000000000000000b2855b4f00000000000000000000000000000000000000000000000000000000b2e693d300000000000000000000000000000000000000000000000000000000ba46ae7200000000000000000000000000000000000000000000000000000000bc25cf7700000000000000000000000000000000000000000000000000000000bc8530f900000000000000000000000000000000000000000000000000000000ce824f1900000000000000000000000000000000000000000000000000000000d6285b7f00000000000000000000000000000000000000000000000000000000e1a4e72a00000000000000000000000000000000000000000000000000000000e3d670d700000000000000000000000000000000000000000000000000000000e4d43ec100000000000000000000000000000000000000000000000000000000ebc80f1300000000000000000000000000000000000000000000000000000000f09a401600000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000f3fef3a300000000000000000000000000000000000000000000000000000000f58a435f00000000000000000000000000000000000000000000000000000000fa09e63000000000000000000000000000000000000000000000000000000000fa75d16000000000000000000000000000000000000000000000000000000000fc60fb5d1806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83a373ed4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff52c49c4400000000000000000000000000000000000000000000000000000000e5e2abf5000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000003560df8c0000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000009b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e31e658a50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000186a04500000000000000000000000000000000000000000000000000000000000000576f6f505056323a20494e535546465f51554f54455f464f525f53574150464508c379a000000000000000000000000000000000000000000000000000000000576f6f505056323a2021616d6f756e7400000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e064647265737300000000000000000000000000000000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061576f6f505056323a20494e49545f494e56414c49440000000000000000000000f077cbab000000000000000000000000000000000000000000000000000000001f1fcd5100000000000000000000000000000000000000000000000000000000c1ae359a00000000000000000000000000000000000000000000000000000000000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee70a08231000000000000000000000000000000000000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f39000000000000000000000000000000000000000000000000ffffffffffffffdf5354450000000000000000000000000000000000000000000000000000000000235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113300000000000000000000000000000000ffffffffffffffffffffffffffffffff76f97b3f5ffcc8d8d9577d141751a7bed446b46d837fbc81b5c01c165bbfbbf459ddfdd1bf7e3ea08a07e8aaa1fe2ce9c840fab69fe5ede6ea727a45eb42fc6623b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff5f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62576f6f505056323a202166656541646472000000000000000000000000000000000000000000ffff000000000000000000000000000000000000000000000000ffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000576f6f505056323a202169735061757365526f6c650000000000000000000000d5bade070000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000c00000000000000000000000000e8e403c2d36126272b08c75823e988381d9dc47f2f0a9a080d95f891d95c469416d6f756e740000000000000000000000000000000000000000000000000000576f6f505056323a206261736532416d6f756e745f4c545f6d696e4261736532576f6f505056323a202142415345315f42414c414e4345000000000000000000576f6f505056323a2062617365313d3d62617365320000000000000000000000576f6f505056323a202162617365546f6b656e32000000000000000000000000576f6f505056323a202162617365546f6b656e31000000000000000000000000576f6f505056323a2071756f7465416d6f756e745f4c545f6d696e51756f7465576f6f505056323a2021424153450000000000000000000000000000000000006f756e7400000000000000000000000000000000000000000000000000000000576f6f505056323a2062617365416d6f756e745f4c545f6d696e42617365416d576f6f505056323a202151554f54450000000000000000000000000000000000371fd8e600000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f5341000000000000000000000000000000000000000000000000000000000000949c0260fa3a6145f57958b7bf0efeb5edb4d3e1e573353a16e69aea2450883d53544600000000000000000000000000000000000000000000000000000000005db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa5061757361626c653a206e6f74207061757365640000000000000000000000009f0d5f2700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000018df02dcc52b9c494f391df09661519c0069bd8540141946280399408205ca1a576f6f505056323a20216e6577506f6f6c000000000000000000000000000000576f6f505056323a2021746f6b656e000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572576f6f505056323a20494e535546465f42414c414e43450000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff805354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffa0d449a83200000000000000000000000000000000000000000000000000000000313ce56700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f576f6f505056323a202161646d696e000000000000000000000000000000000062e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2585061757361626c653a2070617573656400000000000000000000000000000000414d4f554e545f494e5355464600000000000000000000000000000000000000576f6f505056323a202162617365546f6b656e00000000000000000000000000576f6f505056323a2021746f0000000000000000000000000000000000000000576f6f505056323a2062617365546f6b656e3d3d71756f7465546f6b656e0000576f6f505056323a202142414c414e4345000000000000000000000000000000576f6f505056323a20214f5241434c455f4645415349424c4500000000000000576f6f505056323a20214f524143455f50524943450000000000000000000000576f6f505056323a20216d61784e6f74696f6e616c56616c7565000000000000576f6f505056323a202167616d6d6100000000000000000000000000000000000000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d4
-----Decoded View---------------
Arg [0] : _quoteToken (address): 0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d4
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.