More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 4,004 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Request Withdraw... | 59501253 | 3 hrs ago | IN | 0 ETH | 0.00001209 | ||||
Approve | 59501249 | 3 hrs ago | IN | 0 ETH | 0.0000037 | ||||
Approve | 59501246 | 3 hrs ago | IN | 0 ETH | 0.00000613 | ||||
Instant Withdraw... | 59477666 | 19 hrs ago | IN | 0 ETH | 0.0000183 | ||||
Instant Withdraw... | 59474825 | 21 hrs ago | IN | 0 ETH | 0.00002268 | ||||
Instant Withdraw... | 59457544 | 31 hrs ago | IN | 0 ETH | 0.0000152 | ||||
Request Withdraw... | 59452066 | 35 hrs ago | IN | 0 ETH | 0.0000106 | ||||
Approve | 59452058 | 35 hrs ago | IN | 0 ETH | 0.00000539 | ||||
Request Withdraw... | 59439161 | 45 hrs ago | IN | 0 ETH | 0.0000081 | ||||
Approve | 59439148 | 45 hrs ago | IN | 0 ETH | 0.00000513 | ||||
Instant Withdraw... | 59438589 | 45 hrs ago | IN | 0 ETH | 0.00001698 | ||||
Instant Withdraw... | 59428510 | 2 days ago | IN | 0 ETH | 0.00001597 | ||||
Request Withdraw... | 59426251 | 2 days ago | IN | 0 ETH | 0.00001063 | ||||
Approve | 59426231 | 2 days ago | IN | 0 ETH | 0.00000476 | ||||
End Weekly Settl... | 59423449 | 2 days ago | IN | 0 ETH | 0.00002719 | ||||
Start Weekly Set... | 59410483 | 2 days ago | IN | 0 ETH | 0.00000857 | ||||
Instant Withdraw... | 59404909 | 2 days ago | IN | 0 ETH | 0.00001664 | ||||
Request Withdraw... | 59402913 | 2 days ago | IN | 0 ETH | 0.00001001 | ||||
Approve | 59402903 | 2 days ago | IN | 0 ETH | 0.00000505 | ||||
Request Withdraw... | 59390700 | 3 days ago | IN | 0 ETH | 0.0000106 | ||||
Approve | 59390684 | 3 days ago | IN | 0 ETH | 0.0000054 | ||||
Instant Withdraw... | 59367291 | 3 days ago | IN | 0 ETH | 0.00001602 | ||||
Approve | 59353847 | 4 days ago | IN | 0 ETH | 0.00000468 | ||||
Approve | 59353247 | 4 days ago | IN | 0 ETH | 0.00000422 | ||||
Approve | 59352731 | 4 days ago | IN | 0 ETH | 0.00000468 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
47656031 | 176 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:
WooSuperChargerVaultV2
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/IStrategy.sol"; import "../interfaces/IWETH.sol"; import "../interfaces/IWooAccessManager.sol"; import "../interfaces/IVaultV2.sol"; import "../interfaces/IMasterChefWoo.sol"; import "./WooWithdrawManagerV2.sol"; import "./WooLendingManager.sol"; import "../libraries/TransferHelper.sol"; 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 {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"; import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; contract WooSuperChargerVaultV2 is ERC20, Ownable, Pausable, ReentrancyGuard { using EnumerableSet for EnumerableSet.AddressSet; event Deposit(address indexed depositor, address indexed receiver, uint256 assets, uint256 shares); event RequestWithdraw(address indexed owner, uint256 assets, uint256 shares); event InstantWithdraw(address indexed owner, uint256 assets, uint256 shares, uint256 fees); event WeeklySettleStarted(address indexed caller, uint256 totalRequestedShares, uint256 weeklyRepayAmount); event WeeklySettleEnded( address indexed caller, uint256 totalBalance, uint256 lendingBalance, uint256 reserveBalance ); event ReserveVaultMigrated(address indexed user, address indexed oldVault, address indexed newVault); event SuperChargerVaultMigrated( address indexed user, address indexed oldVault, address indexed newVault, uint256 amount ); event LendingManagerUpdated(address formerLendingManager, address newLendingManager); event WithdrawManagerUpdated(address formerWithdrawManager, address newWithdrawManager); event InstantWithdrawFeeRateUpdated(uint256 formerFeeRate, uint256 newFeeRate); /* ----- State Variables ----- */ address constant ETH_PLACEHOLDER_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; IVaultV2 public reserveVault; address public migrationVault; WooLendingManager public lendingManager; WooWithdrawManagerV2 public withdrawManager; address public immutable want; address public immutable weth; IWooAccessManager public immutable accessManager; mapping(address => uint256) public costSharePrice; mapping(address => uint256) public requestedWithdrawShares; // Requested withdrawn amount (in assets, NOT shares) uint256 public requestedTotalShares; EnumerableSet.AddressSet private requestUsers; uint256 public instantWithdrawCap; // Max instant withdraw amount (in assets, per week) uint256 public instantWithdrawnAmount; // Withdrawn amout already consumed (in assets, per week) bool public isSettling; address public treasury = 0x815D4517427Fc940A90A5653cdCEA1544c6283c9; uint256 public instantWithdrawFeeRate = 30; // 1 in 10000th. default: 30 -> 0.3% uint256 public maxWithdrawCount = 300; address public masterChef; uint256 public pid; constructor( address _weth, address _want, address _accessManager ) ERC20( string(abi.encodePacked("WOOFi Super Charger ", ERC20(_want).name())), string(abi.encodePacked("we", ERC20(_want).symbol())) ) { require(_weth != address(0), "WooSuperChargerVault: !weth"); require(_want != address(0), "WooSuperChargerVault: !want"); require(_accessManager != address(0), "WooSuperChargerVault: !accessManager"); weth = _weth; want = _want; accessManager = IWooAccessManager(_accessManager); } function init( address _reserveVault, address _lendingManager, address payable _withdrawManager ) external onlyOwner { require(_reserveVault != address(0), "WooSuperChargerVault: !_reserveVault"); require(_lendingManager != address(0), "WooSuperChargerVault: !_lendingManager"); require(_withdrawManager != address(0), "WooSuperChargerVault: !_withdrawManager"); reserveVault = IVaultV2(_reserveVault); require(reserveVault.want() == want); lendingManager = WooLendingManager(_lendingManager); withdrawManager = WooWithdrawManagerV2(_withdrawManager); } modifier onlyAdmin() { require(owner() == msg.sender || accessManager.isVaultAdmin(msg.sender), "WooSuperChargerVault: !ADMIN"); _; } modifier onlyLendingManager() { require(msg.sender == address(lendingManager), "WooSuperChargerVault: !lendingManager"); _; } /* ----- External Functions ----- */ function setMasterChef(address _masterChef, uint256 _pid) external onlyOwner { require(_masterChef != address(0), "!_masterChef"); masterChef = _masterChef; pid = _pid; (IERC20 weToken, , , , ) = IMasterChefWoo(masterChef).poolInfo(pid); require(address(weToken) == address(this), "!pid"); } function stakedShares(address _user) public view returns (uint256 shares) { if (masterChef == address(0)) { shares = 0; } else { (shares, ) = IMasterChefWoo(masterChef).userInfo(pid, _user); } } function deposit(uint256 amount) external payable whenNotPaused nonReentrant { _deposit(amount, msg.sender); } function deposit(uint256 amount, address receiver) external payable whenNotPaused nonReentrant { _deposit(amount, receiver); } function _deposit(uint256 amount, address receiver) private { if (amount == 0) { return; } lendingManager.accureInterest(); uint256 shares = _shares(amount, getPricePerFullShare()); require(shares > 0, "!shares"); uint256 sharesBefore = balanceOf(receiver) + stakedShares(receiver); uint256 costBefore = costSharePrice[receiver]; uint256 costAfter = (sharesBefore * costBefore + amount * 1e18) / (sharesBefore + shares); costSharePrice[receiver] = costAfter; if (want == weth) { require(amount == msg.value, "WooSuperChargerVault: msg.value_INSUFFICIENT"); reserveVault.deposit{value: msg.value}(amount); } else { TransferHelper.safeTransferFrom(want, msg.sender, address(this), amount); TransferHelper.safeApprove(want, address(reserveVault), amount); reserveVault.deposit(amount); } _mint(receiver, shares); instantWithdrawCap = instantWithdrawCap + amount / 10; emit Deposit(msg.sender, receiver, amount, shares); } function instantWithdraw(uint256 amount) external whenNotPaused nonReentrant { _instantWithdrawShares(_sharesUpLatest(amount), msg.sender); } function instantWithdrawAll() external whenNotPaused nonReentrant { _instantWithdrawShares(balanceOf(msg.sender), msg.sender); } function _instantWithdrawShares(uint256 shares, address owner) private { require(shares > 0, "WooSuperChargerVault: !amount"); require(!isSettling, "WooSuperChargerVault: NOT_ALLOWED_IN_SETTLING"); if (instantWithdrawnAmount >= instantWithdrawCap) { // NOTE: no more instant withdraw quota. return; } lendingManager.accureInterest(); uint256 amount = _assets(shares); require(amount <= instantWithdrawCap - instantWithdrawnAmount, "WooSuperChargerVault: OUT_OF_CAP"); if (msg.sender != owner) { _spendAllowance(owner, msg.sender, shares); } _burn(owner, shares); uint256 reserveShares = _sharesUp(amount, reserveVault.getPricePerFullShare()); reserveVault.withdraw(reserveShares); uint256 fee = accessManager.isZeroFeeVault(msg.sender) ? 0 : (amount * instantWithdrawFeeRate) / 10000; if (want == weth) { TransferHelper.safeTransferETH(treasury, fee); TransferHelper.safeTransferETH(owner, amount - fee); } else { TransferHelper.safeTransfer(want, treasury, fee); TransferHelper.safeTransfer(want, owner, amount - fee); } instantWithdrawnAmount = instantWithdrawnAmount + amount; emit InstantWithdraw(owner, amount, reserveShares, fee); } function migrateToNewVault() external whenNotPaused nonReentrant { _migrateToNewVault(msg.sender); } function _migrateToNewVault(address owner) private { require(owner != address(0), "WooSuperChargerVault: !owner"); require(migrationVault != address(0), "WooSuperChargerVault: !migrationVault"); WooSuperChargerVaultV2 newVault = WooSuperChargerVaultV2(payable(migrationVault)); require(newVault.want() == want, "WooSuperChargerVault: !WANT_newVault"); uint256 shares = balanceOf(owner); if (shares == 0) { return; } lendingManager.accureInterest(); uint256 amount = _assets(shares); if (msg.sender != owner) { _spendAllowance(owner, msg.sender, shares); } _burn(owner, shares); uint256 reserveShares = _sharesUp(amount, reserveVault.getPricePerFullShare()); reserveVault.withdraw(reserveShares); if (want == weth) { newVault.deposit{value: amount}(amount, owner); } else { TransferHelper.safeApprove(want, address(newVault), amount); newVault.deposit(amount, owner); } emit SuperChargerVaultMigrated(owner, address(this), address(newVault), amount); } function requestWithdraw(uint256 amount) external whenNotPaused nonReentrant { _requestWithdrawShares(_sharesUpLatest(amount)); } function requestWithdrawAll() external whenNotPaused nonReentrant { _requestWithdrawShares(balanceOf(msg.sender)); } function _requestWithdrawShares(uint256 shares) private { require(shares > 0, "WooSuperChargerVault: !amount"); require(!isSettling, "WooSuperChargerVault: CANNOT_WITHDRAW_IN_SETTLING"); require(requestUsers.length() <= maxWithdrawCount, "WooSuperChargerVault: MAX_WITHDRAW_COUNT"); address owner = msg.sender; lendingManager.accureInterest(); uint256 amount = _assets(shares); TransferHelper.safeTransferFrom(address(this), owner, address(this), shares); requestedWithdrawShares[owner] = requestedWithdrawShares[owner] + shares; requestedTotalShares = requestedTotalShares + shares; requestUsers.add(owner); emit RequestWithdraw(owner, amount, shares); } function requestedTotalAmount() public view returns (uint256) { return _assets(requestedTotalShares); } function totalRequestedUserNumber() external view returns (uint256 totalNumber) { return requestUsers.length(); } function requestedWithdrawAmount(address user) public view returns (uint256) { return _assets(requestedWithdrawShares[user]); } function available() public view returns (uint256) { return IERC20(want).balanceOf(address(this)); } function reserveBalance() public view returns (uint256) { return _assets(IERC20(address(reserveVault)).balanceOf(address(this)), reserveVault.getPricePerFullShare()); } function lendingBalance() public view returns (uint256) { return lendingManager.debtAfterPerfFee(); } // Returns the total balance (assets), which is avaiable + reserve + lending. function balance() public view returns (uint256) { return available() + reserveBalance() + lendingBalance(); } function getPricePerFullShare() public view returns (uint256) { return totalSupply() == 0 ? 1e18 : (balance() * 1e18) / totalSupply(); } // --- For WooLendingManager --- // function maxBorrowableAmount() public view returns (uint256) { uint256 resBal = reserveBalance(); uint256 instWithdrawBal = instantWithdrawCap - instantWithdrawnAmount; return resBal > instWithdrawBal ? resBal - instWithdrawBal : 0; } function borrowFromLendingManager(uint256 amount, address fundAddr) external onlyLendingManager { require(!isSettling, "IN SETTLING"); require(amount <= maxBorrowableAmount(), "INSUFF_AMOUNT_FOR_BORROW"); uint256 sharesToWithdraw = _sharesUp(amount, reserveVault.getPricePerFullShare()); reserveVault.withdraw(sharesToWithdraw); if (want == weth) { IWETH(weth).deposit{value: amount}(); } TransferHelper.safeTransfer(want, fundAddr, amount); } function repayFromLendingManager(uint256 amount) external onlyLendingManager { TransferHelper.safeTransferFrom(want, msg.sender, address(this), amount); if (want == weth) { IWETH(weth).withdraw(amount); reserveVault.deposit{value: amount}(amount); } else { TransferHelper.safeApprove(want, address(reserveVault), amount); reserveVault.deposit(amount); } } // --- Admin operations --- // /* NOTE: this method is for fund rescue in emergency. */ function setIsSettling(bool _isSettling) external onlyOwner { isSettling = _isSettling; } function weeklyNeededAmountForWithdraw() public view returns (uint256) { uint256 reserveBal = reserveBalance(); uint256 requestedAmount = requestedTotalAmount(); uint256 afterBal = balance() - requestedAmount; return reserveBal >= requestedAmount + afterBal / 10 ? 0 : requestedAmount + afterBal / 10 - reserveBal; } function startWeeklySettle() external onlyAdmin { require(!isSettling, "IN_SETTLING"); isSettling = true; lendingManager.accureInterest(); emit WeeklySettleStarted(msg.sender, requestedTotalShares, weeklyNeededAmountForWithdraw()); } function endWeeklySettle() public onlyAdmin { require(isSettling, "!SETTLING"); require(weeklyNeededAmountForWithdraw() == 0, "WEEKLY_REPAY_NOT_CLEARED"); // NOTE: Do need accureInterest here, since it's already been updated in `startWeeklySettle` uint256 sharePrice = getPricePerFullShare(); isSettling = false; uint256 totalWithdrawAmount = requestedTotalAmount(); if (totalWithdrawAmount != 0) { uint256 shares = _sharesUp(totalWithdrawAmount, reserveVault.getPricePerFullShare()); reserveVault.withdraw(shares); if (want == weth) { IWETH(weth).deposit{value: totalWithdrawAmount}(); } require(available() >= totalWithdrawAmount); uint256 length = requestUsers.length(); for (uint256 i = 0; i < length; i++) { address user = requestUsers.at(0); withdrawManager.addWithdrawAmount(user, (requestedWithdrawShares[user] * sharePrice) / 1e18); requestedWithdrawShares[user] = 0; requestUsers.remove(user); } _burn(address(this), requestedTotalShares); requestedTotalShares = 0; TransferHelper.safeTransfer(want, address(withdrawManager), totalWithdrawAmount); } instantWithdrawnAmount = 0; lendingManager.accureInterest(); uint256 totalBalance = balance(); instantWithdrawCap = totalBalance / 10; emit WeeklySettleEnded(msg.sender, totalBalance, lendingBalance(), reserveBalance()); } function batchEndWeeklySettle(uint256 _length) public onlyAdmin { require(isSettling, "!SETTLING"); // require(weeklyNeededAmountForWithdraw() == 0, "WEEKLY_REPAY_NOT_CLEARED"); uint256 sharePrice = getPricePerFullShare(); uint256 _batchWithdrawAmount = 0; uint256 _batchRequestedShares = 0; require(_length <= requestUsers.length(), "!batch_length"); for (uint256 i = 0; i < _length; i++) { address user = requestUsers.at(0); uint256 _amount = (requestedWithdrawShares[user] * sharePrice) / 1e18; _batchWithdrawAmount += _amount; _batchRequestedShares += requestedWithdrawShares[user]; withdrawManager.addWithdrawAmount(user, _amount); // NOTE: accounting only, no fund transfering. requestedWithdrawShares[user] = 0; requestUsers.remove(user); } uint256 shares = _sharesUp(_batchWithdrawAmount, reserveVault.getPricePerFullShare()); reserveVault.withdraw(shares); if (want == weth) { IWETH(weth).deposit{value: _batchWithdrawAmount}(); // WETH for withdraw manager } require(available() >= _batchWithdrawAmount, "!available_amount_for_withdraw"); _burn(address(this), _batchRequestedShares); requestedTotalShares -= _batchRequestedShares; TransferHelper.safeTransfer(want, address(withdrawManager), _batchWithdrawAmount); if (requestUsers.length() == 0) { // NOTE: all settling finished isSettling == false; instantWithdrawnAmount = 0; lendingManager.accureInterest(); uint256 totalBalance = balance(); instantWithdrawCap = totalBalance / 10; emit WeeklySettleEnded(msg.sender, totalBalance, lendingBalance(), reserveBalance()); } } function migrateReserveVault(address _vault) external onlyOwner { require(_vault != address(0), "!_vault"); uint256 preBal = (want == weth) ? address(this).balance : available(); reserveVault.withdraw(IERC20(address(reserveVault)).balanceOf(address(this))); uint256 afterBal = (want == weth) ? address(this).balance : available(); uint256 reserveAmount = afterBal - preBal; address oldVault = address(reserveVault); reserveVault = IVaultV2(_vault); require(reserveVault.want() == want, "INVALID_WANT"); if (want == weth) { reserveVault.deposit{value: reserveAmount}(reserveAmount); } else { TransferHelper.safeApprove(want, address(reserveVault), reserveAmount); reserveVault.deposit(reserveAmount); } emit ReserveVaultMigrated(msg.sender, oldVault, _vault); } 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); } } function setLendingManager(address _lendingManager) external onlyOwner { address formerManager = address(lendingManager); lendingManager = WooLendingManager(_lendingManager); emit LendingManagerUpdated(formerManager, _lendingManager); } function setWithdrawManager(address payable _withdrawManager) external onlyOwner { address formerManager = address(withdrawManager); withdrawManager = WooWithdrawManagerV2(_withdrawManager); emit WithdrawManagerUpdated(formerManager, _withdrawManager); } function setTreasury(address _treasury) external onlyOwner { treasury = _treasury; } function setMaxWithdrawCount(uint256 _maxWithdrawCount) external onlyOwner { maxWithdrawCount = _maxWithdrawCount; } function setInstantWithdrawFeeRate(uint256 _feeRate) external onlyOwner { uint256 formerFeeRate = instantWithdrawFeeRate; instantWithdrawFeeRate = _feeRate; emit InstantWithdrawFeeRateUpdated(formerFeeRate, _feeRate); } function setInstantWithdrawCap(uint256 _instantWithdrawCap) external onlyOwner { instantWithdrawCap = _instantWithdrawCap; } function setMigrationVault(address _vault) external onlyOwner { migrationVault = _vault; WooSuperChargerVaultV2 newVault = WooSuperChargerVaultV2(payable(_vault)); require(newVault.want() == want, "WooSuperChargerVault: !WANT_vault"); } function pause() public onlyAdmin { _pause(); } function unpause() external onlyAdmin { _unpause(); } receive() external payable {} function _assets(uint256 shares) private view returns (uint256) { return _assets(shares, getPricePerFullShare()); } function _assets(uint256 shares, uint256 sharePrice) private pure returns (uint256) { return (shares * sharePrice) / 1e18; } function _shares(uint256 assets, uint256 sharePrice) private pure returns (uint256) { return (assets * 1e18) / sharePrice; } function _sharesUpLatest(uint256 assets) private returns (uint256) { lendingManager.accureInterest(); return _sharesUp(assets, getPricePerFullShare()); } function _sharesUp(uint256 assets, uint256 sharePrice) private pure returns (uint256) { uint256 shares = (assets * 1e18) / sharePrice; return _assets(shares, sharePrice) == assets ? shares : shares + 1; } }
// 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. */ interface IStrategy { function vault() external view returns (address); function want() external view returns (address); function beforeDeposit() external; function beforeWithdraw() external; function deposit() external; function withdraw(uint256) external; function balanceOf() external view returns (uint256); function balanceOfWant() external view returns (uint256); function balanceOfPool() external view returns (uint256); function harvest() external; function retireStrat() external; function emergencyExit() external; function paused() external view returns (bool); function inCaseTokensGetStuck(address stuckToken) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// @title Wrapped ETH. interface IWETH { /// @dev Deposit ETH into WETH function deposit() external payable; /// @dev Transfer WETH to receiver /// @param to address of WETH receiver /// @param value amount of WETH to transfer /// @return get true when succeed, else false function transfer(address to, uint256 value) external returns (bool); /// @dev Withdraw WETH to ETH function withdraw(uint256) 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 Reward manager interface for WooFi Swap. /// @notice this is for swap rebate or potential incentive program interface IWooAccessManager { /* ----- Events ----- */ event FeeAdminUpdated(address indexed feeAdmin, bool flag); event VaultAdminUpdated(address indexed vaultAdmin, bool flag); event RebateAdminUpdated(address indexed rebateAdmin, bool flag); event ZeroFeeVaultUpdated(address indexed vault, bool flag); /* ----- External Functions ----- */ function isFeeAdmin(address feeAdmin) external returns (bool); function isVaultAdmin(address vaultAdmin) external returns (bool); function isRebateAdmin(address rebateAdmin) external returns (bool); function isZeroFeeVault(address vault) external returns (bool); /* ----- Admin Functions ----- */ /// @notice Sets feeAdmin function setFeeAdmin(address feeAdmin, bool flag) external; /// @notice Sets vaultAdmin function setVaultAdmin(address vaultAdmin, bool flag) external; /// @notice Sets rebateAdmin function setRebateAdmin(address rebateAdmin, bool flag) external; /// @notice Sets zeroFeeVault function setZeroFeeVault(address vault, bool flag) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.14; interface IVaultV2 { function want() external view returns (address); function weth() external view returns (address); function deposit(uint256 amount) external payable; function withdraw(uint256 shares) external; function earn() external; function available() external view returns (uint256); function balance() external view returns (uint256); function getPricePerFullShare() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.14; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./IRewarder.sol"; interface IMasterChefWoo { event PoolAdded(uint256 poolId, uint256 allocPoint, IERC20 weToken, IRewarder rewarder); event PoolSet(uint256 poolId, uint256 allocPoint, IRewarder rewarder); event PoolUpdated(uint256 poolId, uint256 lastRewardBlock, uint256 supply, uint256 accTokenPerShare); event XWooPerBlockUpdated(uint256 xWooPerBlock); event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); struct UserInfo { uint256 amount; uint256 rewardDebt; } struct PoolInfo { IERC20 weToken; uint256 allocPoint; uint256 lastRewardBlock; uint256 accTokenPerShare; IRewarder rewarder; } // System-level function function setXWooPerBlock(uint256 _xWooPerBlock) external; // Pool-related functions function poolLength() external view returns (uint256); function add( uint256 allocPoint, IERC20 weToken, IRewarder rewarder ) external; function set( uint256 pid, uint256 allocPoint, IRewarder rewarder ) external; function massUpdatePools() external; function updatePool(uint256 pid) external; // User-related functions function pendingXWoo(uint256 pid, address user) external view returns (uint256, uint256); function deposit(uint256 pid, uint256 amount) external; function withdraw(uint256 pid, uint256 amount) external; function harvest(uint256 pid) external; function emergencyWithdraw(uint256 pid) external; function userInfo(uint256 pid, address user) external view returns (uint256 amount, uint256 rewardDebt); function poolInfo(uint256 pid) external view returns ( IERC20 weToken, uint256 allocPoint, uint256 lastRewardBlock, uint256 accTokenPerShare, IRewarder rewarder ); }
// 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/IWETH.sol"; import "../interfaces/IWooAccessManager.sol"; import "../libraries/TransferHelper.sol"; 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 {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; contract WooWithdrawManagerV2 is Ownable, ReentrancyGuard { // addedAmount: added withdrawal amount for this user // totalAmount: total withdrawal amount for this user event WithdrawAdded(address indexed user, uint256 addedAmount, uint256 totalAmount); event Withdraw(address indexed user, uint256 amount); address public want; address public weth; address public accessManager; address public superChargerVault; mapping(address => uint256) public withdrawAmount; address constant ETH_PLACEHOLDER_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; constructor() {} function init( address _weth, address _want, address _accessManager, address _superChargerVault ) external onlyOwner { weth = _weth; want = _want; accessManager = _accessManager; superChargerVault = _superChargerVault; } modifier onlyAdmin() { require( owner() == msg.sender || IWooAccessManager(accessManager).isVaultAdmin(msg.sender), "WooWithdrawManager: !owner" ); _; } modifier onlySuperChargerVault() { require(superChargerVault == msg.sender, "WooWithdrawManager: !superChargerVault"); _; } function setSuperChargerVault(address _superChargerVault) external onlyAdmin { superChargerVault = _superChargerVault; } function addWithdrawAmount(address user, uint256 amount) external onlySuperChargerVault { // NOTE: in V2, granular token transfer is avoided to save the gas consumption; // Do remember batch transfer the total amount of `want` tokens after calling this method. // TransferHelper.safeTransferFrom(want, msg.sender, address(this), amount); withdrawAmount[user] = withdrawAmount[user] + amount; emit WithdrawAdded(user, amount, withdrawAmount[user]); } function withdraw() external nonReentrant { uint256 amount = withdrawAmount[msg.sender]; if (amount == 0) { return; } withdrawAmount[msg.sender] = 0; if (want == weth) { IWETH(weth).withdraw(amount); TransferHelper.safeTransferETH(msg.sender, amount); } else { TransferHelper.safeTransfer(want, msg.sender, amount); } emit Withdraw(msg.sender, amount); } function inCaseTokenGotStuck(address stuckToken) external onlyOwner { require(stuckToken != want); 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); } } receive() external payable {} }
// 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 "./WooSuperChargerVaultV2.sol"; import "../interfaces/IWETH.sol"; import "../interfaces/IWooAccessManager.sol"; import "../interfaces/IWooPPV2.sol"; import "../libraries/TransferHelper.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {IERC20, SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; contract WooLendingManager is Ownable, ReentrancyGuard { event Borrow(address indexed user, uint256 assets); event Repay(address indexed user, uint256 assets, uint256 perfFee); event InterestRateUpdated(address indexed user, uint256 oldInterest, uint256 newInterest); address public weth; address public want; address public accessManager; address public wooPP; WooSuperChargerVaultV2 public superChargerVault; uint256 public borrowedPrincipal; uint256 public borrowedInterest; uint256 public perfRate = 1000; // 1 in 10000th. 1000 = 10% address public treasury; uint256 public interestRate; // 1 in 10000th. 1 = 0.01% (1 bp), 10 = 0.1% (10 bps) uint256 public lastAccuredTs; // Timestamp of last accured interests mapping(address => bool) public isBorrower; address constant ETH_PLACEHOLDER_ADDR = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; constructor() {} function init( address _weth, address _want, address _accessManager, address _wooPP, address payable _superChargerVault ) external onlyOwner { weth = _weth; want = _want; accessManager = _accessManager; wooPP = _wooPP; superChargerVault = WooSuperChargerVaultV2(_superChargerVault); lastAccuredTs = block.timestamp; treasury = 0x4094D7A17a387795838c7aba4687387B0d32BCf3; } modifier onlyAdmin() { require( owner() == msg.sender || IWooAccessManager(accessManager).isVaultAdmin(msg.sender), "WooLendingManager: !ADMIN" ); _; } modifier onlyBorrower() { require(isBorrower[msg.sender] || msg.sender == wooPP, "WooLendingManager: !borrower"); _; } modifier onlySuperChargerVault() { require(msg.sender == address(superChargerVault), "WooLendingManager: !superChargerVault"); _; } function setSuperChargerVault(address payable _wooSuperCharger) external onlyOwner { superChargerVault = WooSuperChargerVaultV2(_wooSuperCharger); } function setWooPP(address _wooPP) external onlyOwner { wooPP = _wooPP; } function setBorrower(address _borrower, bool _isBorrower) external onlyOwner { isBorrower[_borrower] = _isBorrower; } function setPerfRate(uint256 _rate) external onlyAdmin { require(_rate < 10000); perfRate = _rate; } function debt() public view returns (uint256 assets) { return borrowedPrincipal + borrowedInterest; } function debtAfterPerfFee() public view returns (uint256 assets) { return debt(); } function borrowState() external view returns ( uint256 total, uint256 principal, uint256 interest, uint256 borrowable ) { total = debt(); principal = borrowedPrincipal; interest = borrowedInterest; borrowable = superChargerVault.maxBorrowableAmount(); } function accureInterest() public { uint256 currentTs = block.timestamp; // CAUTION: block.timestamp may be out of order if (currentTs <= lastAccuredTs) { return; } uint256 duration = currentTs - lastAccuredTs; // interestRate is in 10000th. // 31536000 = 365 * 24 * 3600 (1 year of seconds) uint256 interest = (borrowedPrincipal * interestRate * duration) / 31536000 / 10000; borrowedInterest = borrowedInterest + interest; lastAccuredTs = currentTs; } function setInterestRate(uint256 _rate) external onlyAdmin { require(_rate <= 50000, "RATE_INVALID"); // NOTE: rate < 500% accureInterest(); uint256 oldInterest = interestRate; interestRate = _rate; emit InterestRateUpdated(msg.sender, oldInterest, _rate); } function setTreasury(address _treasury) external onlyAdmin { require(_treasury != address(0), "WooLendingManager: !_treasury"); treasury = _treasury; } function maxBorrowableAmount() external view returns (uint256) { return superChargerVault.maxBorrowableAmount(); } /// @dev Borrow the fund from super charger and then deposit directly into WooPP. /// @param amount the borrowing amount function borrow(uint256 amount) external onlyBorrower { require(amount > 0, "!AMOUNT"); accureInterest(); borrowedPrincipal = borrowedPrincipal + amount; uint256 preBalance = IERC20(want).balanceOf(address(this)); superChargerVault.borrowFromLendingManager(amount, address(this)); uint256 afterBalance = IERC20(want).balanceOf(address(this)); require(afterBalance - preBalance == amount, "WooLendingManager: BORROW_AMOUNT_ERROR"); TransferHelper.safeApprove(want, wooPP, amount); IWooPPV2(wooPP).deposit(want, amount); emit Borrow(msg.sender, amount); } // NOTE: this is the view function; // Remember to call the accureInterest to ensure the latest repayment state. function weeklyRepayment() public view returns (uint256 repayAmount) { (repayAmount, , , ) = weeklyRepaymentBreakdown(); } function weeklyRepaymentBreakdown() public view returns ( uint256 repayAmount, uint256 principal, uint256 interest, uint256 perfFee ) { uint256 neededAmount = superChargerVault.weeklyNeededAmountForWithdraw(); if (neededAmount == 0) { return (0, 0, 0, 0); } if (neededAmount <= borrowedInterest) { interest = neededAmount; principal = 0; } else { interest = borrowedInterest; principal = neededAmount - borrowedInterest; } perfFee = (interest * perfRate) / 10000; repayAmount = principal + interest + perfFee; } function repayWeekly() external onlyBorrower returns (uint256 repaidAmount) { accureInterest(); uint256 _principal; uint256 _interest; (, _principal, _interest, ) = weeklyRepaymentBreakdown(); return _repay(_principal, _interest); } function repayAll() external onlyBorrower returns (uint256 repaidAmount) { accureInterest(); return _repay(borrowedPrincipal, borrowedInterest); } // NOTE: repay the specified principal amount with all the borrowed interest function repayPrincipal(uint256 _principal) external onlyBorrower returns (uint256 repaidAmount) { accureInterest(); return _repay(_principal, borrowedInterest); } function _repay(uint256 _principal, uint256 _interest) private returns (uint256 repaidAmount) { if (_principal == 0 && _interest == 0) { emit Repay(msg.sender, 0, 0); return 0; } uint256 _perfFee = (_interest * perfRate) / 10000; uint256 _totalAmount = _principal + _interest + _perfFee; TransferHelper.safeTransferFrom(want, msg.sender, address(this), _totalAmount); borrowedInterest -= _interest; borrowedPrincipal -= _principal; TransferHelper.safeTransfer(want, treasury, _perfFee); TransferHelper.safeApprove(want, address(superChargerVault), _principal + _interest); superChargerVault.repayFromLendingManager(_principal + _interest); emit Repay(msg.sender, _totalAmount, _perfFee); return _totalAmount; } 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); } } }
// 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"); } }
// 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.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 (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) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer(address from, address to, uint256 amount) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 amount) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {} }
// 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 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) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// 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 pragma solidity 0.8.14; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IRewarder { event OnRewarded(address indexed user, uint256 amount); event RewardRateUpdated(uint256 oldRate, uint256 newRate); struct UserInfo { uint256 amount; uint256 rewardDebt; uint256 unpaidRewards; } struct PoolInfo { uint256 accTokenPerShare; uint256 lastRewardBlock; } function onRewarded(address user, uint256 amount) external; function pendingTokens(address user) external view returns (uint256); }
// 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 // 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: 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) (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); } } }
{ "viaIR": false, "remappings": [ "@ensdomains/=node_modules/@ensdomains/", "@layerzerolabs/=node_modules/@layerzerolabs/", "@openzeppelin-3/=node_modules/@openzeppelin-3/", "@openzeppelin/=node_modules/@openzeppelin/", "@uniswap/=node_modules/@uniswap/", "base64-sol/=node_modules/base64-sol/", "ds-test/=lib/forge-std/lib/ds-test/src/", "erc721a/=node_modules/erc721a/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "hardhat-deploy/=node_modules/hardhat-deploy/", "hardhat/=node_modules/hardhat/" ], "evmVersion": "london", "outputSelection": { "*": { "*": [ "abi" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "detectMissingLibraries": false, "enableEraVMExtensions": false, "forceEVMLA": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_want","type":"address"},{"internalType":"address","name":"_accessManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees","type":"uint256"}],"name":"InstantWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"formerFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFeeRate","type":"uint256"}],"name":"InstantWithdrawFeeRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"formerLendingManager","type":"address"},{"indexed":false,"internalType":"address","name":"newLendingManager","type":"address"}],"name":"LendingManagerUpdated","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"RequestWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"oldVault","type":"address"},{"indexed":true,"internalType":"address","name":"newVault","type":"address"}],"name":"ReserveVaultMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"oldVault","type":"address"},{"indexed":true,"internalType":"address","name":"newVault","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SuperChargerVaultMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","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":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lendingBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveBalance","type":"uint256"}],"name":"WeeklySettleEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalRequestedShares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weeklyRepayAmount","type":"uint256"}],"name":"WeeklySettleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"formerWithdrawManager","type":"address"},{"indexed":false,"internalType":"address","name":"newWithdrawManager","type":"address"}],"name":"WithdrawManagerUpdated","type":"event"},{"inputs":[],"name":"accessManager","outputs":[{"internalType":"contract IWooAccessManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"available","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_length","type":"uint256"}],"name":"batchEndWeeklySettle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"fundAddr","type":"address"}],"name":"borrowFromLendingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"costSharePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endWeeklySettle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stuckToken","type":"address"}],"name":"inCaseTokenGotStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_reserveVault","type":"address"},{"internalType":"address","name":"_lendingManager","type":"address"},{"internalType":"address payable","name":"_withdrawManager","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"instantWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"instantWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"instantWithdrawCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"instantWithdrawFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"instantWithdrawnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSettling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lendingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lendingManager","outputs":[{"internalType":"contract WooLendingManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterChef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBorrowableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWithdrawCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"migrateReserveVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateToNewVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repayFromLendingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestWithdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestedTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestedTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"requestedWithdrawAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"requestedWithdrawShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveVault","outputs":[{"internalType":"contract IVaultV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_instantWithdrawCap","type":"uint256"}],"name":"setInstantWithdrawCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeRate","type":"uint256"}],"name":"setInstantWithdrawFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSettling","type":"bool"}],"name":"setIsSettling","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lendingManager","type":"address"}],"name":"setLendingManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_masterChef","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"setMasterChef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWithdrawCount","type":"uint256"}],"name":"setMaxWithdrawCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setMigrationVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawManager","type":"address"}],"name":"setWithdrawManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"stakedShares","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startWeeklySettle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRequestedUserNumber","outputs":[{"internalType":"uint256","name":"totalNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weeklyNeededAmountForWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawManager","outputs":[{"internalType":"contract WooWithdrawManagerV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010009a5016ca2ebe9d78d05500de76523b31a0e74e67e5891a67f1e504566c9000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a910000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d400000000000000000000000035a62c09427be1bae622d4492b851338969721b5
Deployed Bytecode
0x0004000000000002000300000000000200000000030100190000006003300270000008ce0430019700030000004103550002000000010355000008ce0030019d000100000000001f00000001012001900000000c0000c13d233301120000040f000000e001000039000000400010043f0000000001000416000000000110004c000000480000c13d0000000001000031000000ff02100039000000200300008a000000000232016f000008cf03200041000008d00330009c0000001f0000213d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000000400020043f0000001f0210018f000000020300036700000005041002720000002d0000613d00000000050000190000000506500210000000000763034f000000000707043b000000e00660003900000000007604350000000105500039000000000645004b000000250000413d000000000520004c0000003c0000613d0000000504400210000000000343034f0000000302200210000000e004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000008d102000041000000600310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c0000004b0000613d00000000010000190000000002000019233301090000040f000000e0010000392333100c0000040f000200000001001d0000010001000039000300000001001d2333100c0000040f000100000001001d00000120010000392333100c0000040f000000000301001900000002010000290000000102000029233310700000040f000000800100043d000001400000044300000160001004430000002001000039000000a00200043d0000018000100443000001a0002004430000004002000039000000c00300043d000001c000200443000001e000300443000001000010044300000003010000390000012000100443000008d20300004100000003010000290000000002010019233300ff0000040f0002000000000002000200000006001d000100000005001d000008ce05000041000008ce0630009c00000000030580190000004003300210000008ce0640009c00000000040580190000006004400210000000000334019f000008ce0410009c0000000001058019000000c001100210000000000113019f233323290000040f000000010900002900000000030100190000006003300270000008ce033001970000000205000029000000000453004b00000000050340190000001f0450018f00000005055002720000008d0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000000850000413d000000010220018f000000000640004c0000009d0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d000008ce05000041000008ce0630009c00000000030580190000004003300210000008ce0640009c00000000040580190000006004400210000000000334019f000008ce0410009c0000000001058019000000c001100210000000000113019f2333232e0000040f000000010900002900000000030100190000006003300270000008ce033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000c40000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000000bc0000413d000000010220018f000000000640004c000000d40000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d000008ce03000041000008ce0410009c000000000103801900000040011002100000006002200210000000000112019f0000000002000414000008ce0420009c0000000002038019000000c0022002100000000001210019000008d40110004100008010020000392333232e0000040f0000000102200190000000ea0000613d000000000101043b000000000001042d00000000010000190000000002000019233301090000040f0000000003010019000008ce010000410000000004000414000008ce0540009c0000000001044019000000c00110021000000060022002100000000001120019000008d50110004100000000020300192333232e0000040f0000000102200190000000fc0000613d000000000101043b000000000001042d00000000010000190000000002000019233301090000040f000008ce04000041000008ce0510009c000000000104801900000040011002100000000001310019000008ce0320009c000000000204801900000060022002100000000001210019000023340001042e000008ce03000041000008ce0420009c0000000002038019000008ce0410009c000000000103801900000040011002100000006002200210000000000112019f0000233500010430000b0000000000020000008001000039000000400010043f0000000002000031000000040120008c000001ca0000413d0000000206000367000000000106043b000000e001100270000008d60310009c000001d00000613d000008d70310009c000002030000613d000008d80310009c0000000005000412000002260000613d000008d90310009c000002480000613d000008da0310009c000002660000613d000008db0310009c0000029a0000613d000008dc0310009c000002b20000613d000008dd0310009c000002e90000613d000008de0310009c000003090000613d000008df0310009c000003360000613d000008e00310009c0000036f0000613d000008e10310009c000003860000613d000008e20310009c000003a80000613d000008e30310009c000003d80000613d000008e40310009c000004070000613d000008e50310009c000004260000613d000008e60310009c0000000004000410000004480000613d000008e70310009c000004730000613d000008e80310009c0000048b0000613d000008e90310009c000004df0000613d000008ea0310009c000004f70000613d000008eb0310009c0000050f0000613d000008ec0310009c000005280000613d000008ed0310009c000005430000613d000008ee0310009c0000056d0000613d000008ef0310009c000005870000613d000008f00310009c000005ab0000613d000008f10310009c000005d50000613d000008f20310009c000005ed0000613d000008f30310009c000006050000613d000008f40310009c000006200000613d000008f50310009c000006400000613d000008f60310009c000006630000613d000008f70310009c000006910000613d000008f80310009c000006b00000613d000008f90310009c000006d50000613d000008fa0310009c000006ed0000613d000008fb0310009c000007110000613d000008fc0310009c0000072c0000613d000008fd0310009c000007450000613d000008fe0310009c000007640000613d000008ff0310009c0000077c0000613d000009000310009c000007940000613d000009010310009c000007b80000613d000009020310009c000007d10000613d000009030310009c000007f00000613d000009040310009c000008150000613d000009050310009c000008300000613d000009060310009c0000084c0000613d000009070310009c000008650000613d000009080310009c0000087d0000613d000009090310009c000008bc0000613d0000090a0310009c000008df0000613d0000090b0310009c0000095c0000613d0000090c0310009c0000097e0000613d0000090d0210009c0000099a0000613d0000090e0210009c000009ce0000613d0000090f0210009c000009e60000613d000009100210009c000009ff0000613d000009110210009c00000a1d0000613d000009120210009c00000a350000613d000009130210009c00000a610000613d000009140210009c00000a790000613d000009150210009c00000aa30000613d000009160210009c00000abc0000613d000009170210009c00000adf0000613d000009180210009c00000af70000613d000009190210009c00000b230000613d0000091a0210009c00000b420000613d0000091b0110009c00000e5f0000c13d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d000000400100043d000b00000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000091d021001970000000b01000029000000000021043500000020020000390000000003000019233300ff0000040f000000000120004c00000e5f0000c13d000000000100001900000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000304000039000000000304041a000000010530019000000001013002700000007f0210018f000000000701001900000000070260190000001f0270008c00000000020000190000000102002039000000010220018f000000000225004b0000080e0000c13d000000400100043d00000000007104350000002002100039000000000550004c00000cb20000c13d000001000400008a000000000343016f000000000032043500000020030000390000002002300039000b00000001001d233312af0000040f000000400100043d000a00000001001d0000000b020000292333126d0000040f0000000a03000029000000000231004900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000201000367000a0000000103530000000401100370000000000101043b000b00000001001d233312850000040f0000000a0100035f0000002401100370000000000301043b00000000010004110000000b02000029233313420000040f0000000102000039000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000001010000390000000502000039000000000202041a0000091d022001970000000003000411000b00000003001d000000000232004b00000b620000c13d23331c710000040f00000004010000390000000201100367000000000101043b23331f1f0000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000b01000029233313d70000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d0000091d0110009c00000e5f0000213d2333129b0000040f0000000a01000039000000000201041a00000920032001970000000b04000029000000000343019f000000000031041b000000400100043d000000200310003900000000004304350000091d022001970000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f0000092b011001c70000800d0200003900000001030000390000094704000041233323290000040f000000010120019000000e5f0000613d00000a9f0000013d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000201000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000600310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000002010003670000000402100370000000000202043b000b00000002001d0000091d0220009c00000e5f0000213d0000002402100370000000000202043b000a00000002001d0000091d0220009c00000e5f0000213d0000004401100370000000000101043b000800000001001d0000091d0110009c00000e5f0000213d000900000005001d2333129b0000040f0000000b01000029000000000110004c00000e620000c13d000000400100043d000000640210003900000945030000410000000000320435000000440210003900000946030000410000000000320435000000240210003900000024030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d000000400100043d000b00000001001d0000091c0100004100000000001004390000000400500443000000240000044300008005010000390000004402000039233300ed0000040f0000091d021001970000000b01000029000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000600310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000201000367000a0000000103530000000401100370000000000101043b000b00000001001d233312850000040f0000000a0100035f0000002401100370000000000101043b000900000001001d233312850000040f0000000a0100035f0000004401100370000000000301043b000a00000003001d00000000020004110000000b01000029233313930000040f0000000b0100002900000009020000290000000a03000029233312d00000040f0000000102000039000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000002010003670000000402100370000000000202043b000b00000002001d0000002401100370000000000101043b000a00000001001d0000091d0110009c00000e5f0000213d000900000005001d0000000901000039000000000101041a0000091d011001970000000002000411000000000112004b0000000001000019000000010100603923331c230000040f0000001201000039000000000101041a000000ff0110019000000cbd0000c13d23331c0d0000040f0000000b02000029000000000112004b00000d890000a13d000000400100043d000000440210003900000940030000410000000000320435000000240210003900000018030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d000000400100043d0000001202000039000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f00000000010004110000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000101041a233319a60000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000001000411000900000001001d00000000001004350000000101000039000a00000001001d000000200010043f00000040020000390000000001000019233300d80000040f0000000b020000292333128b0000040f00000024020000390000000202200367000000000202043b000000000101041a233312c30000040f000000000301001900000009010000290000000b02000029233313420000040f000000400100043d0000000a02000029000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d2333129b0000040f0000001301000039000000000201041a0000000b04000029000000000041041b000000400100043d000000200310003900000000004304350000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f0000092b011001c70000800d0200003900000001030000390000093b04000041233323290000040f000000010120019000000a9f0000c13d00000e5f0000013d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000001010000390000000502000039000000000202041a0000091d022001970000000003000411000b00000003001d000000000232004b00000b980000c13d23331c710000040f233321180000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d000000400100043d000b00000001001d0000091c01000041000000000010043900000004005004430000002001000039000a00000001001d000000240010044300008005010000390000004402000039233300ed0000040f0000091d021001970000000b0100002900000000002104350000000a020000290000000003000019233300ff0000040f000b00000004001d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000a00000001001d0000091d0110009c00000e5f0000213d000900000005001d2333129b0000040f0000000a01000029000000000110004c00000ccb0000c13d000000400100043d00000044021000390000093a030000410000000000320435000000240210003900000007030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331aa00000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d0000091d0110009c00000e5f0000213d000900000005001d2333129b0000040f0000000801000039000000000201041a00000920032001970000000b02000029000000000323019f000000000031041b0000093701000041000000400300043d00000000001304350000000001000414000000040420008c000004b80000613d00000004040000390000002006000039000b00000003001d0000000b05000029233300a10000040f0000000b03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c000000090200002900000e5f0000413d0000000001030433000b00000001001d0000091d0110009c00000e5f0000213d0000091c0100004100000000001004390000000400200443000000240000044300008005010000390000004402000039233300ed0000040f0000000b02000029000000000121013f0000091d0110019800000000010000190000000101006039233320e70000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331c0d0000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331b7d0000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001501000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000501000039000000000101041a00000936011001980000000002000019000000010200c039000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000b010000290000091d0110019700000000001004350000000c01000039000000200010043f00000040020000390000000001000019233300d80000040f000000000101041a000b00000001001d23331be70000040f00000000020100190000000b01000029233314580000040f0000092a1210012a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001201000039000000000101041a00000008011002700000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000b010000290000091d0110019700000000001004350000000b01000039000000200010043f00000040020000390000000001000019233300d80000040f000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f000b00000004001d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000a00000001001d0000091d0110009c00000e5f0000213d2333129b0000040f0000000a03000029000000000130004c00000cf20000c13d000000400100043d00000044021000390000093503000041000000000032043500000024021000390000000c030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001101000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331c370000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d2333129b0000040f00000004010000390000000201100367000000000101043b0000001402000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f000000040120008a000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d000a0000000603530000002401600370000000000101043b000b00000001001d233312850000040f233314300000040f233314430000040f0000000a0100035f0000000401100370000000000101043b0000000b02000029233314670000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000b010000290000091d011001970000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d2333129b0000040f0000000501000039000000000201041a0000092003200197000000000031041b000000400500043d000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0450009c000b00000005001d00000000010540190000004001100210000000c003300210000000000113019f0000091d05200197000008d4011001c70000800d02000039000000030300003900000921040000410000000006000019233323290000040f000000010120019000000e5f0000613d0000000b0100002900000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f00000004010000390000000201100367000000000101043b233321430000040f233319a60000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312920000040f2333129b0000040f000001000100008a0000001202000039000000000302041a000000000113016f0000000b03000029000000000330004c0000000003000019000000010300c039000000000131019f000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331be70000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f0000000001000411000b00000001001d0000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000101041a0000000b02000029233316240000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d2333129b0000040f00000004010000390000000201100367000000000101043b0000001002000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000801000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000001010000390000000502000039000000000202041a0000091d022001970000000003000411000b00000003001d000000000232004b00000bce0000c13d23331c710000040f233320fb0000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000e01000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001001000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f0000000b010000290000091d0110019700000000001004350000000c01000039000000200010043f00000040020000390000000001000019233300d80000040f000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000501000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000001010000390000000502000039000000000202041a0000091d022001970000000003000411000b00000003001d000000000232004b00000c040000c13d23331c710000040f23331c820000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000404000039000000000304041a000000010530019000000001013002700000007f0210018f000000000701001900000000070260190000001f0270008c00000000020000190000000102002039000000000223013f000000010220019000000c3a0000613d000008d30100004100000000001004350000002201000039000000040010043f00000024020000390000000001000019233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001201000039000000000101041a000000ff011001900000000002000019000000010200c039000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f0000000001000411233317fe0000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000901000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331afc0000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000002010003670000000402100370000000000202043b000b00000002001d0000091d0220009c00000e5f0000213d0000002401100370000000000101043b000a00000001001d0000000001000411000700000001001d00000000001004350000000101000039000800000001001d000000200010043f0000004002000039000900000002001d0000000001000019233300d80000040f0000000b020000290000000000200435000000200010043f00000000010000190000000902000029233300d80000040f0000000a03000029000000000101041a000000000231004b00000d300000813d000000400100043d000000640210003900000931030000410000000000320435000000440210003900000932030000410000000000320435000000240210003900000025030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000201000367000a0000000103530000000401100370000000000101043b000b00000001001d233312850000040f0000000a0100035f0000002401100370000000000301043b00000000010004110000000b02000029233312d00000040f0000000102000039000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000901000039000000000101041a0000091d011001970000000002000411000a00000002001d000000000112004b0000000001000019000000010100603900000004020000390000000202200367000000000202043b000b00000002001d000900000005001d23331c230000040f0000091c01000041000800000001001d00000000001004390000000901000029000000040010044300000024000004430000800501000039000700000001001d0000004402000039000600000002001d233300ed0000040f000500000001001d00000000030004100000000a020000290000000b04000029233321ea0000040f00000008010000290000000000100439000000090100002900000004001004430000002001000039000000240010044300000007010000290000000602000029233300ed0000040f00000005040000290000091d024001970000091d03100197000000000132004b00000c4f0000c13d0000000b010000290000092d010000410000000000100439000a00000003001d000000040030044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400500043d0000092f010000410000000000150435000000040250003900000000010004140000000b0300002900000000003204350000000a02000029000000040320008c000009390000613d00000024040000390000000003050019000a00000005001d0000000a0500002900000000060000192333006a0000040f0000000a05000029000000000110004c00000e220000613d0000091f0150009c00000f120000213d000000400050043f0000000701000039000000000101041a0000092d0200004100000000002004390000091d01100197000900000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400500043d0000092e010000410000000000150435000000040250003900000000010004140000000b0300002900000000003204350000000902000029000000040220008c00000f100000613d000a00000005001d000000000230004c00000ef90000c13d000000240400003900000009020000290000000a03000029000000000503001900000000060000192333006a0000040f00000f0d0000013d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d23331aa00000040f000b00000001001d23331afc0000040f00000000020100190000000b01000029233312c30000040f000b00000001001d23331b7d0000040f00000000020100190000000b01000029233312c30000040f000000400300043d0000000000130435000000200200003900000000010300190000000003000019233300ff0000040f000a000000060353000000040120008a000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f0000000a0100035f0000000401100370000000000101043b0000000002000411233314670000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d0000091d0110009c00000e5f0000213d2333129b0000040f0000000901000039000000000201041a00000920032001970000000b04000029000000000343019f000000000031041b000000400100043d000000200310003900000000004304350000091d022001970000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f0000092b011001c70000800d0200003900000001030000390000092c04000041233323290000040f000000010120019000000a9f0000c13d00000e5f0000013d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001301000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000701000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000d01000039000000000101041a000b00000001001d23331be70000040f00000000020100190000000b01000029233314580000040f0000092a1210012a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001401000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000400310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000201000367000b0000000103530000000401100370000000000101043b000a00000001001d233312850000040f0000000b0100035f0000002401100370000000000101043b000b00000001001d233312850000040f0000000a010000290000091d0110019700000000001004350000000101000039000000200010043f00000040020000390000000001000019233300d80000040f0000000b020000292333128b0000040f000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000d01000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f000b00000004001d0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000a00000001001d0000091d0110009c00000e5f0000213d2333129b0000040f0000000a02000029000009270120009c00000d3a0000c13d000009290100004100000000001004390000000b0100002900000004001004430000800a010000390000002402000039233300ed0000040f00000000020100190000000001000411233322e60000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000000a01000039000000000101041a0000091d02100197000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d233312850000040f2333129b0000040f0000000b01000029000000080110021000000925011001970000001202000039000000000302041a0000092603300197000000000113019f000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d0000001601000039000000000201041a000000400100043d000000000021043500000020020000390000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000004010000390000000201100367000000000101043b000b00000001001d0000091d0110009c00000e5f0000213d2333129b0000040f0000000b06000029000000000160004c00000d620000c13d000000400100043d000000640210003900000922030000410000000000320435000000440210003900000923030000410000000000320435000000240210003900000026030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000000310004c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d00000001010000390000000502000039000000000202041a0000091d022001970000000003000411000b00000003001d000000000232004b00000c7c0000c13d23331c710000040f23331d0d0000040f000000400100043d00000000020000190000000003000019233300ff0000040f0000000001000416000000000110004c00000e5f0000c13d000000040100008a0000000001100031000008d102000041000000200310008c00000000030000190000000003024019000008d101100197000000000410004c000000000200a019000008d10110009c00000000010300190000000001026019000000000110004c00000e5f0000c13d233314300000040f233314430000040f00000004010000390000000201100367000000000101043b233321430000040f0000000002000411233316240000040f00000001010000390000000602000039000000000012041b000000400100043d00000000020000190000000003000019233300ff0000040f000000400200043d000a00000002001d0000091e0100004100000000001204350000000001000414000800000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000000a030000290000000b020000290000091d02200197000000040430003900000000002404350000091d02100197000000040120008c00000b800000613d0000002404000039000000200600003900000008010000290000000a050000292333006a0000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b0000023f0000613d00000e5f0000013d000000400200043d000a00000002001d0000091e0100004100000000001204350000000001000414000800000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000000a030000290000000b020000290000091d02200197000000040430003900000000002404350000091d02100197000000040120008c00000bb60000613d0000002404000039000000200600003900000008010000290000000a050000292333006a0000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b000004200000613d00000e5f0000013d000000400200043d000a00000002001d0000091e0100004100000000001204350000000001000414000800000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000000a030000290000000b020000290000091d02200197000000040430003900000000002404350000091d02100197000000040120008c00000bec0000613d0000002404000039000000200600003900000008010000290000000a050000292333006a0000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b0000075e0000613d00000e5f0000013d000000400200043d000a00000002001d0000091e0100004100000000001204350000000001000414000800000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000000a030000290000000b020000290000091d02200197000000040430003900000000002404350000091d02100197000000040120008c00000c220000613d0000002404000039000000200600003900000008010000290000000a050000292333006a0000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b000007ea0000613d00000e5f0000013d000000400100043d00000000007104350000002002100039000000000550004c00000d7e0000c13d000001000400008a000000000343016f000000000032043500000020030000390000002002300039000b00000001001d233312af0000040f000000400100043d000a00000001001d0000000b020000292333126d0000040f0000000a03000029000000000231004900000000010300190000000003000019233300ff0000040f0000000701000039000a00000001001d000000000101041a0000091d0210019700000000010400190000000b03000029233322930000040f0000000a01000029000000000101041a0000092d0200004100000000002004390000091d01100197000a00000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400500043d0000092e010000410000000000150435000000040250003900000000010004140000000b0300002900000000003204350000000a02000029000000040320008c00000c750000613d00000024040000390000000003050019000a00000005001d0000000a0500002900000000060000192333006a0000040f0000000a05000029000000000110004c00000e220000613d0000091f0150009c00000f120000213d000000400050043f000000000105001900000000020000190000000003000019233300ff0000040f000000400200043d000a00000002001d0000091e0100004100000000001204350000000001000414000800000001001d0000091c01000041000000000010043900000004005004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f0000000a030000290000000b020000290000091d02200197000000040430003900000000002404350000091d02100197000000040120008c00000c9a0000613d0000002404000039000000200600003900000008010000290000000a050000292333006a0000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b00000b3c0000613d00000e5f0000013d000000000040043500000948040000410000000003000019000000000573004b000001f70000813d0000000005230019000000000604041a00000000006504350000002003300039000000010440003900000cb50000013d000000400100043d00000044021000390000093c03000041000000000032043500000024021000390000000b030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000091c01000041000800000001001d00000000001004390000000901000029000000040010044300000024000004430000800501000039000700000001001d0000004402000039000600000002001d233300ed0000040f00000008020000290000000000200439000000090200002900000004002004430000002002000039000300000002001d0000002400200443000900000001001d00000007010000290000000602000029233300ed0000040f00000009020000290000091d022001970000091d01100197000700000002001d000500000001001d000000000112004b00000e080000c13d000009290100004100000000001004390000000b0100002900000004001004430000800a010000390000002402000039233300ed0000040f0000000b04000029000600000001001d00000e0b0000013d0000001501000039000000000201041a0000092002200197000000000232019f000000000021041b00000024020000390000000202200367000000000202043b0000001603000039000000000023041b000000000201041a000000000503041a0000093401000041000000400300043d00000000001304350000000404300039000000000100041400000000005404350000091d02200197000000040420008c00000d0f0000613d0000002404000039000000a006000039000a00000003001d0000000a05000029233300a10000040f0000000a03000029000000000110004c00000e220000613d0000000101000031000000a00210008c000000a00200003900000000020140190000001f02200039000001e00420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000a00110008c00000e5f0000413d00000000010304330000091d0210009c00000e5f0000213d000000800230003900000000020204330000091d0220009c00000e5f0000213d0000000b02000029000000000121004b00000000010000190000000101006039233313c60000040f000000400100043d00000000020000190000000003000019233300ff0000040f000000000331004900000007010000290000000b02000029233313420000040f000000400100043d0000000802000029000000000021043500000020020000390000000003000019233300ff0000040f000000400300043d000009280100004100000000001304350000000b010000290000091d04100197000000040530003900000000010004140000000000450435000000040420008c00000d4c0000613d00000024040000390000002006000039000b00000003001d0000000b05000029233300a10000040f0000000b03000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00000f120000213d000000010450019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d000000000303043300000000020004110000000a01000029233322400000040f00000a9f0000013d0000000501000039000000000201041a0000092003200197000000000363019f000000000031041b000000400500043d000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0450009c000a00000005001d00000000010540190000004001100210000000c003300210000000000113019f0000091d05200197000008d4011001c70000800d0200003900000003030000390000092104000041233323290000040f000000010120019000000e5f0000613d0000000a0100002900000000020000190000000003000019233300ff0000040f000000000040043500000933040000410000000003000019000000000573004b00000c430000813d0000000005230019000000000604041a00000000006504350000002003300039000000010440003900000d810000013d0000000701000039000000000201041a000000400300043d0000093d01000041000000000013043500000000010004140000091d02200197000000040420008c000800000002001d00000d9c0000613d00000004040000390000002006000039000700000003001d0000000705000029233300a10000040f00000007030000290000000802000029000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f00000000050300190000000002340019000000000342004b000000000300001900000001030040390000091f0420009c00000f120000213d000000010330019000000f120000c13d000000400020043f000000200110008c00000e5f0000413d00000000020504330000000b01000029233321920000040f0000092d02000041000000000020043900000008020000290000000400200443000700000001001d00008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400200043d0000092f010000410000000000120435000600000002001d00000004022000390000000001000414000000070300002900000000003204350000000802000029000000040320008c00000dcd0000613d00000024040000390000000603000029000000000503001900000000060000192333006a0000040f000000000110004c00000e220000613d00000006010000290000091f0110009c00000f120000213d0000000601000029000000400010043f0000091c01000041000800000001001d00000000001004390000000901000029000000040010044300000024000004430000800501000039000700000001001d0000004402000039000600000002001d233300ed0000040f000000080200002900000000002004390000000902000029000000040020044300000020020000390000002400200443000900000001001d00000007010000290000000602000029233300ed0000040f0000091d0210019700000009010000290000091d01100197000800000002001d000000000121004b00000f9e0000c13d0000092d0100004100000000001004390000000801000029000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400200043d0000093e01000041000700000002001d000000000012043500000000010004140000000802000029000000040220008c00000f990000613d0000000b02000029000000000220004c00000f830000c13d000000040400003900000008020000290000000703000029000000000503001900000000060000192333006a0000040f00000f970000013d23331aa00000040f000600000001001d0000000b040000290000000701000039000400000001001d000000000201041a000000400300043d000009280100004100000000001304350000091d054001970000000404300039000000000100041400000000005404350000091d02200197000000040420008c00000e420000613d00000024040000390000002006000039000800000002001d0000000005030019000200000003001d233300a10000040f00000002030000290000000802000029000000000110004c00000e420000c13d0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200000e310000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00000e290000413d000000000530004c00000e400000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b000000000600001900000001060040390000091f0450009c00000f120000213d000000010460019000000f120000c13d000800000002001d000000400050043f000000200110008c00000e5f0000413d0000000001030433000200000001001d0000092d0100004100000000001004390000000801000029000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e8a0000c13d00000000010000190000000002000019233301090000040f0000000a01000029000000000110004c00000e760000c13d000000400100043d000000640210003900000943030000410000000000320435000000440210003900000944030000410000000000320435000000240210003900000026030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000801000029000000000110004c00000eae0000c13d000000400100043d000000640210003900000941030000410000000000320435000000440210003900000942030000410000000000320435000000240210003900000027030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400200043d0000092f010000410000000000120435000100000002001d00000004022000390000000001000414000000020300002900000000003204350000000802000029000000040320008c00000e9c0000613d00000024040000390000000103000029000000000503001900000000060000192333006a0000040f000000000110004c00000e220000613d00000001010000290000091f0110009c00000f120000213d0000000101000029000000400010043f00000007010000290000000502000029000000000121004b00000f190000c13d000009290100004100000000001004390000000b0100002900000004001004430000800a010000390000002402000039233300ed0000040f000b00000001001d00000f1b0000013d0000000701000039000000000201041a00000920022001970000000b03000029000000000232019f000000000021041b000000000201041a000000400300043d0000093701000041000b00000003001d000000000013043500000000010004140000091d02200197000000040320008c00000ec40000613d000000040400003900000020060000390000000b030000290000000005030019233300a10000040f000000000110004c00000e220000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000b020000290000000002230019000000000332004b000000000300001900000001030040390000091f0420009c00000f120000213d000000010330019000000f120000c13d000000400020043f000000200110008c000000090200002900000e5f0000413d0000000b010000290000000001010433000b00000001001d0000091d0110009c00000e5f0000213d0000091c0100004100000000001004390000000400200443000000240000044300008005010000390000004402000039233300ed0000040f0000000b02000029000000000121013f0000091d0110019800000000010000190000000101006039233313c00000040f0000000901000039000000000201041a00000920022001970000000a03000029000000000232019f000000000021041b0000000a01000039000000000201041a00000920022001970000000803000029000000000232019f000000000021041b000000400100043d00000000020000190000000003000019233300ff0000040f000008ce02000041000008ce0310009c00000000010280190000000a04000029000008ce0340009c00000000020440190000004002200210000000c001100210000000000121019f00000930011001c700008009020000390000000b0300002900000009040000290000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000000000110004c0000000a0500002900000e220000613d0000091f0150009c00000c770000a13d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f23331aa00000040f000b00000001001d00000006010000290000000b02000029000000000112004b00000f260000813d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f0000000404000029000000000104041a00000920021001970000000a03000029000000000232019f000000000024041b000000000204041a000000400400043d0000093703000041000800000004001d00000000003404350000091d01100197000100000001001d00000000010004140000091d02200197000200000002001d000000040220008c00000f400000613d00000004040000390000002006000039000000020200002900000008030000290000000005030019233300a10000040f000000000110004c00000e220000613d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600310018f00000008010000290000000001130019000000000331004b000000000300001900000001030040390000091f0410009c00000f120000213d000000010330019000000f120000c13d000000400010043f000000200220008c00000e5f0000413d000000080200002900000000020204330000091d0320009c00000e5f0000213d0000000703000029000000000232004b00000fa60000c13d00000006010000290000000b020000290000000001120049000800000001001d00000007010000290000000502000029000000000121004b00000fb30000c13d0000000401000029000000000101041a0000092d0200004100000000002004390000091d01100197000700000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400200043d0000092e010000410000000000120435000900000002001d00000004022000390000000001000414000000080300002900000000003204350000000702000029000000040220008c00000ff00000613d00000006020000290000000b03000029000000000223004b00000fda0000c13d000000240400003900000007020000290000000903000029000000000503001900000000060000192333006a0000040f00000fee0000013d000008ce02000041000008ce0310009c00000000010280190000000704000029000008ce0340009c00000000020440190000004002200210000000c001100210000000000121019f0000093f011001c700008009020000390000000b0300002900000008040000290000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000000000110004c00000e220000613d00000007010000290000091f0110009c00000f120000213d0000000701000029000000400010043f00000009010000290000000a020000290000000b03000029233322400000040f000000400100043d00000000020000190000000003000019233300ff0000040f00000044021000390000093803000041000000000032043500000024021000390000000c030000390000000000320435000009240200004100000000002104350000000402100039000000030300002900000000003204350000006402000039233301090000040f000000090100002900000002020000290000000803000029233322930000040f0000000401000029000000000101041a0000092d0200004100000000002004390000091d01100197000b00000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00000e5f0000613d000000400200043d0000092e010000410000000000120435000900000002001d00000004022000390000000001000414000000080300002900000000003204350000000b02000029000000040220008c00000fd60000613d00000024040000390000000b020000290000000903000029000000000503001900000000060000192333006a0000040f000000000110004c00000e220000613d00000009010000290000091f0110009c00000f120000213d00000ff30000013d000008ce02000041000008ce0310009c00000000010280190000000904000029000008ce0340009c00000000020440190000004002200210000000c001100210000000000121019f00000930011001c70000800902000039000000080300002900000007040000290000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000000000110004c00000e220000613d00000009010000290000091f0110009c00000f120000213d0000000904000029000000400040043f000008ce010000410000000002000414000008ce0320009c0000000002018019000008ce0340009c00000000010440190000004001100210000000c002200210000000000112019f000008d4011001c70000800d0200003900000004030000390000093904000041000000000500041100000001060000290000000a07000029233323290000040f000000010120019000000e5f0000613d000000090100002900000000020000190000000003000019233300ff0000040f0000000001010433000009490210009c000010100000813d000000000001042d00000000010000190000000002000019233301090000040f0000000003120049000008d1040000410000001f0530008c00000000050000190000000005042019000008d103300197000000000630004c0000000004008019000008d10330009c00000000030500190000000003046019000000000330004c000010570000613d00000000030104330000091f0430009c000010570000213d00000000041300190000001f01400039000008d103000041000000000521004b00000000050000190000000005038019000008d101100197000008d106200197000000000761004b0000000003008019000000000161013f000008d10110009c00000000010500190000000001036019000000000110004c000010570000c13d00000000030404330000094a0130009c0000105a0000813d0000003f01300039000000200500008a000000000551016f000000400100043d0000000005510019000000000615004b000000000600001900000001060040390000091f0750009c0000105a0000213d00000001066001900000105a0000c13d000000400050043f000000000031043500000020044000390000000005340019000000000225004b000010570000213d00000020021000390000000005000019000000000635004b000010520000813d000000000625001900000000075400190000000007070433000000000076043500000020055000390000104a0000013d000000000435004b000010560000a13d00000000023200190000000000020435000000000001042d00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00000000030104330000000004000019000000000534004b0000106b0000813d00000000052400190000002004400039000000000614001900000000060604330000000000650435000010630000013d0000000001230019000000000234004b0000106f0000a13d0000000000010435000000000001042d000c000000000002000500000003001d000600000001001d000000400800043d0000094b0100004100000000001804350000000001000414000400000002001d0000091d02200197000b00000002001d000000040220008c000010860000613d00000004040000390000000b02000029000000000308001900000000050800190000000006000019000c00000008001d233300a10000040f0000000c08000029000000000110004c0000120b0000613d000000030200036700000001010000310000001f0310018f0000000504100272000010940000613d000000000500001900000005065002100000000007680019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000108c0000413d000000000530004c000010a30000613d0000000504400210000000000242034f00000000044800190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000001f02100039000000200300008a000c00000003001d000000000332016f0000000002830019000000000332004b000000000300001900000001030040390000091f0420009c000012040000213d0000000103300190000012040000c13d000000400020043f00000000028100190000000001080019233310130000040f000000400400043d000a00000004001d00000020034000390000094c02000041000300000003001d00000000002304350000003402400039233310610000040f0000000a030000290000000001310049000000200210008a00000000002304350000001f011000390000000c02000029000000000121016f0000000008310019000000000118004b000000000100001900000001010040390000091f0280009c000012040000213d0000000101100190000012040000c13d000000400080043f0000094d01000041000000000018043500000000010004140000000b02000029000000040220008c000010db0000613d00000004040000390000000b02000029000000000308001900000000050800190000000006000019000900000008001d233300a10000040f0000000908000029000000000110004c0000120b0000613d000000030200036700000001010000310000001f0310018f0000000504100272000010e90000613d000000000500001900000005065002100000000007680019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000010e10000413d000000000530004c000010f80000613d0000000504400210000000000242034f00000000044800190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000001f021000390000000c03000029000000000332016f0000000002830019000000000332004b000000000300001900000001030040390000091f0420009c000012040000213d0000000103300190000012040000c13d000000400020043f00000000028100190000000001080019233310130000040f000000400400043d000900000004001d00000020034000390000094e02000041000200000003001d00000000002304350000002202400039233310610000040f00000009030000290000000001310049000000200210008a00000000002304350000001f011000390000000c02000029000000000221016f0000000001320019000000000221004b000000000200001900000001020040390000091f0310009c000012040000213d0000000102200190000012040000c13d000000400010043f0000000a010000290000000001010433000800000001001d0000091f0110009c000012040000213d0000000301000039000700000001001d000000000101041a2333125b0000040f0000000002010019000000200120008c0000000804000029000011420000413d00000007010000290000000000100435000100000002001d00000020020000390000000001000019233300d80000040f00000008040000290000001f024000390000000502200270000000200340008c0000000003020019000000000300401900000001020000290000001f02200039000000050220027000000000022100190000000001310019000000000321004b000011420000813d000000000001041b00000001011000390000113d0000013d0000001f0140008c0000115a0000a13d000000070100002900000000001004350000002002000039000300000002001d0000000001000019233300d80000040f000000030800002900000008070000290000000c02000029000000000227016f000000000300001900000009050000290000000a06000029000000000423004b0000000004680019000011670000813d0000000004040433000000000041041b000000200330003900000020088000390000000101100039000011510000013d000000000140004c00000000010000190000000905000029000011600000613d000000030100002900000000010104330000000302400210000000010300008a000000000223022f000000000232013f000000000221016f0000000101400210000011730000013d000000000272004b000011710000813d0000000302700210000000f80220018f000000010300008a000000000223022f000000000232013f0000000003040433000000000223016f000000000021041b00000001010000390000000102700210000000000112019f0000000702000029000000000012041b0000000001050433000a00000001001d0000091f0110009c000012040000213d0000000401000039000800000001001d000000000101041a2333125b0000040f0000000002010019000000200120008c0000000a04000029000011980000413d00000008010000290000000000100435000700000002001d00000020020000390000000001000019233300d80000040f0000000a040000290000001f024000390000000502200270000000200340008c0000000003020019000000000300401900000007020000290000001f02200039000000050220027000000000022100190000000001310019000000000321004b000011980000813d000000000001041b0000000101100039000011930000013d000000200140008c000011af0000413d000000080100002900000000001004350000002002000039000700000002001d0000000001000019233300d80000040f00000007070000290000000a060000290000000c02000029000000000226016f00000000030000190000000905000029000000000423004b0000000004570019000011bb0000813d0000000004040433000000000041041b000000200330003900000020077000390000000101100039000011a60000013d000000000140004c0000000001000019000011b40000613d000000020100002900000000010104330000000302400210000000010300008a000000000223022f000000000232013f000000000221016f0000000101400210000011c70000013d000000000262004b000011c50000813d0000000302600210000000f80220018f000000010300008a000000000223022f000000000232013f0000000003040433000000000223016f000000000021041b00000001010000390000000102600210000000000112019f0000000802000029000000000012041b00000000010004110000091d061001970000000503000039000000000103041a0000092002100197000000000262019f000c00000003001d000000000023041b000008ce02000041000000400300043d0000000004000414000008ce0540009c0000000004028019000008ce0530009c00000000020340190000004002200210000000c003400210000000000223019f0000091d05100197000008d4012001c70000800d0200003900000003030000390000092104000041233323290000040f00000001012001900000122b0000613d0000000c02000029000000000102041a0000094f01100197000000000012041b00000001010000390000000602000039000000000012041b0000001201000039000000000201041a000009260220019700000950022001c7000000000021041b0000001e010000390000001302000039000000000012041b0000012c010000390000001402000039000000000012041b00000006020000290000091d012001980000122e0000613d0000000b01000029000000000110004c0000123c0000613d00000005010000290000091d011001980000124a0000613d000000a00020043f0000000402000029000000800020043f000000c00010043f000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000121a0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000012120000413d000000000530004c000012290000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f00000000010000190000000002000019233301090000040f000000400100043d00000044021000390000095403000041000000000032043500000024021000390000001b030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000400100043d00000044021000390000095303000041000000000032043500000024021000390000001b030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000400100043d000000640210003900000951030000410000000000320435000000440210003900000952030000410000000000320435000000240210003900000024030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000010210019000000001011002700000007f0310018f00000000010360190000001f0310008c00000000030000190000000103002039000000010330018f000000000232004b000012660000c13d000000000001042d000008d30100004100000000001004350000002201000039000000040010043f00000024020000390000000001000019233301090000040f0000002003000039000000000031043500000000030204330000002004100039000000000034043500000040011000390000000004000019000000000534004b0000127c0000813d00000000054100190000002004400039000000000624001900000000060604330000000000650435000012740000013d000000000234004b000012800000a13d000000000231001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d000009490110009c000012880000813d000000000001042d00000000010000190000000002000019233301090000040f0000091d022001970000000000200435000000200010043f00000040020000390000000001000019233300d80000040f000000000001042d000000000210004c0000000002000019000000010200c039000000000112004b000012980000c13d000000000001042d00000000010000190000000002000019233301090000040f0000000501000039000000000101041a0000091d011001970000000002000411000000000121004b000012a20000c13d000000000001042d000000400100043d00000044021000390000095503000041000000000032043500000924020000410000000000210435000000240210003900000020030000390000000000320435000000040210003900000000003204350000006402000039233301090000040f0000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b000000000200001900000001020040390000091f0310009c000012bc0000213d0000000102200190000012bc0000c13d000000400010043f000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000000010300008a000000000332013f000000000313004b000012c90000413d0000000001120019000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00050000000000020000091d041001980000130c0000613d000500000003001d0000091d01200198000400000001001d0000131d0000613d0000000000400435000000200000043f00000040020000390000000001000019000300000004001d233300d80000040f000000000201041a0000000501000029000200000002001d000000000112004b0000132e0000413d00000003010000290000000000100435000000200000043f0000004002000039000100000002001d0000000001000019233300d80000040f000000050300002900000002020000290000000002320049000000000021041b00000004010000290000000000100435000000200000043f00000000010000190000000102000029233300d80000040f000000000201041a00000005030000290000000002320019000000000021041b000000400100043d0000000000310435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f00000956011001c70000800d020000390000000303000039000009570400004100000003050000290000000406000029233323290000040f00000001012001900000133f0000613d000000000001042d000000400100043d00000064021000390000095c03000041000000000032043500000044021000390000095d030000410000000000320435000000240210003900000025030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400100043d00000064021000390000095a03000041000000000032043500000044021000390000095b030000410000000000320435000000240210003900000023030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400100043d000000640210003900000958030000410000000000320435000000440210003900000959030000410000000000320435000000240210003900000026030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f00000000010000190000000002000019233301090000040f00040000000000020000091d041001980000136e0000613d000300000003001d0000091d01200198000400000001001d0000137f0000613d00000000004004350000000101000039000000200010043f0000004002000039000100000002001d0000000001000019000200000004001d233300d80000040f00000004020000290000000000200435000000200010043f00000000010000190000000102000029233300d80000040f0000000302000029000000000021041b000000400100043d0000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f00000956011001c70000800d0200003900000003030000390000095e0400004100000002050000290000000406000029233323290000040f0000000101200190000013900000613d000000000001042d000000400100043d000000640210003900000961030000410000000000320435000000440210003900000962030000410000000000320435000000240210003900000024030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400100043d00000064021000390000095f030000410000000000320435000000440210003900000960030000410000000000320435000000240210003900000022030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f00000000010000190000000002000019233301090000040f0004000000000002000200000003001d000400000002001d000100000001001d0000091d0110019700000000001004350000000101000039000000200010043f0000004002000039000300000002001d0000000001000019233300d80000040f00000004020000290000091d022001970000000000200435000000200010043f00000000010000190000000302000029233300d80000040f000000000101041a000000010200008a000000000221004b000013b10000613d0000000203000029000000000231004b000013b20000413d000000000331004900000001010000290000000402000029233313420000040f000000000001042d000000400100043d00000044021000390000096303000041000000000032043500000024021000390000001d030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000000110004c000013c30000613d000000000001042d00000000010000190000000002000019233301090000040f000000000110004c000013c90000613d000000000001042d000000400100043d000000440210003900000964030000410000000000320435000000240210003900000004030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00010000000000020000001502000039000000000202041a0000091d022001980000000003000019000014040000613d0000001603000039000000000603041a000000400300043d000009650400004100000000004304350000091d0410019700000024053000390000000001000414000000000045043500000004043000390000000000640435000000040420008c000013f20000613d000000440400003900000040060000390000000005030019000100000003001d233300a10000040f0000000103000029000000000110004c000014100000613d0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c000014060000213d0000000104500190000014060000c13d000000400020043f000000400110008c0000140d0000413d00000000030304330000000001030019000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000141f0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000014170000413d000000000530004c0000142e0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f0000000501000039000000000101041a0000093601100198000014350000c13d000000000001042d000000400100043d000000440210003900000966030000410000000000320435000000240210003900000010030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000000601000039000000000201041a000000020220008c0000144a0000613d0000000202000039000000000021041b000000000001042d000000400100043d00000044021000390000096703000041000000000032043500000024021000390000001f030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000000310004c0000145e0000613d000000010300008a00000000431300d9000000000323004b000014600000413d00000000211200a9000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f0009000000000002000700000002001d000900000001001d000000000110004c000015720000613d0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000800000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c000015bc0000613d000000400300043d0000096801000041000000000013043500000000010004140000000802000029000000040420008c000014870000613d0000000404000039000800000003001d000000080500002900000000060000192333006a0000040f0000000803000029000000000110004c000015e20000613d0000094a0130009c000015ae0000813d000000400030043f23331be70000040f000400000001001d0000000901000029000009690110009c000015b50000813d0000000403000029000000000130004c000015bf0000613d00000009010000290000092a121000d1000500000002001d000000000123004b000015c60000213d00000007010000290000091d01100197000800000001001d0000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000101041a000300000001001d0000000701000029233313d70000040f000000010200008a000600000002001d000700000001001d000000000121013f0000000302000029000000000112004b000015b50000213d000000080100002900000000001004350000000b01000039000200000001001d000000200010043f00000040020000390000000001000019233300d80000040f00000003020000290000000703000029000000000423001a000000000101041a000014bb0000613d000000060200002900000000324200d9000000000212004b000015b50000413d00000000134100a900000006010000290000000502000029000000000112013f000300000003001d000000000113004b000015b50000213d0000000501000029000000040200002900000000122100d9000700000002001d000000080100002900000000001004350000000201000029000000200010043f00000040020000390000000001000019000400000004001d233300d80000040f000000040300002900000006020000290000000704000029000000000224013f000100000002001d000000000223004b000015b50000213d0000000702000029000000000223001a000015bf0000613d00000005030000290000000304000029000000000334001900000000322300d9000000000021041b0000091c01000041000500000001001d00000000001004390000000001000412000200000001001d000000040010044300000024000004430000800501000039000400000001001d0000004402000039000300000002001d233300ed0000040f00000005020000290000000000200439000000020200002900000004002004430000002002000039000200000002001d0000002400200443000500000001001d00000004010000290000000302000029233300ed0000040f00000005020000290000000004020019000000000121013f0000091d01100198000015730000613d0000000002000411000000000300041000000000010400190000000904000029233321ea0000040f0000000701000039000400000001001d000000000101041a0000091d0210019700000005010000290000000903000029233322930000040f0000000401000029000000000101041a0000092d0200004100000000002004390000091d01100197000500000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c000015bc0000613d000000400500043d0000092e01000041000000000015043500000004025000390000000001000414000000090300002900000000003204350000000502000029000000040320008c000015240000613d00000024040000390000000003050019000500000005001d000000050500002900000000060000192333006a0000040f0000000505000029000000000110004c000015e20000613d0000091f0150009c000015ae0000213d000000400050043f0000000801000029000000000110004c000015d40000613d0000000201000039000000000201041a0000000103000029000000000332004b000015b50000213d00000007030000290000000002320019000000000021041b00000008010000290000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000201041a00000007030000290000000002320019000000000021041b000000400100043d0000000000310435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f00000956011001c70000800d020000390000000303000039000009570400004100000000050000190000000806000029233323290000040f0000000101200190000015bc0000613d00000009010000290000000a2110011a0000000602000029000000000421013f0000001002000039000000000302041a000000000443004b000015b50000213d0000000001130019000000000012041b000000400100043d00000020021000390000000703000029000000000032043500000009020000290000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f0000092b011001c70000800d0200003900000003030000390000096c0400004100000000050004110000000806000029233323290000040f0000000101200190000015bc0000613d000000000001042d00000000010004160000000902000029000000000121004b000016020000c13d0000000701000039000000000101041a0000092d0200004100000000002004390000091d01100197000400000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c000015bc0000613d000000400500043d0000092e010000410000000000150435000000040250003900000000010004140000000003000416000000090400002900000000004204350000000406000029000000040260008c000015ac0000613d000000000230004c000500000005001d000015a40000613d000008ce02000041000008ce0410009c0000000001028019000008ce0450009c00000000020540190000004002200210000000c001100210000000000121019f00000930011001c7000080090200003900000000040600190000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000015a90000013d00000024040000390000000002060019000000000305001900000000060000192333006a0000040f000000000110004c0000000505000029000015e20000613d0000091f0150009c000015260000a13d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000001201000039000000040010043f00000024020000390000000001000019233301090000040f000000400100043d00000044021000390000096e030000410000000000320435000000240210003900000007030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000044015000390000096d02000041000000000021043500000024015000390000001f0200003900000000002104350000092401000041000000000015043500000004015000390000000202000029000000000021043500000064020000390000000001050019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000015f10000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000015e90000413d000000000530004c000016000000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000400100043d00000064021000390000096a03000041000000000032043500000044021000390000096b03000041000000000032043500000024021000390000002c030000390000000000320435000009240200004100000000002104350000000402100039000000020300002900000000003204350000008402000039233301090000040f000000000110004c000016160000613d000000000001042d000000400100043d00000044021000390000096f03000041000000000032043500000024021000390000001d030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000c000000000002000b00000002001d000900000001001d000000000110004c0000000001000019000000010100c039233316130000040f0000001202000039000000000102041a000000ff01100190000017690000c13d000700000002001d0000001001000039000800000001001d000000000101041a0000001102000039000c00000002001d000000000202041a000000000112004b000017570000813d0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000a00000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c000017580000613d000000400300043d0000096801000041000000000013043500000000010004140000000a02000029000000040420008c000016530000613d0000000404000039000a00000003001d0000000a0500002900000000060000192333006a0000040f0000000a03000029000000000110004c0000177a0000613d0000094a0130009c0000175b0000813d000000400030043f23331be70000040f0000000906000029000000000260004c0000165e0000613d000000010200008a00000000326200d9000000000212004b000017620000413d00000000156100a90000092a1450012a0000000c01000029000000000101041a0000000802000029000000000202041a000000000312004b000017620000413d000100000005001d0000000001120049000a00000004001d000000000114004b0000179a0000213d0000000b010000290000091d021001970000000003000411000300000002001d000500000003001d000000000223004b000016770000613d00000005020000290000000003060019233313930000040f00000009060000290000000b010000290000000002060019233317a70000040f0000000701000039000000000201041a000000400300043d0000093d01000041000000000013043500000000010004140000091d02200197000000040420008c000800000002001d0000168c0000613d000000040400003900000020060000390000000005030019000900000003001d233300a10000040f00000009030000290000000802000029000000000110004c0000177a0000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b000000000600001900000001060040390000091f0450009c0000175b0000213d00000001046001900000175b0000c13d000000400050043f000000200110008c000017580000413d00000000020304330000000a01000029233321920000040f0000092d02000041000000000020043900000008020000290000000400200443000600000001001d00008002010000390000002402000039233300ed0000040f000000000110004c000017580000613d000000400300043d0000092f010000410000000000130435000000040430003900000000010004140000000602000029000400000004001d00000000002404350000000804000029000000040240008c000900000003001d0000000002040019000016be0000613d0000002404000039000000090500002900000000060000192333006a0000040f0000000903000029000000000110004c0000177a0000613d0000091f0130009c0000175b0000213d000000400030043f000009720100004100000000001304350000000001000414000200000001001d0000091c0100004100000000001004390000000001000412000800000001001d00000004001004430000004001000039000000240010044300008005010000390000004402000039233300ed0000040f000000090300002900000005020000290000091d02200197000000040400002900000000002404350000091d02100197000000040120008c000016df0000613d00000024040000390000002006000039000000020100002900000009050000292333006a0000040f0000000903000029000000000110004c0000177a0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000023200190000091f0420009c0000175b0000213d000000400020043f000000200110008c000017580000413d0000000001030433000000000210004c0000000002000019000000010200c039000000000221004b000017580000c13d000000000110004c0000000002000019000017000000c13d0000001301000039000000000101041a00000001020000290000092a0220009c0000000a04000029000016fe0000413d000000010200008a00000000324200d9000000000212004b000017620000413d00000000214100a9000027101210011a000900000002001d0000091c01000041000500000001001d00000000001004390000000801000029000000040010044300000024000004430000800501000039000400000001001d0000004402000039000200000002001d233300ed0000040f000000050200002900000000002004390000000802000029000000040020044300000020020000390000002400200443000800000001001d00000004010000290000000202000029233300ed0000040f0000000802000029000000000121013f0000000702000029000000000202041a00000008022002700000091d022001970000091d011001980000172a0000613d00000008010000290000000903000029233322400000040f00000009020000290000000a04000029000000000124004b000017620000413d000000000324004900000008010000290000000b02000029233322400000040f000017340000013d00000000010200190000000902000029233322e60000040f00000009020000290000000a03000029000000000123004b000017620000413d00000000022300490000000b01000029233322e60000040f000000010100008a0000000a03000029000000000213013f0000000c01000029000000000101041a000000000221004b0000000904000029000017620000213d00000000011300190000000c02000029000000000012041b000000400100043d000000400210003900000000004204350000002002100039000000060400002900000000004204350000000000310435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f00000973011001c70000800d02000039000000020300003900000974040000410000000305000029233323290000040f0000000101200190000017580000613d000000000001042d00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000000c01000029000000040010043f00000024020000390000000001000019233301090000040f000000400100043d00000064021000390000097003000041000000000032043500000044021000390000097103000041000000000032043500000024021000390000002d030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000017890000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000017810000413d000000000530004c000017980000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000400100043d00000044021000390000097503000041000000000032043500000924020000410000000000210435000000240210003900000020030000390000000000320435000000040210003900000000003204350000006402000039233301090000040f0003000000000002000300000002001d0000091d01100198000017d90000613d000200000001001d0000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000201041a0000000301000029000100000002001d000000000112004b000017ea0000413d00000002010000290000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000030300002900000001020000290000000002320049000000000021041b0000000201000039000000000201041a0000000002320049000000000021041b000000400100043d0000000000310435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f00000956011001c70000800d020000390000000303000039000009570400004100000002050000290000000006000019233323290000040f0000000101200190000017fb0000613d000000000001042d000000400100043d000000640210003900000978030000410000000000320435000000440210003900000979030000410000000000320435000000240210003900000021030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400100043d000000640210003900000976030000410000000000320435000000440210003900000977030000410000000000320435000000240210003900000022030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f00000000010000190000000002000019233301090000040f0009000000000002000500000001001d0000091d01100198000800000001001d0000196f0000613d000000400300043d0000000801000039000000000101041a0000091d021001980000197d0000613d000009370100004100000000001304350000000001000414000900000002001d000000040220008c000018170000613d000000040400003900000020060000390000000902000029000700000003001d0000000705000029233300a10000040f0000000703000029000000000110004c0000194f0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c000019160000213d0000000104500190000019160000c13d000000400020043f0000001f0110008c0000194c0000a13d0000000001030433000700000001001d0000091d0110009c0000194c0000213d0000091c0100004100000000001004390000000001000412000300000001001d0000000400100443000000240000044300008005010000390000004402000039233300ed0000040f000200000001001d0000091d01100197000400000001001d0000000702000029000000000112004b0000198e0000c13d00000008010000290000000000100435000000200000043f00000040020000390000000001000019233300d80000040f000000000301041a000000000130004c0000194b0000613d0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000700000001001d000000040010044300008002010000390000002402000039000600000003001d233300ed0000040f0000000604000029000000000110004c0000194c0000613d000000400300043d0000096801000041000000000013043500000000010004140000000702000029000000040520008c000018620000613d0000000404000039000700000003001d000000070500002900000000060000192333006a0000040f00000007030000290000000604000029000000000110004c0000194f0000613d0000091f0130009c000019160000213d000000400030043f000000010100008a00000000124100d9000700000002001d23331be70000040f0000000702000029000000000212004b0000199f0000413d000000060300002900000000123100a9000100000002001d0000092a1220012a000700000002001d00000000020004110000000801000029000000000112004b000018790000613d00000005010000290000000603000029233313930000040f000000060300002900000005010000290000000002030019233317a70000040f0000000701000039000000000201041a000000400300043d0000093d01000041000000000013043500000000010004140000091d02200197000000040420008c000600000002001d0000188f0000613d000000040400003900000020060000390000000005030019000500000003001d233300a10000040f00000005030000290000000602000029000000000110004c0000194f0000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b000000000600001900000001060040390000091f0450009c000019160000213d0000000104600190000019160000c13d000000400050043f000000200110008c0000194c0000413d00000000020304330000000701000029233321920000040f0000092d02000041000000000020043900000006020000290000000400200443000500000001001d00008002010000390000002402000039233300ed0000040f000000000110004c0000194c0000613d000000400300043d0000092f01000041000000000013043500000004023000390000000001000414000000050400002900000000004204350000000604000029000000040240008c0000000002040019000018c00000613d0000002404000039000600000003001d000000060500002900000000060000192333006a0000040f0000000603000029000000000110004c0000194f0000613d0000091f0130009c000019160000213d000000400030043f0000091c010000410000000000100439000000030100002900000004001004430000002001000039000000240010044300008005010000390000004402000039233300ed0000040f0000091d011001970000000402000029000000000112004b000018f00000c13d0000092d0100004100000000001004390000000901000029000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c0000194c0000613d000000400500043d0000097b01000041000000000015043500000024025000390000000001000414000000080300002900000000003204350000000402500039000000070300002900000000003204350000000902000029000000040220008c000019330000613d00000001020000290000092a0220009c000600000005001d0000191d0000813d00000044040000390000000902000029000000000305001900000000060000192333006a0000040f000019300000013d000000020100002900000009020000290000000703000029233322930000040f0000092d0100004100000000001004390000000901000029000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c0000194c0000613d000000400500043d0000097b01000041000000000015043500000024025000390000000001000414000000080300002900000000003204350000000402500039000000070300002900000000003204350000000902000029000000040220008c000019140000613d000000440400003900000009020000290000000003050019000600000005001d000000060500002900000000060000192333006a0000040f0000000605000029000000000110004c0000194f0000613d0000091f0150009c000019350000a13d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000008ce02000041000008ce0310009c0000000001028019000008ce0350009c00000000020540190000004002200210000000c001100210000000000121019f0000097c011001c70000800902000039000000070300002900000009040000290000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000000000110004c00000006050000290000194f0000613d0000091f0150009c000019160000213d000000400050043f00000007010000290000000000150435000008ce010000410000000002000414000008ce0320009c0000000002018019000008ce0350009c00000000010540190000004001100210000000c002200210000000000112019f00000956011001c70000800d0200003900000004030000390000097d04000041000000000600041000000008050000290000000907000029233323290000040f00000001012001900000194c0000613d000000000001042d00000000010000190000000002000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000195e0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000019560000413d000000000530004c0000196d0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000400100043d00000044021000390000098003000041000000000032043500000024021000390000001c030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000064013000390000097e02000041000000000021043500000044013000390000097f0200004100000000002104350000002401300039000000250200003900000000002104350000092401000041000000000013043500000004013000390000002002000039000000000021043500000084020000390000000001030019233301090000040f000000400100043d00000064021000390000094503000041000000000032043500000044021000390000097a030000410000000000320435000000240210003900000024030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f0007000000000002000700000001001d000000000110004c0000000001000019000000010100c039233316130000040f0000001201000039000000000101041a000000ff0110019000001a570000c13d0000001401000039000000000101041a0000000e02000039000100000002001d000000000202041a000000000112004b00001a680000213d0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000600000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00001a4d0000613d000000400300043d0000096801000041000000000013043500000000010004140000000602000029000000040420008c000019d20000613d0000000404000039000600000003001d000000060500002900000000060000192333006a0000040f0000000603000029000000000110004c00001a790000613d0000094a0130009c00001a500000813d000000400030043f23331be70000040f00000000030100190000000704000029000000000140004c000019de0000613d000000010100008a00000000214100d9000000000131004b00001a460000413d0000000002000411000600000002001d0000000001000410000500000003001d0000000003010019233321ea0000040f00000006010000290000091d01100197000400000001001d00000000001004350000000c01000039000200000001001d000000200010043f0000004002000039000300000002001d0000000001000019233300d80000040f000000040200002900000000002004350000000202000029000000200020043f000400000001001d00000000010000190000000302000029233300d80000040f0000000705000029000000010200008a000000000225013f000000050300002900000000435300a90000092a3430012a000500000004001d000000000101041a000000000321004b00001a460000213d00000000015100190000000403000029000000000013041b0000000d01000039000000000301041a000000000223004b00001a460000213d0000000002530019000000000021041b000000060100002900000000001004350000000f01000039000400000001001d000000200010043f00000040020000390000000001000019233300d80000040f0000000703000029000000000101041a000000000110004c00001a2f0000c13d00000004050000290000000101000029000000000101041a0000091f0210009c00001a500000213d00000001021000390000000103000029000000000023041b000000000203041a000000000212004b000000060400002900001a990000a13d00000000003004350000098301100041000000000041041b000000000103041a000300000001001d0000000000400435000000200050043f00000040020000390000000001000019233300d80000040f0000000302000029000000000021041b0000000703000029000000400100043d0000002002100039000000000032043500000005020000290000000000210435000008ce020000410000000003000414000008ce0430009c0000000003028019000008ce0410009c00000000010280190000004001100210000000c002300210000000000112019f0000092b011001c70000800d02000039000000020300003900000984040000410000000605000029233323290000040f000000010120019000001a4d0000613d000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000000400100043d000000640210003900000981030000410000000000320435000000440210003900000982030000410000000000320435000000240210003900000031030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000000400100043d000000640210003900000985030000410000000000320435000000440210003900000986030000410000000000320435000000240210003900000028030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001a880000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001a800000413d000000000530004c00001a970000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000008d30100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019233301090000040f0002000000000002000000400200043d00000928010000410000000000120435000200000002001d0000000401200039000000000200041000000000002104350000000001000414000100000001001d0000091c01000041000000000010043900000000010004120000000400100443000000240000044300008005010000390000004402000039233300ed0000040f0000091d02100197000000040120008c00001abd0000613d00000024040000390000002006000039000000010100002900000002030000290000000005030019233300a10000040f000000000110004c00001adc0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000002050000290000000002530019000000000332004b000000000300001900000001030040390000091f0420009c000000000405001900001ad20000213d000000010330019000001ad20000c13d000000400020043f0000001f0110008c00001ad90000a13d0000000001040433000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001aeb0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001ae30000413d000000000530004c00001afa0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f00020000000000020000000701000039000000000201041a000000400700043d0000092801000041000000000017043500000000010004100000091d031001970000000404700039000000000100041400000000003404350000091d02200197000000040320008c00001b150000613d000000240400003900000020060000390000000003070019000200000002001d0000000005070019000100000007001d233300a10000040f00000001070000290000000202000029000000000110004c00001b560000613d0000000101000031000000200310008c000000200300003900000000030140190000001f03300039000000600430018f0000000003740019000000000443004b000000000500001900000001050040390000091f0430009c00001b4c0000213d000000010450019000001b4c0000c13d000000400030043f0000001f0110008c00001b530000a13d00000000050704330000093d0100004100000000001304350000000001000414000000040420008c00001b360000613d00000004040000390000002006000039000200000003001d000100000005001d0000000205000029233300a10000040f00000001050000290000000203000029000000000110004c00001b560000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000023200190000091f0420009c00001b4c0000213d000000400020043f000000200110008c00001b530000413d0000000001030433000000000250004c00001b490000613d000000010200008a00000000325200d9000000000212004b00001b760000413d00000000211500a90000092a2110012a000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001b650000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001b5d0000413d000000000530004c00001b740000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00010000000000020000000901000039000000000201041a000000400300043d0000098701000041000000000013043500000000010004140000091d02200197000000040420008c00001b8f0000613d00000004040000390000002006000039000100000003001d0000000105000029233300a10000040f0000000103000029000000000110004c00001bac0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b000000000500001900000001050040390000091f0420009c00001ba20000213d000000010450019000001ba20000c13d000000400020043f0000001f0110008c00001ba90000a13d0000000001030433000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001bbb0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001bb30000413d000000000530004c00001bca0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000200000000000223331aa00000040f000200000001001d23331afc0000040f0000000203000029000000010200008a000100000002001d000000000221013f000000000223004b00001be00000213d0000000001310019000200000001001d23331b7d0000040f00000002030000290000000102000029000000000221013f000000000223004b00001be00000213d0000000001310019000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00030000000000020000092a010000410000000202000039000000000302041a000000000230004c00001c050000613d000100000003001d23331aa00000040f000300000001001d23331afc0000040f0000000303000029000000010200008a000200000002001d000000000221013f000000000223004b00001c060000213d0000000001310019000300000001001d23331b7d0000040f00000003030000290000000202000029000000000221013f000000000223004b00001c060000213d0000000001310019000009880210009c00001c060000213d0000092a211000d1000000010200002900000000212100d9000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f23331afc0000040f0000001102000039000000000302041a0000001004000039000000000404041a000000000534004b00001c1d0000413d00000000024300490000000002210019000000000112004b00000000010000190000000101002039000000000110004c0000000001020019000000000100c019000000000001042d000008d3010000410000000000100435000000040020043f00000024020000390000000001000019233301090000040f000000000110004c00001c260000613d000000000001042d000000400100043d00000064021000390000098903000041000000000032043500000044021000390000098a030000410000000000320435000000240210003900000025030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f000400000000000223331afc0000040f000100000001001d0000000d01000039000000000101041a000400000001001d23331be70000040f0000000404000029000000000240004c00001c450000613d000000010200008a00000000324200d9000000000212004b00001c6a0000413d00000000214100a90000092a1210012a000400000002001d23331aa00000040f000300000001001d23331afc0000040f0000000303000029000000010200008a000200000002001d000000000221013f000000000223004b00001c6a0000213d0000000001310019000300000001001d23331b7d0000040f00000003030000290000000202000029000000000221013f000000000223004b00001c6a0000213d00000000013100190000000402000029000000000221004b00001c6a0000413d000000040300002900000000013100490000000a2110011a000000000131001900000001020000290000000002210049000000000112004b00000000010000190000000101002039000000000110004c0000000001020019000000000100c019000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f000000000110004c00001c740000613d000000000001042d000000400100043d00000044021000390000098b03000041000000000032043500000024021000390000001c030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00010000000000020000001201000039000000000201041a000000ff0320019000001cc70000c13d000001000300008a000000000232016f00000001022001bf000000000021041b0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000100000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00001cc40000613d000000400300043d0000096801000041000000000013043500000000010004140000000102000029000000040420008c00001ca60000613d0000000404000039000100000003001d000000010500002900000000060000192333006a0000040f0000000103000029000000000110004c00001cdc0000613d0000094a0130009c00001cd50000813d000000400030043f0000000d01000039000000000101041a000100000001001d23331c370000040f000000400200043d0000002003200039000000000013043500000001010000290000000000120435000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0420009c00000000010240190000004001100210000000c002300210000000000112019f0000092b011001c70000800d0200003900000002030000390000098d040000410000000005000411233323290000040f000000010120019000001cc40000613d000000000001042d00000000010000190000000002000019233301090000040f000000400100043d00000044021000390000098c03000041000000000032043500000024021000390000000b030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001ceb0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001ce30000413d000000000530004c00001cfa0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000000110004c00001cff0000613d000000000001042d000000400100043d00000044021000390000098e030000410000000000320435000000240210003900000009030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000f0000000000020000001201000039000f00000001001d000000000101041a000000ff0110018f23331cfc0000040f23331c370000040f000000000110004c00001ea70000c13d23331be70000040f000a00000001001d0000000f03000029000000000103041a000001000200008a000000000121016f000000000013041b0000000d01000039000200000001001d000000000101041a000f00000001001d23331be70000040f0000000f04000029000000000240004c00001d290000613d000000010200008a00000000324200d9000000000212004b00001e800000413d00000000214100a90000092a2310012a000300000003001d0000092a0110009c00001e2d0000413d0000000701000039000000000201041a000000400300043d0000093d01000041000000000013043500000000010004140000091d02200197000000040420008c000f00000002001d00001d410000613d000000040400003900000020060000390000000005030019000e00000003001d233300a10000040f0000000e030000290000000f02000029000000000110004c00001e870000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b000000000600001900000001060040390000091f0450009c00001e720000213d000000010460019000001e720000c13d000000400050043f0000001f0110008c00001e6f0000a13d00000000020304330000000301000029233321920000040f0000092d0200004100000000002004390000000f020000290000000400200443000e00000001001d00008002010000390000002402000039233300ed0000040f000000000110004c00001e6f0000613d000000400300043d0000092f010000410000000000130435000000040230003900000000010004140000000e0400002900000000004204350000000f04000029000000040240008c000000000204001900001d720000613d0000002404000039000f00000003001d0000000f0500002900000000060000192333006a0000040f0000000f03000029000000000110004c00001e870000613d0000091f0130009c00001e720000213d000000400030043f0000091c01000041000f00000001001d00000000001004390000000001000412000c00000001001d000000040010044300000024000004430000800501000039000e00000001001d0000004402000039000d00000002001d233300ed0000040f0000000f0200002900000000002004390000000c02000029000000040020044300000020020000390000002400200443000100000001001d0000000e010000290000000d02000029233300ed0000040f0000091d0210019700000001010000290000091d01100197000000000121004b00001dba0000c13d0000092d010000410000000000100439000f00000002001d000000040020044300008002010000390000002402000039233300ed0000040f000000000110004c00001e6f0000613d000000400500043d0000093e01000041000000000015043500000000010004140000000f04000029000000040240008c00001db70000613d000008ce02000041000008ce0310009c0000000001028019000008ce0350009c00000000020540190000004002200210000000c001100210000000000121019f0000093f011001c700008009020000390000000303000029000f00000005001d0000000005000019233323290000040f0000000f05000029000000000301034f00000000010300190000006001100270000108ce0010019d000008ce041001970003000000030355000000010120019000001eb50000613d0000091f0150009c00001e720000213d000000400050043f23331aa00000040f0000000302000029000000000121004b00001e6f0000413d0000000e02000039000000000102041a000900000001001d0000000a01000039000800000001001d0000000c01000039000e00000001001d0000004001000039000700000001001d0000800201000039000600000001001d0000002401000039000500000001001d0000000003000019000400000002001d0000000901000029000000000113004b00001e210000813d000c00000003001d000000000102041a000000000110004c00001e790000613d00000000002004350000000801000029000000000101041a000d00000001001d0000098301000041000000000101041a0000091d01100197000f00000001001d00000000001004350000000e01000029000000200010043f00000000010000190000000702000029233300d80000040f0000000d020000290000091d03200197000000000401041a000000000140004c00001dec0000613d000000010100008a00000000214100d90000000a02000029000000000121004b00001e800000413d000d00000004001d0000092d010000410000000000100439000000040030044300000006010000290000000502000029000b00000003001d233300ed0000040f000000000110004c00001e6f0000613d000000400500043d000009900100004100000000001504350000000a010000290000000d0200002900000000211200a90000092a1210012a00000024035000390000000001000414000000000023043500000004025000390000000f0300002900000000003204350000000b03000029000000040230008c000000000203001900001e100000613d00000044040000390000000003050019000d00000005001d0000000d0500002900000000060000192333006a0000040f0000000d05000029000000000110004c00001e870000613d0000091f0150009c00001e720000213d000000400050043f0000000f0100002900000000001004350000000e01000029000000200010043f00000040020000390000000001000019233300d80000040f000000000001041b0000000f0100002923331ed30000040f0000000c030000290000000103300039000000040200002900001dcd0000013d0000000201000029000000000201041a0000000001000410233317a70000040f0000000201000029000000000001041b0000000801000029000000000101041a0000091d0210019700000001010000290000000303000029233322400000040f0000001101000039000000000001041b0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000f00000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c00001e6f0000613d000000400300043d0000096801000041000000000013043500000000010004140000000f02000029000000040420008c00001e4a0000613d0000000404000039000f00000003001d0000000f0500002900000000060000192333006a0000040f0000000f03000029000000000110004c00001e870000613d0000091f0130009c00001e720000213d000000400030043f23331bcc0000040f000f00000001001d0000000a2310011a0000001002000039000000000032041b23331b7d0000040f000e00000001001d23331afc0000040f000000400200043d00000020032000390000000e040000290000000000430435000000400320003900000000001304350000000f010000290000000000120435000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0420009c00000000010240190000004001100210000000c002300210000000000112019f00000973011001c70000800d02000039000000020300003900000991040000410000000005000411233323290000040f000000010120019000001e6f0000613d000000000001042d00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200001e960000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00001e8e0000413d000000000530004c00001ea50000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000400100043d00000044021000390000098f030000410000000000320435000000240210003900000018030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000400100043d0000001f0240018f000000050440027200001ec20000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001eba0000413d000000000520004c00001ed10000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000102000031233301090000040f0004000000000002000300000001001d00000000001004350000000f01000039000400000001001d000000200010043f00000040020000390000000001000019233300d80000040f000000000401041a000000000140004c00001f090000613d0000000e03000039000000000103041a000000000210004c00001f0a0000613d000000000241004b00001ef90000613d000000010240008a0000000000300435000200000003001d000000000303041a000000000223004b00001f180000a13d0000099201100041000000000101041a0000099202400041000000000012041b00000000001004350000000401000029000000200010043f00000040020000390000000001000019000100000004001d233300d80000040f0000000102000029000000000021041b0000000203000029000000000103041a000000000210004c00001f110000613d00000000003004350000099202100041000000000002041b000000010110008a000000000013041b000000030100002900000000001004350000000401000029000000200010043f00000040020000390000000001000019233300d80000040f000000000001041b000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000003101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019233301090000040f000d000000000002000300000001001d0000001201000039000000000101041a000000ff0110018f23331cfc0000040f23331be70000040f000400000001001d0000000e02000039000000000102041a0000000303000029000000000131004b000020cb0000413d0000000c01000039000a00000001001d0000004001000039000100000001001d000000010300008a000b00000000001d000c00000000001d0000000004000019000200000002001d000900000003001d0000000301000029000000000114004b00001fa20000813d000700000004001d000000000102041a000000000110004c000020a40000613d00000000002004350000098301000041000000000101041a0000091d01100197000d00000001001d00000000001004350000000a01000029000000200010043f00000000010000190000000102000029233300d80000040f000000000101041a000000000210004c000000090400002900001f500000613d00000000321400d90000000403000029000000000232004b000020930000413d000000040200002900000000212100a90000092a1210012a000800000002001d000000000142013f0000000b02000029000000000112004b000020930000213d0000000d0100002900000000001004350000000a01000029000000200010043f00000040020000390000000001000019233300d80000040f000000000201041a0000000901000029000500000002001d000000000112013f0000000c02000029000000000112004b000020930000213d0000000a01000039000000000101041a0000092d0200004100000000002004390000091d01100197000600000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c0000209a0000613d000000400500043d00000990010000410000000000150435000000240250003900000000010004140000000803000029000000000032043500000004025000390000000d0300002900000000003204350000000602000029000000040320008c00001f880000613d00000044040000390000000003050019000600000005001d000000060500002900000000060000192333006a0000040f0000000605000029000000000110004c000020ab0000613d0000094a0150009c0000209d0000813d0000000b0100002900000008020000290000000001120019000b00000001001d0000000c0100002900000005020000290000000001120019000c00000001001d000000400050043f0000000d0100002900000000001004350000000a01000029000000200010043f00000040020000390000000001000019233300d80000040f000000000001041b0000000d0100002923331ed30000040f000000070400002900000001044000390000000202000029000000090300002900001f360000013d0000000701000039000000000201041a000000400300043d0000093d01000041000000000013043500000000010004140000091d02200197000000040420008c000d00000002001d00001fb50000613d000000040400003900000020060000390000000005030019000a00000003001d233300a10000040f0000000a030000290000000d02000029000000000110004c000020ab0000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b000000000600001900000001060040390000091f0450009c0000209d0000213d00000001046001900000209d0000c13d000000400050043f000000200110008c0000209a0000413d00000000020304330000000b01000029233321920000040f0000092d0200004100000000002004390000000d020000290000000400200443000a00000001001d00008002010000390000002402000039233300ed0000040f000000000110004c0000209a0000613d000000400300043d0000092f010000410000000000130435000000040230003900000000010004140000000a0400002900000000004204350000000d04000029000000040240008c000000000204001900001fe60000613d0000002404000039000d00000003001d0000000d0500002900000000060000192333006a0000040f0000000d03000029000000000110004c000020ab0000613d0000091f0130009c0000209d0000213d000000400030043f0000091c01000041000d00000001001d00000000001004390000000001000412000800000001001d000000040010044300000024000004430000800501000039000a00000001001d0000004402000039000900000002001d233300ed0000040f0000000d020000290000000000200439000000080200002900000004002004430000002002000039000800000002001d0000002400200443000d00000001001d0000000a010000290000000902000029233300ed0000040f0000091d031001970000000d010000290000091d01100197000000000131004b000020370000c13d0000092d010000410000000000100439000000040030044300008002010000390000002402000039000a00000003001d233300ed0000040f000000000110004c0000209a0000613d000000400500043d0000093e01000041000000000015043500000000010004140000000a06000029000000040260008c000020340000613d0000000b03000029000000000230004c000900000005001d0000202c0000613d000008ce02000041000008ce0410009c0000000001028019000008ce0450009c00000000020540190000004002200210000000c001100210000000000121019f0000093f011001c7000080090200003900000000040600190000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010120018f000020310000013d00000004040000390000000002060019000000000305001900000000060000192333006a0000040f000000000110004c0000000905000029000020ab0000613d0000091f0150009c0000209d0000213d000000400050043f23331aa00000040f0000000b02000029000000000121004b000020d90000413d00000000010004100000000c02000029000c00000002001d233317a70000040f0000000d01000039000000000201041a0000000c03000029000000000332004b000020930000413d0000000c030000290000000002320049000000000021041b0000000a01000039000000000101041a0000091d021001970000000d010000290000000b03000029233322400000040f0000000201000029000000000101041a000000000110004c000020920000c13d0000001101000039000000000001041b0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000d00000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c0000209a0000613d000000400300043d0000096801000041000000000013043500000000010004140000000d02000029000000040420008c0000206e0000613d0000000404000039000d00000003001d0000000d0500002900000000060000192333006a0000040f0000000d03000029000000000110004c000020ab0000613d0000091f0130009c0000209d0000213d000000400030043f23331bcc0000040f000d00000001001d0000000a2310011a0000001002000039000000000032041b23331b7d0000040f000c00000001001d23331afc0000040f000000400200043d00000020032000390000000c040000290000000000430435000000400320003900000000001304350000000d010000290000000000120435000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0420009c00000000010240190000004001100210000000c002300210000000000112019f00000973011001c70000800d02000039000000020300003900000991040000410000000005000411233323290000040f00000001012001900000209a0000613d000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000003201000039000000040010043f00000024020000390000000001000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000020ba0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000020b20000413d000000000530004c000020c90000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000000400100043d00000044021000390000099403000041000000000032043500000024021000390000000d030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f000000400100043d00000044021000390000099303000041000000000032043500000024021000390000001e030000390000000000320435000009240200004100000000002104350000000402100039000000080300002900000000003204350000006402000039233301090000040f000000000110004c000020ea0000613d000000000001042d000000400100043d000000640210003900000995030000410000000000320435000000440210003900000996030000410000000000320435000000240210003900000021030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000008402000039233301090000040f233314300000040f0000000501000039000000000201041a0000094f0220019700000949022001c7000000000021041b0000000001000411000000400200043d0000000000120435000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0420009c00000000010240190000004001100210000000c002300210000000000112019f00000956011001c70000800d0200003900000001030000390000099704000041233323290000040f0000000101200190000021150000613d000000000001042d00000000010000190000000002000019233301090000040f0000000501000039000000000201041a0000093603200198000021320000613d0000094f02200197000000000021041b0000000001000411000000400200043d0000000000120435000008ce010000410000000003000414000008ce0430009c0000000003018019000008ce0420009c00000000010240190000004001100210000000c002300210000000000112019f00000956011001c70000800d0200003900000001030000390000099804000041233323290000040f0000000101200190000021400000613d000000000001042d000000400100043d000000440210003900000999030000410000000000320435000000240210003900000014030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000000010000190000000002000019233301090000040f0002000000000002000100000001001d0000000901000039000000000101041a0000092d0200004100000000002004390000091d01100197000200000001001d000000040010044300008002010000390000002402000039233300ed0000040f000000000110004c000021680000613d000000400300043d0000096801000041000000000013043500000000010004140000000202000029000000040420008c000021600000613d0000000404000039000200000003001d000000020500002900000000060000192333006a0000040f0000000203000029000000000110004c000021720000613d0000094a0130009c0000216b0000813d000000400030043f23331be70000040f00000000020100190000000101000029233321920000040f000000000001042d00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000021810000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000021790000413d000000000530004c000021900000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f00000000002404350000000102000031233301090000040f000009690310009c000021a50000813d000000000320004c000021ac0000613d0000092a341000d100000000532400d9000000000424004b0000219e0000413d000000010400008a00000000543400d9000000000424004b000021a50000413d00000000422300a90000092a4220012a000000000112004b0000000001000019000000010100c0390000000001130019000000000001042d000008d30100004100000000001004350000001101000039000000040010043f00000024020000390000000001000019233301090000040f000008d30100004100000000001004350000001201000039000000040010043f00000024020000390000000001000019233301090000040f00000060010000390000000102000032000021e20000613d0000003f01200039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b000000000400001900000001040040390000091f0530009c000021e30000213d0000000104400190000021e30000c13d000000400030043f00000000002104350000002002100039000000030300036700000001050000310000001f0450018f0000000505500272000021d30000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000021cb0000413d000000000640004c000021e20000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00010000000000020000000005010019000000400600043d000000640160003900000000004104350000091d013001970000004403600039000000000013043500000020036000390000099a0100004100000000001304350000091d0120019700000024026000390000000000120435000000640100003900000000001604350000099b0160009c000022390000813d000000a001600039000000400010043f0000000001000414000000040250008c00000000020000190000220a0000613d00000000040604330000000002050019000000000500001900000000060000192333006a0000040f000000000110004c00000000020000190000000102006039000100000002001d233321b30000040f00000001020000290000000102200190000022280000c13d0000000002010433000000000320004c000022270000613d000008d1030000410000001f0420008c00000000040000190000000004032019000008d102200197000000000520004c0000000003008019000008d10220009c00000000020400190000000002036019000000000220004c000022360000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000022360000c13d000000000110004c000022280000613d000000000001042d000000400100043d00000044021000390000099c030000410000000000320435000000240210003900000003030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00010000000000020000000005010019000000400400043d0000004401400039000000000031043500000020034000390000099d0100004100000000001304350000091d0120019700000024024000390000000000120435000000440100003900000000001404350000099e0140009c0000228c0000813d0000008001400039000000400010043f0000000001000414000000040250008c00000000020000190000225d0000613d00000000040404330000000002050019000000000500001900000000060000192333006a0000040f000000000110004c00000000020000190000000102006039000100000002001d233321b30000040f000000010200002900000001022001900000227b0000c13d0000000002010433000000000320004c0000227a0000613d000008d1030000410000001f0420008c00000000040000190000000004032019000008d102200197000000000520004c0000000003008019000008d10220009c00000000020400190000000002036019000000000220004c000022890000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000022890000c13d000000000110004c0000227b0000613d000000000001042d000000400100043d00000044021000390000099f030000410000000000320435000000240210003900000002030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f00010000000000020000000005010019000000400400043d000000440140003900000000003104350000002003400039000009a00100004100000000001304350000091d0120019700000024024000390000000000120435000000440100003900000000001404350000099e0140009c000022df0000813d0000008001400039000000400010043f0000000001000414000000040250008c0000000002000019000022b00000613d00000000040404330000000002050019000000000500001900000000060000192333006a0000040f000000000110004c00000000020000190000000102006039000100000002001d233321b30000040f00000001020000290000000102200190000022ce0000c13d0000000002010433000000000320004c000022cd0000613d000008d1030000410000001f0420008c00000000040000190000000004032019000008d102200197000000000520004c0000000003008019000008d10220009c00000000020400190000000002036019000000000220004c000022dc0000613d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000022dc0000c13d000000000110004c000022ce0000613d000000000001042d000000400100043d0000004402100039000009a1030000410000000000320435000000240210003900000002030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f00000000010000190000000002000019233301090000040f000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000100000000000200000000050200190000000004010019000000400100043d000009a20210009c000023140000813d0000002003100039000000400030043f000000000001043500000001060000390000000001000414000000040240008c0000230e0000613d000000000250004c000023080000613d000008ce02000041000008ce0610009c0000000001028019000008ce0630009c00000000020340190000004002200210000000c001100210000000000121019f000008d4011001c7000080090200003900000000030500190000000005000019233323290000040f00000000030100190000006003300270000108ce0030019d0003000000010355000000010620018f0000230e0000013d00000000020400190000000004000019000000000500001900000000060000192333006a0000040f0000000006010019000100000006001d233321b30000040f0000000101000029000000000110004c0000231b0000613d000000000001042d000008d30100004100000000001004350000004101000039000000040010043f00000024020000390000000001000019233301090000040f000000400100043d0000004402100039000009a3030000410000000000320435000000240210003900000003030000390000000000320435000009240200004100000000002104350000000402100039000000200300003900000000003204350000006402000039233301090000040f0000232c002104210000000102000039000000000001042d00000000020000190000232b0000013d00002331002104230000000102000039000000000001042d0000000002000019000023300000013d0000233300000432000023340001042e00002335000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff00000000000000df800000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006fdde0300000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000000c0fb800000000000000000000000000000000000000000000000000000000000eb0c8f30000000000000000000000000000000000000000000000000000000017e3e2e80000000000000000000000000000000000000000000000000000000018160ddd00000000000000000000000000000000000000000000000000000000184b9559000000000000000000000000000000000000000000000000000000001f1fcd510000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000002ea9239e00000000000000000000000000000000000000000000000000000000313ce5670000000000000000000000000000000000000000000000000000000036ea43440000000000000000000000000000000000000000000000000000000039509351000000000000000000000000000000000000000000000000000000003bfb5c14000000000000000000000000000000000000000000000000000000003f4ba83a000000000000000000000000000000000000000000000000000000003fc8cef3000000000000000000000000000000000000000000000000000000004069ab680000000000000000000000000000000000000000000000000000000048a0d7540000000000000000000000000000000000000000000000000000000048cdc141000000000000000000000000000000000000000000000000000000004bb2dcea000000000000000000000000000000000000000000000000000000004d9b489400000000000000000000000000000000000000000000000000000000575a86b2000000000000000000000000000000000000000000000000000000005c975abb0000000000000000000000000000000000000000000000000000000060773a2c0000000000000000000000000000000000000000000000000000000061d027b3000000000000000000000000000000000000000000000000000000006226399100000000000000000000000000000000000000000000000000000000672f1490000000000000000000000000000000000000000000000000000000006a7855fd000000000000000000000000000000000000000000000000000000006aa9eda2000000000000000000000000000000000000000000000000000000006d67d5d4000000000000000000000000000000000000000000000000000000006e553f650000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000715018a600000000000000000000000000000000000000000000000000000000745400c900000000000000000000000000000000000000000000000000000000776b65390000000000000000000000000000000000000000000000000000000077c7b8fc000000000000000000000000000000000000000000000000000000007ab7cbb1000000000000000000000000000000000000000000000000000000007f2932280000000000000000000000000000000000000000000000000000000083165e59000000000000000000000000000000000000000000000000000000008456cb59000000000000000000000000000000000000000000000000000000008542783f00000000000000000000000000000000000000000000000000000000864a897f00000000000000000000000000000000000000000000000000000000882c127e000000000000000000000000000000000000000000000000000000008da5cb5b000000000000000000000000000000000000000000000000000000008e4005700000000000000000000000000000000000000000000000000000000095d89b410000000000000000000000000000000000000000000000000000000096f25d42000000000000000000000000000000000000000000000000000000009d46c009000000000000000000000000000000000000000000000000000000009e3b77af00000000000000000000000000000000000000000000000000000000a10954fe00000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000b5589fad00000000000000000000000000000000000000000000000000000000b69ef8a800000000000000000000000000000000000000000000000000000000b6b55f2500000000000000000000000000000000000000000000000000000000c869d0ed00000000000000000000000000000000000000000000000000000000cecdb96100000000000000000000000000000000000000000000000000000000cef062fc00000000000000000000000000000000000000000000000000000000dadb6c1d00000000000000000000000000000000000000000000000000000000dc692cd700000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000e14224f300000000000000000000000000000000000000000000000000000000e1a4e72a00000000000000000000000000000000000000000000000000000000ec3e9da500000000000000000000000000000000000000000000000000000000f0f4426000000000000000000000000000000000000000000000000000000000f106845400000000000000000000000000000000000000000000000000000000f2fde38b00000000000000000000000000000000000000000000000000000000fac6182f00000000000000000000000000000000000000000000000000000000fd92bff200000000000000000000000000000000000000000000000000000000fdcb6068310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e000000000000000000000000ffffffffffffffffffffffffffffffffffffffffaf5b052b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000008be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e064647265737300000000000000000000000000000000000000000000000000004f776e61626c653a206e6577206f776e657220697320746865207a65726f206108c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffff0000000000000000000000000000000000000000ff000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee70a08231000000000000000000000000000000000000000000000000000000009cc7f708afc65944829bd487b90b72536b1951864fbfc14e125fc972a6507f390000000000000000000000000000000000000000000000000de0b6b3a764000002000000000000000000000000000000000000400000000000000000000000009ed29eb74f1356c602e59670cf82bfe8b0f564216ce091e163fbf7f0376aa1971806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83b6b55f25000000000000000000000000000000000000000000000000000000002e1a7d4d000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000024000000000000000000000000207a65726f00000000000000000000000000000000000000000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f778a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b1526fe2700000000000000000000000000000000000000000000000000000000215f6d61737465724368656600000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000001f1fcd5100000000000000000000000000000000000000000000000000000000494e56414c49445f57414e540000000000000000000000000000000000000000548fe255eb14d86b43af1c165d3a356a85be79136670fa5ff20aa3e0284afde7215f7661756c74000000000000000000000000000000000000000000000000002f0bfd95e6bf57fab22ace02a57c77bdabde00f81ccf61034ae4a915d3a47f4d494e20534554544c494e4700000000000000000000000000000000000000000077c7b8fc00000000000000000000000000000000000000000000000000000000d0e30db0000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000494e535546465f414d4f554e545f464f525f424f52524f5700000000000000004d616e6167657200000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20215f7769746864726177616e616765720000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20215f6c656e64696e674d61756c7400000000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20215f726573657276655668b42fcf63f2d28ae477b4539c3101ade5142acdcc91191a106d867f3554f28ac2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000006fdde0300000000000000000000000000000000000000000000000000000000574f4f466920537570657220436861726765722000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000007765000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff0000000000000000000000815d4517427fc940a90a5653cdcea1544c6283c9006167657200000000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20216163636573734d616e576f6f5375706572436861726765725661756c743a202177616e740000000000576f6f5375706572436861726765725661756c743a20217765746800000000004f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720200000000000000000000000000000000000020000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062657373000000000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220746f20746865207a65726f2061646472647265737300000000000000000000000000000000000000000000000000000045524332303a207472616e736665722066726f6d20746865207a65726f2061648c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925737300000000000000000000000000000000000000000000000000000000000045524332303a20617070726f766520746f20746865207a65726f206164647265726573730000000000000000000000000000000000000000000000000000000045524332303a20617070726f76652066726f6d20746865207a65726f2061646445524332303a20696e73756666696369656e7420616c6c6f77616e6365000000217069640000000000000000000000000000000000000000000000000000000093f1a40b000000000000000000000000000000000000000000000000000000005061757361626c653a20706175736564000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00a373ed4e000000000000000000000000000000000000000000000000000000000000000000000012725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f22494e53554646494349454e540000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a206d73672e76616c75655fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d745524332303a206d696e7420746f20746865207a65726f2061646472657373002173686172657300000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a2021616d6f756e74000000445f494e5f534554544c494e4700000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a204e4f545f414c4c4f5745871e6ca6000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000060000000000000000000000000672004d35ad2124f90299371ade95cf5594500e40705a7cf6eaf7c00b55a07ac576f6f5375706572436861726765725661756c743a204f55545f4f465f434150636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e730000000000000000000000000000000000000000000000000000000000000045524332303a206275726e2066726f6d20746865207a65726f20616464726573576f6f5375706572436861726765725661756c743a202157414e545f6e6577566e553f650000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000440000000000000000000000002f003beff7d020bbaf25c7b278041e72cadccf9e4eaad1805835be384f19df5f5661756c74000000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20216d6967726174696f6e576f6f5375706572436861726765725661756c743a20216f776e65720000000048445241575f494e5f534554544c494e47000000000000000000000000000000576f6f5375706572436861726765725661756c743a2043414e4e4f545f574954bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fdebeaa8785285a4f7c37a305351997dceebabc3c357dab98023dc37514a1b6ed641575f434f554e54000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a204d41585f574954484452d83e6b38000000000000000000000000000000000000000000000000000000000000000000000012725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f216e61676572000000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a20216c656e64696e674d61576f6f5375706572436861726765725661756c743a202141444d494e00000000494e5f534554544c494e47000000000000000000000000000000000000000000fce7d682dc90b7cc945fb8cfff947668bcf6d304aa58823b24d2c06dec38df6e21534554544c494e4700000000000000000000000000000000000000000000005745454b4c595f52455041595f4e4f545f434c454152454400000000000000009b927a9100000000000000000000000000000000000000000000000000000000805ee433ea4242be6315bc317b1bf10e767ad8beb03ee547773b3ee1f842c206bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fc21617661696c61626c655f616d6f756e745f666f725f776974686472617700002162617463685f6c656e677468000000000000000000000000000000000000007400000000000000000000000000000000000000000000000000000000000000576f6f5375706572436861726765725661756c743a202157414e545f7661756c62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2585db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa5061757361626c653a206e6f742070617573656400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff605354460000000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff805354000000000000000000000000000000000000000000000000000000000000095ea7b3000000000000000000000000000000000000000000000000000000005341000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe053544500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a910000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d400000000000000000000000035a62c09427be1bae622d4492b851338969721b5
-----Decoded View---------------
Arg [0] : _weth (address): 0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
Arg [1] : _want (address): 0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4
Arg [2] : _accessManager (address): 0x35a62C09427BE1BaE622d4492b851338969721B5
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
Arg [1] : 0000000000000000000000001d17cbcf0d6d143135ae902365d2e5e2a16538d4
Arg [2] : 00000000000000000000000035a62c09427be1bae622d4492b851338969721b5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.