More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,019,485 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 49244250 | 155 days ago | IN | 0.000077 ETH | 0.00002831 | ||||
Swap Exact ETH F... | 49235935 | 155 days ago | IN | 0.00066 ETH | 0.00001769 | ||||
Swap Exact ETH F... | 49231678 | 155 days ago | IN | 0.001063 ETH | 0.00002713 | ||||
Swap Exact ETH F... | 49225729 | 155 days ago | IN | 0.000376 ETH | 0.00002605 | ||||
Swap Exact ETH F... | 49220490 | 156 days ago | IN | 0.000176 ETH | 0.00003114 | ||||
Swap Exact ETH F... | 49216603 | 156 days ago | IN | 0.000177 ETH | 0.00002642 | ||||
Swap Exact ETH F... | 49211612 | 156 days ago | IN | 0.000284 ETH | 0.00002681 | ||||
Swap Exact ETH F... | 49198752 | 156 days ago | IN | 0.00013 ETH | 0.00002526 | ||||
Swap Exact ETH F... | 49194768 | 156 days ago | IN | 0.000202 ETH | 0.00002138 | ||||
Swap Exact ETH F... | 49179798 | 156 days ago | IN | 0.001064 ETH | 0.00002788 | ||||
Swap Exact ETH F... | 49157855 | 156 days ago | IN | 0.000199 ETH | 0.00002708 | ||||
Swap Exact ETH F... | 49153733 | 156 days ago | IN | 0.00066 ETH | 0.00001828 | ||||
Swap Exact ETH F... | 49140939 | 157 days ago | IN | 0.001516 ETH | 0.0000287 | ||||
Swap Exact ETH F... | 49121181 | 157 days ago | IN | 0.000124 ETH | 0.00002685 | ||||
Swap Exact ETH F... | 49111102 | 157 days ago | IN | 0.000182 ETH | 0.00001947 | ||||
Swap Exact ETH F... | 49104456 | 157 days ago | IN | 0.000483 ETH | 0.00002771 | ||||
Swap Exact ETH F... | 49097976 | 157 days ago | IN | 0.00051 ETH | 0.00002765 | ||||
Swap Exact ETH F... | 49094024 | 157 days ago | IN | 0.000135 ETH | 0.00003211 | ||||
Swap Exact ETH F... | 49080924 | 157 days ago | IN | 0.000291 ETH | 0.00002723 | ||||
Swap Exact ETH F... | 49069321 | 157 days ago | IN | 0.000582 ETH | 0.00001969 | ||||
Swap Exact ETH F... | 49061998 | 158 days ago | IN | 0.00025 ETH | 0.00003041 | ||||
Swap Exact ETH F... | 49058844 | 158 days ago | IN | 0.001209 ETH | 0.00002735 | ||||
Swap Exact ETH F... | 49048971 | 158 days ago | IN | 0.002245 ETH | 0.00003022 | ||||
Swap Exact Token... | 49036768 | 158 days ago | IN | 0 ETH | 0.00004847 | ||||
Swap Exact Token... | 48971964 | 159 days ago | IN | 0 ETH | 0.00001788 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
49244250 | 155 days ago | 0.000077 ETH | ||||
49244250 | 155 days ago | 0.000077 ETH | ||||
49244250 | 155 days ago | 0.000077 ETH | ||||
49235935 | 155 days ago | 0.00066 ETH | ||||
49235935 | 155 days ago | 0.00066 ETH | ||||
49235935 | 155 days ago | 0.00066 ETH | ||||
49231678 | 155 days ago | 0.001063 ETH | ||||
49231678 | 155 days ago | 0.001063 ETH | ||||
49231678 | 155 days ago | 0.001063 ETH | ||||
49225729 | 155 days ago | 0.000376 ETH | ||||
49225729 | 155 days ago | 0.000376 ETH | ||||
49225729 | 155 days ago | 0.000376 ETH | ||||
49220490 | 156 days ago | 0.000176 ETH | ||||
49220490 | 156 days ago | 0.000176 ETH | ||||
49220490 | 156 days ago | 0.000176 ETH | ||||
49216603 | 156 days ago | 0.000177 ETH | ||||
49216603 | 156 days ago | 0.000177 ETH | ||||
49216603 | 156 days ago | 0.000177 ETH | ||||
49211612 | 156 days ago | 0.000284 ETH | ||||
49211612 | 156 days ago | 0.000284 ETH | ||||
49211612 | 156 days ago | 0.000284 ETH | ||||
49198752 | 156 days ago | 0.00013 ETH | ||||
49198752 | 156 days ago | 0.00013 ETH | ||||
49198752 | 156 days ago | 0.00013 ETH | ||||
49194768 | 156 days ago | 0.000202 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:
Router
Compiler Version
v0.8.17+commit.8df45f5f
ZkSolc Version
v1.3.5
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IPair.sol"; import "./interfaces/IPairFactory.sol"; import "./interfaces/IRouter.sol"; import "./interfaces/IWETH.sol"; import {WrappedBribeFactory, WrappedBribe} from "./factories/WrappedBribeFactory.sol"; import {Pair} from "./Pair.sol"; import {WrappedExternalBribe} from "./WrappedExternalBribe.sol"; contract Router is IRouter, ReentrancyGuard { struct route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable weth; uint256 internal constant MINIMUM_LIQUIDITY = 10 ** 3; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "Router: EXPIRED"); _; } constructor(address _factory, address _weth) { factory = _factory; weth = IWETH(_weth); } receive() external payable { assert(msg.sender == address(weth)); // only accept ETH via fallback from the WETH contract } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, "Router: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "Router: ZERO_ADDRESS"); } // calculates the CREATE2 address for a pair without making any external nonReentrant calls function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); require(pair != address(0), "pair na"); return pair; } function unsafePairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); return pair; } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) { require(amountA > 0, "Router: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "Router: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * reserveB) / reserveA; } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint256 reserveA, uint256 reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1,) = IPair(unsafePairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint256 amountIn, address tokenIn, address tokenOut) external view returns (uint256 amount, bool stable) { address pair = unsafePairFor(tokenIn, tokenOut, true); uint256 amountStable; uint256 amountVolatile; if (IPairFactory(factory).isPair(pair)) { amountStable = IPair(pair).getAmountOut(amountIn, tokenIn); } pair = unsafePairFor(tokenIn, tokenOut, false); if (IPairFactory(factory).isPair(pair)) { amountVolatile = IPair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint256 amountIn, route[] memory routes) public view returns (uint256[] memory amounts) { require(routes.length >= 1, "Router: INVALID_PATH"); amounts = new uint256[](routes.length + 1); amounts[0] = amountIn; for (uint256 i = 0; i < routes.length; i++) { address pair = unsafePairFor(routes[i].from, routes[i].to, routes[i].stable); if (IPairFactory(factory).isPair(pair)) { amounts[i + 1] = IPair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) external view returns (bool) { return IPairFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired ) external view returns (uint256 amountA, uint256 amountB, uint256 liquidity) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); (uint256 reserveA, uint256 reserveB) = (0, 0); uint256 _totalSupply = 0; if (_pair != address(0)) { _totalSupply = IERC20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint256 amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } else { uint256 amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } } } function quoteRemoveLiquidity(address tokenA, address tokenB, bool stable, uint256 liquidity) external view returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0, 0); } (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB, stable); uint256 _totalSupply = IERC20(_pair).totalSupply(); amountA = (liquidity * reserveA) / _totalSupply; // using balances ensures pro-rata distribution amountB = (liquidity * reserveB) / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal returns (uint256 amountA, uint256 amountB) { require(amountADesired >= amountAMin); require(amountBDesired >= amountBMin); // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable); } (uint256 reserveA, uint256 reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IPair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable nonReentrant ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) { (amountToken, amountETH) = _addLiquidity(token, address(weth), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); address pair = pairFor(token, address(weth), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); weth.deposit{value: amountETH}(); assert(weth.transfer(pair, amountETH)); liquidity = IPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) { _safeTransferETH(msg.sender, msg.value - amountETH); } } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public nonReentrant ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = pairFor(tokenA, tokenB, stable); require(IPair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair uint256 balanceBeforeA = IERC20(tokenA).balanceOf(to); uint256 balanceBeforeB = IERC20(tokenB).balanceOf(to); IPair(pair).burn(to); amountA = IERC20(tokenA).balanceOf(to) - balanceBeforeA; amountB = IERC20(tokenB).balanceOf(to) - balanceBeforeB; require(amountA >= amountAMin, "Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) public ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(weth), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); weth.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external nonReentrant returns (uint256 amountA, uint256 amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint256 value = approveMax ? type(uint256).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external nonReentrant returns (uint256 amountToken, uint256 amountETH) { address pair = pairFor(token, address(weth), stable); uint256 value = approveMax ? type(uint256).max : liquidity; IPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(route[] memory routes, address _to) internal virtual { for (uint256 i = 0; i < routes.length; i++) { (address token0,) = sortTokens(routes[i].from, routes[i].to); IPair pair = IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); (uint256 reserve0, uint256 reserve1,) = pair.getReserves(); (uint256 reserveInput,) = routes[i].from == token0 ? (reserve0, reserve1) : (reserve1, reserve0); uint256 amountIn = IERC20(routes[i].from).balanceOf(address(pair)) - reserveInput; uint256 amountOut = pair.getAmountOut(amountIn, routes[i].from); (uint256 amount0Out, uint256 amount1Out) = routes[i].from == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; IPair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokensSimple( uint256 amountIn, uint256 amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { route[] memory routes = new route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; uint256 balanceBefore = IERC20(tokenTo).balanceOf(to); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0)) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pair, amountIn); _swap(routes, to); uint256 amountOut = IERC20(tokenTo).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { address tokenOut = routes[routes.length - 1].to; uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0)) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swap(routes, to); uint256 amountOut = IERC20(tokenOut).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactETHForTokens(uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline) external payable nonReentrant ensure(deadline) returns (uint256) { require(routes[0].from == address(weth), "Router: INVALID_PATH"); address tokenOut = routes[routes.length - 1].to; uint256 balanceBefore = IERC20(tokenOut).balanceOf(to); weth.deposit{value: msg.value}(); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); uint256 amountIn = msg.value; if (address(weBribe) != address(0)) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; uint256 bribeAmount = fee; WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } assert(weth.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); _swap(routes, to); uint256 amountOut = IERC20(tokenOut).balanceOf(to) - balanceBefore; require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256) { require(routes[routes.length - 1].to == address(weth), "Router: INVALID_PATH"); uint256 balanceBefore = IERC20(address(weth)).balanceOf(address(this)); address pair = pairFor(routes[0].from, routes[0].to, routes[0].stable); WrappedExternalBribe weBribe = WrappedExternalBribe(Pair(pair).externalBribe()); if (address(weBribe) != address(0)) { uint256 fee = (routes[0].stable ? 2 : 25) * amountIn / 10000; amountIn -= fee; _safeTransferFrom(routes[0].from, msg.sender, address(this), fee); uint256 bribeAmount = IERC20(routes[0].from).balanceOf(address(this)); WrappedBribe bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).oldBribeToNew( address(weBribe.underlying_bribe()) ) ); if (address(bribe) == address(0)) { bribe = WrappedBribe( WrappedBribeFactory(0xe490695Fafe699E85ff4b23bC9986cFE454B65F4).createBribe( address(weBribe.underlying_bribe()) ) ); } IERC20(routes[0].from).approve(address(bribe), bribeAmount); bribe.notifyRewardAmount(routes[0].from, bribeAmount); } _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swap(routes, address(this)); uint256 amountOut = IERC20(address(weth)).balanceOf(address(this)) - balanceBefore; weth.withdraw(amountOut); _safeTransferETH(to, amountOut); require(amountOut >= amountOutMin, "Router: INSUFFICIENT_OUTPUT_AMOUNT"); return amountOut; } function UNSAFE_swapExactTokensForTokens( uint256[] memory amounts, route[] calldata routes, address to, uint256 deadline ) external nonReentrant ensure(deadline) returns (uint256[] memory) { _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(routes, to); return amounts; } function _safeTransferETH(address to, uint256 value) internal { (bool success,) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// 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.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/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. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
uint256 constant VELOCORE_EPOCH_DURATION = 7 days;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "./interfaces/IBribe.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IGauge.sol"; import "./interfaces/IVoter.sol"; import "./interfaces/IVotingEscrow.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import {VELOCORE_EPOCH_DURATION} from "./Duration.sol"; // Bribes pay out rewards for a given pool based on the votes that were received from the user (goes hand in hand with Voter.vote()) contract ExternalBribe is IBribe { address public voter; // only voter can modify balances (since it only happens on vote()) address public _ve; // 天使のたまご uint256 internal constant DURATION = VELOCORE_EPOCH_DURATION; // rewards are released over the voting period uint256 internal constant MAX_REWARD_TOKENS = 16; uint256 public totalSupply; mapping(uint256 => uint256) public balanceOf; mapping(address => mapping(uint256 => uint256)) public tokenRewardsPerEpoch; mapping(address => uint256) public periodFinish; mapping(address => mapping(uint256 => uint256)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; /// @notice A checkpoint for marking balance struct Checkpoint { uint256 timestamp; uint256 balanceOf; } /// @notice A checkpoint for marking supply struct SupplyCheckpoint { uint256 timestamp; uint256 supply; } /// @notice A record of balance checkpoints for each account, by index mapping(uint256 => mapping(uint256 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(uint256 => uint256) public numCheckpoints; /// @notice A record of balance checkpoints for each token, by index mapping(uint256 => SupplyCheckpoint) public supplyCheckpoints; /// @notice The number of checkpoints uint256 public supplyNumCheckpoints; event Deposit(address indexed from, uint256 tokenId, uint256 amount); event Withdraw(address indexed from, uint256 tokenId, uint256 amount); event NotifyReward( address indexed from, address indexed reward, uint256 epoch, uint256 amount ); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); bool initialized; constructor() { initialized = true; } function initialize( address _voter, address[] memory _allowedRewardTokens ) external { require(!initialized, "1322"); initialized = true; voter = _voter; _unlocked = 1; _ve = IVoter(_voter)._ve(); for (uint256 i; i < _allowedRewardTokens.length; i++) { if (_allowedRewardTokens[i] != address(0)) { isReward[_allowedRewardTokens[i]] = true; rewards.push(_allowedRewardTokens[i]); } } } // simple re-entrancy check uint256 internal _unlocked; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint256 timestamp) internal pure returns (uint256) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint256 timestamp) public pure returns (uint256) { uint256 bribeStart = _bribeStart(timestamp); uint256 bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } /** * @notice Determine the prior balance for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param tokenId The token of the NFT to check * @param timestamp The timestamp to get the balance at * @return The balance the account had as of the given block */ function getPriorBalanceIndex( uint256 tokenId, uint256 timestamp ) public view returns (uint256) { uint256 nCheckpoints = numCheckpoints[tokenId]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[tokenId][nCheckpoints - 1].timestamp <= timestamp) { return (nCheckpoints - 1); } // Next check implicit zero balance if (checkpoints[tokenId][0].timestamp > timestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[tokenId][center]; if (cp.timestamp == timestamp) { return center; } else if (cp.timestamp < timestamp) { lower = center; } else { upper = center - 1; } } return lower; } function getPriorSupplyIndex( uint256 timestamp ) public view returns (uint256) { uint256 nCheckpoints = supplyNumCheckpoints; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (supplyCheckpoints[nCheckpoints - 1].timestamp <= timestamp) { return (nCheckpoints - 1); } // Next check implicit zero balance if (supplyCheckpoints[0].timestamp > timestamp) { return 0; } uint256 lower = 0; uint256 upper = nCheckpoints - 1; while (upper > lower) { uint256 center = upper - (upper - lower) / 2; // ceil, avoiding overflow SupplyCheckpoint memory cp = supplyCheckpoints[center]; if (cp.timestamp == timestamp) { return center; } else if (cp.timestamp < timestamp) { lower = center; } else { upper = center - 1; } } return lower; } function _writeCheckpoint(uint256 tokenId, uint256 balance) internal { uint256 _timestamp = block.timestamp; uint256 _nCheckPoints = numCheckpoints[tokenId]; if ( _nCheckPoints > 0 && checkpoints[tokenId][_nCheckPoints - 1].timestamp == _timestamp ) { checkpoints[tokenId][_nCheckPoints - 1].balanceOf = balance; } else { checkpoints[tokenId][_nCheckPoints] = Checkpoint( _timestamp, balance ); numCheckpoints[tokenId] = _nCheckPoints + 1; } } function _writeSupplyCheckpoint() internal { uint256 _nCheckPoints = supplyNumCheckpoints; uint256 _timestamp = block.timestamp; if ( _nCheckPoints > 0 && supplyCheckpoints[_nCheckPoints - 1].timestamp == _timestamp ) { supplyCheckpoints[_nCheckPoints - 1].supply = totalSupply; } else { supplyCheckpoints[_nCheckPoints] = SupplyCheckpoint( _timestamp, totalSupply ); supplyNumCheckpoints = _nCheckPoints + 1; } } function rewardsListLength() external view returns (uint256) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable( address token ) public view returns (uint256) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint256 tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], msg.sender, _reward); emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], _owner, _reward); emit ClaimRewards(_owner, tokens[i], _reward); } } function earned( address token, uint256 tokenId ) public view returns (uint256) { uint256 _startTimestamp = lastEarn[token][tokenId]; if (numCheckpoints[tokenId] == 0) { return 0; } uint256 _startIndex = getPriorBalanceIndex(tokenId, _startTimestamp); uint256 _endIndex = numCheckpoints[tokenId] - 1; uint256 reward = 0; // you only earn once per epoch (after it's over) Checkpoint memory prevRewards; // reuse struct to avoid stack too deep prevRewards.timestamp = _bribeStart(_startTimestamp); uint256 _prevSupply = 1; if (_endIndex > 0) { for (uint256 i = _startIndex; i <= _endIndex - 1; i++) { Checkpoint memory cp0 = checkpoints[tokenId][i]; uint256 _nextEpochStart = _bribeStart(cp0.timestamp); // check that you've earned it // this won't happen until a week has passed if (_nextEpochStart > prevRewards.timestamp) { reward += prevRewards.balanceOf; } prevRewards.timestamp = _nextEpochStart; _prevSupply = supplyCheckpoints[ getPriorSupplyIndex(_nextEpochStart + DURATION) ].supply; prevRewards.balanceOf = (cp0.balanceOf * tokenRewardsPerEpoch[token][_nextEpochStart]) / _prevSupply; } } Checkpoint memory cp = checkpoints[tokenId][_endIndex]; uint256 _lastEpochStart = _bribeStart(cp.timestamp); uint256 _lastEpochEnd = _lastEpochStart + DURATION; if (block.timestamp > _lastEpochEnd) { reward += (cp.balanceOf * tokenRewardsPerEpoch[token][_lastEpochStart]) / supplyCheckpoints[getPriorSupplyIndex(_lastEpochEnd)].supply; } return reward; } // This is an external function, but internal notation is used since it can only be called "internally" from Gauges function _deposit(uint256 amount, uint256 tokenId) external { require(msg.sender == voter); totalSupply += amount; balanceOf[tokenId] += amount; _writeCheckpoint(tokenId, balanceOf[tokenId]); _writeSupplyCheckpoint(); emit Deposit(msg.sender, tokenId, amount); } function _withdraw(uint256 amount, uint256 tokenId) external { require(msg.sender == voter); totalSupply -= amount; balanceOf[tokenId] -= amount; _writeCheckpoint(tokenId, balanceOf[tokenId]); _writeSupplyCheckpoint(); emit Withdraw(msg.sender, tokenId, amount); } function left(address token) external view returns (uint256) { uint256 adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint256 amount) external lock { require(amount > 0); if (!isReward[token]) { require( IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted" ); require( rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens" ); } // bribes kick in at the start of next bribe period uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; _safeTransferFrom(token, msg.sender, address(this), amount); tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function swapOutRewardToken( uint256 i, address oldToken, address newToken ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/utils/math/Math.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IPair.sol"; import "./interfaces/IPairCallee.sol"; import "./interfaces/IPairFactory.sol"; import "./interfaces/IBribe.sol"; // The base pair of pools, either stable or volatile contract Pair is IPair { string public name; string public symbol; uint8 public constant decimals = 18; // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public immutable stable; uint public totalSupply = 0; mapping(address => mapping(address => uint)) public allowance; mapping(address => uint) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; uint internal constant MINIMUM_LIQUIDITY = 10 ** 3; address public immutable token0; address public immutable token1; address immutable factory; address public externalBribe; address public voter; bool public hasGauge; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } // Capture oracle reading every 30 minutes uint constant periodSize = 1800; Observation[] public observations; uint internal immutable decimals0; uint internal immutable decimals1; uint public reserve0; uint public reserve1; uint public blockTimestampLast; uint public reserve0CumulativeLast; uint public reserve1CumulativeLast; event TankFees(address indexed token, uint amount, address tank); event GaugeFees(address indexed token, uint amount, address externalBribe); event Mint(address indexed sender, uint amount0, uint amount1); event Burn( address indexed sender, uint amount0, uint amount1, address indexed to ); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint reserve0, uint reserve1); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); event ExternalBribeSet(address indexed externalBribe); event HasGaugeSet(bool value); constructor() { factory = msg.sender; voter = IPairFactory(msg.sender).voter(); (address _token0, address _token1, bool _stable) = IPairFactory( msg.sender ).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); if (_stable) { name = string( abi.encodePacked( "StableV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol() ) ); symbol = string( abi.encodePacked( "sAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol() ) ); } else { name = string( abi.encodePacked( "VolatileV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol() ) ); symbol = string( abi.encodePacked( "vAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol() ) ); } decimals0 = 10 ** IERC20(_token0).decimals(); decimals1 = 10 ** IERC20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _safeApprove(address token, address spender, uint value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.approve.selector, spender, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function tank() public view returns (address) { return IPairFactory(factory).tank(); } function setExternalBribe(address _externalBribe) external { require( externalBribe == address(0), "External bribe has already been set." ); require(msg.sender == voter, "Only voter can set external bribe"); externalBribe = _externalBribe; _safeApprove(token0, externalBribe, type(uint).max); _safeApprove(token1, externalBribe, type(uint).max); emit ExternalBribeSet(_externalBribe); } function setHasGauge(bool value) external { require(msg.sender == voter, "Only voter can set has gauge"); hasGauge = value; emit HasGaugeSet(value); } function observationLength() external view returns (uint) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length - 1]; } function metadata() external view returns ( uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1 ) { return ( decimals0, decimals1, reserve0, reserve1, stable, token0, token1 ); } function tokens() external view returns (address, address) { return (token0, token1); } function _sendTokenFees(address token, uint amount) internal { if (amount != 0) { if (hasGauge) { IBribe(externalBribe).notifyRewardAmount(token, amount); // transfer fees to exBribes emit GaugeFees(token, amount, externalBribe); } else { address _tank = tank(); _safeTransfer(token, _tank, amount); // transfer the fees to tank MSig for gaugeless LPs emit TankFees(token, amount, _tank); } } } function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update( uint balance0, uint balance1, uint _reserve0, uint _reserve1 ) internal { uint blockTimestamp = block.timestamp; uint timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push( Observation( blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast ) ); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns ( uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp ) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values ( uint _reserve0, uint _reserve1, uint _blockTimestampLast ) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current( address tokenIn, uint amountIn ) external view returns (uint amountOut) { Observation memory _observation = lastObservation(); ( uint reserve0Cumulative, uint reserve1Cumulative, ) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length - 2]; } uint timeElapsed = block.timestamp - _observation.timestamp; uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } // as per `current`, however allows user configured granularity, up to the full window size function quote( address tokenIn, uint amountIn, uint granularity ) external view returns (uint amountOut) { uint[] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint priceAverageCumulative; for (uint i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices( address tokenIn, uint amountIn, uint points ) external view returns (uint[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample( address tokenIn, uint amountIn, uint points, uint window ) public view returns (uint[] memory) { uint[] memory _prices = new uint[](points); uint length = observations.length - 1; uint i = length - (points * window); uint nextIndex = 0; uint index = 0; for (; i < length; i += window) { nextIndex = i + window; uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut( amountIn, tokenIn, _reserve0, _reserve1 ); // index < length; length cannot overflow unchecked { index = index + 1; } } return _prices; } // this low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint liquidity) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); uint _balance0 = IERC20(token0).balanceOf(address(this)); uint _balance1 = IERC20(token1).balanceOf(address(this)); uint _amount0 = _balance0 - _reserve0; uint _amount1 = _balance1 - _reserve1; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min( (_amount0 * _totalSupply) / _reserve0, (_amount1 * _totalSupply) / _reserve1 ); } require(liquidity > 0, "ILM"); // Pair: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function burn( address to ) external lock returns (uint amount0, uint amount1) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint _balance0 = IERC20(_token0).balanceOf(address(this)); uint _balance1 = IERC20(_token1).balanceOf(address(this)); uint _liquidity = balanceOf[address(this)]; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = (_liquidity * _balance0) / _totalSupply; // using balances ensures pro-rata distribution amount1 = (_liquidity * _balance1) / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, "ILB"); // Pair: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); _update(_balance0, _balance1, _reserve0, _reserve1); emit Burn(msg.sender, amount0, amount1, to); } // this low-level function should be called from a contract which performs important safety checks function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external lock { require(!IPairFactory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, "IOA"); // Pair: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, "IL"); // Pair: INSUFFICIENT_LIQUIDITY uint _balance0; uint _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, "IT"); // Pair: INVALID_TO if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IPairCallee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); } uint amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "IIA"); // Pair: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _sendTokenFees( token0, (amount0In * IPairFactory(factory).getFee(stable)) / 10000 ); if (amount1In > 0) _sendTokenFees( token1, (amount1In * IPairFactory(factory).getFee(stable)) / 10000 ); _balance0 = IERC20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = IERC20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), "K"); // Pair: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer( _token0, to, IERC20(_token0).balanceOf(address(this)) - (reserve0) ); _safeTransfer( _token1, to, IERC20(_token1).balanceOf(address(this)) - (reserve1) ); } // force reserves to match balances function sync() external lock { _update( IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1 ); } function _f(uint x0, uint y) internal pure returns (uint) { return (x0 * ((((y * y) / 1e18) * y) / 1e18)) / 1e18 + (((((x0 * x0) / 1e18) * x0) / 1e18) * y) / 1e18; } function _d(uint x0, uint y) internal pure returns (uint) { return (3 * x0 * ((y * y) / 1e18)) / 1e18 + ((((x0 * x0) / 1e18) * x0) / 1e18); } function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) { for (uint i = 0; i < 255; i++) { uint y_prev = y; uint k = _f(x0, y); if (k < xy) { uint dy = ((xy - k) * 1e18) / _d(x0, y); y = y + dy; } else { uint dy = ((k - xy) * 1e18) / _d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut( uint amountIn, address tokenIn ) external view returns (uint) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); amountIn -= (amountIn * IPairFactory(factory).getFee(stable)) / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut( uint amountIn, address tokenIn, uint _reserve0, uint _reserve1 ) internal view returns (uint) { if (stable) { uint xy = _k(_reserve0, _reserve1); _reserve0 = (_reserve0 * 1e18) / decimals0; _reserve1 = (_reserve1 * 1e18) / decimals1; (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? (amountIn * 1e18) / decimals0 : (amountIn * 1e18) / decimals1; uint y = reserveB - _get_y(amountIn + reserveA, xy, reserveB); return (y * (tokenIn == token0 ? decimals1 : decimals0)) / 1e18; } else { (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return (amountIn * reserveB) / (reserveA + amountIn); } } function _k(uint x, uint y) internal view returns (uint) { if (stable) { uint _x = (x * 1e18) / decimals0; uint _y = (y * 1e18) / decimals1; uint _a = (_x * _y) / 1e18; uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return (_a * _b) / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint amount) internal { totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint amount) internal { totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "Pair: EXPIRED"); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline ) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "Pair: INVALID_SIGNATURE" ); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom( address src, address dst, uint amount ) external returns (bool) { address spender = msg.sender; uint spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint).max) { uint newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint amount) internal { balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/utils/math/Math.sol"; import "./ExternalBribe.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IGauge.sol"; import "./interfaces/IVoter.sol"; import "./interfaces/IVotingEscrow.sol"; // Bribes pay out rewards for a given pool based on the votes that were received from the user (goes hand in hand with Voter.vote()) contract WrappedBribe { address public immutable voter; address public immutable _ve; ExternalBribe public underlying_bribe; uint internal constant DURATION = 7 days; // rewards are released over the voting period uint internal constant MAX_REWARD_TOKENS = 4; mapping(address => mapping(uint => uint)) public tokenRewardsPerEpoch; mapping(address => uint) public periodFinish; mapping(address => mapping(uint => uint)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; mapping(address => uint) public tokenRewardBalance; /// @notice A checkpoint for marking balance struct RewardCheckpoint { uint timestamp; uint balance; } event NotifyReward( address indexed from, address indexed reward, uint epoch, uint amount ); event ClaimRewards( address indexed from, address indexed reward, uint amount ); event HandleLeftOverRewards( address indexed reward, uint originalEpoch, uint updatedEpoch, uint amount ); constructor(address _voter, address _old_bribe) { voter = _voter; _ve = IVoter(_voter)._ve(); underlying_bribe = ExternalBribe(_old_bribe); for (uint i; i < underlying_bribe.rewardsListLength(); i++) { address underlying_reward = underlying_bribe.rewards(i); if (underlying_reward != address(0)) { isReward[underlying_reward] = true; rewards.push(underlying_reward); } } } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint timestamp) internal pure returns (uint) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint timestamp) public pure returns (uint) { uint bribeStart = _bribeStart(timestamp); uint bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } function rewardsListLength() external view returns (uint) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable( address token ) public view returns (uint) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); uint256 balanceBefore; for (uint i = 0; i < tokens.length; i++) { uint _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) { balanceBefore = IERC20(tokens[i]).balanceOf(address(this)); _safeTransfer(tokens[i], msg.sender, _reward); tokenRewardBalance[tokens[i]] -= balanceBefore - IERC20(tokens[i]).balanceOf(address(this)); } emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner( uint tokenId, address[] memory tokens ) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); uint256 balanceBefore; for (uint i = 0; i < tokens.length; i++) { uint _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) { balanceBefore = IERC20(tokens[i]).balanceOf(address(this)); _safeTransfer(tokens[i], _owner, _reward); tokenRewardBalance[tokens[i]] -= balanceBefore - IERC20(tokens[i]).balanceOf(address(this)); } emit ClaimRewards(_owner, tokens[i], _reward); } } function earned(address token, uint tokenId) public view returns (uint) { if (underlying_bribe.numCheckpoints(tokenId) == 0) { return 0; } uint reward = 0; uint _ts = 0; uint _bal = 0; uint _supply = 1; uint _index = 0; uint _currTs = _bribeStart(lastEarn[token][tokenId]); // take epoch last claimed in as starting point _index = underlying_bribe.getPriorBalanceIndex(tokenId, _currTs); (_ts, _bal) = underlying_bribe.checkpoints(tokenId, _index); // accounts for case where lastEarn is before first checkpoint _currTs = Math.max(_currTs, _bribeStart(_ts)); // get epochs between current epoch and first checkpoint in same epoch as last claim uint numEpochs = (_bribeStart(block.timestamp) - _currTs) / DURATION; if (numEpochs > 0) { for (uint256 i = 0; i < numEpochs; i++) { // get index of last checkpoint in this epoch _index = underlying_bribe.getPriorBalanceIndex( tokenId, _currTs + DURATION ); // get checkpoint in this epoch (_ts, _bal) = underlying_bribe.checkpoints(tokenId, _index); // get supply of last checkpoint in this epoch (, _supply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex(_currTs + DURATION) ); if (_supply != 0) { reward += (_bal * tokenRewardsPerEpoch[token][_currTs]) / _supply; } _currTs += DURATION; } } return reward; } function left(address token) external view returns (uint) { uint adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint amount) external lock { require(amount > 0); if (!isReward[token]) { require( IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted" ); require( rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens" ); } // bribes kick in at the start of next bribe period uint adjustedTstamp = getEpochStart(block.timestamp); uint epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; uint256 balanceBefore = IERC20(token).balanceOf(address(this)); _safeTransferFrom(token, msg.sender, address(this), amount); uint256 balanceAfter = IERC20(token).balanceOf(address(this)); amount = balanceAfter - balanceBefore; tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; tokenRewardBalance[token] += amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function updateRewardAmount(address[] memory tokens) external lock { uint256 length = tokens.length; uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 rewardBalance; uint256 difference; for (uint256 i = 0; i < length; ) { rewardBalance = tokenRewardBalance[tokens[i]]; difference = IERC20(tokens[i]).balanceOf(address(this)) - rewardBalance; if (difference != 0) { tokenRewardsPerEpoch[tokens[i]][adjustedTstamp] += difference; tokenRewardBalance[tokens[i]] = rewardBalance + difference; periodFinish[tokens[i]] = adjustedTstamp + DURATION; emit NotifyReward( msg.sender, tokens[i], adjustedTstamp, difference ); } unchecked { ++i; } } } // This is an external function that can only be called by teams to handle unclaimed rewards due to zero vote function handleLeftOverRewards( uint epochTimestamp, address[] memory tokens ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); // require that supply of that epoch to be ZERO uint epochStart = getEpochStart(epochTimestamp); (uint _ts, uint _supply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex(epochStart + DURATION) ); if (epochStart + DURATION > _bribeStart(_ts)) { require(_supply == 0, "this epoch has votes"); } // do sth like notifyRewardAmount uint length = tokens.length; for (uint i = 0; i < length; ) { // check bribe amount uint previousEpochRewards = tokenRewardsPerEpoch[tokens[i]][ epochStart ]; require(previousEpochRewards != 0, "no bribes for this epoch"); // get timestamp of current epoch uint adjustedTstamp = getEpochStart(block.timestamp); // get notified reward of current epoch uint currentEpochRewards = tokenRewardsPerEpoch[tokens[i]][ adjustedTstamp ]; // add previous unclaimed rewards to current epoch tokenRewardsPerEpoch[tokens[i]][adjustedTstamp] = currentEpochRewards + previousEpochRewards; // remove token rewards from previous epoch tokenRewardsPerEpoch[tokens[i]][epochStart] = 0; // amend period finish periodFinish[tokens[i]] = adjustedTstamp + DURATION; emit HandleLeftOverRewards( tokens[i], epochStart, adjustedTstamp, previousEpochRewards ); unchecked { ++i; } } } function swapOutRewardToken( uint i, address oldToken, address newToken ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/utils/math/Math.sol"; import "./ExternalBribe.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/IGauge.sol"; import "./interfaces/IVoter.sol"; import "./interfaces/IVotingEscrow.sol"; import {VELOCORE_EPOCH_DURATION} from "./Duration.sol"; // Bribes pay out rewards for a given pool based on the votes that were received from the user (goes hand in hand with Voter.vote()) contract WrappedExternalBribe { address public voter; address public _ve; ExternalBribe public underlying_bribe; uint256 internal constant DURATION = VELOCORE_EPOCH_DURATION; //7 days; // rewards are released over the voting period uint256 internal constant MAX_REWARD_TOKENS = 16; uint256 internal constant PRECISION = 10 ** 18; mapping(address => mapping(uint256 => uint256)) public tokenRewardsPerEpoch; mapping(address => uint256) public periodFinish; mapping(address => mapping(uint256 => uint256)) public lastEarn; address[] public rewards; mapping(address => bool) public isReward; /// @notice A checkpoint for marking balance struct RewardCheckpoint { uint256 timestamp; uint256 balance; } event NotifyReward( address indexed from, address indexed reward, uint256 epoch, uint256 amount ); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); bool initialized; constructor() { initialized = true; } function initialize(address _voter, address _old_bribe) external { require(!initialized, "1022"); initialized = true; _unlocked = 1; voter = _voter; _ve = IVoter(_voter)._ve(); underlying_bribe = ExternalBribe(_old_bribe); for (uint256 i; i < underlying_bribe.rewardsListLength(); i++) { address underlying_reward = underlying_bribe.rewards(i); if (underlying_reward != address(0)) { isReward[underlying_reward] = true; rewards.push(underlying_reward); } } } // simple re-entrancy check uint256 internal _unlocked; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _bribeStart(uint256 timestamp) internal pure returns (uint256) { return timestamp - (timestamp % (7 days)); } function getEpochStart(uint256 timestamp) public pure returns (uint256) { uint256 bribeStart = _bribeStart(timestamp); uint256 bribeEnd = bribeStart + DURATION; return timestamp < bribeEnd ? bribeStart : bribeStart + 7 days; } function rewardsListLength() external view returns (uint256) { return rewards.length; } // returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable( address token ) public view returns (uint256) { return Math.min(block.timestamp, periodFinish[token]); } // allows a user to claim rewards for a given token function getReward(uint256 tokenId, address[] memory tokens) external lock { require(IVotingEscrow(_ve).isApprovedOrOwner(msg.sender, tokenId)); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], msg.sender, _reward); emit ClaimRewards(msg.sender, tokens[i], _reward); } } // used by Voter to allow batched reward claims function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external lock { require(msg.sender == voter); address _owner = IVotingEscrow(_ve).ownerOf(tokenId); for (uint256 i = 0; i < tokens.length; i++) { uint256 _reward = earned(tokens[i], tokenId); lastEarn[tokens[i]][tokenId] = block.timestamp; if (_reward > 0) _safeTransfer(tokens[i], _owner, _reward); emit ClaimRewards(_owner, tokens[i], _reward); } } function earned( address token, uint256 tokenId ) public view returns (uint256) { uint256 _startTimestamp = lastEarn[token][tokenId]; if (underlying_bribe.numCheckpoints(tokenId) == 0) { return 0; } uint256 _startIndex = underlying_bribe.getPriorBalanceIndex( tokenId, _startTimestamp ); uint256 _endIndex = underlying_bribe.numCheckpoints(tokenId) - 1; uint256 reward = 0; // you only earn once per epoch (after it's over) RewardCheckpoint memory prevRewards; prevRewards.timestamp = _bribeStart(_startTimestamp); uint256 _prevTs = 0; uint256 _prevBal = 0; uint256 _prevSupply = 1; if (_endIndex > 0) { for (uint256 i = _startIndex; i <= _endIndex - 1; i++) { (_prevTs, _prevBal) = underlying_bribe.checkpoints(tokenId, i); uint256 _nextEpochStart = _bribeStart(_prevTs); // check that you've earned it // this won't happen until a week has passed if (_nextEpochStart > prevRewards.timestamp) { reward += prevRewards.balance; } prevRewards.timestamp = _nextEpochStart; (, _prevSupply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex( _nextEpochStart + DURATION ) ); prevRewards.balance = (_prevBal * tokenRewardsPerEpoch[token][_nextEpochStart]) / _prevSupply; } } (_prevTs, _prevBal) = underlying_bribe.checkpoints(tokenId, _endIndex); uint256 _lastEpochStart = _bribeStart(_prevTs); uint256 _lastEpochEnd = _lastEpochStart + DURATION; if ( block.timestamp > _lastEpochEnd && _startTimestamp < _lastEpochEnd ) { (, _prevSupply) = underlying_bribe.supplyCheckpoints( underlying_bribe.getPriorSupplyIndex(_lastEpochEnd) ); reward += (_prevBal * tokenRewardsPerEpoch[token][_lastEpochStart]) / _prevSupply; } return reward; } function left(address token) external view returns (uint256) { uint256 adjustedTstamp = getEpochStart(block.timestamp); return tokenRewardsPerEpoch[token][adjustedTstamp]; } function notifyRewardAmount(address token, uint256 amount) external lock { require(amount > 0); if (!isReward[token]) { require( IVoter(voter).isWhitelisted(token), "bribe tokens must be whitelisted" ); require( rewards.length < MAX_REWARD_TOKENS, "too many rewards tokens" ); } // bribes kick in at the start of next bribe period uint256 adjustedTstamp = getEpochStart(block.timestamp); uint256 epochRewards = tokenRewardsPerEpoch[token][adjustedTstamp]; uint256 balanceBefore = IERC20(token).balanceOf(address(this)); _safeTransferFrom(token, msg.sender, address(this), amount); uint256 balanceAfter = IERC20(token).balanceOf(address(this)); amount = balanceAfter - balanceBefore; tokenRewardsPerEpoch[token][adjustedTstamp] = epochRewards + amount; periodFinish[token] = adjustedTstamp + DURATION; if (!isReward[token]) { isReward[token] = true; rewards.push(token); } emit NotifyReward(msg.sender, token, adjustedTstamp, amount); } function swapOutRewardToken( uint256 i, address oldToken, address newToken ) external { require(msg.sender == IVotingEscrow(_ve).team(), "only team"); require(rewards[i] == oldToken); isReward[oldToken] = false; isReward[newToken] = true; rewards[i] = newToken; } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(IERC20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom( address token, address from, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector( IERC20.transferFrom.selector, from, to, value ) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {WrappedBribe} from "../WrappedBribe.sol"; contract WrappedBribeFactory { using SafeERC20 for IERC20; address public immutable voter; mapping(address => address) public oldBribeToNew; address public last_bribe; constructor(address _voter) { voter = _voter; } function notifyRewardAmount(address existing_bribe, IERC20 token, uint256 amount) external returns (address) { if (oldBribeToNew[existing_bribe] == address(0)) { createBribe(existing_bribe); } token.safeTransferFrom(msg.sender, address(this), amount); token.approve(oldBribeToNew[existing_bribe], amount); WrappedBribe(oldBribeToNew[existing_bribe]).notifyRewardAmount(address(token), amount); } function createBribe(address existing_bribe) public returns (address) { require(oldBribeToNew[existing_bribe] == address(0), "Wrapped bribe already created"); last_bribe = address(new WrappedBribe(voter, existing_bribe)); oldBribeToNew[existing_bribe] = last_bribe; return last_bribe; } }
pragma solidity ^0.8.13; interface IBribe { function _deposit(uint256 amount, uint256 tokenId) external; function _withdraw(uint256 amount, uint256 tokenId) external; function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external; function notifyRewardAmount(address token, uint256 amount) external; //keep same as external bribe function left(address token) external view returns (uint256); }
pragma solidity ^0.8.13; interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); function allowance( address owner, address spender ) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); }
pragma solidity ^0.8.13; interface IGauge { function notifyRewardAmount(address token, uint amount) external; function getReward(address account, address[] memory tokens) external; function left(address token) external view returns (uint); function isForPair() external view returns (bool); function stake() external view returns (address); }
pragma solidity ^0.8.13; interface IPair { function metadata() external view returns ( uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1 ); function setExternalBribe(address _externalBribe) external; function setHasGauge(bool value) external; function tokens() external returns (address, address); function transferFrom( address src, address dst, uint amount ) external returns (bool); function permit( address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s ) external; function swap( uint amount0Out, uint amount1Out, address to, bytes calldata data ) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); }
pragma solidity ^0.8.13; interface IPairCallee { function hook( address sender, uint amount0, uint amount1, bytes calldata data ) external; }
pragma solidity ^0.8.13; interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function voter() external view returns (address); function tank() external view returns (address); function getInitializable() external view returns (address, address, bool); function getFee(bool _stable) external view returns (uint256); function isPaused() external view returns (bool); function getPair( address tokenA, address token, bool stable ) external view returns (address); function createPair( address tokenA, address tokenB, bool stable ) external returns (address pair); }
pragma solidity ^0.8.13; interface IRouter { function pairFor( address tokenA, address tokenB, bool stable ) external view returns (address pair); }
pragma solidity ^0.8.13; interface IVoter { function _ve() external view returns (address); function governor() external view returns (address); function emergencyCouncil() external view returns (address); function attachTokenToGauge(uint _tokenId, address account) external; function detachTokenFromGauge(uint _tokenId, address account) external; function emitDeposit(uint _tokenId, address account, uint amount) external; function emitWithdraw(uint _tokenId, address account, uint amount) external; function isWhitelisted(address token) external view returns (bool); function notifyRewardAmount(uint amount) external; function distribute(address _gauge) external; }
pragma solidity ^0.8.13; interface IVotingEscrow { struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } function token() external view returns (address); function team() external returns (address); function epoch() external view returns (uint); function point_history(uint loc) external view returns (Point memory); function user_point_history( uint tokenId, uint loc ) external view returns (Point memory); function user_point_epoch(uint tokenId) external view returns (uint); function ownerOf(uint) external view returns (address); function isApprovedOrOwner(address, uint) external view returns (bool); function transferFrom(address, address, uint) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; function attach(uint tokenId) external; function detach(uint tokenId) external; function checkpoint() external; function deposit_for(uint tokenId, uint value) external; function create_lock_for(uint, uint, address) external returns (uint); function balanceOfNFT(uint) external view returns (uint); function totalSupply() external view returns (uint); }
pragma solidity ^0.8.13; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
{ "compilerPath": "./zksolc", "experimental": {}, "forceEvmla": false, "isSystem": false, "libraries": {}, "optimizer": { "enabled": true, "mode": "3" } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct Router.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"unsafePairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
9c4d535b000000000000000000000000000000000000000000000000000000000000000001000d5700614b4aaa007778cc63f9d58d176cf517d77aa0e5ce81aa2f64c98500000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e140eac2bb748c8f456719a457f26636617bb0e90000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
Deployed Bytecode
0x000400000000000200020000000000020000000003010019000000600330027000000d01043001970003000000410355000200000001035500000d010030019d000100000000001f00000001012001900000000c0000c13d33fe00f50000040f0000000001000416000000000110004c000000450000c13d0000000001000031000000df02100039000000200300008a000000000232016f000000bf0320008c0000001c0000213d00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000400020043f0000001f0210018f000000020300036700000005041002720000002a0000613d00000000050000190000000506500210000000000763034f000000000707043b000000c00660003900000000007604350000000105500039000000000645004b000000220000413d000000000520004c000000390000613d0000000504400210000000000343034f0000000302200210000000c004400039000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f000000000024043500000d0202000041000000400310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000000480000613d0000000001000019000000000200001933fe00ec0000040f000000c001000039000200000001001d33fe2cd90000040f000100000001001d000000e00100003933fe2cd90000040f0000000102000039000000000020041b0000000102000029000000800020043f00000d0301100197000000a00010043f000000800100043d000001400000044300000160001004430000002001000039000000a00200043d0000018000100443000001a000200443000001000010044300000002010000390000012000100443000001000100003900000d0403000041000000020200002933fe00e20000040f0002000000000002000200000006001d000100000005001d00000d010500004100000d010630009c0000000003058019000000400330021000000d010640009c00000000040580190000006004400210000000000334019f00000d010410009c0000000001058019000000c001100210000000000113019f33fe33f40000040f00000001090000290000000003010019000000600330027000000d01033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000850000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000007d0000413d000000010220018f000000000640004c000000950000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d0002000000000002000200000006001d000100000005001d00000d010500004100000d010630009c0000000003058019000000400330021000000d010640009c00000000040580190000006004400210000000000334019f00000d010410009c0000000001058019000000c001100210000000000113019f33fe33f90000040f00000001090000290000000003010019000000600330027000000d01033001970000000205000029000000000453004b00000000050340190000001f0450018f0000000505500272000000bc0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000000b40000413d000000010220018f000000000640004c000000cc0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000100000003001f00030000000103550000000001020019000000000001042d000000000301001900000d0101000041000000000400041400000d010540009c0000000001044019000000c0011002100000006002200210000000000112001900000d0601100041000000000203001933fe33f90000040f0000000102200190000000df0000613d000000000101043b000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d010400004100000d010510009c00000000010480190000004001100210000000000131001900000d010320009c000000000204801900000060022002100000000001210019000033ff0001042e00000d010300004100000d010420009c000000000203801900000d010410009c000000000103801900000040011002100000006002200210000000000112019f000034000001043000120000000000020000008001000039000000400010043f0000000002000031000000040120008c000000000900041200000000060004110000018b0000413d001200000000001d0000000203000367000000000103043b000000e00110027000000d080410009c000007af0000613d00000d090410009c0000000005000410000005bc0000613d00000d0a0410009c000005790000613d00000d0b0410009c000008110000613d00000d0c0410009c000006d00000613d00000d0d0410009c000004f10000613d00000d0e0410009c000001a00000613d00000d0f0410009c000004060000613d00000d100410009c000001c00000613d00000d110410009c0000061c0000613d00000d120410009c0000028b0000613d00000d130410009c000002340000613d00000d140310009c000006f50000613d00000d150310009c000002ad0000613d00000d160310009c0000073e0000613d00000d170310009c000004700000613d000e00000009001d00000d180310009c0000067e0000613d00000d190210009c0000059b0000613d00000d1a0210009c0000026b0000613d001000000005001d00000d1b0210009c000004270000613d00000d1c0210009c0000000e05000029000003b20000613d00000d1d0110009c000028dc0000c13d0000000001000416000000000110004c000028dc0000c13d000000000100003133fe2d1b0000040f000c00000001001d000b00000002001d000e00000003001d001100000004001d000d00000005001d000f00000006001d33fe30840000040f00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000000f02000029000000000112004b0000000001000019000000010100803933fe30730000040f0000001102000029000000000120004c000005940000613d00000060212000c90000000e020000290000000001210019000000400110008a0000000201100367000000000101043b000f00000001001d00000d030110009c000028dc0000213d000000400300043d00000d1f0100004100000000001304350000000d0100002900000d03021001970000000401300039000900000002001d000000000021043500000000010004140000000f02000029000000040420008c000009db0000613d00000024040000390000002006000039000a00000003001d0000000a0500002933fe00990000040f0000000a03000029000000000110004c000009db0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000017a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000001720000413d000000000520004c000001890000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000000120004c000028dc0000c13d00000d0701000041000000000010043900000004009004430000002001000039000000240010044300008005010000390000004402000039001100000006001d33fe00d00000040f00000d03011001970000001102000029000000000112004b0000000001000019000000010100603933fe2dcf0000040f00000000010000190000000002000019000000000300001933fe00e20000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000600310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d33fe2ce00000040f001100000001001d33fe2ce90000040f001000000001001d33fe2cf20000040f00000000030100190000001101000029000000100200002933fe2e020000040f00000d0302100197000000400100043d00000000002104350000002002000039000000000300001933fe00e20000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000001200310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d000000020100036700110000000103530000000401100370000000000101043b001000000001001d00000d030110009c000028dc0000213d000000110100035f0000002401100370000000000101043b000f00000001001d00000d030110009c000028dc0000213d000000110100035f0000004401100370000000000201043b000000000120004c0000000001000019000000010100c039000e00000002001d000000000112004b000028dc0000c13d000000110100035f000000e401100370000000000101043b000d00000001001d00000d030110009c000028dc0000213d33fe30840000040f000000110100035f0000010401100370000000000101043b001100000001001d00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000001102000029000000000112004b0000000001000019000000010100803933fe30730000040f0000000201000367000000c402100370000000000702043b000000a402100370000000000602043b0000008402100370000000000502043b0000006401100370000000000401043b00000010010000290000000f020000290000000e0300002933fe30ba0000040f000c00000001001d000b00000002001d00000010010000290000000f020000290000000e0300002933fe2e020000040f0000000003010019001100000003001d0000000002000411000e00000002001d00000010010000290000000c0400002933fe339e0000040f0000000f010000290000000e0200002900000011030000290000000b0400002933fe339e0000040f00000d3501000041000000400900043d000000000019043500000004019000390000000d02000029000000000021043500000000010004140000001203000029000000110200002900000d0305200197000000040250008c001100000003001d00000df60000613d000000000230004c001000000009001d00000d9c0000c13d0000002404000039000000200600003900000000020500190000000003090019000000000509001933fe00620000040f0000001009000029000000000201001900000dcf0000013d000000040120008a00000d0204000041000000800510008c0000000005000019000000000504401900000d0201100197000000000610004c000000000400a01900000d020110009c00000000010500190000000001046019000000000110004c000028dc0000c13d0000002401300370000000000101043b00000d200310009c000028dc0000213d0000000401100039000e00000009001d33fe2cfe0000040f000f00000001001d001100000002001d000000020100036700100000000103530000004401100370000000000101043b000d00000001001d00000d030110009c000028dc0000213d33fe30840000040f000000100100035f0000006401100370000000000101043b001000000001001d00000d1e0100004100000000001004390000800b010000390000000402000039000c00000002001d33fe00d00000040f0000001002000029000000000112004b0000000001000019000000010100803933fe30730000040f0000001101000029000000000110004c00000a9e0000c13d00000d050100004100000000001004350000003201000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000600310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d33fe2ce00000040f001100000001001d33fe2ce90000040f001000000001001d33fe2cf20000040f00000000030100190000001101000029000000100200002933fe2e7e0000040f00000d0302100197000000400100043d00000000002104350000002002000039000000000300001933fe00e20000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000600310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d33fe2ce00000040f001100000001001d33fe2ce90000040f001000000001001d33fe2cf20000040f00000000030100190000001101000029000000100200002933fe2f010000040f000000400300043d00000020043000390000000000240435000000000013043500000040020000390000000001030019000000000300001933fe00e20000040f0000000001000416000000000110004c000028dc0000c13d0000000003000031000000040130008a00000d0202000041000000400410008c0000000004000019000000000402401900000d0201100197000000000510004c000000000200a01900000d020110009c00000000010400190000000001026019000000000110004c000028dc0000c13d00000002020003670000002401200370000000000101043b00000d200410009c000028dc0000213d000000230410003900000d0205000041000000000634004b0000000006000019000000000605801900000d020730019700000d0204400197000000000874004b0000000005008019000000000474013f00000d020440009c00000000040600190000000004056019000000000440004c000028dc0000c13d000e00000009001d0000000404100039000000000242034f000000000202043b000000240110003933fe2d560000040f000f00000001001d0000000002010433000000000120004c0000000001000019000000010100c03933fe2f5d0000040f0000000f010000290000000001010433000000010110003a000000000200001900000001020060390000000102200190000005940000c13d00000d200210009c000009980000213d00000005031002100000003f02300039000000200400008a000000000242016f000000400400043d0000000002240019001000000004001d000000000442004b0000000004000019000000010400403900000d200520009c000009980000213d0000000104400190000009980000c13d000000400020043f000000100200002900000000001204350000001f0130018f0000002007200039000000000200003100000002022003670000000503300272000003070000613d000000000400001900000005054002100000000006570019000000000552034f000000000505043b00000000005604350000000104400039000000000534004b000002ff0000413d000000000410004c000003160000613d0000000503300210000000000232034f00000000033700190000000301100210000000000403043300000000041401cf000000000414022f000000000202043b0000010001100089000000000212022f00000000011201cf000000000141019f000000000013043500000010010000290000000001010433000000000110004c000002640000613d00000004010000390000000201100367000000000101043b00000000001704350000001201000029001100000001001d00000d070100004100000000001004390000000e010000290000000400100443000000240000044300008005010000390000004402000039000900000007001d33fe00d00000040f0000000f020000290000002002200039000a00000002001d000000110200002900000d0301100197000c00000001001d0000000f010000290000000001010433000000000112004b000010cb0000813d001100000002001d00000005022002100000000a01000029000d00000002001d0000000001210019000e00000001001d0000000003010433000000000103043300000d03011001970000002002300039000000000202043300000d030220019700000040033000390000000003030433000000000330004c0000000003000019000000010300c03933fe2e7e0000040f00000d2b02000041000000400500043d000000000025043500000d03071001970000000401500039000000000071043500000000010004140000000c02000029000000040220008c0000035b0000613d000000240400003900000020060000390000000c020000290000000003050019000b00000005001d0000000b05000029000800000007001d33fe00990000040f0000000b050000290000000807000029000000000110004c000011de0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003520019000000000223004b0000000002000019000000010200403900000d200430009c0000000904000029000009980000213d0000000102200190000009980000c13d000000400030043f000000200110008c000028dc0000413d0000000001050433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000011020000290000000106200039000003b00000613d00000010010000290000000001010433000000000121004b000002640000a13d0000000f010000290000000001010433000000000121004b000002640000a13d0000000d01000029000000000114001900000000020104330000000e010000290000000001010433000000000101043300000d3b04000041000000000043043500000d030510019700000024043000390000000001000414000000000054043500000004043000390000000000240435000000040270008c0000039a0000613d0000004404000039000e00000006001d00000020060000390000000002070019001100000003001d000000110500002933fe00990000040f0000000e060000290000001103000029000000000110004c000013d80000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d200420009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000010010000290000000001010433000000000161004b000002640000a13d00000005016002100000001002000029000000000121001900000020011000390000000002030433000000000021043500000000020600190000032f0000013d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000200310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d00000004010000390000000201100367000000000101043b00000d030210009c000028dc0000213d000000400300043d00000d2b020000410000000000230435001100000003001d000000040230003900000000001204350000000001000414001000000001001d00000d07010000410000000000100439000000040050044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c000009be0000613d0000002404000039000000200600003900000010010000290000001103000029000000000503001933fe00990000040f000000000110004c000009be0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000003f50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000003ed0000413d000000000520004c000004040000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000400310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d33fe2ce00000040f001100000001001d33fe2ce90000040f0000000002010019000000110100002933fe2dd90000040f00000d0302200197000000400300043d0000002004300039000000000024043500000d0301100197000000000013043500000040020000390000000001030019000000000300001933fe00e20000040f0000000001000416000000000110004c0000000e02000029000028dc0000c13d0000000001000031001100000006001d33fe2da60000040f00000d1e080000410000000000800439000f00000001001d000c00000002001d000d00000003001d000900000004001d000a00000005001d000800000006001d000b00000007001d0000800b01000039000000040200003933fe00d00000040f0000000b02000029000000000112004b00000000010000190000000101008039000b00000001001d33fe30730000040f33fe30840000040f0000000b0100002933fe30730000040f00000d070100004100000000001004390000000e0100002900000004001004430000002001000039000b00000001001d00000024001004430000800501000039000000440200003933fe00d00000040f00000d03021001970000000f010000290000000c0300002933fe2e020000040f00000d2c02000041000000400900043d0000000000290435000000110200002900000d03042001970000000002010019000000040590003900000000010004140000001203000029000000000045043500000044049000390000000d05000029000000000054043500000d030420019700000024029000390000000000420435001100000004001d000000040240008c000008e90000613d000000000230004c000c00000009001d000008900000c13d0000006404000039000000200600003900000011020000290000000003090019000000000509001933fe00620000040f0000000c090000290000000002010019000008c30000013d001000000005001d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000001800310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d00000002010003670000000402100370000000000202043b000f00000002001d00000d030220009c000028dc0000213d0000002402100370000000000202043b000e00000002001d00000d030220009c000028dc0000213d0000004402100370000000000302043b000000000230004c0000000002000019000000010200c039000d00000003001d000000000223004b000028dc0000c13d0000006402100370000000000202043b000c00000002001d000000c402100370000000000202043b000b00000002001d00000d030220009c000028dc0000213d000000e402100370000000000202043b000a00000002001d0000010402100370000000000302043b000000000230004c0000000002000019000000010200c039000900000003001d000000000223004b000028dc0000c13d0000012401100370000000000101043b000800000001001d000000ff0110008c000028dc0000213d001100000006001d33fe30840000040f0000000f010000290000000e020000290000000d0300002933fe2e020000040f00000d2902000041000000000020043900000d0301100197000700000001001d00000004001004430000800201000039000000240200003933fe00d00000040f0000001107000029000000000110004c000028dc0000613d000000010100008a0000000902000029000000000220004c0000000c02000029000000000201c019000000400800043d00000d36010000410000000000180435000000000100041400000002030003670000014404300370000000000404043b0000016403300370000000000503043b000000c40680003900000012030000290000000000560435000000a405800039000000000045043500000084048000390000000805000029000000000054043500000064048000390000000a05000029000000000054043500000044048000390000000000240435000000100200002900000d03022001970000002404800039000000000024043500000d0304700197000900000008001d0000000402800039001000000004001d00000000004204350000001202000029001100000002001d0000000702000029000000040220008c0000125e0000613d000000000230004c000012020000c13d000000e404000039000000070200002900000009030000290000000005030019000000110600002933fe00620000040f0000000002010019000012370000013d001000000005001d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000001600310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d00000002010003670000000402100370000000000202043b000f00000002001d00000d030220009c000028dc0000213d0000002402100370000000000302043b000000000230004c0000000002000019000000010200c039000d00000003001d000000000223004b000028dc0000c13d0000004402100370000000000202043b000c00000002001d000000a402100370000000000202043b000b00000002001d00000d030220009c000028dc0000213d000000c402100370000000000202043b000a00000002001d000000e402100370000000000302043b000000000230004c0000000002000019000000010200c039000900000003001d000000000223004b000028dc0000c13d0000010401100370000000000101043b000800000001001d000000ff0110008c000028dc0000213d000e00000009001d001100000006001d33fe30840000040f00000d070100004100000000001004390000000e0100002900000004001004430000002001000039000000240010044300008005010000390000004402000039000600000002001d33fe00d00000040f00000d03021001970000000f01000029000700000002001d0000000d0300002933fe2e020000040f00000d2902000041000000000020043900000d0301100197000e00000001001d00000004001004430000800201000039000000240200003933fe00d00000040f0000001107000029000000000110004c000028dc0000613d000000010100008a0000000902000029000000000220004c0000000c02000029000000000201c019000000400800043d00000d36010000410000000000180435000000000100041400000002030003670000012404300370000000000404043b0000014403300370000000000503043b000000c40680003900000012030000290000000000560435000000a405800039000000000045043500000084048000390000000805000029000000000054043500000064048000390000000a05000029000000000054043500000044048000390000000000240435000000100200002900000d03022001970000002404800039000000000024043500000d03047001970000000402800039000800000004001d00000000004204350000001202000029001100000002001d0000000e02000029000000040220008c000900000008001d000011310000613d000000000230004c000010d40000c13d000000e4040000390000000e0200002900000009030000290000000005030019000000110600002933fe00620000040f0000000002010019000011090000013d001000000005001d0000000001000416000000000110004c000028dc0000c13d000e00000009001d000000000100003133fe2d1b0000040f000c00000001001d000b00000002001d000d00000003001d001100000004001d000a00000005001d000f00000006001d33fe30840000040f00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000000f02000029000000000112004b0000000001000019000000010100803933fe30730000040f0000001102000029000000000120004c000008330000c13d00000d050100004100000000001004350000001101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000001000416000000000110004c0000000e05000029000028dc0000c13d000000040100008a000000000110003100000d0202000041000000000310004c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d000000400100043d001100000001001d00000d07010000410000000000100439000000040050044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000110100002900000000002104350000002002000039000000000300001933fe00e20000040f001000000005001d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000e00310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d000000020100036700110000000103530000004401100370000000000101043b000f00000001001d00000d030110009c000028dc0000213d000000110100035f0000006401100370000000000101043b000e00000001001d00000d030110009c000028dc0000213d000000110100035f0000008401100370000000000201043b000000000120004c0000000001000019000000010100c039000d00000002001d000000000112004b000028dc0000c13d000000110100035f000000a401100370000000000101043b000c00000001001d00000d030110009c000028dc0000213d33fe30840000040f000000110100035f000000c401100370000000000101043b000b00000001001d00000d1e0100004100000000001004390000800b010000390000000402000039001100000002001d33fe00d00000040f0000000b02000029000000000112004b0000000001000019000000010100803933fe30730000040f00000011010000290000000201100367000000000101043b000a00000001001d000000400100043d000b00000001001d00000d3c0110009c000009980000213d0000000b060000290000004001600039000000400010043f0000000105000039000000000056043500000020076000390000001201000029000000200210008c00000d4a0000813d000000400200043d00000d3d0320009c00000e8e0000813d0000006003200039000000400030043f00000012030000290000000000320435000000200320003900000012040000290000000000430435000000400320003900000012040000290000000000430435000000000317001900000000002304350000002001100039000006090000013d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000600310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d00000002010003670000002402100370000000000202043b001100000002001d00000d030220009c000028dc0000213d0000004401100370000000000101043b001000000001001d00000d030110009c000028dc0000213d00000011010000290000001002000029000e00000009001d33fe2dd90000040f00000d3801000041000000400200043d0000000000120435000000040120003900000011030000290000000000310435000000240120003900000010030000290000000000310435000f00000002001d0000004401200039000000010200003900000000002104350000000001000414000d00000001001d00000d070100004100000000001004390000000e01000029000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c00000af40000613d000000640400003900000020060000390000000d010000290000000f03000029000000000503001933fe00990000040f000000000110004c00000af40000c13d0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000066d0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000006650000413d000000000530004c0000067c0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000000102001933fe2da60000040f001100000001001d000f00000002001d000b00000003001d000d00000004001d000c00000005001d000a00000006001d001000000007001d33fe30840000040f00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000001002000029000000000112004b0000000001000019000000010100803933fe30730000040f00000d070100004100000000001004390000000e010000290000000400100443000000200100003900000024001004430000800501000039000000440200003933fe00d00000040f000000000500041600000d0302100197001000000002001d00000011010000290000000f030000290000000b040000290000000d060000290000000c0700002933fe30ba0000040f000e00000001001d000d00000002001d000000110100002900000010020000290000000f0300002933fe2e020000040f000000000301001900000000020004110000001101000029000c00000002001d001100000003001d0000000e0400002933fe339e0000040f00000d29010000410000000000100439000000100100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c000028dc0000613d000000400900043d00000d33010000410000000000190435000000000100041400000012060000290000001002000029000000040220008c000f00000009001d000b00000006001d000009960000613d0000000d03000029000000000230004c0000093d0000c13d000000040400003900000010020000290000000003090019000000000509001933fe00620000040f0000000b0a0000290000000f090000290000000002010019000009700000013d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000800310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d33fe2ce00000040f001100000001001d33fe2ce90000040f001000000001001d33fe2cf20000040f00000064020000390000000202200367000000000402043b00000000030100190000001101000029000000100200002933fe2fb40000040f000000400300043d00000020043000390000000000240435000000000013043500000040020000390000000001030019000000000300001933fe00e20000040f0000000001000416000000000110004c000028dc0000c13d0000000002000031000000040120008a00000d0203000041000000800410008c0000000004000019000000000403401900000d0201100197000000000510004c000000000300a01900000d020110009c00000000010400190000000001036019000000000110004c000028dc0000c13d00000002030003670000000401300370000000000101043b00000d200410009c000028dc0000213d000000230410003900000d0205000041000000000624004b0000000006000019000000000605801900000d020220019700000d0204400197000000000724004b0000000005008019000000000224013f00000d020220009c00000000020600190000000002056019000000000220004c000028dc0000c13d0000000402100039000000000223034f000000000202043b00000d200320009c000009980000213d00000005032002100000003f04300039000000200500008a000000000454016f000000400500043d0000000004450019001100000005001d000000000554004b0000000005000019000000010500403900000d200640009c000009980000213d0000000105500190000009980000c13d000000400040043f00000011040000290000000000240435000000240110003900000000023100190000000003000031000000000332004b00000c480000213d0000000003040019000000000421004b00000c430000813d0000000204100367000000000404043b000000200330003900000000004304350000002001100039000007360000013d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000a00310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d00000002010003670000000402100370000000000202043b001100000002001d00000d030220009c000028dc0000213d0000002402100370000000000202043b001000000002001d00000d030220009c000028dc0000213d0000004402100370000000000302043b000000000230004c0000000002000019000000010200c039000f00000003001d000000000223004b000028dc0000c13d0000008402100370000000000202043b000a00000002001d0000006401100370000000000101043b000b00000001001d000000400200043d000d00000002001d00000d380100004100000000001204350000000001000414000c00000001001d00000d07010000410000000000100439000000040090044300000024000004430000800501000039000000440200003933fe00d00000040f0000000d0500002900000044025000390000000f03000029000000000032043500000024025000390000001003000029000000000032043500000004025000390000001103000029000000000032043500000d0302100197000000040120008c00000bc50000613d000000640400003900000020060000390000000c0100002900000000030500190000000d0500002933fe00990000040f0000000d05000029000000000110004c00000bc50000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000079e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000007960000413d000000000520004c000007ad0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000001000310008c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d000000020100036700100000000103530000000401100370000000000101043b000f00000001001d00000d030110009c000028dc0000213d000000100100035f0000002401100370000000000101043b000e00000001001d00000d030110009c000028dc0000213d000000100100035f0000004401100370000000000201043b000000000120004c0000000001000019000000010100c039000d00000002001d000000000112004b000028dc0000c13d000000100100035f000000c401100370000000000101043b000c00000001001d00000d030110009c000028dc0000213d001100000006001d33fe30840000040f000000100100035f000000e401100370000000000101043b001000000001001d00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000001002000029000000000112004b0000000001000019000000010100803933fe30730000040f0000000f010000290000000e020000290000000d0300002933fe2e020000040f00000d2c02000041000000400900043d00000000002904350000000002010019000000640300003900000000010004140000000203300367000000000403043b000000440590003900000012030000290000000000450435000000110400002900000d03044001970000000405900039000000000045043500000d030420019700000024029000390000000000420435001100000004001d000000040240008c00000e6f0000613d000000000230004c000d00000009001d00000e170000c13d0000006404000039000000200600003900000011020000290000000003090019000000000509001933fe00620000040f0000000d09000029000000000201001900000e490000013d0000000001000416000000000110004c000028dc0000c13d000000040100008a000000000110003100000d0202000041000000000310004c0000000003000019000000000302401900000d0201100197000000000410004c000000000200a01900000d020110009c00000000010300190000000001026019000000000110004c000028dc0000c13d000000400100043d001100000001001d00000d0701000041000000000010043900000004009004430000002001000039001000000001001d00000024001004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000110100002900000000002104350000001002000029000000000300001933fe00e20000040f00000060212000c90000000d020000290000000001120019000000400110008a0000000201100367000000000101043b000f00000001001d00000d030110009c0000000e03000029000028dc0000213d00000d0701000041000800000001001d000000000010043900000004003004430000002001000039000900000001001d00000024001004430000800501000039000600000001001d0000004402000039000700000002001d33fe00d00000040f0000000f02000029000000000121013f00000d03011001980000000001000019000000010100603933fe2f5d0000040f00000d1f01000041000000400200043d0000000000120435000f00000002001d0000000401200039000000100200002900000000002104350000000001000414000500000001001d000000080100002900000000001004390000000e010000290000000400100443000000090100002900000024001004430000000601000029000000070200002933fe00d00000040f00000d0302100197000000040120008c00000a3b0000613d0000002404000039000000200600003900000005010000290000000f03000029000000000503001933fe00990000040f000000000110004c00000a3b0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000087f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000008770000413d000000000520004c0000088e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d010200004100000d010490009c0000000004020019000000000409401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d2d011001c700008009020000390000001104000029000000000500001933fe33f40000040f0000000c090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000008b10000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000008a90000413d000000000640004c000008c00000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000008e90000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000008d80000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000008d00000413d000000000520004c000008e70000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000040900190000000003920019000000000223004b00000000020000190000000102004039000d00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000028dc0000413d0000000001040433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000c480000613d00000d1f010000410000000d03000029000000000013043500000004013000390000001002000029000000000021043500000000010004140000000f0200002900000d0302200197000000040420008c000700000002001d00000bf20000613d000000240400003900000020060000390000000d0500002933fe00990000040f0000000d030000290000000702000029000000000110004c00000bf20000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000092c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000009240000413d000000000520004c0000093b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d010200004100000d010410009c000000000102801900000d010490009c00000000020940190000004002200210000000c001100210000000000121019f00000d34011001c700008009020000390000001004000029000000000500001933fe33f40000040f0000000b0a0000290000000f090000290000000003010019000000600330027000000d01033001970000000004a3004b00000000050a001900000000050340190000001f0450018f00000005055002720000095e0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000009560000413d000000000640004c0000096d0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000009960000c13d00000001040000310000000001a40019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000b0300002900000003033003670000000504400272000009850000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000097d0000413d000000000520004c000009940000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d200190009c0000099f0000a13d00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000f09000029000000400090043f0000000b02000029000000000120004c00000a9c0000c13d00000d2f0100004100000000001904350000002402900039000000000100041400000012030000290000000d040000290000000000420435000000110200002900000d03042001970000000402900039000b00000004001d00000000004204350000001002000029000000040220008c00000ba70000613d000000000230004c00000b4e0000c13d0000004404000039000000200600003900000010020000290000000003090019000000000509001933fe00620000040f0000000f09000029000000000201001900000b810000013d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600310018f000000110100002900000000050100190000000001130019000000000331004b0000000003000019000000010300403900000d200410009c000009980000213d0000000103300190000009980000c13d000000400010043f000000200220008c000028dc0000413d0000000002050433000000000320004c0000000003000019000000010300c039000000000332004b000028dc0000c13d00000000002104350000002002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f00000000050300190000000002340019000000000342004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000002030003670000000e01000029000000000113034f0000000002050433000a00000002001d000000000101043b00000d030210009c000028dc0000213d0000000e020000290000002002200039000800000002001d000000000223034f000000000202043b00000d030420009c000028dc0000213d0000000e040000290000004004400039000600000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000028dc0000c13d33fe2e020000040f00000d2102000041000000400300043d000700000003001d00000000002304350000000002010019000000000100041400000d0302200197000000040320008c00000ebf0000613d000000040400003900000020060000390000000703000029000000000503001933fe00990000040f000000000110004c00000ebf0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000a2a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000a220000413d000000000520004c00000a390000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000f0200002900000000050200190000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000002030003670000000d01000029000000000113034f0000000002050433000f00000002001d000000000101043b00000d030210009c000028dc0000213d0000000d020000290000002002200039000800000002001d000000000223034f000000000202043b00000d030420009c000028dc0000213d0000000d040000290000004004400039000600000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000028dc0000c13d33fe2e020000040f00000d2102000041000000400300043d000700000003001d00000000002304350000000002010019000000000100041400000d0302200197000000040320008c00000f320000613d000000040400003900000020060000390000000703000029000000000503001933fe00990000040f000000000110004c00000f320000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000a8b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000a830000413d000000000520004c00000a9a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000000102001933fe00ec0000040f0000000f010000290000000201100367000000000101043b001000000001001d00000d030110009c0000000e02000029000028dc0000213d00000d0701000041000000000010043900000004002004430000002001000039000b00000001001d00000024001004430000800501000039000000440200003933fe00d00000040f0000001002000029000000000121013f00000d03011001980000000001000019000000010100603933fe2f5d0000040f000000110100002900000060211000c90000000f020000290000000001210019000000400110008a0000000201100367000000000101043b001000000001001d00000d030110009c000028dc0000213d000000400300043d00000d1f01000041000000000013043500000004013000390000000d02000029000000000021043500000000010004140000001002000029000000040420008c00000c4b0000613d00000024040000390000002006000039000a00000003001d0000000a0500002933fe00990000040f0000000a03000029000000000110004c00000c4b0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000ae30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000adb0000413d000000000520004c00000af20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000f0300002900000000040300190000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c0000000e02000029000028dc0000413d0000000001040433000f00000001001d00000d030110009c000028dc0000213d0000001201000029000b00000001001d00000d2b010000410000000d03000029000000000013043500000004013000390000000f0300002900000000003104350000000001000414000c00000001001d00000d07010000410000000000100439000000040020044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c00000cb40000613d000000240400003900000020060000390000000c010000290000000d03000029000000000503001933fe00990000040f000000000110004c00000cb40000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000b3d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b350000413d000000000520004c00000b4c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d010200004100000d010490009c0000000004020019000000000409401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d28011001c700008009020000390000001004000029000000000500001933fe33f40000040f0000000f090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000b6f0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000b670000413d000000000640004c00000b7e0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00000ba70000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000b960000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000b8e0000413d000000000520004c00000ba50000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000002920019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d0000000f010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000c9c0000c13d00000d050100004100000000001004350000000101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000001201000029000c00000001001d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000000040500190000000003520019000000000223004b00000000020000190000000102004039000e00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000e02000029000000400020043f000000200110008c000028dc0000413d000000000204043300000d030120009c000028dc0000213d000000000120004c0000000c01000029000900000001001d000d00000001001d00000ffb0000c13d00000009010000290000000d0200002900000000011201a0000011670000c13d0000000b01000029000000000110004c000012920000c13d000000120100002900000d050200004100000000002104350000001101000039000000040010043f0000001201000029000000240200003933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000002320019000c00000002001d00000d200220009c000009980000213d0000000c02000029000000400020043f000000200110008c0000000e02000029000028dc0000413d0000000d010000290000000001010433000600000001001d00000d1f010000410000000c0300002900000000001304350000000401300039000000100300002900000000003104350000000001000414000d00000001001d00000d0701000041000000000010043900000004002004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c00000e960000613d000000240400003900000020060000390000000d010000290000000c03000029000000000503001933fe00990000040f000000000110004c00000e960000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000c320000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000c2a0000413d000000000520004c00000c410000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000024010000390000000201100367000000000101043b00000d200210009c00000c760000a13d0000001201000029000000000201001933fe00ec0000040f0000001201000029000a00000001001d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f00000000050300190000000002340019000000000342004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c0000000e02000029000028dc0000413d0000000001050433000800000001001d00000d0701000041000000000010043900000004002004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f00000d2902000041000000000020043900000d030110019700000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00000fdb0000c13d0000000a01000029000000000201001933fe00ec0000040f0000000002000031000000040110003933fe2cfe0000040f001000000001001d000f00000002001d0000000201000367000e0000000103530000004401100370000000000101043b000d00000001001d00000d030110009c000028dc0000213d33fe30840000040f0000000e0100035f0000006401100370000000000101043b000e00000001001d00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000000e02000029000000000112004b0000000001000019000000010100803933fe30730000040f0000000f01000029000000000110004c00000fb00000c13d000000120100002900000d050200004100000000002104350000003201000039000000040010043f0000001201000029000000240200003933fe00ec0000040f00000d3501000041000000110300002900000000001304350000000a0100002900000d03011001970000000402300039000000000012043500000000010004140000001202000029001000000002001d0000000b02000029000000040220008c0000108a0000613d0000001002000029000000000220004c0000102c0000c13d000000240400003900000020060000390000000b020000290000001103000029000000000503001933fe00620000040f0000000002010019000010620000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019000c00000002001d00000d200220009c000009980000213d0000000c02000029000000400020043f000000200110008c000028dc0000413d0000000d010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c0000000b01000029000d00000001001d000013ff0000c13d0000001101000029000000100200002933fe2dd90000040f00000d3801000041000000400200043d0000000000120435000000040120003900000011030000290000000000310435000000240120003900000010030000290000000000310435001000000002001d000000440120003900000000000104350000000001000414000f00000001001d00000d070100004100000000001004390000000e01000029000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c00000cf20000613d000000640400003900000020060000390000000f010000290000001003000029000000000503001933fe00990000040f000000000110004c0000065e0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000003320019000000000223004b00000000020000190000000102004039000f00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000f02000029000000400020043f000000200110008c0000000e02000029000028dc0000413d00000010010000290000000001010433001000000001001d00000d030110009c000028dc0000213d00000d2b010000410000000f0300002900000000001304350000000401300039000000100300002900000000003104350000000001000414000c00000001001d00000d07010000410000000000100439000000040020044300000024000004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c000019140000613d000000240400003900000020060000390000000c010000290000000f03000029000000000503001933fe00990000040f000000000110004c000019140000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000d390000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000d310000413d000000000520004c00000d480000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000900000005001d0000000001060433000000000110004c000002640000613d00000000010704330000000f0200002900000d030220019700000000002104350000000001060433000000000110004c000002640000613d0000000e0100002900000d030210019700000000010704330000002001100039000f00000002001d00000000002104350000000001060433000000000110004c000002640000613d000800000007001d000000000107043300000040011000390000000d02000029000000000021043500000d1f01000041000000400300043d00000000001304350000000c0100002900000d0302100197000e00000003001d0000000401300039000d00000002001d000000000021043500000000010004140000000f02000029000000040220008c0000130f0000613d000000240400003900000020060000390000000f020000290000000e03000029000000000503001933fe00990000040f000000000110004c0000130f0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000d8b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000d830000413d000000000520004c00000d9a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d010200004100000d010490009c0000000006020019000000000609401900000d010410009c0000000001028019000000c0011002100000004002600210000000000112019f00000d26011001c700008009020000390000000004050019000000000500001933fe33f40000040f00000010090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000dbd0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000db50000413d000000000640004c00000dcc0000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000000110100002900000df60000c13d00000001040000310000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200000de50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000ddd0000413d000000000520004c00000df40000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000000050900190000000002930019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d000000000205043300000001010000390000001103000029000000000013041b000000400100043d0000004003100039000000000023043500000020021000390000000b0300002900000000003204350000000c0200002900000000002104350000006002000039000000000300001933fe00e20000040f00000d010200004100000d010410009c000000000102801900000d010490009c00000000020940190000004002200210000000c001100210000000000121019f00000d2d011001c700008009020000390000001104000029000000000500001933fe33f40000040f0000000d090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200000e370000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00000e2f0000413d000000000640004c00000e460000613d0000000505500210000000000651034f00000000055900190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00000e6f0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000e5e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000e560000413d000000000520004c00000e6d0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600330018f00000000050900190000000004930019000000000334004b00000000030000190000000103004039001000000004001d00000d200440009c000009980000213d0000000103300190000009980000c13d0000001003000029000000400030043f000000200220008c000028dc0000413d0000000002050433000000000320004c0000000003000019000000010300c039000000000332004b000028dc0000c13d000000000220004c000011960000c13d000000000201001933fe00ec0000040f000000120100002900000d050200004100000000002104350000004101000039000000040010043f0000001201000029000000240200003933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000c030000290000000002320019000d00000002001d00000d200220009c000009980000213d0000000d02000029000000400020043f000000200110008c000028dc0000413d0000000c010000290000000001010433000500000001001d00000d2e010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000001202000029000c00000002001d0000001102000029000000040220008c000014970000613d0000000c02000029000000000220004c0000143a0000c13d0000002404000039000000400600003900000011020000290000000d03000029000000000503001933fe00620000040f0000000002010019000014700000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f000000070200002900000000050200190000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d0000000001050433000700000001001d00000d030110009c000028dc0000213d0000000701000029000000000110004c0000159e0000c13d00000002010003670000000e02000029000000000221034f000000000202043b000000000402001900000d030220009c000028dc0000213d0000000802000029000000000221034f000000000202043b00000d030320009c000028dc0000213d0000000603000029000000000131034f000000000301043b000000000130004c0000000001000019000000010100c039000000000113004b000028dc0000c13d0000000001040019001000000001001d33fe2e020000040f0000000003010019000000000200041100000010010000290000000c0400002933fe339e0000040f00000000030000310000000e01000029000000110200002933fe2d560000040f0000000d0200002933fe31a20000040f00000d1f01000041000000400200043d0000000000120435001100000002001d00000004012000390000000902000029000000000021043500000000010004140000000f02000029000000040220008c000019400000613d000000240400003900000020060000390000000f020000290000001103000029000000000503001933fe00990000040f000000000110004c000019400000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000f210000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000f190000413d000000000520004c00000f300000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f000000070200002900000000050200190000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d0000000001050433000700000001001d00000d030110009c000028dc0000213d0000000701000029000000000110004c000015f70000c13d00000002010003670000000d02000029000000000221034f000000000202043b000000000502001900000d030220009c0000000e04000029000028dc0000213d0000000802000029000000000221034f000000000202043b00000d030320009c000028dc0000213d0000000603000029000000000131034f000000000301043b000000000130004c0000000001000019000000010100c039000000000113004b000028dc0000c13d0000000001050019000700000001001d33fe2e020000040f0000000003010019000000000200041100000007010000290000000c0400002933fe339e0000040f00000000030000310000000d01000029000000110200002933fe2d560000040f000000100200002933fe31a20000040f00000d1f01000041000000400200043d0000000000120435001100000002001d00000004012000390000001002000029000000000021043500000d07010000410000000002000414001000000002001d00000000001004390000000e010000290000000400100443000000090100002900000024001004430000800501000039000000440200003933fe00d00000040f00000d0302100197000000040120008c000019660000613d0000002404000039000000200600003900000010010000290000001103000029000000000503001933fe00990000040f000000000110004c000019660000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200000f9f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000f970000413d000000000520004c00000fae0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000100100002933fe33120000040f000e00000001001d000000100100002933fe33120000040f000c00000001001d0000001001000029000000200110003933fe33120000040f000b00000001001d0000001001000029000000400110003933fe331a0000040f00000000030100190000000c010000290000000b0200002933fe2e020000040f000c00000001001d000000110100002933fe2f6e0000040f000000000401043300000000020004110000000e010000290000000c0300002933fe339e0000040f000000000300003100000010010000290000000f0200002933fe2d560000040f0000000d0200002933fe31a20000040f00000001010000390000001202000029000000000012041b000000400100043d001000000001001d000000110200002933fe2d460000040f000000100300002900000000023100490000000001030019000000000300001933fe00e20000040f000000400200043d00000d3301000041000a00000002001d00000000001204350000000001000414000700000001001d00000d070100004100000000001004390000000e0100002900000004001004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f00000000030004160000001202000029000900000002001d00000d0305100197000000040150008c000013810000613d000000000130004c000013240000c13d0000000404000039000000070100002900000000020500190000000a030000290000000005030019000000090600002933fe00620000040f00000000020100190000135a0000013d00000d39010000410000000e0300002900000000001304350000000001000414000000040320008c000010b40000613d000000040400003900000020060000390000000e03000029000000000503001933fe00990000040f000000000110004c000010b40000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000101b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000010130000413d000000000520004c0000102a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d0102000041000000110400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c7000080090200003900000010030000290000000b04000029000000000500001933fe33f40000040f00000011090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000104f0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000010470000413d000000000640004c0000105f0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00000011030000290000108a0000c13d000000010400003100000010010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000100300002900000003033003670000000504400272000010790000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000010710000413d000000000520004c000010880000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433001100000001001d00000000010004160000000d02000029000000000121004b000010a50000a13d00000000010004160000000d02000029000000000221004b000005940000413d0000000d0200002900000000022100490000000c0100002933fe335c0000040f00000001010000390000001002000029000000000012041b000000400100043d00000040021000390000001103000029000000000032043500000020021000390000000d0300002900000000003204350000000e0200002900000000002104350000006002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e03000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d0000000e010000290000000001010433000c00000001001d000000110100002900000010020000290000000f0300002933fe2f010000040f000d00000001001d000900000002001d00000be30000013d000000400100043d001100000001001d000000100200002933fe2d460000040f000000110300002900000000023100490000000001030019000000000300001933fe00e20000040f00000d0102000041000000090500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d37011001c700008009020000390000000e04000029000000000500001933fe33f40000040f00000009090000290000000003010019000000600330027000000d01033001970000001105000029000000000453004b00000000050340190000001f0450018f0000000505500272000010f60000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000010ee0000413d000000000640004c000011060000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000000908000029000011310000c13d000000010400003100000011010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000110300002900000003033003670000000504400272000011200000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011180000413d000000000520004c0000112f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d200180009c000009980000213d0000000901000029000000400010043f0000001101000029000000000110004c000011930000c13d00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000000a02000029000000000112004b00000000010000190000000101008039001100000001001d33fe30730000040f33fe30840000040f000000110100002933fe30730000040f0000000f0100002900000007020000290000000d0300002933fe2e020000040f00000d2c02000041000000400600043d000000000026043500000000020100190000004404600039000000000100041400000012030000290000000c05000029000000000054043500000004046000390000000805000029000000000054043500000d0304200197001100000006001d00000024026000390000000000420435000e00000004001d000000040240008c000015150000613d000000000230004c000014ba0000c13d000000640400003900000020060000390000000e020000290000001103000029000000000503001933fe00620000040f0000000002010019000014ef0000013d0000000b010000290000000d02000029000000090300002933fe2f850000040f0000000a02000029000000000221004b000012f00000a13d0000000a0100002900000009020000290000000d0300002933fe2f850000040f0000000c0200002900000000251200a9000b00000001001d000000000210004c0000117c0000613d0000000b0100002900000000321500d90000000c01000029000000000212004b000005940000c13d0000000d01000029000000000210004c000013080000613d0000000a010000290000000c0200002900000000322100a9000000000310004c000011890000613d0000000a0100002900000000431200d90000000c01000029000000000313004b000005940000c13d0000000901000029000000000310004c000013080000613d0000000d0100002900000000311500d9000000090300002900000000323200d9000000000321004b0000000002014019000017ef0000013d0000001101000029000000000201001933fe00ec0000040f00000d1f010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000f02000029000000040220008c000011cc0000613d000000240400003900000020060000390000000f020000290000001003000029000000000503001933fe00990000040f000000000110004c000011cc0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000011bb0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011b30000413d000000000520004c000011ca0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f000000100300002900000000033100190000001201000029000d00000003001d00000d200330009c000009980000213d0000000d03000029000000400030043f000000200220008c000016500000813d000000000201001933fe00ec0000040f000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000011f10000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000011e90000413d000000000520004c000012000000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d0102000041000000090500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d37011001c700008009020000390000000704000029000000000500001933fe33f40000040f00000009090000290000000003010019000000600330027000000d01033001970000001105000029000000000453004b00000000050340190000001f0450018f0000000505500272000012240000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000121c0000413d000000000640004c000012340000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c0000125e0000c13d000000010400003100000011010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000001103000029000000030330036700000005044002720000124d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000012450000413d000000000520004c0000125c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000090100002900000d200110009c000009980000213d0000000901000029000000400010043f0000001101000029000000000110004c000013d50000c13d33fe30840000040f00000d1e0100004100000000001004390000800b01000039000000040200003933fe00d00000040f0000000a02000029000000000112004b0000000001000019000000010100803933fe30730000040f0000000f010000290000000e020000290000000d0300002933fe2e020000040f00000d2c02000041000000400600043d000000000026043500000000020100190000004404600039000000000100041400000012030000290000000c05000029000000000054043500000004046000390000001005000029000000000054043500000d0304200197001100000006001d00000024026000390000000000420435001000000004001d000000040240008c000017950000613d000000000230004c0000173a0000c13d0000006404000039000000200600003900000010020000290000001103000029000000000503001933fe00620000040f00000000020100190000176f0000013d0000000b030000290000000a0400002900000000214300a900000000323100d9000000000242004b000005940000c13d000000000210004c00000bea0000613d000000800210027000000d3a0310009c000000000201a01900000d3a0310009c0000000003000019000000800300203900000040043001bf00000d200520009c0000000003042019000000400420027000000d200520009c000000000204201900000020043001bf00000d010520009c0000000003042019000000200420027000000d010520009c000000000204201900000010043001bf0000ffff0520008c0000000003042019000000100420027000000000020420190000000804300039000000ff0520008c00000000030420190000000804200270000000000204201900000004043000390000000f0520008c0000000003042019000000040420027000000000020420190000000204300039000000030520008c000000000304201900000002042002700000000002042019000000010220008c0000000002000019000000010200203900000000022300190000000102200270000000000321022f000000010220020f0000000002320019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000432100d90000000002230019000000020320008c000013080000413d000000010220027000000000312100d9000000000312004b0000000001024019000003e70210008c00000bea0000a13d000003e80210008a000017ef0000013d0000000b040000290000000c0200002900000000324200a9000000000340004c000012fa0000613d0000000b0300002900000000433200d90000000c04000029000000000343004b000005940000c13d0000000d03000029000000000330004c000013080000613d0000000c0300002900000000433100a9000000000410004c000013050000613d00000000541300d90000000c05000029000000000454004b000005940000c13d0000000904000029000000000440004c000017e80000c13d00000d050100004100000000001004350000001201000039000000040010043f0000002402000039000000000100001933fe00ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600430018f0000000e030000290000000003340019000000000443004b0000000004000019000000010400403900000d200530009c000009980000213d0000000104400190000009980000c13d000000400030043f000000200220008c000016f10000813d000000000201001933fe00ec0000040f00000d01010000410000000a0400002900000d010240009c00000000020100190000000002044019000000070600002900000d010460009c0000000001064019000000c0011002100000004002200210000000000112019f00000d34011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000a090000290000000003010019000000600330027000000d01033001970000000905000029000000000453004b00000000050340190000001f0450018f0000000505500272000013470000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000133f0000413d000000000640004c000013570000613d0000000505500210000000000651034f0000000a0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000013810000c13d000000010400003100000009010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000090300002900000003033003670000000504400272000013700000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013680000413d000000000520004c0000137f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000a0100002900000d200110009c000009980000213d0000000a01000029000000400010043f0000000901000029000000000110004c000013fc0000c13d00000002030003670000000f01000029000000000113034f000000000101043b00000d030210009c000028dc0000213d0000000f020000290000002002200039000a00000002001d000000000223034f000000000202043b00000d030420009c000028dc0000213d0000000f040000290000004004400039000700000004001d000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000028dc0000c13d33fe2e020000040f00000d2102000041000000400300043d000900000003001d00000000002304350000000002010019000000000100041400000d0302200197000000040320008c0000185a0000613d000000040400003900000020060000390000000903000029000000000503001933fe00990000040f000000000110004c0000185a0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000013c40000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013bc0000413d000000000520004c000013d30000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000001101000029000000000201001933fe00ec0000040f000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000013eb0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000013e30000413d000000000520004c000013fa0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000901000029000000000201001933fe00ec0000040f00000d3b010000410000000c050000290000000000150435000000000100041400000004020000390000000202200367000000000202043b000000240350003900000011040000290000000000430435000000040350003900000000002304350000000f02000029000000040220008c000014a90000613d000000440400003900000020060000390000000f020000290000000c03000029000000000503001933fe00990000040f000000000110004c000014a90000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000014290000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000014210000413d000000000520004c000014380000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d01020000410000000d0400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c700008009020000390000000c030000290000001104000029000000000500001933fe33f40000040f0000000d090000290000000003010019000000600330027000000d0103300197000000400430008c000000400500003900000000050340190000001f0450018f00000005055002720000145d0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000014550000413d000000000640004c0000146d0000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000014970000c13d00000001040000310000000c010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000c0300002900000003033003670000000504400272000014860000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000147e0000413d000000000520004c000014950000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000400110008c000015680000813d0000000c01000029000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000c03000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d0000000c010000290000000001010433000d00000001001d00000cce0000013d00000d0102000041000000110500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d2d011001c700008009020000390000000e04000029000000000500001933fe33f40000040f00000011090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000014dc0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000014d40000413d000000000640004c000014ec0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000015150000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015040000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000014fc0000413d000000000520004c000015130000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000c480000613d00000d1f010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000f02000029000000040220008c000018b20000613d000000240400003900000020060000390000000f020000290000000d03000029000000000503001933fe00990000040f000000000110004c000018b20000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015570000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000154f0000413d000000000520004c000015660000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d1f010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c000016890000613d0000002404000039000000200600003900000007020000290000001103000029000000000503001933fe00990000040f000000000110004c000016890000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000158d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015850000413d000000000520004c0000159c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000002010003670000000602000029000000000221034f000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b000028dc0000c13d000000000220004c000000020300003900000019030060390000000c0500002900000000423500a900000000433200d9000000000353004b0000000e03000029000005940000c13d000027102420011a0000000c02000029000500000004001d000000000242004b000005940000413d000000000131034f000000000101043b00000d030210009c000028dc0000213d00000000020004110000001003000029000000050400002933fe339e0000040f0000000e010000290000000201100367000000000201043b00000d030120009c000028dc0000213d000000400300043d00000d1f010000410000000000130435000400000003001d0000000401300039000000100300002900000000003104350000000001000414000000040320008c00001b130000613d000000240400003900000020060000390000000403000029000000000503001933fe00990000040f000000000110004c00001b130000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000015e60000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000015de0000413d000000000520004c000015f50000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000002010003670000000602000029000000000221034f000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b000028dc0000c13d000000000220004c000000020300003900000019030060390000000c0500002900000000425300a900000000433200d9000000000353004b0000000d03000029000005940000c13d000027102420011a0000000c02000029000400000004001d000000000242004b000005940000413d000000000131034f000000000101043b00000d030210009c000028dc0000213d00000000020004110000001003000029000000040400002933fe339e0000040f0000000d010000290000000201100367000000000201043b00000d030120009c000028dc0000213d000000400300043d00000d1f010000410000000000130435000500000003001d0000000401300039000000100300002900000000003104350000000001000414000000040320008c00001b5d0000613d000000240400003900000020060000390000000503000029000000000503001933fe00990000040f000000000110004c00001b5d0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000163f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016370000413d000000000520004c0000164e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000010010000290000000001010433000b00000001001d00000d1f010000410000000d02000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040220008c000016df0000613d000000240400003900000020060000390000000e020000290000000d03000029000000000503001933fe00990000040f000000000110004c000016df0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000016780000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016700000413d000000000520004c000016870000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d200220009c000009980000213d0000000d02000029000000400020043f000000200110008c000028dc0000413d000000110100002900000000020104330000000601000029001100000002001d000000000112004b000005940000413d00000d1f010000410000000d0200002900000000001204350000000401200039000000100200002900000000002104350000000001000414001000000001001d00000d070100004100000000001004390000000e0100002900000004001004430000000b01000029000000240010044300008005010000390000004402000039000c00000002001d33fe00d00000040f00000d0302100197000000040120008c000019fe0000613d0000002404000039000000200600003900000010010000290000000d03000029000000000503001933fe00990000040f000000000110004c000019fe0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000016ce0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000016c60000413d000000000520004c000016dd0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f0000000d0300002900000000033100190000001201000029001000000003001d00000d200330009c000009980000213d0000001003000029000000400030043f000000200220008c000018fa0000813d000000000201001933fe00ec0000040f0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d0000000e020000290000000002020433000600000002001d00000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d030110019700000d0302200197000000000330004c0000000003000019000000010300c03933fe2e020000040f00000d2102000041000000400300043d000e00000003001d000000000023043500000000020100190000000001000414000700000002001d00000d0302200197000000040320008c000017fa0000613d000000040400003900000020060000390000000e03000029000000000503001933fe00990000040f000000000110004c000017fa0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000017290000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000017210000413d000000000520004c000017380000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d0102000041000000110500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d2d011001c700008009020000390000001004000029000000000500001933fe33f40000040f00000011090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000175c0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000017540000413d000000000640004c0000176c0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000017950000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000017840000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000177c0000413d000000000520004c000017930000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000003320019000000000223004b00000000020000190000000102004039000d00000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000d02000029000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000c480000613d00000d1f010000410000000d02000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000f02000029000000040220008c000019b60000613d000000240400003900000020060000390000000f020000290000000d03000029000000000503001933fe00990000040f000000000110004c000019b60000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000017d70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000017cf0000413d000000000520004c000017e60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000d0400002900000000424200d9000000090400002900000000434300d9000000000432004b0000000002038019000a00000001001d000000400100043d0000004003100039000000000023043500000020021000390000000a0300002900000000003204350000000b0200002900000000002104350000006002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000e020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d0000000e010000290000000001010433000e00000001001d00000d030110009c000028dc0000213d0000000e01000029000000000110004c00001bd00000c13d0000000b050000290000000001050433000000000110004c0000000801000029000002640000613d0000000001010433000000000101043300000d0301100197000000000200041100000007030000290000000a0400002933fe339e0000040f0000000b010000290000000c0200002933fe31a20000040f00000d1f01000041000000400200043d0000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000000f02000029000000040220008c00001cfd0000613d000000240400003900000020060000390000000f020000290000001103000029000000000503001933fe00990000040f000000000110004c00001cfd0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000018490000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000018410000413d000000000520004c000018580000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000009020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000009010000290000000001010433000900000001001d00000d030110009c000028dc0000213d0000000001000416000600000001001d0000000901000029000000000110004c00001c2b0000c13d00000002030003670000000f01000029000000000113034f000000000101043b00000d030210009c0000000e05000029000028dc0000213d0000000a02000029000000000223034f000000000202043b00000d030420009c000028dc0000213d0000000704000029000000000343034f000000000303043b000000000430004c0000000004000019000000010400c039000000000443004b000028dc0000c13d33fe2e020000040f00000d2f02000041000000400300043d000a00000003001d0000000000230435000900000001001d0000000001000414000700000001001d00000d070100004100000000001004390000000e0100002900000004001004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f000000090200002900000d03022001970000000a0500002900000004045000390000001203000029000000000024043500000024025000390000000604000029000000000042043500000d0305100197000000040150008c000021a30000613d000000000130004c000021470000c13d00000044040000390000002006000039000000070100002900000000020500190000000a03000029000000000503001933fe00620000040f00000000020100190000217d0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d0000000d010000290000000001010433000c00000001001d00000d1f010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c00001aa20000613d0000002404000039000000200600003900000007020000290000001103000029000000000503001933fe00990000040f000000000110004c00001aa20000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000018e90000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000018e10000413d000000000520004c000018f80000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000d010000290000000001010433000a00000001001d00000d2e010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000001202000029000d00000002001d0000001102000029000000040220008c00001a900000613d0000000d02000029000000000220004c00001a340000c13d0000002404000039000000400600003900000011020000290000001003000029000000000503001933fe00620000040f000000000201001900001a690000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000f030000290000000002320019000e00000002001d00000d200220009c000009980000213d0000000e02000029000000400020043f000000200110008c000028dc0000413d0000000f010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00001c740000c13d000000120100002a0000000001000019000000010100c0390000000b030000290000000d04000029000000000234004b00000000020000190000000102002039000000000112019f000000010510018f0000000e0100002900000020021000390000000000520435000000000234004b0000000002030019000000000204201900000000002104350000004002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d000000110100002900000000010104330000000a0200002933fe2f7a0000040f0000000002010019001100000002001d0000000b01000029000000000112004b0000000001000019000000010100803933fe318e0000040f00000001010000390000001202000029000000000012041b000000400100043d000000110200002900000000002104350000002002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d000000110100002900000000020104330000000f01000029001100000002001d000000000112004b000005940000413d00000d070100004100000000001004390000000e010000290000000400100443000000090100002900000024001004430000800501000039000000440200003933fe00d00000040f00000d2902000041000000000020043900000d030110019700000004001004430000800201000039000000240200003933fe00d00000040f0000000e02000029000000000110004c00000c480000613d0000000f0100002900000011030000290000000003130049000000400400043d00000d32010000410000000000140435001100000004001d0000000401400039000f00000003001d00000000003104350000000001000414000d00000001001d00000d070100004100000000001004390000000400200443000000090100002900000024001004430000800501000039000000440200003933fe00d00000040f0000001202000029001000000002001d00000d0305100197000000040150008c00001ef60000613d0000001001000029000000000110004c00001e980000c13d00000024040000390000000d01000029000000000205001900000011030000290000000005030019000000000600001933fe00620000040f000000000201001900001ecf0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d0000000d010000290000000001010433000c00000001001d00000d1f010000410000001102000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000e02000029000000040220008c00001ba70000613d000000240400003900000020060000390000000e020000290000001103000029000000000503001933fe00990000040f000000000110004c00001ba70000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000019ed0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000019e50000413d000000000520004c000019fc0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000d03000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d0000000d0100002900000000020104330000000501000029001000000002001d000000000112004b000005940000413d0000000601000029000000110200002900000000021200490000000901000029001100000002001d000000000112004b0000000001000019000000010100803933fe30980000040f0000000501000029000000100200002900000000021200490000000a01000029000900000002001d000000000112004b0000000001000019000000010100803933fe30a90000040f00000001010000390000001202000029000d00000001001d001000000002001d000000000012041b00000d290100004100000000001004390000000f0100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00001d240000c13d0000001001000029000000000201001933fe00ec0000040f00000d010200004100000d010310009c0000000001028019000000100400002900000d010340009c00000000020440190000004002200210000000c001100210000000000121019f00000d26011001c700008009020000390000000d030000290000001104000029000000000500001933fe33f40000040f00000010090000290000000003010019000000600330027000000d0103300197000000400430008c000000400500003900000000050340190000001f0450018f000000050550027200001a560000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001a4e0000413d000000000640004c00001a660000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001a900000c13d00000001040000310000000d010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000d030000290000000303300367000000050440027200001a7f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001a770000413d000000000520004c00001a8e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f00000010030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000400110008c00001acb0000813d0000000d01000029000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d200220009c000009980000213d0000000d02000029000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000a00000001001d00000d2e010000410000000d02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000001202000029001100000002001d0000000e02000029000000040220008c00001e500000613d0000001102000029000000000220004c00001df30000c13d000000240400003900000040060000390000000e020000290000000d03000029000000000503001933fe00620000040f000000000201001900001e290000013d00000d1f010000410000001102000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000f02000029000000040220008c00001b010000613d000000240400003900000020060000390000000f020000290000001103000029000000000503001933fe00990000040f000000000110004c00001b010000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001af00000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001ae80000413d000000000520004c00001aff0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600110018f000000110300002900000000033100190000001201000029001000000003001d00000d200330009c000009980000213d0000001003000029000000400030043f000000200220008c00001cc10000813d000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000004030000290000000003320019000000000223004b00000000020000190000000102004039001000000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000001002000029000000400020043f000000200110008c000028dc0000413d00000004010000290000000001010433000300000001001d00000d22010000410000001002000029000000000012043500000000010004140000000702000029000000040220008c00001d590000613d0000000404000039000000200600003900000007020000290000001003000029000000000503001933fe00990000040f000000000110004c00001d590000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001b4c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001b440000413d000000000520004c00001b5b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000003320019000000000223004b00000000020000190000000102004039000300000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000302000029000000400020043f000000200110008c000028dc0000413d00000005010000290000000001010433000100000001001d00000d22010000410000000302000029000000000012043500000000010004140000000702000029000000040220008c00001d9d0000613d0000000404000039000000200600003900000007020000290000000303000029000000000503001933fe00990000040f000000000110004c00001d9d0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001b960000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001b8e0000413d000000000520004c00001ba50000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019000d00000002001d00000d200220009c000009980000213d0000000d02000029000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000a00000001001d00000d2e010000410000000d02000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000001202000029001100000002001d0000001002000029000000040220008c00001fc40000613d0000001102000029000000000220004c00001f670000c13d0000002404000039000000400600003900000010020000290000000d03000029000000000503001933fe00620000040f000000000201001900001f9d0000013d0000000b010000290000000001010433000000000110004c0000000802000029000002640000613d00000011010000290000000201100367000000000501043b000000000102043300000040021000390000000002020433000000000220004c0000000203000039000000190300603900000000423500a900000000433200d9000a00000005001d000000000353004b000005940000c13d000027102320011a0000000a02000029000500000003001d000000000232004b000005940000413d000000000101043300000d030110019700000000020004110000001003000029000000050400002933fe339e0000040f0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d00000000010104330000000002010433000000400300043d00000d1f010000410000000000130435001100000003001d000000040130003900000010030000290000000000310435000000000100041400000d0302200197000000040320008c000020550000613d000000240400003900000020060000390000001103000029000000000503001933fe00990000040f000000000110004c000020550000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001c1a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001c120000413d000000000520004c00001c290000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000007010000290000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000002020000390000001902006039000000060400002900000000314200a900000000322100d9000000000242004b000005940000c13d000027101210011a0000000601000029000400000002001d000000000121004b000005940000413d000000400200043d00000d2201000041000500000002001d000000000012043500000000010004140000000902000029000000040220008c00001fd60000613d0000000404000039000000200600003900000009020000290000000503000029000000000503001933fe00990000040f000000000110004c00001fd60000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001c630000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001c5b0000413d000000000520004c00001c720000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d3b010000410000000e050000290000000000150435000000000100041400000004020000390000000202200367000000000202043b000000240350003900000011040000290000000000430435000000040350003900000000002304350000001002000029000000040220008c00001caf0000613d0000004404000039000000200600003900000010020000290000000e03000029000000000503001933fe00990000040f000000000110004c00001caf0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001c9e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001c960000413d000000000520004c00001cad0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e03000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d0000000e010000290000000001010433000b00000001001d000e00000002001d0000192c0000013d000000110100002900000000020104330000000b01000029001100000002001d000000000112004b000005940000413d00000d1f010000410000001002000029000000000012043500000004012000390000000c02000029000000000021043500000000010004140000000e02000029000000040220008c00001de10000613d000000240400003900000020060000390000000e020000290000001003000029000000000503001933fe00990000040f000000000110004c00001de10000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001cec0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001ce40000413d000000000520004c00001cfb0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000000060200002933fe2f7a0000040f00000024020000390000000202200367000000000202043b001100000001001d000000000221004b0000000001000019000000010100803933fe318e0000040f00000012010000290000000902000029000000000021041b000000400100043d000000110200002900000000002104350000002002000039000000000300001933fe00e20000040f000000400200043d000000440120003900000011030000290000000000310435000000200320003900000d2f010000410000000000130435000000080100002900000d0301100197000000240420003900000000001404350000000c01000029000000000012043500000d300120009c000009980000213d0000008001200039000000400010043f00000000010004140000001204000029001000000004001d0000000f04000029000000040440008c00001f0f0000c13d00000010070000290000001f0170018f000000050270027200001d480000613d0000000004000019000000050540021000000000065700190000000005530019000000000505043300000000005604350000000104400039000000000524004b00001d400000413d000000000410004c000020ca0000613d00000005022002100000000003230019000000100400002900000000022400190000000301100210000000000402043300000000041401cf000000000414022f00000000030304330000010001100089000000000313022f00000000011301cf000000000141019f0000000000120435000020ca0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019000400000002001d00000d200220009c000009980000213d0000000402000029000000400020043f000000200110008c000028dc0000413d0000001001000029000000000101043300000d030210009c000028dc0000213d00000d23020000410000000403000029000000000023043500000004023000390000000000120435000000000100041400000d240200004100000024040000390000002006000039000000000503001933fe00990000040f000000000110004c0000221e0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001d8c0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001d840000413d000000000520004c00001d9b0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000003030000290000000002320019000200000002001d00000d200220009c000009980000213d0000000202000029000000400020043f000000200110008c000028dc0000413d0000000301000029000000000101043300000d030210009c000028dc0000213d00000d23020000410000000203000029000000000023043500000004023000390000000000120435000000000100041400000d240200004100000024040000390000002006000039000000000503001933fe00990000040f000000000110004c000022670000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001dd00000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001dc80000413d000000000520004c00001ddf0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000100300002900000000023200190000001203000029000f00000003001d00000d200320009c000009980000213d000000400020043f000000200110008c0000206c0000813d0000000f01000029000000000201001933fe00ec0000040f00000d01020000410000000d0400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c7000080090200003900000011030000290000000e04000029000000000500001933fe33f40000040f0000000d090000290000000003010019000000600330027000000d0103300197000000400430008c000000400500003900000000050340190000001f0450018f000000050550027200001e160000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001e0e0000413d000000000640004c00001e260000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001e500000c13d000000010400003100000011010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200001e3f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001e370000413d000000000520004c00001e4e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019000e00000002001d00000d200220009c000009980000213d0000000e02000029000000400020043f000000400110008c00001e620000813d0000001101000029000000000201001933fe00ec0000040f00000d1f010000410000000e02000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000f02000029000000040220008c00001f190000613d000000240400003900000020060000390000000f020000290000000e03000029000000000503001933fe00990000040f000000000110004c00001f190000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001e870000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001e7f0000413d000000000520004c00001e960000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d01010000410000000d0300002900000d010230009c00000000020100190000000002034019000000110400002900000d010340009c00000000010440190000004001100210000000c002200210000000000112019f00000d26011001c7000080090200003900000010030000290000000004050019000000000500001933fe33f40000040f00000011090000290000000003010019000000600330027000000d01033001970000001005000029000000000453004b00000000050340190000001f0450018f000000050550027200001ebc0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001eb40000413d000000000640004c00001ecc0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001ef60000c13d000000010400003100000010010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000010030000290000000303300367000000050440027200001ee50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001edd0000413d000000000520004c00001ef40000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000110100002900000d200110009c000009980000213d0000001101000029000000400010043f0000001001000029000000000110004c00001f640000c13d0000000a010000290000000f0200002933fe335c0000040f0000000b010000290000000f02000029000000000112004b0000000001000019000000010100803933fe318e0000040f0000000101000039000000000010041b000000400100043d0000000f0200002900000000002104350000002002000039000000000300001933fe00e20000040f00000000040204330000001002000029000000000220004c000020910000c13d0000000f020000290000000005000019000000000600001933fe00620000040f000d00000001001d000020ca0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000e030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d0000000e0100002900000000020104330000000c01000029000e00000002001d000000000112004b000005940000413d00000d1f010000410000001102000029000000000012043500000004012000390000001002000029000000000021043500000000010004140000000702000029000000040220008c0000232b0000613d0000002404000039000000200600003900000007020000290000001103000029000000000503001933fe00990000040f000000000110004c0000232b0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200001f530000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001f4b0000413d000000000520004c00001f620000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000001001000029000000000201001933fe00ec0000040f00000d01020000410000000d0400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c7000080090200003900000011030000290000001004000029000000000500001933fe33f40000040f0000000d090000290000000003010019000000600330027000000d0103300197000000400430008c000000400500003900000000050340190000001f0450018f000000050550027200001f8a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00001f820000413d000000000640004c00001f9a0000613d0000000505500210000000000651034f0000000d0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00001fc40000c13d000000010400003100000011010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200001fb30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00001fab0000413d000000000520004c00001fc20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000400210008c000000400200003900000000020140190000001f02200039000000e00220018f0000000d030000290000000002320019001000000002001d00000d200220009c000009980000213d0000001002000029000000400020043f000000400110008c0000201f0000813d0000001101000029000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000003320019000000000223004b00000000020000190000000102004039000300000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000302000029000000400020043f000000200110008c000028dc0000413d0000000501000029000000000101043300000d030210009c000028dc0000213d00000d23020000410000000303000029000000000023043500000004023000390000000000120435000000000100041400000d240200004100000024040000390000002006000039000000000503001933fe00990000040f000000000110004c000023d70000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000200e0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000020060000413d000000000520004c0000201d0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d1f010000410000001002000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000f02000029000000040220008c000020e60000613d000000240400003900000020060000390000000f020000290000001003000029000000000503001933fe00990000040f000000000110004c000020e60000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000020440000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000203c0000413d000000000520004c000020530000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000012010000290000000102000031000000200320008c000000200300003900000000030240190000001f03300039000000600330018f00000011040000290000000004430019000000000334004b00000000030000190000000103004039001000000004001d00000d200440009c000009980000213d0000000103300190000009980000c13d0000001003000029000000400030043f000000200220008c000022b10000813d000000000201001933fe00ec0000040f000000100100002900000000010104330000000a0200002933fe2f7a0000040f0000000b0200002900000011030000290000000003230049001000000003001d00000084020000390000000202200367000000000202043b000000000223004b00000000020000190000000102008039001100000001001d000000000102001933fe30980000040f000000a4010000390000000201100367000000000101043b0000001102000029000000000112004b0000000001000019000000010100803933fe30a90000040f00000001010000390000000f02000029000000000012041b000000400100043d000000200210003900000011030000290000000000320435000000100200002900000000002104350000004002000039000000000300001933fe00e20000040f00000d010200004100000d010530009c0000000003028019000000400330021000000d010540009c00000000040280190000006004400210000000000334019f00000d010410009c0000000001028019000000c001100210000000000113019f00000d31011001c7000080090200003900000010030000290000000f04000029000000000500001933fe33f40000040f00000010090000290000000003010019000000600330027000000d0103300197000000000493004b000000000509001900000000050340190000001f0450018f0000000505500272000020b60000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000020ae0000413d000000000640004c000020c60000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000d00000002001d000100000003001f000300000001035533fe33250000040f0000000d02000029000000000220004c000020e30000613d0000000002010433000000000320004c000021310000c13d00000d070100004100000000001004390000000e0100002900000004001004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f00000d2902000041000000000020043900000d030110019700000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c000021fb0000c13d0000001001000029000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d000000100100002900000000020104330000000c01000029001000000002001d000000000112004b000005940000413d00000d1f010000410000001102000029000000000012043500000004012000390000000b02000029000000000021043500000000010004140000000e02000029000000040220008c000024230000613d000000240400003900000020060000390000000e020000290000001103000029000000000503001933fe00990000040f000000000110004c000024230000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000021200000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000021180000413d000000000520004c0000212f0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d0203000041000000200420008c0000000004000019000000000403401900000d0202200197000000000520004c000000000300a01900000d020220009c00000000020400190000000002036019000000000220004c000028dc0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c000020e30000613d000020d10000013d00000d01010000410000000a0400002900000d010240009c00000000020100190000000002044019000000070600002900000d010460009c0000000001064019000000c0011002100000004002200210000000000112019f00000d28011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000a090000290000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000216a0000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000021620000413d000000000640004c0000217a0000613d0000000505500210000000000651034f0000000a0700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000021a30000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000021920000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000218a0000413d000000000520004c000021a10000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f0000000a020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d0000000a010000290000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c00000bbe0000613d00000000030000310000000f01000029000000110200002933fe2d560000040f0000000d0200002933fe31a20000040f00000d1f01000041000000400200043d0000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000001002000029000000040220008c000024550000613d0000002404000039000000200600003900000010020000290000001103000029000000000503001933fe00990000040f000000000110004c000024550000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000021ea0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000021e20000413d000000000520004c000021f90000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000400200043d00000d32010000410000000000120435001000000002001d0000000401200039000000090200002900000000002104350000000001000414000d00000001001d00000d070100004100000000001004390000000e0100002900000004001004430000000b0100002900000024001004430000800501000039000000440200003933fe00d00000040f0000001202000029000f00000002001d00000d0305100197000000040150008c000023c30000613d0000000f01000029000000000110004c000023650000c13d00000024040000390000000d01000029000000000205001900000010030000290000000005030019000000000600001933fe00620000040f00000000020100190000239c0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000403000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000004010000290000000001010433000400000001001d00000d030110009c000028dc0000213d0000000401000029000000000110004c000026ab0000c13d000000400200043d00000d2201000041000400000002001d000000000012043500000000010004140000000702000029000000040220008c0000247c0000613d0000000404000039000000200600003900000007020000290000000403000029000000000503001933fe00990000040f000000000110004c0000247c0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000022560000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000224e0000413d000000000520004c000022650000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000002030000290000000002320019000500000002001d00000d200220009c000009980000213d0000000502000029000000400020043f000000200110008c000028dc0000413d00000002010000290000000001010433000300000001001d00000d030110009c000028dc0000213d0000000301000029000000000110004c000027790000c13d00000d22010000410000000502000029000000000012043500000000010004140000000702000029000000040220008c000024a50000613d0000000404000039000000200600003900000007020000290000000503000029000000000503001933fe00990000040f000000000110004c000024a50000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000022a00000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000022980000413d000000000520004c000022af0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000011010000290000000001010433000300000001001d00000d22010000410000001002000029000000000012043500000000010004140000000e02000029000000040220008c000022e70000613d000000040400003900000020060000390000000e020000290000001003000029000000000503001933fe00990000040f000000000110004c000022e70000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000022d60000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000022ce0000413d000000000520004c000022e50000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000010030000290000000002320019000400000002001d00000d200220009c000009980000213d0000000402000029000000400020043f000000200110008c000028dc0000413d0000001001000029000000000101043300000d030210009c000028dc0000213d00000d23020000410000000403000029000000000023043500000004023000390000000000120435000000000100041400000d240200004100000024040000390000002006000039000000000503001933fe00990000040f000000000110004c000024c90000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000231a0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000023120000413d000000000520004c000023290000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d000000110100002900000000020104330000000a01000029001100000002001d000000000112004b000005940000413d0000000c010000290000000e02000029000000000212004900000064010000390000000201100367000000000101043b001000000002001d000000000112004b0000000001000019000000010100803933fe30980000040f0000000a010000290000001102000029000000000212004900000084010000390000000201100367000000000101043b000d00000002001d000000000112004b0000000001000019000000010100803933fe30a90000040f00000001010000390000001202000029000e00000001001d001100000002001d000000000012041b00000d290100004100000000001004390000000f0100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c000025130000c13d0000001101000029000000000201001933fe00ec0000040f00000d0101000041000000100300002900000d010230009c000000000201001900000000020340190000000d0400002900000d010340009c0000000001044019000000c0011002100000004002200210000000000112019f00000d26011001c700008009020000390000000f030000290000000004050019000000000500001933fe33f40000040f00000010090000290000000003010019000000600330027000000d01033001970000000f05000029000000000453004b00000000050340190000001f0450018f0000000505500272000023890000613d000000000600001900000005076002100000000008790019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000023810000413d000000000640004c000023990000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000023c30000c13d00000001040000310000000f010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000f0300002900000003033003670000000504400272000023b20000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000023aa0000413d000000000520004c000023c10000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000100100002900000d200110009c000009980000213d0000001001000029000000400010043f0000000f01000029000000000110004c000024200000c13d0000000801000029000000090200002933fe335c0000040f000000400100043d000000200210003900000009030000290000000000320435000000110200002900000000002104350000004002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000303000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000003010000290000000001010433000500000001001d00000d030110009c000028dc0000213d0000000501000029000000000110004c000028d70000c13d000000400200043d00000d2201000041000500000002001d000000000012043500000000010004140000000902000029000000040220008c0000254c0000613d0000000404000039000000200600003900000009020000290000000503000029000000000503001933fe00990000040f000000000110004c0000254c0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000030330036700000005044002720000240f0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000024070000413d000000000520004c0000241e0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000f01000029000000000201001933fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d000000110100002900000000010104330000000a0200002933fe2f7a0000040f0000000c0200002900000010030000290000000003230049001000000003001d00000084020000390000000202200367000000000202043b000000000223004b00000000020000190000000102008039001100000001001d000000000102001933fe30980000040f000000a4010000390000000201100367000000000101043b0000001102000029000000000112004b0000000001000019000000010100803933fe30a90000040f00000001010000390000001202000029000000000012041b000000400100043d000000200210003900000011030000290000000000320435000000100200002900000000002104350000004002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000011020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000000080200002933fe2f7a0000040f0000000c020000290000000202200367000000000202043b001100000001001d000000000221004b0000000001000019000000010100803933fe318e0000040f00000001010000390000001202000029000000000012041b000000400100043d000000110200002900000000002104350000002002000039000000000300001933fe00e20000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000004030000290000000003320019000000000223004b00000000020000190000000102004039001000000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000001002000029000000400020043f000000200110008c000028dc0000413d0000000401000029000000000101043300000d030210009c000028dc0000213d00000d250200004100000010030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000700000002001d000025e10000c13d00000d2402000041000000240400003900000020060000390000001003000029000000000503001933fe00620000040f0000000002010019000026170000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000002320019000700000002001d00000d200220009c000009980000213d0000000702000029000000400020043f000000200110008c000028dc0000413d0000000501000029000000000101043300000d030210009c000028dc0000213d00000d250200004100000007030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000500000002001d0000263e0000c13d00000d2402000041000000240400003900000020060000390000000703000029000000000503001933fe00620000040f0000000002010019000026730000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000004030000290000000002320019001100000002001d00000d200220009c000009980000213d0000001102000029000000400020043f000000200110008c000028dc0000413d00000004010000290000000001010433001000000001001d00000d030110009c000028dc0000213d0000001001000029000000000110004c00002b4f0000c13d00000d22010000410000001102000029000000000012043500000000010004140000000e02000029000000040220008c000028450000613d000000040400003900000020060000390000000e020000290000001103000029000000000503001933fe00990000040f000000000110004c000028450000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000025020000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000024fa0000413d000000000520004c000025110000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000400200043d000000440120003900000010030000290000000000310435000000200320003900000d2f01000041000000000013043500000024012000390000000b0400002900000000004104350000000601000029000000000012043500000d300120009c000009980000213d0000008001200039000000400010043f00000000010004140000001204000029001100000004001d0000000f04000029000000040440008c000025750000c13d00000011020000290000001f0120018f0000000502200272000025370000613d00000000040000190000000505400210000000110600002900000000065600190000000005530019000000000505043300000000005604350000000104400039000000000524004b0000252e0000413d000000000410004c0000000e04000029000f00000004001d000025b80000613d00000005022002100000000003230019000000110400002900000000022400190000000301100210000000000402043300000000041401cf000000000414022f00000000030304330000010001100089000000000313022f00000000011301cf000000000141019f00000000001204350000000e01000029000f00000001001d000025b80000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000005030000290000000003320019000000000223004b00000000020000190000000102004039000900000003001d00000d200330009c000009980000213d0000000102200190000009980000c13d0000000902000029000000400020043f000000200110008c000028dc0000413d0000000501000029000000000101043300000d030210009c000028dc0000213d00000d250200004100000009030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a000500000002001d000028690000c13d00000d2402000041000000240400003900000020060000390000000903000029000000000503001933fe00620000040f00000000020100190000289f0000013d00000000040204330000001102000029000000000220004c0000257f0000c13d0000000f020000290000000005000019000000000600001933fe00620000040f000f00000001001d000025b80000013d00000d010200004100000d010530009c0000000003028019000000400330021000000d010540009c00000000040280190000006004400210000000000334019f00000d010410009c0000000001028019000000c001100210000000000113019f00000d31011001c7000080090200003900000011030000290000000f04000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000001105000029000000000453004b00000000050340190000001f0450018f0000000505500272000025a40000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000259b0000413d000000000640004c000025b40000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000f00000002001d000100000003001f000300000001035533fe33250000040f0000000f02000029000000000220004c000025c80000613d0000000002010433000000000320004c000025cb0000c13d00000d29010000410000000000100439000000070100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c0000282d0000c13d0000001101000029000000000201001933fe00ec0000040f00000d0203000041000000200420008c0000000004000019000000000403401900000d0202200197000000000520004c000000000300a01900000d020220009c00000000020400190000000002036019000000000220004c000028dc0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000028dc0000c13d000000000110004c000025c80000613d000025bf0000013d00000d0102000041000000100400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c7000080090200003900000d24040000410000000703000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000026040000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000025fb0000413d000000000640004c000026140000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c0000269a0000c13d00000007010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000703000029000000030330036700000005044002720000262d0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000026250000413d000000000520004c0000263c0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d010200004100000d010310009c0000000001028019000000070400002900000d010340009c00000000020440190000004002200210000000c001100210000000000121019f00000d26011001c7000080090200003900000d24040000410000000503000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000026600000613d0000000006000019000000050760021000000007080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000026570000413d000000000640004c000026700000613d0000000505500210000000000651034f000000070700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c000027660000c13d00000005010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000050300002900000003033003670000000504400272000026890000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000026810000413d000000000520004c000026980000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f0000001002000029000000000121001900000d200210009c000009980000213d000000400010043f000000200140008c000028dc0000413d00000010010000290000000001010433000400000001001d00000d030110009c000028dc0000213d0000000e010000290000000201100367000000000501043b00000d030150009c000028dc0000213d000000400600043d00000d2701000041000000000016043500000024026000390000000001000414000000120300002900000003040000290000000000420435001000000006001d000000040260003900000004040000290000000000420435000000040250008c000027230000613d000000000230004c000026c80000c13d0000004404000039000000200600003900000000020500190000001003000029000000000503001933fe00620000040f0000000002010019000026fd0000013d00000d0102000041000000100600002900000d010460009c0000000004020019000000000406401900000d010610009c0000000001028019000000c0011002100000004002400210000000000112019f00000d28011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000026ea0000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000026e10000413d000000000640004c000026fa0000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000027230000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000027120000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b0000270a0000413d000000000520004c000027210000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000010020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000010010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000028dc0000c13d0000000e010000290000000201100367000000000101043b000700000001001d00000d030110009c000028dc0000213d00000d29010000410000000000100439000000040100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00000c480000613d000000400500043d00000d2a01000041000000000015043500000024025000390000000001000414000000120300002900000003040000290000000000420435001000000005001d0000000402500039000000070400002900000000004204350000001202000029000700000002001d0000000402000029000000040220008c00002a670000613d000000000230004c00002a0b0000c13d0000004404000039000000040200002900000010030000290000000005030019000000070600002933fe00620000040f000000000201001900002a400000013d000000200140008c000000200100003900000000010440190000001f01100039000000600110018f00000007020000290000000001210019000500000001001d00000d200110009c000009980000213d0000000501000029000000400010043f000000200140008c000028dc0000413d00000007010000290000000001010433000300000001001d00000d030110009c000028dc0000213d0000000d010000290000000201100367000000000501043b00000d030150009c000028dc0000213d00000d27010000410000000506000029000000000016043500000024026000390000000001000414000000120300002900000001040000290000000000420435000000040260003900000003040000290000000000420435000000040250008c000027ef0000613d000000000230004c000027950000c13d0000004404000039000000200600003900000000020500190000000503000029000000000503001933fe00620000040f0000000002010019000027c90000013d00000d010200004100000d010410009c0000000001028019000000050600002900000d010460009c00000000020640190000004002200210000000c001100210000000000121019f00000d28011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000027b60000613d0000000006000019000000050760021000000005080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000027ad0000413d000000000640004c000027c60000613d0000000505500210000000000651034f000000050700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000027ef0000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000027de0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000027d60000413d000000000520004c000027ed0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000503000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000005010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000028dc0000c13d0000000d010000290000000201100367000000000101043b000500000001001d00000d030110009c000028dc0000213d00000d29010000410000000000100439000000030100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00000c480000613d000000400500043d00000d2a01000041000000000015043500000024025000390000000001000414000000120300002900000001040000290000000000420435000700000005001d0000000402500039000000050400002900000000004204350000001202000029000500000002001d0000000302000029000000040220008c00002ad10000613d000000000230004c00002a760000c13d0000004404000039000000030200002900000007030000290000000005030019000000050600002933fe00620000040f000000000201001900002aaa0000013d000000400200043d00000d32010000410000000000120435001100000002001d00000004012000390000000d02000029000000000021043500000000010004140000001202000029000f00000002001d0000000702000029000000040220008c000029f20000613d0000000f02000029000000000220004c000029950000c13d0000002404000039000000070200002900000011030000290000000005030019000000000600001933fe00620000040f0000000002010019000029cb0000013d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f00000011030000290000000002320019001000000002001d00000d200220009c000009980000213d0000001002000029000000400020043f000000200110008c000028dc0000413d0000001101000029000000000101043300000d030210009c000028dc0000213d00000d250200004100000010030000290000000000230435000000040230003900000000001204350000000001000414000000120200002a001100000002001d00002ae00000c13d00000d2402000041000000240400003900000020060000390000001003000029000000000503001933fe00620000040f000000000201001900002b150000013d00000d0102000041000000090400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c7000080090200003900000d24040000410000000503000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f00000005055002720000288c0000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000028830000413d000000000640004c0000289c0000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c000028c60000c13d00000005010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f000000050300002900000003033003670000000504400272000028b50000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000028ad0000413d000000000520004c000028c40000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f0000000902000029000000000121001900000d200210009c000009980000213d000000400010043f000000200140008c000028dc0000413d00000009010000290000000001010433000500000001001d00000d030110009c000028dc0000213d0000000f010000290000000201100367000000000501043b00000d030150009c000028df0000a13d0000000001000019000000000200001933fe00ec0000040f000000400600043d00000d2701000041000000000016043500000024026000390000000001000414000000120300002900000004040000290000000000420435000900000006001d000000040260003900000005040000290000000000420435000000040250008c000029520000613d000000000230004c000028f70000c13d0000004404000039000000200600003900000000020500190000000903000029000000000503001933fe00620000040f00000000020100190000292c0000013d00000d0102000041000000090600002900000d010460009c0000000004020019000000000406401900000d010610009c0000000001028019000000c0011002100000004002400210000000000112019f00000d28011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f0000000505500272000029190000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000029100000413d000000000640004c000029290000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000029520000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003033003670000000504400272000029410000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000029390000413d000000000520004c000029500000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600320018f00000009020000290000000002230019000000000332004b0000000003000019000000010300403900000d200420009c000009980000213d0000000103300190000009980000c13d000000400020043f000000200110008c000028dc0000413d00000009010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000028dc0000c13d0000000f010000290000000201100367000000000101043b000300000001001d00000d030110009c000028dc0000213d00000d29010000410000000000100439000000050100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00000c480000613d000000400500043d00000d2a01000041000000000015043500000024025000390000000001000414000000120300002900000004040000290000000000420435000900000005001d0000000402500039000000030400002900000000004204350000001202000029000300000002001d0000000502000029000000040220008c00002c650000613d000000000230004c00002c090000c13d0000004404000039000000050200002900000009030000290000000005030019000000030600002933fe00620000040f000000000201001900002c3e0000013d00000d0102000041000000110400002900000d010340009c0000000003020019000000000304401900000d010410009c0000000001028019000000c0011002100000004002300210000000000112019f00000d26011001c700008009020000390000000f030000290000000704000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000000f05000029000000000453004b00000000050340190000001f0450018f0000000505500272000029b80000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000029af0000413d000000000640004c000029c80000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c000029f20000c13d00000001040000310000000f010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000f0300002900000003033003670000000504400272000029e10000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b000029d90000413d000000000520004c000029f00000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000110100002900000d200110009c000009980000213d0000001101000029000000400010043f0000000f01000029000000000110004c00002a080000c13d0000000b010000290000000d0200002933fe335c0000040f0000000e01000029000000000010041b000000400100043d00000020021000390000000d030000290000000000320435000000100200002900000000002104350000004002000039000000000300001933fe00e20000040f0000000f01000029000000000201001933fe00ec0000040f00000d0102000041000000100500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d28011001c700008009020000390000000404000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000000705000029000000000453004b00000000050340190000001f0450018f000000050550027200002a2d0000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002a240000413d000000000640004c00002a3d0000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002a670000c13d000000010400003100000007010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000007030000290000000303300367000000050440027200002a560000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002a4e0000413d000000000520004c00002a650000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000100100002900000d200110009c000009980000213d0000000c0100002900000005020000290000000001210049000c00000001001d0000001001000029000000400010043f0000000701000029000000000110004c00000ed90000613d0000000701000029000000000201001933fe00ec0000040f00000d010200004100000d010410009c0000000001028019000000070500002900000d010450009c00000000020540190000004002200210000000c001100210000000000121019f00000d28011001c700008009020000390000000304000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000000505000029000000000453004b00000000050340190000001f0450018f000000050550027200002a970000613d0000000006000019000000050760021000000007080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002a8e0000413d000000000640004c00002aa70000613d0000000505500210000000000651034f000000070700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002ad10000c13d000000010400003100000005010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000005030000290000000303300367000000050440027200002ac00000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002ab80000413d000000000520004c00002acf0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000070100002900000d200110009c000009980000213d0000000c0100002900000004020000290000000001210049000c00000001001d0000000701000029000000400010043f0000000501000029000000000110004c00000f4c0000613d0000000501000029000000000201001933fe00ec0000040f00000d010200004100000d010310009c0000000001028019000000100400002900000d010340009c00000000020440190000004002200210000000c001100210000000000121019f00000d26011001c7000080090200003900000d24040000410000001103000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002b020000613d0000000006000019000000050760021000000010080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002af90000413d000000000640004c00002b120000613d0000000505500210000000000651034f000000100700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f00030000000103550000000104000031000000000120004c00002b3c0000c13d00000011010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000011030000290000000303300367000000050440027200002b2b0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002b230000413d000000000520004c00002b3a0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000200140008c000000200100003900000000010440190000001f01100039000000600110018f00000010020000290000000001210019001100000001001d00000d200110009c000009980000213d0000001101000029000000400010043f000000200140008c000028dc0000413d00000010010000290000000001010433001000000001001d00000d030110009c000028dc0000213d0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d0000000001010433000000000201043300000d2701000041000000110600002900000000001604350000002404600039000000000100041400000012030000290000000305000029000000000054043500000004046000390000001005000029000000000054043500000d0305200197000000040250008c00002bc80000613d000000000230004c00002b6e0000c13d0000004404000039000000200600003900000000020500190000001103000029000000000503001933fe00620000040f000000000201001900002ba20000013d00000d010200004100000d010410009c0000000001028019000000110600002900000d010460009c00000000020640190000004002200210000000c001100210000000000121019f00000d28011001c700008009020000390000000004050019000000000500001933fe33f40000040f0000000003010019000000600330027000000d0103300197000000200430008c000000200500003900000000050340190000001f0450018f000000050550027200002b8f0000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002b860000413d000000000640004c00002b9f0000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002bc80000c13d000000120300002900000001040000310000000001340019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000303300367000000050440027200002bb70000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002baf0000413d000000000520004c00002bc60000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000001103000029000000000232001900000d200320009c000009980000213d000000400020043f000000200110008c000028dc0000413d00000011010000290000000001010433000000000210004c0000000002000019000000010200c039000000000121004b000028dc0000c13d0000000b010000290000000001010433000000000110004c0000000801000029000002640000613d00000000010104330000000001010433001100000001001d00000d29010000410000000000100439000000100100002900000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c00000c480000613d000000400500043d00000d2a01000041000000000015043500000024025000390000000001000414000000120300002900000003040000290000000000420435000000110200002900000d0302200197001100000005001d000000040450003900000000002404350000001002000029000000040220008c00002ccf0000613d0000001202000029000e00000002001d000000000230004c00002c740000c13d00000044040000390000001002000029000000110300002900000000050300190000000e0600002933fe00620000040f000000000201001900002ca80000013d00000d0102000041000000090500002900000d010450009c0000000004020019000000000405401900000d010510009c0000000001028019000000c0011002100000004002400210000000000112019f00000d28011001c700008009020000390000000504000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000000305000029000000000453004b00000000050340190000001f0450018f000000050550027200002c2b0000613d0000000006000019000000050760021000000009080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002c220000413d000000000640004c00002c3b0000613d0000000505500210000000000651034f000000090700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002c650000c13d000000010400003100000003010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f00000003030000290000000303300367000000050440027200002c540000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002c4c0000413d000000000520004c00002c630000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000090100002900000d200110009c000009980000213d000000060100002900000004020000290000000001210049000600000001001d0000000901000029000000400010043f0000000301000029000000000110004c000018760000613d0000000301000029000000000201001933fe00ec0000040f00000d010200004100000d010410009c0000000001028019000000110500002900000d010450009c00000000020540190000004002200210000000c001100210000000000121019f00000d28011001c700008009020000390000001004000029000000000500001933fe33f40000040f0000000003010019000000600330027000000d01033001970000000e05000029000000000453004b00000000050340190000001f0450018f000000050550027200002c950000613d0000000006000019000000050760021000000011080000290000000008780019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b00002c8c0000413d000000000640004c00002ca50000613d0000000505500210000000000651034f000000110700002900000000055700190000000304400210000000000705043300000000074701cf000000000747022f000000000606043b0000010004400089000000000646022f00000000044601cf000000000474019f0000000000450435000000010220018f000100000003001f0003000000010355000000000120004c00002ccf0000c13d00000001040000310000000e010000290000000001140019000000000141004b000028dc0000213d000000400100043d0000001f0240018f0000000e030000290000000303300367000000050440027200002cbe0000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00002cb60000413d000000000520004c00002ccd0000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000110100002900000d200110009c000009980000213d0000000a0100002900000005020000290000000001210049000a00000001001d0000001101000029000000400010043f000018140000013d000000000101043300000d3e0210009c00002cdd0000813d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000004010000390000000201100367000000000101043b00000d3e0210009c00002ce60000813d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000024010000390000000201100367000000000101043b00000d3e0210009c00002cef0000813d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000044010000390000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b00002cfb0000c13d000000000001042d0000000001000019000000000200001933fe00ec0000040f0000001f0310003900000d0204000041000000000523004b0000000005000019000000000504401900000d020620019700000d0203300197000000000763004b000000000400a019000000000363013f00000d020330009c00000000030500190000000003046019000000000330004c00002d180000613d0000000203100367000000000303043b00000d200430009c00002d180000213d00000060543000c900000020011000390000000004410019000000000224004b00002d180000213d0000000002030019000000000001042d0000000001000019000000000200001933fe00ec0000040f00020000000000020000000002010019000000040120008a00000d02030000410000009f0410008c0000000004000019000000000403201900000d0201100197000000000510004c000000000300801900000d020110009c00000000010400190000000001036019000000000110004c00002d430000613d00000002010003670000002403100370000000000303043b000200000003001d0000000403100370000000000303043b000100000003001d0000004401100370000000000101043b00000d200310009c00002d430000213d000000040110003933fe2cfe0000040f0000000003010019000000000402001900000002010003670000006402100370000000000502043b00000d030250009c00002d430000213d0000008401100370000000000601043b00000001010000290000000202000029000000000001042d0000000001000019000000000200001933fe00ec0000040f0000002003000039000000000031043500000000030204330000002004100039000000000034043500000040011000390000000004000019000000000534004b00002d550000813d0000002002200039000000000502043300000000005104350000000104400039000000200110003900002d4d0000013d000000000001042d00000d3f0420009c00002d9f0000813d00000005042002100000003f04400039000000200500008a000000000554016f000000400400043d0000000005540019000000000645004b0000000006000019000000010600403900000d200750009c00002d9f0000213d000000010660019000002d9f0000c13d000000400050043f000000000024043500000060522000c90000000002120019000000000532004b00002d9c0000213d0000000005040019000000000621004b00002d9a0000813d000000000613004900000d0207000041000000600860008c0000000008000019000000000807401900000d0206600197000000000960004c000000000700a01900000d020660009c00000000060800190000000006076019000000000660004c00002d9c0000c13d000000400600043d00000d400760009c00002d9f0000213d0000006007600039000000400070043f0000000207100367000000000707043b00000d030870009c00002d9c0000213d000000000076043500000020071000390000000207700367000000000707043b00000d030870009c00002d9c0000213d0000002008600039000000000078043500000040071000390000000207700367000000000707043b000000000870004c0000000008000019000000010800c039000000000887004b00002d9c0000c13d0000002005500039000000400860003900000000007804350000000000650435000000600110003900002d6c0000013d0000000001040019000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000040110008a00000d0202000041000000df0310008c0000000003000019000000000302201900000d0201100197000000000410004c000000000200801900000d020110009c00000000010300190000000001026019000000000110004c00002dcc0000613d00000002070003670000000401700370000000000101043b00000d030210009c00002dcc0000213d0000002402700370000000000202043b000000000320004c0000000003000019000000010300c039000000000332004b00002dcc0000c13d000000a403700370000000000603043b00000d030360009c00002dcc0000213d0000004403700370000000000303043b0000006404700370000000000404043b0000008405700370000000000505043b000000c407700370000000000707043b000000000001042d0000000001000019000000000200001933fe00ec0000040f000000000110004c00002dd20000613d000000000001042d00000d050100004100000000001004350000000101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f00000d030410019700000d0305200197000000000354004b00002de60000613d000000000354004b0000000003020019000000000301401900000d030630019800002df40000613d000000000454004b00000000020180190000000001030019000000000001042d000000400100043d000000440210003900000d4303000041000000000032043500000024021000390000001b03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000000400100043d000000440210003900000d4103000041000000000032043500000024021000390000001403000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f0005000000000002000300000003001d000200000002001d000400000001001d33fe2dd90000040f00000d3801000041000000400200043d000500000002001d00000000001204350000000001000414000100000001001d00000d070100004100000000001004390000000001000412000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000005030000290000000302000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000020200002900000d030220019700000024043000390000000000240435000000040200002900000d03022001970000000404300039000000000024043500000d0302100197000000040120008c00002e2f0000613d000000640400003900000020060000390000000101000029000000050500002933fe00990000040f0000000503000029000000000110004c00002e5e0000613d0000000102000031000000200120008c000000200100003900000000010240190000001f01100039000000600410018f0000000001340019000000000441004b0000000005000019000000010500403900000d200410009c00002e4a0000213d000000010450019000002e4a0000c13d000000400010043f0000001f0220008c00002e470000a13d000000000203043300000d030320009c00002e470000213d000000000320004c00002e510000613d0000000001020019000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000440210003900000d4403000041000000000032043500000024021000390000000703000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200002e6d0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00002e650000413d000000000530004c00002e7c0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0005000000000002000300000003001d000200000002001d000400000001001d33fe2dd90000040f00000d3801000041000000400200043d000500000002001d00000000001204350000000001000414000100000001001d00000d070100004100000000001004390000000001000412000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000005030000290000000302000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000020200002900000d030220019700000024043000390000000000240435000000040200002900000d03022001970000000404300039000000000024043500000d0302100197000000040120008c00002eab0000613d000000640400003900000020060000390000000101000029000000050500002933fe00990000040f0000000503000029000000000110004c00002eca0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b0000000005000019000000010500403900000d200420009c00002ec30000213d000000010450019000002ec30000c13d000000400020043f0000001f0110008c00002ec00000a13d000000000103043300000d030210009c00002ec00000213d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200002ed90000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00002ed10000413d000000000530004c00002ee80000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000000212004900000d02030000410000005f0420008c0000000004000019000000000403201900000d0202200197000000000520004c000000000300801900000d020220009c00000000020400190000000002036019000000000220004c00002efe0000613d000000200210003900000000020204330000000004010433000000400110003900000000030104330000000001040019000000000001042d0000000001000019000000000200001933fe00ec0000040f0004000000000002000300000003001d000200000002001d000400000001001d33fe2dd90000040f000100000001001d00000004010000290000000202000029000000030300002933fe2e7e0000040f00000d4502000041000000400500043d00000000002504350000000002010019000000000100041400000d0302200197000000040320008c00002f1c0000613d000000040400003900000060060000390000000003050019000300000005001d000000030500002933fe00990000040f0000000305000029000000000110004c00002f3d0000613d0000000101000031000000600210008c00000060010080390000001f02100039000000e00320018f0000000002530019000000000332004b0000000003000019000000010300403900000d200420009c00002f360000213d000000010330019000002f360000c13d000000400020043f0000000002510019000000000105001933fe2eea0000040f00000004030000290000000104000029000000000334013f00000d030330019800000000030200190000000003016019000000000201c0190000000001030019000000000001042d00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f000000050440027200002f4c0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b00002f440000413d000000000530004c00002f5b0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f000000000110004c00002f600000613d000000000001042d000000400100043d000000440210003900000d4603000041000000000032043500000024021000390000001403000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f0000000002010433000000000220004c00002f730000613d0000002001100039000000000001042d00000d050100004100000000001004350000003201000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000321004b00002f7e0000413d0000000001210049000000000001042d00000d050100004100000000001004350000001101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000410004c00002f910000613d000000000420004c00002f9f0000613d000000000430004c00002f9f0000613d00000000541300a900000000511400d9000000000131004b00002fad0000c13d00000000212400d9000000000001042d000000400100043d000000440210003900000d4803000041000000000032043500000024021000390000001b03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000000400100043d000000440210003900000d4703000041000000000032043500000024021000390000001e03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f00000d050100004100000000001004350000001101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0006000000000002000200000004001d000500000003001d000400000002001d000300000001001d000000400200043d000600000002001d00000d380100004100000000001204350000000001000414000100000001001d00000d070100004100000000001004390000000001000412000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000006030000290000000502000029000000000220004c0000000002000019000000010200c03900000044043000390000000000240435000000040200002900000d030220019700000024043000390000000000240435000000030200002900000d03022001970000000404300039000000000024043500000d0302100197000000040120008c00002fe10000613d000000640400003900000020060000390000000101000029000000060500002933fe00990000040f0000000603000029000000000110004c0000304c0000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600420018f0000000002340019000000000442004b0000000005000019000000010500403900000d200420009c000030450000213d0000000104500190000030450000c13d000000400020043f0000001f0110008c000030420000a13d000000000403043300000d030140009c000030420000213d000000000140004c00000000010000190000000002000019000030410000613d000000030100002900000004020000290000000503000029000600000004001d33fe2f010000040f000000060500002900000d3904000041000000400300043d000000000043043500000000070100190000000001000414000000040450008c000030130000613d0000000404000039000500000002001d000000200600003900000000020500190000000005030019000600000007001d000400000003001d33fe00990000040f000000040300002900000006070000290000000502000029000000000110004c0000304c0000613d0000000101000031000000200410008c000000200400003900000000040140190000001f04400039000000600440018f0000000005340019000000000445004b0000000006000019000000010600403900000d200450009c000030450000213d0000000104600190000030450000c13d000000400050043f000000200110008c000030420000413d00000000060304330000000203000029000000000130004c0000303c0000613d000000000403001900000000314700a900000000434100d9000000000373004b000030350000c13d000000000360004c0000306c0000613d00000000316100d9000000020500002900000000435200a900000000545300d9000000000424004b000030400000613d00000d050100004100000000001004350000001101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000160004c000000000300001900000000010000190000306c0000613d00000000326300d9000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f00000005044002720000305b0000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000030530000413d000000000530004c0000306a0000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d050100004100000000001004350000001201000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000110004c000030760000613d000000000001042d000000400100043d000000440210003900000d4903000041000000000032043500000024021000390000000f03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000000000100041a000000020110008c0000308a0000613d0000000201000039000000000010041b000000000001042d000000400100043d000000440210003900000d4a03000041000000000032043500000024021000390000001f03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000000000110004c0000309b0000613d000000000001042d000000400100043d000000440210003900000d4b03000041000000000032043500000024021000390000001d03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000000000110004c000030ac0000613d000000000001042d000000400100043d000000440210003900000d4c03000041000000000032043500000024021000390000001d03000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000640200003933fe00ec0000040f000c000000000002000700000007001d000c00000005001d000b00000003001d000a00000002001d000900000001001d000800000004001d000600000006001d000000000164004b0000315d0000413d0000000c010000290000000702000029000000000121004b0000315d0000413d00000d070100004100000000001004390000000001000412000000040010044300000024000004430000800501000039000000440200003933fe00d00000040f00000d3802000041000000400900043d00000000002904350000000b02000029000000000220004c0000000006000019000000010600c03900000000020100190000004403900039000000000100041400000000006304350000000a0300002900000d030730019700000024039000390000000000730435000000090300002900000d03083001970000000403900039000000000083043500000d0305200197000000040250008c000030f80000613d0000006404000039000400000006001d000000200600003900000000020500190000000003090019000500000005001d0000000005090019000300000007001d000200000008001d000100000009001d33fe00990000040f00000001090000290000000208000029000000030700002900000004060000290000000505000029000000000110004c000031670000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003920019000000000223004b0000000002000019000000010200403900000d200430009c000031600000213d0000000102200190000031600000c13d000000400030043f000000200110008c0000315d0000413d000000000109043300000d030210009c0000315d0000213d000000000110004c000031310000c13d00000d4d0100004100000000001304350000004402300039000000000100041400000000006204350000002402300039000000000072043500000004023000390000000000820435000000040250008c000031220000613d000000640400003900000020060000390000000002050019000500000003001d000000050500002933fe00620000040f0000000503000029000000000110004c000031670000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d200420009c000031600000213d000000400020043f000000200110008c0000315d0000413d000000000103043300000d030110009c0000315d0000213d00000009010000290000000a020000290000000b0300002933fe2f010000040f0000000003010019000000000402001900000000014301a000000008010000290000315b0000613d000b00000003001d0000000002030019000a00000004001d000000000304001933fe2f850000040f00000000030100190000000c01000029000000000213004b000031520000a13d0000000a020000290000000b0300002933fe2f850000040f00000000020100190000000801000029000000000112004b000031870000213d0000000601000029000000000112004b00000000010000190000000101008039000b00000002001d33fe30980000040f0000000b010000290000315b0000013d0000000701000029000000000113004b00000000010000190000000101008039000c00000003001d33fe30a90000040f0000000c01000029000c00000001001d00000008010000290000000c02000029000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000031760000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b0000316e0000413d000000000530004c000031850000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f00000d050100004100000000001004350000000101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000110004c000031910000613d000000000001042d000000400100043d000000640210003900000d4e030000410000000000320435000000440210003900000d4f03000041000000000032043500000024021000390000002203000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000840200003933fe00ec0000040f000a000000000002000100000002001d00000000030100190000002001300039000200000001001d0000000004000019000800000003001d0000000001030433000000000114004b000032e00000813d000000050140021000000002020000290000000001210019000900000001001d0000000002010433000000000102043300000d03011001970000002002200039000000000202043300000d0302200197000a00000004001d33fe2dd90000040f00000008020000290000000002020433000600000001001d0000000a01000029000000000112004b000032e10000a13d000000090100002900000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d030110019700000d0302200197000000000330004c0000000003000019000000010300c03933fe2e020000040f00000d4502000041000000400500043d00000000002504350000000002010019000000000100041400000d0302200197000700000002001d000000040220008c000031de0000613d0000000404000039000000600600003900000007020000290000000003050019000500000005001d000000050500002933fe00990000040f0000000505000029000000000110004c000032f20000613d0000000101000031000000600210008c00000060010080390000001f02100039000000e00320018f0000000002530019000000000332004b0000000003000019000000010300403900000d200420009c000032e80000213d0000000103300190000032e80000c13d000000400020043f0000000002510019000000000105001933fe2eea0000040f000000080300002900000000030304330000000a04000029000000000343004b000032e10000a13d000000090300002900000000030304330000000003030433000000400700043d00000d1f040000410000000000470435000000040470003900000007050000290000000000540435000000060400002900000d030440019700000d0303300197000600000004001d000000000443004b000000000602001900000000060160190000000001000414000000040230008c000032130000613d0000002404000039000500000006001d0000002006000039000000000203001900000000030700190000000005070019000400000007001d33fe00990000040f00000004070000290000000506000029000000000110004c000032f20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f0000000003720019000000000223004b0000000002000019000000010200403900000d200430009c000032e80000213d0000000102200190000032e80000c13d000000400030043f000000200110008c000032ef0000413d0000000002070433000000000162004b00000008010000290000000a04000029000032d90000413d0000000001010433000000000141004b000032e10000a13d00000009010000290000000001010433000000000101043300000d3b04000041000000000043043500000d03051001970000002404300039000000000100041400000000005404350000000002620049000000040430003900000000002404350000000702000029000000040220008c000032440000613d000000440400003900000020060000390000000702000029000700000003001d000000070500002933fe00990000040f0000000703000029000000000110004c000032f20000613d0000000101000031000000200210008c000000200200003900000000020140190000001f02200039000000600220018f000000000232001900000d200420009c000032e80000213d000000400020043f000000200110008c000032ef0000413d000000080100002900000000020104330000000a04000029000000000142004b000032e10000a13d000000000103043300000009030000290000000003030433000000000303043300000d03033001970000000605000029000000000353004b00000000030000190000000003016019000600000003001d0000000001006019000700000001001d000000010120008a000000000114004b00000001010000290000327a0000813d0000000101400039000000000212004b000032e10000a13d0000000501100210000000020200002900000000012100190000000003010433000000000103043300000d03011001970000002002300039000000000202043300000d030220019700000040033000390000000003030433000000000330004c0000000003000019000000010300c03933fe2e020000040f0000000a0400002900000008020000290000000002020433000500000001001d000000000142004b000032e10000a13d000000090100002900000000010104330000004002100039000000000302043300000020021000390000000002020433000000000101043300000d030110019700000d0302200197000000000330004c0000000003000019000000010300c03933fe2e020000040f000000400300043d00000d030210019700000d500130009c000032e80000213d0000002001300039000400000001001d000000400010043f000300000003001d000000000003043500000d29010000410000000000100439000900000002001d00000004002004430000800201000039000000240200003933fe00d00000040f000000000110004c000032ef0000613d0000000a010000290000000107100039000000400300043d000000640130003900000080020000390000000000210435000000050100002900000d03011001970000004402300039000000000012043500000024013000390000000602000029000000000021043500000d510100004100000000001304350000000401300039000000070200002900000000002104350000000301000029000000000601043300000084013000390000000000610435000000a40130003900000000020000190000000408000029000000000462004b000032bd0000813d00000000042100190000000005280019000000000505043300000000005404350000002002200039000032b50000013d0000000001610019000000000001043500000000010004140000000902000029000000040420008c000032d00000613d0000001f04600039000000200500008a000000000454016f000000a40440003900000000050300190000000006000019000900000007001d000700000003001d33fe00620000040f00000007030000290000000907000029000000000110004c000032f20000613d00000d200130009c000032e80000213d000000400030043f000000010100008a0000000a02000029000000000112004b00000000040700190000000803000029000031a90000c13d00000d050100004100000000001004350000001101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000000001042d00000d050100004100000000001004350000003201000039000000040010043f0000002402000039000000000100001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f0000000001000019000000000200001933fe00ec0000040f0000000302000367000000400100043d00000001040000310000001f0340018f0000000504400272000033010000613d000000000500001900000005065002100000000007610019000000000662034f000000000606043b00000000006704350000000105500039000000000645004b000032f90000413d000000000530004c000033100000613d0000000504400210000000000242034f00000000044100190000000303300210000000000504043300000000053501cf000000000535022f000000000202043b0000010003300089000000000232022f00000000023201cf000000000252019f0000000000240435000000010200003133fe00ec0000040f0000000201100367000000000101043b00000d3e0210009c000033170000813d000000000001042d0000000001000019000000000200001933fe00ec0000040f0000000201100367000000000101043b000000000210004c0000000002000019000000010200c039000000000221004b000033220000c13d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000060010000390000000102000032000033540000613d0000003f01200039000000200300008a000000000331016f000000400100043d0000000003310019000000000413004b0000000004000019000000010400403900000d200530009c000033550000213d0000000104400190000033550000c13d000000400030043f00000000002104350000002002100039000000030300036700000001050000310000001f0450018f0000000505500272000033450000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b0000333d0000413d000000000640004c000033540000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000000001042d00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000100000000000200000000030200190000000004010019000000400100043d00000d520210009c000033860000813d0000002002100039000000400020043f000000000001043500000001050000390000000001000414000000040240008c000033800000613d000000000230004c000033790000613d00000d010200004100000d010510009c0000000001028019000000c00110021000000d31011001c70000800902000039000000000500001933fe33f40000040f0000000003010019000000600330027000010d010030019d0003000000010355000000010520018f000033800000013d0000000002040019000000000300001900000000040000190000000005000019000000000600001933fe00620000040f0000000005010019000100000005001d33fe33250000040f0000000101000029000000000110004c0000338d0000613d000000000001042d00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000000400100043d000000640210003900000d53030000410000000000320435000000440210003900000d5403000041000000000032043500000024021000390000002303000039000000000032043500000d42020000410000000000210435000000040210003900000020030000390000000000320435000000840200003933fe00ec0000040f0004000000000002000200000004001d000300000003001d000400000002001d00000d29020000410000000000200439000100000001001d00000004001004430000800201000039000000240200003933fe00d00000040f000000000110004c000033ea0000613d000000400500043d000000640150003900000002020000290000000000210435000000030100002900000d030110019700000044035000390000000000130435000000200350003900000d2c010000410000000000130435000000040100002900000d0301100197000000240450003900000000001404350000006401000039000000000015043500000d550150009c000033ed0000813d000000a001500039000000400010043f00000000010004140000000102000029000000040420008c0000000004000019000033cc0000613d00000000040504330000000005000019000000000600001933fe00620000040f000000000110004c00000000040000190000000104006039000400000004001d33fe33250000040f00000004020000290000000102200190000033ea0000c13d0000000002010433000000000320004c000033e90000613d00000d0203000041000000200420008c0000000004000019000000000403401900000d0202200197000000000520004c000000000300a01900000d020220009c00000000020400190000000002036019000000000220004c000033ea0000c13d00000020011000390000000001010433000000000210004c0000000002000019000000010200c039000000000221004b000033ea0000c13d000000000110004c000033ea0000613d000000000001042d0000000001000019000000000200001933fe00ec0000040f00000d050100004100000000001004350000004101000039000000040010043f0000002402000039000000000100001933fe00ec0000040f000033f7002104210000000102000039000000000001042d0000000002000019000033f60000013d000033fc002104230000000102000039000000000001042d0000000002000019000033fb0000013d000033fe00000432000033ff0001042e000034000001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff00000002000000000000000000000000000000000000000000000000000000004e487b71000000000000000000000000000000000000000000000000000000000200000200000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e000000000000000000000000000000000000000000000000000000000dede6c40000000000000000000000000000000000000000000000000000000013dcfc590000000000000000000000000000000000000000000000000000000018a13086000000000000000000000000000000000000000000000000000000003fc8cef3000000000000000000000000000000000000000000000000000000004386e63c00000000000000000000000000000000000000000000000000000000448725b4000000000000000000000000000000000000000000000000000000004c1ee03e00000000000000000000000000000000000000000000000000000000544caa56000000000000000000000000000000000000000000000000000000005a47ddc3000000000000000000000000000000000000000000000000000000005e1e6325000000000000000000000000000000000000000000000000000000005e60dab50000000000000000000000000000000000000000000000000000000067ffb66a000000000000000000000000000000000000000000000000000000007301e3c8000000000000000000000000000000000000000000000000000000009881fcb40000000000000000000000000000000000000000000000000000000098a0fb3c00000000000000000000000000000000000000000000000000000000a32b1fcd00000000000000000000000000000000000000000000000000000000b7e0d4c000000000000000000000000000000000000000000000000000000000c45a015500000000000000000000000000000000000000000000000000000000cfc381ea00000000000000000000000000000000000000000000000000000000d7b0e0a500000000000000000000000000000000000000000000000000000000e5e31b1300000000000000000000000000000000000000000000000000000000f41766d8796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d9553913270a0823100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff45a1de79000000000000000000000000000000000000000000000000000000006c4f5398000000000000000000000000000000000000000000000000000000002fcd8f2700000000000000000000000000000000000000000000000000000000000000000000000000000000e490695fafe699e85ff4b23bc9986cfe454b65f46bd1a72c000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000024000000000000000000000000095ea7b30000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000440000000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83b66503cf00000000000000000000000000000000000000000000000000000000e5e31b130000000000000000000000000000000000000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000006400000000000000000000000089afcb4400000000000000000000000000000000000000000000000000000000a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f02000000000000000000000000000000000000000000000000000000000000002e1a7d4d00000000000000000000000000000000000000000000000000000000d0e30db00000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000040000000000000000000000006a62784200000000000000000000000000000000000000000000000000000000d505accf0000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000e40000000000000000000000006801cc300000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffffffffffffffffffff140a35a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffffa000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9f526f757465723a205a45524f5f4144445245535300000000000000000000000008c379a000000000000000000000000000000000000000000000000000000000526f757465723a204944454e544943414c5f414444524553534553000000000070616972206e61000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000526f757465723a20494e56414c49445f50415448000000000000000000000000526f757465723a20494e53554646494349454e545f4c49515549444954590000526f757465723a20494e53554646494349454e545f414d4f554e540000000000526f757465723a204558504952454400000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00526f757465723a20494e53554646494349454e545f415f414d4f554e54000000526f757465723a20494e53554646494349454e545f425f414d4f554e5400000082dfdce4000000000000000000000000000000000000000000000000000000004e54000000000000000000000000000000000000000000000000000000000000526f757465723a20494e53554646494349454e545f4f55545055545f414d4f55000000000000000000000000000000000000000000000000ffffffffffffffdf022c0d9f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffe04c454400000000000000000000000000000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f464149000000000000000000000000000000000000000000000000ffffffffffffff600000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0x000000000000000000000000e140eac2bb748c8f456719a457f26636617bb0e90000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91
-----Decoded View---------------
Arg [0] : _factory (address): 0xE140EaC2bB748c8F456719a457F26636617Bb0E9
Arg [1] : _weth (address): 0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
-----Encoded View---------------
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,784.54 | 0.0151 | $26.95 |
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.