ETH Price: $2,284.92 (+1.83%)

Contract

0x7642e38867860d4512Fcce1116e2Fb539c5cdd21
Transaction Hash
Method
Block
From
To
Approve436334582024-09-07 13:05:005 hrs ago1725714300IN
0x7642e388...39c5cdd21
0 ETH0.000005070.04525
Approve436163572024-09-07 8:08:4010 hrs ago1725696520IN
0x7642e388...39c5cdd21
0 ETH0.000004220.04525
Approve435737122024-09-06 19:13:1523 hrs ago1725649995IN
0x7642e388...39c5cdd21
0 ETH0.000004980.04525
Approve435541752024-09-06 13:39:0029 hrs ago1725629940IN
0x7642e388...39c5cdd21
0 ETH0.000005710.04525
Approve435516282024-09-06 12:54:3629 hrs ago1725627276IN
0x7642e388...39c5cdd21
0 ETH0.000005080.04525
Approve435453962024-09-06 11:07:2231 hrs ago1725620842IN
0x7642e388...39c5cdd21
0 ETH0.00000430.04525
Approve434522012024-09-05 8:26:572 days ago1725524817IN
0x7642e388...39c5cdd21
0 ETH0.000004840.04525
Approve434228362024-09-04 23:54:352 days ago1725494075IN
0x7642e388...39c5cdd21
0 ETH0.000004240.04525
Approve434201232024-09-04 22:56:452 days ago1725490605IN
0x7642e388...39c5cdd21
0 ETH0.000004260.04525
Approve433668412024-09-04 7:27:403 days ago1725434860IN
0x7642e388...39c5cdd21
0 ETH0.000004970.04525
Approve433653052024-09-04 7:01:433 days ago1725433303IN
0x7642e388...39c5cdd21
0 ETH0.00000420.04525
Approve433541462024-09-04 3:50:353 days ago1725421835IN
0x7642e388...39c5cdd21
0 ETH0.00000420.04525
Approve433541412024-09-04 3:50:303 days ago1725421830IN
0x7642e388...39c5cdd21
0 ETH0.00000420.04525
Approve433508702024-09-04 2:54:083 days ago1725418448IN
0x7642e388...39c5cdd21
0 ETH0.000004360.04525
Approve433295222024-09-03 20:33:103 days ago1725395590IN
0x7642e388...39c5cdd21
0 ETH0.000004890.04525
Approve433225462024-09-03 18:31:304 days ago1725388290IN
0x7642e388...39c5cdd21
0 ETH0.000004320.04525
Approve433183292024-09-03 17:18:374 days ago1725383917IN
0x7642e388...39c5cdd21
0 ETH0.000004180.04525
Approve432881302024-09-03 8:44:384 days ago1725353078IN
0x7642e388...39c5cdd21
0 ETH0.000005170.04525
Approve432770012024-09-03 5:34:524 days ago1725341692IN
0x7642e388...39c5cdd21
0 ETH0.000004750.04525
Approve432342272024-09-02 16:37:395 days ago1725295059IN
0x7642e388...39c5cdd21
0 ETH0.000005540.04525
Approve432329992024-09-02 16:16:345 days ago1725293794IN
0x7642e388...39c5cdd21
0 ETH0.000005570.04525
Approve432260752024-09-02 14:17:265 days ago1725286646IN
0x7642e388...39c5cdd21
0 ETH0.000004460.04525
Approve432245022024-09-02 13:50:355 days ago1725285035IN
0x7642e388...39c5cdd21
0 ETH0.000004210.04525
Approve432149382024-09-02 11:07:555 days ago1725275275IN
0x7642e388...39c5cdd21
0 ETH0.000005150.04525
Approve431779152024-09-02 0:20:215 days ago1725236421IN
0x7642e388...39c5cdd21
0 ETH0.000004150.04525
View all transactions

Latest 1 internal transaction

Parent Transaction Hash Block From To
41906902023-05-23 14:19:31473 days ago1684851571  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZFPair

Compiler Version
v0.8.16+commit.07a7930e

ZkSolc Version
v1.3.8

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 18 : ZFPair.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import '../interfaces/ERC20/IERC20.sol';
import '../interfaces/protocol/core/IZFPair.sol';
import '../interfaces/protocol/core/IZFFactory.sol';
import '../interfaces/protocol/core/uniswap/IUniswapV2Callee.sol';

import '../libraries/utils/math/Math.sol';
import '../libraries/utils/math/UQ112x112.sol';
import '../libraries/security/ReentrancyGuard.sol';
import '../libraries/token/ERC20/ERC20WithPermit.sol';
import '../libraries/token/ERC20/utils/TransferHelper.sol';
import '../libraries/token/ERC20/utils/MetadataHelper.sol';

contract ZFPair is IZFPair, ERC20WithPermit, ReentrancyGuard {
    using TransferHelper for address;
    using UQ112x112 for uint224;

    /// @dev liquidity to be locked forever on first provision
    uint private constant MINIMUM_LIQUIDITY = 1000;

    uint private constant SWAP_FEE_POINT_PRECISION = 10000;
    uint private constant SWAP_FEE_POINT_PRECISION_SQ = 10000_0000;

    address public override factory;
    address public override token0;
    address public override token1;

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves
    uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint public override price0CumulativeLast;
    uint public override price1CumulativeLast;
    uint public override kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event

    uint16 private constant SWAP_FEE_INHERIT = type(uint16).max;
    uint16 public override swapFeeOverride = SWAP_FEE_INHERIT;

    // track account balances, uses single storage slot
    struct Principal {
        uint112 principal0;
        uint112 principal1;
        uint32 timeLastUpdate;
    }
    mapping(address => Principal) private principals;

    /// @dev create and initialize the pair
    constructor(address _token0, address _token1) {
        factory = msg.sender;
        token0 = _token0;
        token1 = _token1;

        // try to set symbols for the pair token
        (bool success0, string memory symbol0) = MetadataHelper.getSymbol(_token0);
        (bool success1, string memory symbol1) = MetadataHelper.getSymbol(_token1);
        if (success0 && success1) {
            _initializeMetadata(
                string(abi.encodePacked("ZF ", symbol0, "/", symbol1, " LP Token")),
                string(abi.encodePacked(symbol0, "/", symbol1, " ZFLP"))
            );
        } else {
            _initializeMetadata(
                "ZF LP Token",
                "ZFLP"
            );
        }
    }

    /// @dev called by the factory to set the swapFeeOverride
    function setSwapFeeOverride(uint16 _swapFeeOverride) external override {
        require(msg.sender == factory, 'FORBIDDEN');
        require(_swapFeeOverride <= 1000 || _swapFeeOverride == SWAP_FEE_INHERIT, 'INVALID_FEE');
        swapFeeOverride = _swapFeeOverride;
    }

    /*//////////////////////////////////////////////////////////////
        VIEW FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    function getPrincipal(address account) external view override returns (uint112 principal0, uint112 principal1, uint32 timeLastUpdate) {
        Principal memory _principal = principals[account];
        return (
            _principal.principal0,
            _principal.principal1,
            _principal.timeLastUpdate
        );
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        if (amount == 0) {
            return;
        }

        // Track account balances.
        (uint _reserve0, uint _reserve1) = _getReserves();
        uint _totalSupply = totalSupply();

        if (from != address(0)) {
            uint liquidity = balanceOf(from);

            principals[from] = Principal({
                principal0: uint112(liquidity * _reserve0 / _totalSupply),
                principal1: uint112(liquidity * _reserve1 / _totalSupply),
                timeLastUpdate: uint32(block.timestamp)
            });
        }
        if (to != address(0)) {
            uint liquidity = balanceOf(to);

            principals[to] = Principal({
                principal0: uint112(liquidity * _reserve0 / _totalSupply),
                principal1: uint112(liquidity * _reserve1 / _totalSupply),
                timeLastUpdate: uint32(block.timestamp)
            });
        }
    }

    function getReserves() external view override returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    function getReservesSimple() external view override returns (uint112, uint112) {
        return (reserve0, reserve1);
    }

    function getSwapFee() public view override returns (uint16) {
        uint16 _swapFeeOverride = swapFeeOverride;
        return _swapFeeOverride == SWAP_FEE_INHERIT ? IZFFactory(factory).swapFee() : _swapFeeOverride;
    }

    function getReservesAndParameters() external view override returns (uint112 _reserve0, uint112 _reserve1, uint16 _swapFee) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _swapFee = getSwapFee();
    }

    /*//////////////////////////////////////////////////////////////
        INTERNAL FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    function _getReserves() private view returns (uint112, uint112) {
        return (reserve0, reserve1);
    }

    function _getBalances(address _token0, address _token1) private view returns (uint, uint) {
        return (
            IERC20(_token0).balanceOf(address(this)),
            IERC20(_token1).balanceOf(address(this))
        );
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
        require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'OVERFLOW');

        uint32 blockTimestamp = uint32(block.timestamp);
        unchecked {
            uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired

            if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
                // * never overflows, and + overflow is desired
                price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
                price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
            }
        }
    
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;

        emit Sync(reserve0, reserve1);
    }

    function _getFeeLiquidity(uint _totalSupply, uint _rootK2, uint _rootK1, uint8 _feeFactor) private pure returns (uint) {
        uint numerator = _totalSupply * (_rootK2 - _rootK1);
        uint denominator = (_feeFactor - 1) * _rootK2 + _rootK1;
        return numerator / denominator;
    }

    function _tryMintProtocolFee(uint112 _reserve0, uint112 _reserve1) private {
        uint _kLast = kLast;
        if (_kLast != 0) {
            IZFFactory _factory = IZFFactory(factory);
            address _feeTo = _factory.feeTo();

            if (_feeTo != address(0)) {
                uint rootK = Math.sqrt(uint(_reserve0) * _reserve1);
                uint rootKLast = Math.sqrt(_kLast);
                uint liquidity = _getFeeLiquidity(totalSupply(), rootK, rootKLast, _factory.protocolFeeFactor());

                if (liquidity > 0) {
                    _mint(_feeTo, liquidity);
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
        Mint
    //////////////////////////////////////////////////////////////*/

    /// @dev this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external nonReentrant override returns (uint liquidity) {
        (uint112 _reserve0, uint112 _reserve1) = _getReserves();
        (uint balance0, uint balance1) = _getBalances(token0, token1);
        uint amount0 = balance0 - _reserve0;
        uint amount1 = balance1 - _reserve1;

        _tryMintProtocolFee(_reserve0, _reserve1);

        {
        uint _totalSupply = totalSupply(); // must be defined here since totalSupply can update in `_tryMintProtocolFee`

        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, 'INSUFFICIENT_LIQUIDITY_MINTED');
        }
  
        _mint(to, liquidity);
        _update(balance0, balance1, _reserve0, _reserve1);
        kLast = uint256(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date

        emit Mint(msg.sender, amount0, amount1);
    }

    /*//////////////////////////////////////////////////////////////
        Burn
    //////////////////////////////////////////////////////////////*/

    /// @dev this low-level function should be called from a contract which performs important safety checks
    function burn(address to) external nonReentrant override returns (uint amount0, uint amount1) {
        (uint112 _reserve0, uint112 _reserve1) = _getReserves();
        address _token0 = token0;
        address _token1 = token1;
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf(address(this));

        _tryMintProtocolFee(_reserve0, _reserve1);

        {
        uint _totalSupply = totalSupply(); // must be defined here since totalSupply can update in `_tryMintProtocolFee`

        // using balances ensures pro-rata distribution
        amount0 = (liquidity * balance0) / _totalSupply;
        amount1 = (liquidity * balance1) / _totalSupply;

        require(amount0 > 0 && amount1 > 0, 'INSUFFICIENT_LIQUIDITY_BURNED');
        }

        _burn(address(this), liquidity);
        _token0.safeTransfer(to, amount0);
        _token1.safeTransfer(to, amount1);

        (balance0, balance1) = _getBalances(_token0, _token1);
        _update(balance0, balance1, _reserve0, _reserve1);

        kLast = uint256(reserve0) * reserve1; // reserve0 and reserve1 are up-to-date

        emit Burn(msg.sender, amount0, amount1, to);
    }

    /*//////////////////////////////////////////////////////////////
        Swap
    //////////////////////////////////////////////////////////////*/

    /// @dev 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 override nonReentrant {
        require(amount0Out > 0 || amount1Out > 0, 'INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1) = _getReserves();
        require(amount0Out < _reserve0 && amount1Out < _reserve1, 'INSUFFICIENT_LIQUIDITY');

        uint balance0After; uint balance1After;
        {
        (address _token0, address _token1) = (token0, token1);

        if (amount0Out > 0) {
            _token0.safeTransfer(to, amount0Out);
        }
        if (amount1Out > 0) {
            _token1.safeTransfer(to, amount1Out);
        }
        if (data.length > 0) {
            IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data);
        }

        (balance0After, balance1After) = _getBalances(_token0, _token1);
        }

        // At least one input is required.
        uint amount0In = balance0After > _reserve0 - amount0Out ? balance0After - (_reserve0 - amount0Out) : 0;
        uint amount1In = balance1After > _reserve1 - amount1Out ? balance1After - (_reserve1 - amount1Out) : 0;
        require(amount0In != 0 || amount1In != 0, 'INSUFFICIENT_INPUT_AMOUNT');

        {
        // Checks the K.
        uint16 _swapFee = getSwapFee();
        uint balance0Adjusted = (balance0After * SWAP_FEE_POINT_PRECISION) - (amount0In * _swapFee);
        uint balance1Adjusted = (balance1After * SWAP_FEE_POINT_PRECISION) - (amount1In * _swapFee);

        require(balance0Adjusted * balance1Adjusted >= uint(_reserve0) * _reserve1 * (SWAP_FEE_POINT_PRECISION_SQ), 'K');
        }

        _update(balance0After, balance1After, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to);
    }

    function swapFor0(uint amount0Out, address to) external override nonReentrant {
        require(amount0Out > 0, 'INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1) = _getReserves();
        require(amount0Out < _reserve0, 'INSUFFICIENT_LIQUIDITY');

        address _token0 = token0;
        _token0.safeTransfer(to, amount0Out);
        (uint balance0After, uint balance1After) = _getBalances(_token0, token1);

        uint amount1In = balance1After - _reserve1;
        require(amount1In != 0, 'INSUFFICIENT_INPUT_AMOUNT');

        // Checks the K.
        uint balance1Adjusted = (balance1After * SWAP_FEE_POINT_PRECISION) - (amount1In * getSwapFee());
        require(balance0After * balance1Adjusted >= uint(_reserve0) * _reserve1 * SWAP_FEE_POINT_PRECISION, 'K');

        _update(balance0After, balance1After, _reserve0, _reserve1);
        emit Swap(msg.sender, 0, amount1In, amount0Out, 0, to);
    }

    function swapFor1(uint amount1Out, address to) external override nonReentrant {
        require(amount1Out != 0, 'INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1) = _getReserves();
        require(amount1Out < _reserve1, 'INSUFFICIENT_LIQUIDITY');

        address _token1 = token1;
        _token1.safeTransfer(to, amount1Out);
        (uint balance0After, uint balance1After) = _getBalances(token0, _token1);

        uint amount0In = balance0After - _reserve0;
        require(amount0In != 0, 'INSUFFICIENT_INPUT_AMOUNT');

        // Checks the K.
        uint balance0Adjusted = (balance0After * SWAP_FEE_POINT_PRECISION) - (amount0In * getSwapFee());
        require(balance0Adjusted * balance1After >= uint(_reserve0) * _reserve1 * SWAP_FEE_POINT_PRECISION, 'K');

        _update(balance0After, balance1After, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, 0, 0, amount1Out, to);
    }

    /*//////////////////////////////////////////////////////////////
        Skim & Sync
    //////////////////////////////////////////////////////////////*/

    /**
     * @dev Force balances to match reserves, taking out positive balances
     */
    function skim(address to) external override nonReentrant {
        address _token0 = token0;
        address _token1 = token1;
        (uint balance0, uint balance1) = _getBalances(_token0, _token1);
        _token0.safeTransfer(to, balance0 - reserve0);
        _token1.safeTransfer(to, balance1 - reserve1);
    }

    /**
     * @dev Force reserves to match balances
     */
    function sync() external override nonReentrant {
        (uint balance0, uint balance1) = _getBalances(token0, token1);
        _update(balance0, balance1, reserve0, reserve1);
    }
}

File 2 of 18 : IERC20.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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);
}

File 3 of 18 : IERC20Metadata.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 4 of 18 : IERC20Permit.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

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);

    /**
     * @dev Returns the permit typehash
     */
    // solhint-disable-next-line func-name-mixedcase
    function PERMIT_TYPEHASH() external pure returns (bytes32);
}

File 5 of 18 : IZFFactory.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import "./uniswap/IUniswapV2Factory.sol";

/// @dev ZF factory interface with full Uniswap V2 compatibility
interface IZFFactory is IUniswapV2Factory {
    function isPair(address pair) external view returns (bool);
    function acceptFeeToSetter() external;

    function swapFee() external view returns (uint16);
    function setSwapFee(uint16 newFee) external;

    function protocolFeeFactor() external view returns (uint8);
    function setProtocolFeeFactor(uint8 newFactor) external;

    function setSwapFeeOverride(address pair, uint16 swapFeeOverride) external;
}

File 6 of 18 : IZFPair.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import "./uniswap/IUniswapV2Pair.sol";

/// @dev ZF pair interface with full Uniswap V2 compatibility
interface IZFPair is IUniswapV2Pair {
    function getPrincipal(address account) external view returns (uint112 principal0, uint112 principal1, uint32 timeLastUpdate);
    function swapFor0(uint amount0Out, address to) external; // support simple swap
    function swapFor1(uint amount1Out, address to) external; // support simple swap

    function getReservesAndParameters() external view returns (uint112 reserve0, uint112 reserve1, uint16 swapFee);
    function getReservesSimple() external view returns (uint112, uint112);

    function swapFeeOverride() external view returns (uint16);
    function setSwapFeeOverride(uint16 newSwapFeeOverride) external;
    function getSwapFee() external view returns (uint16);
}

File 7 of 18 : IUniswapV2Callee.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

/// @dev Uniswap V2 callee interface
interface IUniswapV2Callee {
    function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

File 8 of 18 : IUniswapV2Factory.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

/// @dev Uniswap V2 factory interface
interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 9 of 18 : IUniswapV2Pair.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import '../../../ERC20/IERC20.sol';
import '../../../ERC20/IERC20Metadata.sol';
import '../../../ERC20/IERC20Permit.sol';

/// @dev Uniswap V2 pair interface
interface IUniswapV2Pair is IERC20, IERC20Metadata, IERC20Permit {
    //event Approval(address indexed owner, address indexed spender, uint value); // IERC20
    //event Transfer(address indexed from, address indexed to, uint value); // IERC20

    //function name() external pure returns (string memory); // IERC20Metadata
    //function symbol() external pure returns (string memory); // IERC20Metadata
    //function decimals() external pure returns (uint8); // IERC20Metadata
    //function totalSupply() external view returns (uint); // IERC20
    //function balanceOf(address owner) external view returns (uint); // IERC20
    //function allowance(address owner, address spender) external view returns (uint); // IERC20

    //function approve(address spender, uint value) external returns (bool); // IERC20
    //function transfer(address to, uint value) external returns (bool); // IERC20
    //function transferFrom(address from, address to, uint value) external returns (bool); // IERC20

    //function DOMAIN_SEPARATOR() external view returns (bytes32); // IERC20Permit
    //function PERMIT_TYPEHASH() external pure returns (bytes32); // IERC20Permit
    //function nonces(address owner) external view returns (uint); // IERC20Permit

    //function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; // IERC20Permit

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    //function MINIMUM_LIQUIDITY() external pure returns (uint); // UNUSED
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    //function initialize(address, address) external; // UNUSED
}

File 10 of 18 : ECDSA.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../utils/Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 11 of 18 : ReentrancyGuard.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// OpenZeppelin Contracts v4.4.1 (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() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 12 of 18 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import '../../../interfaces/ERC20/IERC20.sol';
import '../../../interfaces/ERC20/IERC20Metadata.sol';

/**
 * @dev Implementation of ERC20 interface.
 */
contract ERC20 is IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * initialization.
     */
    function _initializeMetadata(string memory name_, string memory symbol_) internal {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() external view override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() external pure override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public override returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public override returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal {
        //require(from != address(0), "ERC20: transfer from the zero address");
        //require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        //require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        //require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        //require(owner != address(0), "ERC20: approve from the zero address");
        //require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 13 of 18 : ERC20WithPermit.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import './ERC20.sol';
import '../../cryptography/ECDSA.sol';
import '../../../interfaces/ERC20/IERC20Permit.sol';

/**
 * @dev Implementation of ERC20 interface with EIP2612 support.
 */
contract ERC20WithPermit is ERC20, IERC20Permit {
    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    bytes32 public immutable override DOMAIN_SEPARATOR = keccak256(
        abi.encode(
            //keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
            0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f,

            //keccak256(bytes('ZF LP Token')),
            0x6511e36e5d2f401c54acf6e396173073db572b463aec87cff7b0e9eb32c66952,

            //keccak256(bytes('1')),
            0xc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6,

            324, // Hardcoded because block.chainid is not supported in zkSync 2.0.
            address(this)
        )
    );

    /**
     * @dev See {IERC20Permit-PERMIT_TYPEHASH}.
     */
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    mapping(address => uint256) public override nonces;

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) override external {
        require(block.timestamp <= deadline, 'EXPIRED');

        bytes32 structHash;
        // Unchecked because nonce cannot realistically overflow.
        unchecked {
            structHash = keccak256(
                abi.encode(
                    PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline
                )
            );
        }

        bytes32 hash = ECDSA.toTypedDataHash(DOMAIN_SEPARATOR, structHash);
        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, 'INVALID_SIGNATURE');

        _approve(owner, spender, value);
    }
}

File 14 of 18 : MetadataHelper.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

library MetadataHelper {
    /**
     * @dev Returns the status and symbol of the token.
     *
     * @param token The address of a ERC20 token.
     *
     * Return boolean indicating the status and the symbol as string;
     *
     * NOTE: Symbol is not the standard interface and some tokens may not support it.
     * Calling against these tokens will not success, with an empty result.
     */
    function getSymbol(address token) internal view returns (bool, string memory) {
        // bytes4(keccak256(bytes("symbol()")))
        (bool success, bytes memory returndata) = token.staticcall(abi.encodeWithSelector(0x95d89b41));
        if (success) {
            return (true, abi.decode(returndata, (string)));
        } else {
            return (false, "");
        }
    }
}

File 15 of 18 : TransferHelper.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/// @dev Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeTransfer: transfer failed'
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::transferFrom: transferFrom failed'
        );
    }

    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            'TransferHelper::safeApprove: approve failed'
        );
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

File 16 of 18 : Strings.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 17 of 18 : Math.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/**
 * @dev A library for performing various math operations.
 */
library Math {
    /**
     * @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;
    }

    /**
     * @notice Calculates the square root of x, rounding down.
     * @dev Uses the Babylonian method https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method.
     * @param x The uint256 number for which to calculate the square root.
     * @return result The result as an uint256.
     *
     * See https://github.com/paulrberg/prb-math/blob/701b1badb9a0951f27e344602726ead71f138b1a/contracts/PRBMath.sol#L599
     */
    function sqrt(uint256 x) internal pure returns (uint256 result) {
        if (x == 0) {
            return 0;
        }

        // Set the initial guess to the least power of two that is greater than or equal to sqrt(x).
        uint256 xAux = uint256(x);
        result = 1;
        if (xAux >= 0x100000000000000000000000000000000) {
            xAux >>= 128;
            result <<= 64;
        }
        if (xAux >= 0x10000000000000000) {
            xAux >>= 64;
            result <<= 32;
        }
        if (xAux >= 0x100000000) {
            xAux >>= 32;
            result <<= 16;
        }
        if (xAux >= 0x10000) {
            xAux >>= 16;
            result <<= 8;
        }
        if (xAux >= 0x100) {
            xAux >>= 8;
            result <<= 4;
        }
        if (xAux >= 0x10) {
            xAux >>= 4;
            result <<= 2;
        }
        if (xAux >= 0x8) {
            result <<= 1;
        }

        // The operations can never overflow because the result is max 2^127 when it enters this block.
        unchecked {
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1;
            result = (result + x / result) >> 1; // Seven iterations should be enough
            uint256 roundedDownResult = x / result;
            return result >= roundedDownResult ? roundedDownResult : result;
        }
    }
}

File 18 of 18 : UQ112x112.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/**
 * @dev A library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))
 *
 * Range: [0, 2**112 - 1]
 * Resolution: 1 / 2**112
 */
library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

Settings
{
  "compilerPath": "",
  "experimental": {},
  "optimizer": {
    "enabled": true,
    "mode": "3"
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPrincipal","outputs":[{"internalType":"uint112","name":"principal0","type":"uint112"},{"internalType":"uint112","name":"principal1","type":"uint112"},{"internalType":"uint32","name":"timeLastUpdate","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReservesAndParameters","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint16","name":"_swapFee","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReservesSimple","outputs":[{"internalType":"uint112","name":"","type":"uint112"},{"internalType":"uint112","name":"","type":"uint112"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_swapFeeOverride","type":"uint16"}],"name":"setSwapFeeOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFeeOverride","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"swapFor0","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"swapFor1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

f305d7190000000000000000000000003355df6d4c9c3035724fd0e3914de96a5a83aaf40000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000005f5e10000000000000000000000000000000000000000000000000000bfd8b6c1df000000000000000000000000000013bd7a61b46950ff0e9b41571dc4c503ee85404200000000000000000000000000000000000000000000000000000000646cd005

Deployed Bytecode

0x0004000000000002000a00000000000200000000030100190000006003300270000006eb0430019700030000004103550002000000010355000006eb0030019d000100000000001f00000001012001900000000c0000c13d1ba604750000040f000000a001000039000000400010043f0000000002000416000000000220004c0000004d0000c13d0000000002000031000000bf03200039000000200900008a000000000393016f000006ec04300041000006ed0440009c0000001e0000213d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000400030043f0000001f0320018f000000020400036700000005052002720000002c0000613d00000000060000190000000507600210000000000874034f000000000808043b000000a00770003900000000008704350000000106600039000000000756004b000000240000413d000000000630004c0000003b0000613d0000000505500210000000000454034f0000000303300210000000a005500039000000000605043300000000063601cf000000000636022f000000000404043b0000010003300089000000000434022f00000000033401cf000000000363019f0000000000350435000006ee03000041000000400420008c00000000040000190000000004034019000006ee02200197000000000520004c000000000300a019000006ee0220009c00000000020400190000000002036019000000000220004c0000004d0000c13d000000a00600043d000006ef0260009c0000004d0000213d000000c00500043d000006ef0250009c0000004f0000a13d000000000100001900001ba800010430000000400200043d000000a003200039000000000400041000000000004304350000008003200039000001440400003900000000004304350000006003200039000006f00400004100000000004304350000004003200039000006f10400004100000000004304350000000001120436000006f2030000410000000000310435000006f30320009c000000180000213d000000c003200039000000400030043f000006eb03000041000006eb0410009c000000000103801900000040011002100000000002020433000006eb0420009c00000000020380190000006002200210000000000112019f0000000002000414000006eb0420009c0000000002038019000000c002200210000000000112019f000006f4011001c70000801002000039000a00000009001d000900000005001d000800000006001d1ba61ba10000040f0000000806000029000000090d0000290000000a0b00002900000001022001900000004d0000613d000000000101043b000000800010043f00000001090000390000000601000039000000000091041b0000000e01000039000000000201041a0000ffff022001bf000000000021041b0000000701000039000000000201041a000006f5022001970000000003000411000000000232019f000000000021041b0000000801000039000000000201041a000006f502200197000000000262019f000000000021041b0000000901000039000000000201041a000006f5022001970000000002d2019f000000000021041b000000040a000039000000400100043d0000000002a10436000006f6030000410000000000320435000006f70310009c000000180000213d0000004003100039000000400030043f0000000003000414000000040460008c000000a40000c13d000000010c0000390000000102000031000000bf0000013d000006eb04000041000006eb0520009c000000000204801900000040022002100000000001010433000006eb0510009c00000000010480190000006001100210000000000121019f000006eb0230009c00000000020400190000000002034019000000c002200210000000000121019f0000000002060019000700000009001d00080000000a001d1ba61ba10000040f000000090d0000290000000a0b000029000000080a0000290000000709000029000000010c20018f00030000000103550000006001100270000106eb0010019d000006eb021001970000006001000039000000000320004c000000dd0000c13d0000000002c0004c0000010a0000c13d000000400100043d000006f90210009c000000180000213d0000002002100039000000400020043f00000000040100190000000000010435000000400100043d0000000002a10436000006f6030000410000000000320435000006f70310009c000000180000213d000600000004001d00090000000c001d00080000000a001d000700000009001d0000004003100039000000400030043f00000000030004140000000404d0008c0000014e0000c13d00000001020000390000000103000031000001630000013d000006f80120009c000000180000213d0000003f012000390000000003b1016f000000400100043d0000000003310019000000000413004b00000000040000190000000104004039000006f80530009c000000180000213d0000000104400190000000180000c13d000000400030043f0000000002210436000000030300036700000001050000310000001f0450018f0000000505500272000000fa0000613d000000000600001900000005076002100000000008720019000000000773034f000000000707043b00000000007804350000000106600039000000000756004b000000f20000413d000000000640004c000000c20000613d0000000505500210000000000353034f00000000025200190000000304400210000000000502043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000320435000000c20000013d0000000032010434000006ee04000041000000200520008c00000000050000190000000005044019000006ee06200197000000000760004c000000000400a019000006ee0660009c000000000405c019000000000440004c0000004d0000c13d0000000004030433000006f80540009c0000004d0000213d000000000232001900000000031400190000003f01300039000006ee04000041000000000521004b00000000050000190000000005048019000006ee01100197000006ee06200197000000000761004b0000000004008019000000000161013f000006ee0110009c00000000010500190000000001046019000000000110004c0000004d0000c13d00000020013000390000000001010433000006f80410009c000000180000213d0000003f041000390000000004b4016f000000400800043d0000000004480019000000000584004b00000000050000190000000105004039000006f80640009c000000180000213d0000000105500190000000180000c13d000000400040043f0000000007080019000000000418043600000040033000390000000005310019000000000225004b0000004d0000213d000000000210004c0000014a0000613d000000000200001900000000054200190000000006320019000000000606043300000000006504350000002002200039000000000512004b000001430000413d0000000001140019000000090d0000290000000004070019000000ca0000013d000006eb04000041000006eb0520009c000000000204801900000040022002100000000001010433000006eb0510009c00000000010480190000006001100210000000000121019f000006eb0230009c00000000020400190000000002034019000000c002200210000000000121019f00000000020d00191ba61ba10000040f000000010220018f00030000000103550000006001100270000106eb0010019d000006eb031001970000006001000039000000000430004c0000019f0000c13d000000000220004c000001cd0000c13d000000400100043d000006f90210009c000000180000213d0000002002100039000000400020043f0000000000010435000000400100043d000900000001001d000006f70110009c0000000802000029000000180000213d00000009030000290000004001300039000000400010043f0000000b010000390000000003130436000006ff01000041000500000003001d0000000000130435000000400100043d000600000001001d000006f70110009c000000180000213d00000006030000290000004001300039000000400010043f00000000022304360000070001000041000300000002001d000000000012043500000009010000290000000001010433000400000001001d000006f80110009c000000180000213d0000000301000039000200000001001d000000000101041a000000010210019000000001011002700000007f0310018f0000000001036019000100000001001d0000001f0110008c00000000010000190000000101002039000000010110018f000000000112004b000002ed0000613d000007020100004100000000001004350000002201000039000000040010043f000007030100004100001ba800010430000006f80130009c0000000a04000029000000180000213d0000003f01300039000000000441016f000000400100043d0000000004410019000000000514004b00000000050000190000000105004039000006f80640009c000000180000213d0000000105500190000000180000c13d000000400040043f0000000003310436000000030400036700000001060000310000001f0560018f0000000506600272000001bd0000613d000000000700001900000005087002100000000009830019000000000884034f000000000808043b00000000008904350000000107700039000000000867004b000001b50000413d000000000750004c000001660000613d0000000506600210000000000464034f00000000036300190000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000001660000013d0000000032010434000006ee04000041000000200520008c00000000050000190000000005044019000006ee06200197000000000760004c000000000400a019000006ee0660009c000000000405c019000000000440004c0000000a080000290000004d0000c13d0000000005030433000006f80450009c0000004d0000213d000000000432001900000000051500190000003f01500039000006ee02000041000000000341004b00000000030000190000000003028019000006ee01100197000006ee06400197000000000761004b0000000002008019000000000161013f000006ee0110009c00000000010300190000000001026019000000000110004c0000004d0000c13d00000020015000390000000003010433000006f80130009c000000180000213d0000003f01300039000000000181016f000000400200043d0000000001120019000000000621004b00000000060000190000000106004039000006f80710009c000000180000213d0000000106600190000000180000c13d000000400010043f000000000132043600000040055000390000000006530019000000000446004b0000004d0000213d000000000430004c0000020d0000613d000000000400001900000000061400190000000007540019000000000707043300000000007604350000002004400039000000000634004b000002060000413d000000000331001900000000000304350000000903000029000000000330004c0000016e0000613d000000400400043d0000002005400039000006fa03000041000400000005001d0000000000350435000900000004001d0000002305400039000000060400002900000020034000390000000004040433000000000640004c000002260000613d000000000600001900000000075600190000000008360019000000000808043300000000008704350000002006600039000000000746004b0000021f0000413d00000000055400190000000000050435000000090500002900000000045400190000002305400039000006fb06000041000000000065043500000024064000390000000005020433000000000750004c000002390000613d000000000700001900000000086700190000000009170019000000000909043300000000009804350000002007700039000000000857004b000002320000413d0000000006650019000000000006043500000000044500190000002405400039000006fc060000410000000000650435000000090600002900000000046400490000000d0540003900000000005604350000004c044000390000000a05000029000000000454016f0000000005640019000000000445004b00000000040000190000000104004039000500000005001d000006f80550009c0000000605000029000000180000213d0000000104400190000000180000c13d0000000504000029000000400040043f00000020084000390000000004050433000000000540004c0000025e0000613d000000000500001900000000068500190000000007350019000000000707043300000000007604350000002005500039000000000645004b000002570000413d000600000008001d00000000038400190000000000030435000000050300002900000000033400190000002004300039000006fb05000041000000000054043500000021043000390000000002020433000000000520004c000002720000613d000000000500001900000000064500190000000007150019000000000707043300000000007604350000002005500039000000000625004b0000026b0000413d0000000001420019000000000001043500000000013200190000002102100039000006fd030000410000000000320435000000050300002900000000013100490000000602100039000000000023043500000045011000390000000a02000029000000000221016f0000000001320019000000000221004b00000000020000190000000102004039000006f80310009c000000180000213d0000000102200190000000180000c13d000000400010043f00000009010000290000000001010433000300000001001d000006f80110009c000000180000213d0000000301000039000200000001001d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000100000002001d0000001f0220008c00000000020000190000000102002039000000000121013f0000000101100190000001990000c13d0000000101000029000000200110008c000002bb0000413d00000002010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000004d0000613d00000003030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000002bb0000813d000000000002041b0000000102200039000000000312004b000002b70000413d00000003010000290000001f0110008c000003cc0000a13d00000002010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000000a020000290000004d0000613d000000030300002900000000032301700000002002000039000000000101043b0000000906000029000002db0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000002d30000413d0000000304000029000000000343004b000002e90000813d00000003030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000090400002900000000024200190000000002020433000000000232016f000000000021041b000000010100003900000003020000290000000102200210000003d90000013d0000000101000029000000200110008c0000030d0000413d00000002010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000004d0000613d00000004030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000001010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b0000030d0000813d000000000002041b0000000102200039000000000312004b000003090000413d00000004010000290000001f0110008c0000033f0000a13d00000002010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000000a020000290000004d0000613d000000040300002900000000032301700000002002000039000000000101043b00000009060000290000032d0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000003250000413d0000000404000029000000000343004b0000033b0000813d00000004030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000090400002900000000024200190000000002020433000000000232016f000000000021041b0000000101000039000000040200002900000001022002100000034c0000013d0000000401000029000000000110004c0000000001000019000003450000613d0000000501000029000000000101043300000004040000290000000302400210000000010300008a000000000223022f000000000232013f000000000221016f0000000101400210000000000112019f0000000202000029000000000012041b00000006010000290000000001010433000900000001001d000006f80110009c0000000801000029000000180000213d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000500000002001d0000001f0220008c00000000020000190000000102002039000000000121013f0000000101100190000001990000c13d0000000501000029000000200110008c000003810000413d00000008010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000004d0000613d00000009030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000005010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b000003810000813d000000000002041b0000000102200039000000000312004b0000037d0000413d00000009010000290000001f0110008c000003b30000a13d00000008010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000000a020000290000004d0000613d000000090300002900000000032301700000002002000039000000000101043b0000000606000029000003a10000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000003990000413d0000000904000029000000000343004b000003af0000813d00000009030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000060400002900000000024200190000000002020433000000000232016f000000000021041b000000090100002900000001011002100000000702000029000003c00000013d0000000901000029000000000110004c0000000001000019000003b90000613d0000000301000029000000000101043300000009040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000000000121019f0000000802000029000000000012041b000000800100043d000001400000044300000160001004430000002001000039000001000010044300000007010000290000012000100443000007010100004100001ba70001042e0000000301000029000000000110004c0000000001000019000003d20000613d0000000401000029000000000101043300000003040000290000000302400210000000010300008a000000000223022f000000000232013f000000000221016f0000000101400210000000000112019f0000000202000029000000000012041b00000005010000290000000001010433000900000001001d000006f80110009c0000000801000029000000180000213d000000000101041a000000010210019000000001021002700000007f0320018f0000000002036019000400000002001d0000001f0220008c00000000020000190000000102002039000000000121013f0000000101100190000001990000c13d0000000401000029000000200110008c0000040e0000413d00000008010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000004d0000613d00000009030000290000001f023000390000000502200270000000200330008c0000000002004019000000000301043b00000004010000290000001f01100039000000050110027000000000011300190000000002230019000000000312004b0000040e0000813d000000000002041b0000000102200039000000000312004b0000040a0000413d00000009010000290000001f0110008c000004400000a13d00000008010000290000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c001100210000006fe011001c700008010020000391ba61ba10000040f00000001022001900000000a020000290000004d0000613d000000090300002900000000032301700000002002000039000000000101043b00000005060000290000042e0000613d0000002002000039000000000400001900000000056200190000000005050433000000000051041b000000200220003900000001011000390000002004400039000000000534004b000004260000413d0000000904000029000000000343004b0000043c0000813d00000009030000290000000303300210000000f80330018f000000010400008a000000000334022f000000000343013f000000050400002900000000024200190000000002020433000000000232016f000000000021041b000000090100002900000001011002100000000702000029000003c00000013d0000000901000029000000000110004c0000000001000019000004460000613d0000000601000029000000000101043300000009040000290000000302400210000000010300008a000000000223022f000000000232013f000000000121016f0000000102400210000003c00000013d000006eb03000041000006eb0410009c00000000010380190000004001100210000006eb0420009c00000000020380190000006002200210000000000112019f0000000002000414000006eb0420009c0000000002038019000000c002200210000000000112019f000006f4011001c700008010020000391ba61ba10000040f0000000102200190000004620000613d000000000101043b000000000001042d000000000100001900001ba8000104300000000003010019000006eb010000410000000004000414000006eb0540009c0000000001044019000000c00110021000000060022002100000000001120019000007040110004100000000020300191ba61ba10000040f0000000102200190000004730000613d000000000101043b000000000001042d000000000100001900001ba80001043000110000000000020000008009000039000000400090043f0000000001000031000000040110008c000012880000413d001100000000001d0000000201000367000000000101043b000000e001100270000007050210009c000004b00000a13d000007060210009c000004dc0000213d000007130210009c000005480000a13d000007140210009c000005de0000a13d000007150210009c0000076d0000613d000007160210009c000007910000613d000007170110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000006ef0320009c000012880000213d0000002401100370000000000301043b00000000010004111ba618070000040f0000000101000039000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000071f0210009c000005170000a13d000007200210009c000005720000a13d000007210210009c000006200000a13d000007220210009c000007e30000613d000007230210009c000007fe0000613d000007240110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000a01000039000000000101041a00000070021002700000073702200197000000400300043d0000002004300039000000000024043500000737011001970000000000130435000006eb01000041000006eb0230009c0000000001034019000000400110021000000757011001c700001ba70001042e000007070210009c0000059b0000a13d000007080210009c0000063f0000a13d000007090210009c0000081a0000613d0000070a0210009c000008400000613d0000070b0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000601000039000e00000001001d000000000101041a000000020110008c0000000001000019000000010100c0391ba6141e0000040f00000002010000390000000e02000029000000000012041b0000000901000039000000000201041a0000000801000039000000000101041a000006ef01100197000006ef022001971ba614330000040f0000000a03000039000000000403041a0000073703400197000000700440027000000737044001971ba615260000040f00000001010000390000000e02000029000000000012041b000006eb01000041000000400200043d000006eb0320009c0000000001024019000000400110021000001ba70001042e0000072c0210009c000005bd0000213d000007320210009c000006740000213d000007350210009c000008730000613d000007360110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000304000039000000000304041a000000010530019000000001013002700000007f0210018f000000000701001900000000070260190000001f0270008c00000000020000190000000102002039000000010220018f000000000225004b0000078b0000c13d000000400100043d0000000002710436000000000550004c00000bfd0000c13d000001000400008a000000000343016f0000000000320435000000000270004c0000002003000039000000000300601900000c0a0000013d0000071a0210009c0000069b0000213d0000071d0210009c000009220000613d0000071e0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000006ef0210009c000012880000213d0000000000100435000000200000043f000000400200003900000000010000191ba6044e0000040f000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e000007270210009c000006d80000213d0000072a0210009c000009f10000613d0000072b0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d000000400100043d000e00000001001d00000745010000410000000000100439000000000100041200000004001004430000002400000443000080050100003900000044020000391ba604640000040f0000000e030000290000000000130435000006eb01000041000006eb0230009c000000000103401900000040011002100000073e011001c700001ba70001042e0000070e0210009c000007300000213d000007110210009c00000a0b0000613d000007120110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000701000039000000000101041a000006ef01100197000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000072d0210009c0000074f0000213d000007300210009c00000a550000613d000007310110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000201000039000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e000007180210009c00000a710000613d000007190110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000e00000001001d000006ef0110009c000012880000213d0000000602000039000000000102041a000000020110008c00000ab40000613d0000000201000039000600000002001d000b00000001001d000000000012041b0000000801000039000000000201041a0000000a01000039000700000001001d000000000101041a0000000903000039000000000303041a000000400a00043d000007540400004100000000004a04350000000404a000390000000005000410000c00000005001d0000000000540435000006ef03300197000d00000003001d0000073703100197000a00000003001d00000070011002700000073701100197000900000001001d0000000001000414000006ef02200197000000040320008c000800000002001d00000c740000c13d0000000103000031000000200130008c0000002004000039000000000403401900000ca60000013d000007250210009c00000a960000613d000007260110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000b01000039000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000070c0210009c00000ac60000613d0000070d0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002020003670000000401200370000000000101043b000006ef0310009c000012880000213d0000002402200370000000000202043b000e00000002001d000006ef0220009c000012880000213d00000000001004350000000101000039000000200010043f0000004002000039000d00000002001d00000000010000191ba6044e0000040f0000000e020000290000000000200435000000200010043f00000000010000190000000d020000291ba6044e0000040f000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e000007330210009c00000b0f0000613d000007340110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000006ef0320009c000012880000213d0000002401100370000000000301043b00000000010004111ba61ad10000040f0000000101000039000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000071b0210009c00000b340000613d0000071c0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000006ef0210009c000012880000213d00000000001004350000000f01000039000000200010043f000000400200003900000000010000191ba6044e0000040f000e00000001001d000000400100043d000d00000001001d1ba6137c0000040f0000000e01000029000000000101041a0000000d030000290000004002300039000000e004100270000000000042043500000737021001970000000005230436000000700110027000000737031001970000000000350435000000400100043d000e00000001001d1ba613720000040f0000000e040000290000000001410049000006eb02000041000006eb0310009c0000000001028019000006eb0340009c000000000204401900000040022002100000006001100210000000000121019f00001ba70001042e000007280210009c00000b4f0000613d000007290110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000e00000002001d0000002401100370000000000101043b000d00000001001d000006ef0110009c000012880000213d0000000601000039000000000201041a000000020220008c00000ab40000613d0000000202000039000000000021041b0000000e03000029000000000130004c00000c330000613d0000000a01000039000000000101041a000000700210027000000737042001970000073702100197000000000123004b00000cfb0000813d000a00000002001d0000000801000039000000000101041a000006ef01100197000b00000001001d0000000d02000029000c00000004001d1ba61b0d0000040f0000000901000039000000000101041a000006ef021001970000000b010000291ba614330000040f0000000c03000029000000000432004b00000b800000413d000000000332004b00000ce90000613d0000075f0320009c00000b800000213d000900000001001d000b00000002001d0000000e01000039000000000101041a0000ffff0110018f0000ffff0210008c000010630000c13d0000000701000039000000000201041a000000400300043d0000076001000041000800000003001d00000000001304350000000001000414000006ef02200197000000040320008c0000101f0000c13d0000000103000031000000200130008c00000020040000390000000004034019000010510000013d0000070f0210009c00000b860000613d000007100110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d1ba6139a0000040f0000ffff0110018f000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000072e0210009c00000ba20000613d0000072f0110009c000012880000c13d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d000000400100043d00000742020000410000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000404000039000000000304041a000000010530019000000001013002700000007f0210018f000000000601001900000000060260190000001f0260008c00000000020000190000000102002039000000000232013f000000010220019000000bf20000613d000007020100004100000000001004350000002201000039000000040010043f000007030100004100001ba8000104300000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000e00000002001d000006ef0220009c000012880000213d0000002401100370000000000101043b000d00000001001d0000000001000411000b00000001001d00000000001004350000000101000039000c00000001001d000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b0000000e020000290000000000200435000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000101041a0000000d03000029000000000231004b00000d0d0000813d000000400100043d00000064021000390000075103000041000000000032043500000044021000390000075203000041000000000032043500000024021000390000002503000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000074b011001c700001ba8000104300000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000c01000039000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000e01000039000000000101041a0000ffff0110018f000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000a01000039000000000101041a000e00000001001d1ba6139a0000040f0000000e0500002900000070025002700000073702200197000000400300043d000000200430003900000000002404350000ffff0110018f0000004002300039000000000012043500000737015001970000000000130435000006eb01000041000006eb0230009c000000000103401900000040011002100000073d011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b0000ffff0210008c000012880000213d0000000702000039000000000202041a000006ef022001970000000003000411000000000223004b00000c1c0000c13d0000ffff0110018f000003e90210008c00000cc50000413d0000ffff0210008c00000cc50000613d000000400100043d00000044021000390000073b03000041000000000032043500000024021000390000000b03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000001000416000000000110004c000012880000c13d0000000001000031000000040210008a000006ee03000041000000800420008c00000000040000190000000004034019000006ee02200197000000000520004c000000000300a019000006ee0220009c00000000020400190000000002036019000000000220004c000012880000c13d00000002020003670000002403200370000000000303043b000e00000003001d0000000403200370000000000303043b000d00000003001d0000004403200370000000000403043b000006ef03400197000b00000003001d000c00000004001d000006ef0340009c000012880000213d0000006403200370000000000303043b000006f80430009c000012880000213d0000002304300039000006ee05000041000000000614004b00000000060000190000000006058019000006ee07100197000006ee04400197000000000874004b0000000005008019000000000474013f000006ee0440009c00000000040600190000000004056019000000000440004c000012880000c13d0000000404300039000000000242034f000000000202043b000a00000002001d000006f80220009c000012880000213d00000024033000390000000a02000029000900000003001d0000000002230019000000000112004b000012880000213d0000000601000039000000000201041a000000020220008c00000ab40000613d000800000009001d0000000202000039000000000021041b0000000d030000290000000e0100002900000000011301a000000c330000613d0000000a01000039000000000101041a000000700210027000000737022001970000073701100197000700000001001d000000000131004b00000cfb0000a13d0000000e01000029000000000112004b00000cfb0000a13d000400000002001d0000000901000039000000000101041a000006ef01100197000600000001001d0000000801000039000000000101041a000006ef01100197000500000001001d0000000d01000029000000000110004c000008d70000613d00000005010000290000000c020000290000000d030000291ba61b0d0000040f0000000e01000029000000000110004c000008de0000613d00000006010000290000000c020000290000000e030000291ba61b0d0000040f0000000a01000029000000000110004c00000f700000c13d000000050100002900000006020000291ba614330000040f000c00000001001d000a00000002001d0000000d010000290000000702000029000000000112004b00000b800000413d0000000d01000029000000070200002900000000011200490000000c02000029000900000001001d0000000001120049000000000221004b00000000020000190000000102002039000000000220004c000000000100c019000800000001001d0000000e010000290000000402000029000000000112004b00000b800000413d0000000e01000029000000040200002900000000011200490000000a02000029000600000001001d0000000001120049000000000221004b00000000020000190000000102002039000000000220004c000000000100c019000500000001001d0000000c010000290000000902000029000000000121004b0000090e0000213d0000000a010000290000000602000029000000000121004b00000ce90000a13d0000000e01000039000000000101041a0000ffff0110018f0000ffff0210008c0000128a0000c13d0000000701000039000000000201041a000000400300043d0000076001000041000300000003001d00000000001304350000000001000414000006ef02200197000000040320008c000012440000c13d0000000103000031000000200130008c00000020040000390000000004034019000012760000013d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000e00000001001d000006ef0110009c000012880000213d0000000602000039000000000102041a000000020110008c00000ab40000613d0000000201000039000a00000002001d000c00000001001d000000000012041b0000000a01000039000b00000001001d000000000101041a000d00000001001d0000000901000039000000000201041a0000000801000039000000000101041a000006ef01100197000006ef022001971ba614330000040f0000000d0400002900000070034002700000073703300197000007370440019700000000050100190000000006020019000000000145004b00000b800000413d000000000136004b00000b800000413d0000000001450049000600000001001d00000000010400190000000002030019000d00000003001d000800000004001d000700000005001d000900000006001d1ba6159a0000040f00000009070000290000000d0400002900000000084700490000000c01000029000000000101041a000000000210004c00000d400000c13d00000008060000290000000707000029000000000167004b0000096f0000613d000000010100008a000000060200002900000000212100d9000000000181004b00000b800000413d000000060100002900000000211800aa00000b800000613d00000080021002700000075b0310009c000000000201a0190000075c030000410000075b0410009c000000010300a0390000002004300210000006f80520009c00000000030420190000004004200270000006f80520009c00000000020420190000001004300210000006eb0520009c00000000030420190000002004200270000006eb0520009c000000000204201900000008043002100000ffff0520008c0000000003042019000000100420027000000000020420190000000404300210000000ff0520008c00000000030420190000000804200270000000000204201900000002043002100000000f0520008c000000000304201900000004042002700000000002042019000000070220008c0000000002000019000000010200203900000000022301cf00000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000432100d90000000002230019000000020320008c00000d530000413d000000010220027000000000312100d9000000000312004b0000000001024019000400000001001d000003e80110008c00000b800000413d000500000008001d000003e8020000390000000c01000029000300000002001d000000000021041b0000000000000435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000201041a000003e90300008a000000000332004b00000b800000213d0000000403000029000003e80330008a000c00000003001d000003e802200039000000000021041b000000400100043d00000003020000290000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d0200003900000003030000390000075504000041000000000500001900000000060000191ba61b9c0000040f000000010120019000000f5b0000c13d000012880000013d0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d000000400100043d00000012020000390000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000e00000001001d000006ef0110009c000012880000213d0000000601000039000d00000001001d000000000101041a000000020110008c0000000001000019000000010100c0391ba6141e0000040f00000002010000390000000d02000029000000000012041b0000000901000039000000000301041a0000000802000039000000000202041a000006ef01200197000006ef02300197000c00000001001d000b00000002001d1ba614330000040f00000000040200190000000a05000039000000000205041a0000073702200197000000000321004b00000b800000413d00000000032100490000000c010000290000000e02000029000c00000004001d000a00000005001d1ba61b0d0000040f0000000c030000290000000a01000029000000000101041a00000070011002700000073701100197000000000213004b00000b800000413d00000000031300490000000b010000290000000e020000291ba61b0d0000040f00000001010000390000000d02000029000000000012041b000006eb01000041000000400200043d000006eb0320009c0000000001024019000000400110021000001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000801000039000000000101041a000006ef01100197000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000200310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000006ef0210009c000012880000213d00000000001004350000000501000039000000200010043f000000400200003900000000010000191ba6044e0000040f000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000e00000002001d0000002401100370000000000101043b000d00000001001d000006ef0110009c000012880000213d0000000601000039000000000201041a000000020220008c00000c2e0000c13d000000400100043d00000044021000390000077103000041000000000032043500000024021000390000001f03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000e00310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000e00000002001d000006ef0220009c000012880000213d0000002402100370000000000202043b000d00000002001d000006ef0220009c000012880000213d0000006402100370000000000202043b000c00000002001d0000004402100370000000000202043b000b00000002001d0000008401100370000000000101043b000a00000001001d000000ff0110008c000012880000213d0000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b0000000c02000029000000000121004b00000d590000a13d000000400100043d00000044021000390000075003000041000000000032043500000024021000390000000703000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000a01000039000000000301041a000000400100043d000e00000001001d0000073702300197000000e004300270000000700330027000000737033001971ba613720000040f0000000e040000290000000001410049000006eb02000041000006eb0310009c0000000001028019000006eb0340009c000000000204401900000040022002100000006001100210000000000121019f00001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000d01000039000000000101041a000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000400310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000004010000390000000201100367000000000101043b000e00000001001d000006ef0110009c000012880000213d0000000001000411000b00000001001d00000000001004350000000101000039000c00000001001d000000200010043f0000004002000039000d00000002001d00000000010000191ba6044e0000040f0000000e020000290000000000200435000000200010043f00000000010000190000000d020000291ba6044e0000040f000000000101041a00000024020000390000000202200367000000000202043b0000000003120019000000000123004b00000000010000190000000101004039000000010110019000000c450000613d000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba8000104300000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000000310004c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d0000000901000039000000000101041a000006ef01100197000000400200043d0000000000120435000006eb01000041000006eb0320009c000000000102401900000040011002100000073e011001c700001ba70001042e0000000001000416000000000110004c000012880000c13d000000040100008a0000000001100031000006ee02000041000000600310008c00000000030000190000000003024019000006ee01100197000000000410004c000000000200a019000006ee0110009c00000000010300190000000001026019000000000110004c000012880000c13d00000002010003670000000402100370000000000202043b000e00000002001d000006ef0220009c000012880000213d0000002402100370000000000202043b000d00000002001d000006ef0220009c000012880000213d0000004401100370000000000101043b000c00000001001d0000000e0100002900000000001004350000000101000039000b00000001001d000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b0000000002000411000a00000002001d0000000000200435000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000201041a000000010100008a000900000002001d000000000112004b00000e2d0000c13d0000000e010000290000000d020000290000000c030000291ba618070000040f000000400100043d0000000b020000290000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e000000400100043d0000000002610436000000000550004c00000c510000c13d000001000400008a000000000343016f0000000000320435000000000360004c0000002003000039000000000300601900000c610000013d0000000000400435000000000370004c000000000300001900000c0a0000613d000007660400004100000000030000190000000005320019000000000604041a000000000065043500000001044000390000002003300039000000000573004b00000c030000413d0000002002300039000e00000001001d1ba613870000040f000000400100043d000d00000001001d0000000e020000291ba6135c0000040f0000000d040000290000000001410049000006eb02000041000006eb0310009c0000000001028019000006eb0340009c000000000204401900000040022002100000006001100210000000000121019f00001ba70001042e000000400100043d00000044021000390000073803000041000000000032043500000024021000390000000903000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000202000039000000000021041b0000000e03000029000000000130004c00000cd00000c13d000000400100043d00000044021000390000076703000041000000000032043500000024021000390000001a03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000b010000290000000e020000291ba61ad10000040f000000400100043d0000000c020000290000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e0000000000400435000000000260004c000000000200001900000c5f0000613d0000075303000041000000000200001900000000042100190000002004400039000000000503041a000000000054043500000001033000390000002002200039000000000462004b00000c570000413d0000000002210019000000200300003900000000023200190000000002120049000e00000001001d1ba613870000040f000000400100043d000d00000001001d0000000e020000291ba6135c0000040f0000000d040000290000000001410049000006eb02000041000006eb0310009c0000000001028019000006eb0340009c000000000204401900000040022002100000006001100210000000000121019f00001ba70001042e000006eb04000041000006eb0310009c0000000001048019000006eb03a0009c000000000304001900000000030a40190000004003300210000000c001100210000000000131019f00000703011001c700050000000a001d1ba61ba10000040f000000050a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050640027200000c930000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000c8b0000413d000000000750004c00000ca20000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f0003000000010355000000010220019000000d1a0000613d0000001f01400039000000600110018f0000000004a10019000000000114004b00000000010000190000000101004039000006f80240009c00000e790000213d000000010110019000000e790000c13d000500000004001d000000400040043f000000200130008c000012880000413d00000000010a0433000400000001001d0000075401000041000000050a00002900000000001a04350000000401a000390000000c02000029000000000021043500000000010004140000000d02000029000000040220008c00000e430000c13d0000000103000031000000200130008c0000002004000039000000000403401900000e740000013d0000000e02000039000000000302041a0000073c03300197000000000113019f000000000012041b000006eb01000041000000400200043d000006eb0320009c0000000001024019000000400110021000001ba70001042e0000000a01000039000000000101041a000007370410019700000070011002700000073702100197000000000123004b00000cfb0000813d000a00000002001d0000000901000039000000000101041a000006ef01100197000b00000001001d0000000d02000029000c00000004001d1ba61b0d0000040f0000000801000039000000000101041a000006ef011001970000000b020000291ba614330000040f0000000c03000029000000000431004b00000b800000413d000000000331004b00000edc0000c13d000000400100043d00000044021000390000076e03000041000000000032043500000024021000390000001903000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba800010430000000400100043d00000044021000390000076803000041000000000032043500000024021000390000001603000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba80001043000000000033100490000000b010000290000000e020000291ba61ad10000040f000000400100043d0000000c020000290000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e000000400200043d0000001f0430018f000000050330027200000d270000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b00000d1f0000413d000000000540004c00000d360000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba80001043000000008050000290000000706000029000000000256004b00000d490000613d000000010200008a000000060300002900000000323200d9000000000212004b00000b800000413d000000000250004c00000d530000613d000000000247004b00000d510000613d000000010200008a00000000328200d9000000000212004b00000b800000413d000000000240004c00000f520000c13d000007020100004100000000001004350000001201000039000000040010043f000007030100004100001ba8000104300000000e0100002900000000001004350000000501000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000201041a0000000103200039000000000031041b000000400300043d000000c0013000390000000c040000290000000000410435000000a001300039000000000021043500000080013000390000000b02000029000000000021043500000060013000390000000d02000029000000000021043500000040013000390000000e020000290000000000210435000000c001000039000000000113043600000742020000410000000000210435000c00000003001d000007430230009c00000e790000213d0000000c04000029000000e002400039000900000002001d000000400020043f000006eb02000041000006eb0310009c000000000102801900000040011002100000000003040433000006eb0430009c00000000030280190000006003300210000000000113019f0000000003000414000006eb0430009c0000000002034019000000c002200210000000000112019f000006f4011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000800000001001d0000000c0100002900000100021000390000074401000041000700000002001d000000000012043500000745010000410000000000100439000000000100041200000004001004430000002400000443000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000746011001c700008005020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b0000000c0300002900000122023000390000000804000029000000000042043500000102023000390000000000120435000000420100003900000009020000290000000000120435000007470120009c00000e790000213d0000000c010000290000016001100039000000400010043f000006eb010000410000000703000029000006eb0230009c00000000020100190000000002034019000000400220021000000009030000290000000003030433000006eb0430009c00000000030180190000006003300210000000000223019f0000000003000414000006eb0430009c0000000001034019000000c001100210000000000121019f000006f4011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000400200043d0000000204000367000000c403400370000000000303043b000007480530009c000011960000213d0000000a050000290000001b0550008a000000010550008c000011960000213d000000000101043b000000a404400370000000000404043b000000600520003900000000003504350000004003200039000000000043043500000020032000390000000a04000029000000000043043500000000001204350000000000000435000006eb010000410000000003000414000006eb0430009c0000000003018019000006eb0420009c00000000010240190000004001100210000000c002300210000000000112019f0000074d011001c700000001020000391ba61ba10000040f00000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050440027200000e060000613d00000000060000190000000507600210000000000871034f000000000808043b00000000008704350000000106600039000000000746004b00000dff0000413d000000000650004c00000e140000613d00000003055002100000000504400210000000000604043300000000065601cf000000000656022f000000000741034f000000000707043b0000010005500089000000000757022f00000000055701cf000000000565019f0000000000540435000100000003001f00030000000103550000000102200190000012e10000613d0000000001000433000006ef01100198000013380000c13d000000400100043d00000044021000390000074f03000041000000000032043500000024021000390000001803000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000c010000290000000902000029000000000112004b00000ef40000813d000000400100043d00000044021000390000076503000041000000000032043500000024021000390000001d03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba800010430000006eb02000041000006eb0310009c0000000001028019000006eb03a0009c00000000020a40190000004002200210000000c001100210000000000121019f00000703011001c70000000d020000291ba61ba10000040f000000050a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f000000050640027200000e610000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b00000e590000413d000000000750004c00000e700000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f0003000000010355000000010220019000000f2c0000613d0000001f01400039000000600110018f0000000001a10019000006f80210009c00000e7f0000a13d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000400010043f000000200130008c000012880000413d00000005010000290000000001010433000300000001001d0000000c010000290000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000101041a000500000001001d0000000a0100002900000009020000291ba6159a0000040f0000000b01000029000000000101041a000200000001001d0000000501000029000000000110004c0000100f0000c13d0000000001000415000000100110008a00000020011000c90000000202000029000000000220004c00000d530000613d0000000505000029000000030200002900000000325200a9000000020600002900000000346200d9000000200110011a000300000004001d000000000104001f000000040100002900000000135100a9000400000003001d000000000136004b0000115b0000213d0000000201000029000000000121004b0000115b0000213d0000000c010000290000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b000000000201041a0000000501000029000100000002001d000000000112004b000011d20000813d000000400100043d00000064021000390000075803000041000000000032043500000044021000390000075903000041000000000032043500000024021000390000002203000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000074b011001c700001ba8000104300000075f0310009c00000b800000213d000900000002001d000b00000001001d0000000e01000039000000000101041a0000ffff0110018f0000ffff0210008c000010e30000c13d0000000701000039000000000201041a000000400300043d0000076001000041000800000003001d00000000001304350000000001000414000006ef02200197000000040320008c0000109f0000c13d0000000103000031000000200130008c00000020040000390000000004034019000010d10000013d0000000e0100002900000000001004350000000b01000029000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000000101043b0000000a02000029000006ef02200197000a00000002001d0000000000200435000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d0000000c0200002900000009030000290000000002230049000000000101043b000000000021041b000000400100043d0000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d02000039000000030300003900000764040000410000000e050000290000000a060000291ba61b9c0000040f000000010120019000000be50000c13d000012880000013d000000400200043d0000001f0430018f000000050330027200000f390000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b00000f310000413d000000000540004c00000f480000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000060200002900000000322100a900000000325200d9000500000008001d00000000318100a900000000314100d9000000000312004b0000000001024019000c00000001001d0000000c01000029000000000110004c00000fdc0000c13d000000400100043d00000044021000390000075e03000041000000000032043500000024021000390000001d03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba800010430000007690100004100000000001004390000000b010000290000000400100443000006eb010000410000000002000414000006eb0320009c0000000001024019000000c0011002100000076a011001c700008002020000391ba61ba10000040f00000001022001900000000802000029000012880000613d000000000101043b000000000110004c000012880000613d000000400300043d0000006401300039000000000021043500000044013000390000000e02000029000000000021043500000024013000390000000d0200002900000000002104350000076b01000041000000000013043500000004013000390000000002000411000000000021043500000084013000390000000a0400002900000000004104350000001f0240018f000c00000003001d000000a40130003900000009030000290000000203300367000000050440027200000fa30000613d000000000500001900000005065002100000000007610019000000000663034f000000000606043b00000000006704350000000105500039000000000645004b00000f9b0000413d000000000520004c00000fb20000613d0000000504400210000000000343034f00000000044100190000000302200210000000000504043300000000052501cf000000000525022f000000000303043b0000010002200089000000000323022f00000000022301cf000000000252019f00000000002404350000000a020000290000000001210019000000000001043500000000010004140000000b02000029000000040220008c00000fd60000613d0000000a020000290000001f02200039000000200300008a000000000232016f0000076c030000410000076c0420009c0000000002038019000006eb030000410000000c05000029000006eb0450009c0000000004030019000000000405401900000040044002100000006002200210000000000242019f000006eb0410009c0000000001038019000000c001100210000000000112019f0000076d011000410000000b020000291ba61b9c0000040f00000000030100190000006003300270000106eb0030019d000006eb0430019700030000000103550000000102200190000011ac0000613d0000000c010000290000075c0110009c00000e790000813d0000000c01000029000000400010043f000008e10000013d0000000e010000290000000c020000291ba61a0e0000040f0000000701000029000000090200002900000008030000290000000d040000291ba615260000040f0000000b01000029000000000101041a00000737021001970000007001100270000007370110019700000000212100a90000000d02000039000000000012041b000000400100043d00000020021000390000000503000029000000000032043500000006020000290000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000741011001c70000800d0200003900000002030000390000075d0400004100000000050004111ba61b9c0000040f0000000101200190000012880000613d00000001010000390000000a02000029000000000012041b000000400100043d0000000c020000290000000000210435000006eb02000041000006eb0310009c000000000102801900000040011002100000073e011001c700001ba70001042e000000010100008a000000050200002900000000122100d90000000401000029000000000112004b00000b800000413d0000000201000029000000000110004c00000d530000613d00000000010004150000000f0110008a00000020011000c90000000303000029000000000232004b00000b800000413d00000ea40000013d000006eb03000041000006eb0410009c00000000010380190000000805000029000006eb0450009c00000000030540190000004003300210000000c001100210000000000131019f00000761011001c71ba61ba10000040f000000080a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f00000005064002720000103d0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000010350000413d000000000750004c0000104d0000613d0000000506600210000000000761034f000000080800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f000300000001035500000001022001900000110f0000613d0000001f01400039000000600210018f00000008010000290000000001120019000000000221004b00000000020000190000000102004039000006f80410009c00000e790000213d000000010220019000000e790000c13d000000400010043f000000200130008c000012880000413d000000080100002900000000010104330000ffff0210008c000012880000213d0000000c050000290000000b060000290000000003560049000000010200008a000800000003001d00000000433200d9000000000313004b000000090700002900000b800000413d00002710436000c9000000080400002900000000414100a9000000000413004b00000b800000413d0000000001130049000000000370004c000010770000613d00000000327200d9000000000212004b00000b800000413d00000000217100a90000000a0200002900000000325200a900002710322000c9000000000121004b000010fd0000413d00000009010000290000000b020000290000000a030000290000000c040000291ba615260000040f000000400100043d00000040021000390000000e030000290000000000320435000000200210003900000008030000290000000000320435000000600210003900000000000204350000000000010435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000762011001c70000800d020000390000000303000039000007630400004100000000050004110000000d060000291ba61b9c0000040f00000001012001900000118d0000c13d000012880000013d000006eb03000041000006eb0410009c00000000010380190000000805000029000006eb0450009c00000000030540190000004003300210000000c001100210000000000131019f00000761011001c71ba61ba10000040f000000080a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000010bd0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000010b50000413d000000000750004c000010cd0000613d0000000506600210000000000761034f000000080800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000011350000613d0000001f01400039000000600210018f00000008010000290000000001120019000000000221004b00000000020000190000000102004039000006f80410009c00000e790000213d000000010220019000000e790000c13d000000400010043f000000200130008c000012880000413d000000080100002900000000010104330000ffff0210008c000012880000213d0000000c050000290000000b060000290000000003560049000000010200008a000800000003001d00000000433200d9000000000313004b000000090700002900000b800000413d00002710436000c9000000080400002900000000144100a9000000000143004b00000b800000413d0000000001430049000000000343004b000010f70000613d00000000321200d9000000000272004b00000b800000413d00000000217100a90000000a0200002900000000322500a900002710322000c9000000000121004b0000116d0000813d000000400100043d00000044021000390000077003000041000000000032043500000024021000390000000103000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba800010430000000400200043d0000001f0430018f00000005033002720000111c0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000011140000413d000000000540004c0000112b0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000400200043d0000001f0430018f0000000503300272000011420000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b0000113a0000413d000000000540004c000011510000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000400100043d00000044021000390000075a03000041000000000032043500000024021000390000001d03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba8000104300000000b0100002900000009020000290000000c030000290000000a040000291ba615260000040f000000400100043d00000060021000390000000e03000029000000000032043500000008020000290000000002210436000000400310003900000000000304350000000000020435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000762011001c70000800d020000390000000303000039000007630400004100000000050004110000000d060000291ba61b9c0000040f0000000101200190000012880000613d00000001010000390000000602000039000000000012041b000006eb01000041000000400200043d000006eb0320009c0000000001024019000000400110021000001ba70001042e000000240120003900000022040000390000000000410435000007390100004100000000001204350000000401200039000000200400003900000000004104350000004401200039000007480330009c000013070000a13d0000074c03000041000000000031043500000064012000390000074a030000410000000000310435000006eb01000041000006eb0320009c000000000102401900000040011002100000074b011001c700001ba800010430000000400200043d0000001f0340018f0000000504400272000011b90000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000645004b000011b10000413d000000000530004c000011c80000613d0000000504400210000000000141034f00000000044200190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f0000000000140435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba8000104300000000c010000290000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000012880000613d000000050300002900000001020000290000000002320049000000000101043b000000000021041b0000000b01000029000000000101041a000000000231004b00000b800000413d000000050300002900000000013100490000000b02000029000000000012041b000000400100043d0000000000310435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d02000039000000030300003900000755040000410000000c0500002900000000060000191ba61b9c0000040f0000000101200190000012880000613d0000000201000029000000040200002900000000121200d9000b00000002001d0000000c0100002900000005020000291ba6187f0000040f00000008010000290000000e020000290000000b030000291ba61b0d0000040f0000000d010000290000000e0200002900000003030000291ba61b0d0000040f00000008010000290000000d020000291ba614330000040f0000000a0300002900000009040000291ba615260000040f0000000701000029000000000101041a00000737021001970000007001100270000007370110019700000000212100a90000000d02000039000000000012041b000000400100043d0000002002100039000000030300002900000000003204350000000b020000290000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000741011001c70000800d020000390000000303000039000007560400004100000000050004110000000e060000291ba61b9c0000040f0000000101200190000012880000613d00000001010000390000000602000029000000000012041b000000400100043d0000002002100039000000030300002900000000003204350000000b020000290000000000210435000006eb02000041000006eb0310009c0000000001028019000000400110021000000757011001c700001ba70001042e000006eb03000041000006eb0410009c00000000010380190000000305000029000006eb0450009c00000000030540190000004003300210000000c001100210000000000131019f00000761011001c71ba61ba10000040f000000030a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000012620000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b0000125a0000413d000000000750004c000012720000613d0000000506600210000000000761034f000000030800002900000000066800190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000013120000613d0000001f01400039000000600210018f00000003010000290000000001120019000000000221004b00000000020000190000000102004039000006f80410009c00000e790000213d000000010220019000000e790000c13d000000400010043f000000200130008c000012880000413d000000030100002900000000010104330000ffff0210008c0000128a0000a13d000000000100001900001ba8000104300000000c020000290000075f0220009c00000b800000213d0000000c020000290000000903000029000000000232004b000012960000a13d000000010200008a000000080300002900000000323200d9000000000212004b00000b800000413d0000000c0200002900002710322000c9000000080300002900000000433100a9000000000432004b00000b800000413d0000000a040000290000075f0440009c00000b800000213d0000000a040000290000000605000029000000000454004b000012a80000a13d000000010400008a000000050500002900000000545400d9000000000414004b00000b800000413d0000000a0400002900002710544000c9000000050500002900000000155100a9000000000154004b00000b800000413d00000000013200490000000004540049000000000232004b000012b60000613d000000010200008a00000000321200d9000000000242004b00000b800000413d00000000211400a90000000402000029000000070300002900000000322300a90000076f322000d1000000000121004b000010fd0000413d0000000c010000290000000a02000029000000070300002900000004040000291ba615260000040f000000400100043d00000060021000390000000e03000029000000000032043500000040021000390000000d03000029000000000032043500000020021000390000000503000029000000000032043500000008020000290000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000762011001c70000800d020000390000000303000039000007630400004100000000050004110000000b060000291ba61b9c0000040f0000000101200190000012880000613d0000118d0000013d000000400200043d0000001f0430018f0000000503300272000012ee0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000012e60000413d000000000540004c000012fd0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba8000104300000074903000041000000000031043500000064012000390000074a030000410000000000310435000006eb01000041000006eb0320009c000000000102401900000040011002100000074b011001c700001ba800010430000000400200043d0000001f0430018f00000005033002720000131f0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000013170000413d000000000540004c0000132e0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba8000104300000000e02000029000000000121004b0000134a0000c13d0000000e010000290000000d020000290000000b030000291ba61ad10000040f000006eb010000410000001102000029000006eb0320009c0000000002018019000000400300043d000006eb0430009c000000000103401900000040011002100000006002200210000000000112019f00001ba70001042e000000400100043d00000044021000390000074e03000041000000000032043500000024021000390000001103000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba80001043000000020030000390000000004310436000000000302043300000000003404350000004001100039000000000430004c0000136b0000613d000000000400001900000000054100190000002004400039000000000624001900000000060604330000000000650435000000000534004b000013640000413d000000000231001900000000000204350000001f02300039000000200300008a000000000232016f0000000001210019000000000001042d000006eb0440019700000040051000390000000000450435000007370330019700000020041000390000000000340435000007370220019700000000002104350000006001100039000000000001042d000007720210009c000013810000813d0000006001100039000000400010043f000000000001042d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba8000104300000001f02200039000000200300008a000000000232016f0000000001120019000000000221004b00000000020000190000000102004039000006f80310009c000013940000213d0000000102200190000013940000c13d000000400010043f000000000001042d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba80001043000010000000000020000000e01000039000000000101041a0000ffff0110018f0000ffff0210008c000013ef0000c13d0000000701000039000000000201041a000000400a00043d000007600100004100000000001a04350000000001000414000006ef02200197000000040320008c000013ae0000c13d0000000103000031000000200130008c00000020040000390000000004034019000013df0000013d000006eb03000041000006eb0410009c0000000001038019000006eb04a0009c00000000030a40190000004003300210000000c001100210000000000131019f00000761011001c700010000000a001d1ba61ba10000040f000000010a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000013cc0000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000013c40000413d000000000750004c000013db0000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f00030000000103550000000102200190000013f80000613d0000001f01400039000000600210018f0000000001a20019000000000221004b00000000020000190000000102004039000006f80410009c000013f20000213d0000000102200190000013f20000c13d000000400010043f0000001f0130008c000013f00000a13d00000000010a04330000ffff0210008c000013f00000213d000000000001042d000000000100001900001ba800010430000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000400200043d0000001f0430018f0000000503300272000014050000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000013fd0000413d000000000540004c000014140000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000000110004c000014210000613d000000000001042d000000400100043d00000044021000390000077103000041000000000032043500000024021000390000001f03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba80001043000030000000000020000000005020019000000400b00043d000007540200004100000000002b04350000000402b00039000000000600041000000000006204350000000003000414000006ef02100197000000040120008c000014440000c13d0000000103000031000000200130008c00000020040000390000000004034019000014790000013d000100000006001d000300000005001d000006eb01000041000006eb0430009c0000000003018019000006eb04b0009c00000000010b40190000004001100210000000c003300210000000000113019f00000703011001c700020000000b001d1ba61ba10000040f000000020b00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000014640000613d0000000007000019000000050870021000000000098b0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b0000145c0000413d000000000750004c000014730000613d0000000506600210000000000761034f00000000066b00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f0003000000010355000000010220019000000003050000290000000106000029000014da0000613d0000001f01400039000000600110018f000000000ab1001900000000011a004b00000000010000190000000101004039000006f802a0009c000014d20000213d0000000101100190000014d20000c13d0000004000a0043f0000001f0130008c000014d80000a13d00000000070b0433000007540100004100000000001a04350000000401a0003900000000006104350000000001000414000006ef02500197000000040320008c000014940000c13d0000000103000031000000200130008c00000020040000390000000004034019000014c70000013d000200000007001d000006eb03000041000006eb0410009c0000000001038019000006eb04a0009c00000000030a40190000004003300210000000c001100210000000000131019f00000703011001c700030000000a001d1ba61ba10000040f000000030a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000014b30000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000014ab0000413d000000000750004c000014c20000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f000300000001035500000001022001900000000207000029000015000000613d0000001f01400039000000600110018f0000000001a10019000006f80210009c000014d20000213d000000400010043f000000200130008c000014d80000413d00000000020a04330000000001070019000000000001042d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000000100001900001ba800010430000000400200043d0000001f0430018f0000000503300272000014e70000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000014df0000413d000000000540004c000014f60000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000400200043d0000001f0430018f00000005033002720000150d0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000015050000413d000000000540004c0000151c0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba8000104300005000000000002000400000004001d000500000003001d000300000001001d000007370110009c000015880000213d000007730120009c000015880000813d000200000002001d0000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f0000000102200190000015860000613d000000000101043b0000000a02000039000100000002001d000000000202041a000000e00220027000000000022100490000000405000029000007370150019700000005060000290000073703600197000006eb022001980000155b0000613d000000000430004c0000155b0000613d000000000410004c0000155b0000613d0000007004500210000007750440019700000000433400d900000000432300a90000000b04000039000000000504041a0000000003530019000000000034041b0000007003600210000007750330019700000000311300d900000000212100a90000000c02000039000000000302041a0000000001310019000000000012041b0000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f0000000102200190000015860000613d0000000204000029000000700240021000000775022001970000000303000029000000000232019f000000000101043b000000e001100210000000000121019f0000000102000029000000000012041b000000400100043d000000200210003900000000004204350000000000310435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f00000741011001c70000800d02000039000000010300003900000776040000411ba61b9c0000040f0000000101200190000015860000613d000000000001042d000000000100001900001ba800010430000000400100043d00000044021000390000077403000041000000000032043500000024021000390000000803000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000073a011001c700001ba800010430000600000000000200000000050100190000000d01000039000000000801041a000000000180004c000017ac0000613d0000000701000039000000000301041a000000400b00043d000007770100004100000000001b04350000000001000414000006ef07300197000000040370008c000015ae0000c13d0000000103000031000000200130008c00000020040000390000000004034019000015e80000013d000300000005001d000400000002001d000500000008001d000006eb02000041000006eb0310009c0000000001028019000006eb03b0009c00000000020b40190000004002200210000000c001100210000000000121019f00000761011001c7000600000007001d000000000207001900020000000b001d1ba61ba10000040f000000020b00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000015d10000613d0000000007000019000000050870021000000000098b0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000015c90000413d000000000750004c000015e00000613d0000000506600210000000000761034f00000000066b00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f000300000001035500000001022001900000000607000029000000050800002900000004020000290000000305000029000017bb0000613d0000001f01400039000000600110018f000000000ab1001900000000011a004b00000000010000190000000101004039000006f804a0009c000017b50000213d0000000101100190000017b50000c13d0000004000a0043f000000200130008c000017b30000413d00000000060b0433000007780160009c000017b30000813d000000000160004c000017ac0000613d0000073701500197000007370220019700000000211200aa00000000050000190000164b0000613d00000080021002700000075b0310009c000000000201a0190000075c030000410000075b0410009c000000010300a0390000002004300210000006f80520009c00000000030420190000004004200270000006f80520009c00000000020420190000001004300210000006eb0520009c00000000030420190000002004200270000006eb0520009c000000000204201900000008043002100000ffff0520008c0000000003042019000000100420027000000000020420190000000404300210000000ff0520008c00000000030420190000000804200270000000000204201900000002043002100000000f0520008c000000000304201900000004042002700000000002042019000000070220008c0000000002000019000000010200203900000000022301cf00000000432100d90000000002230019000000010320008c000017ad0000a13d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000432100d90000000002230019000000020320008c000017ad0000413d000000010220027000000000312100d9000000000312004b0000000005010019000000000502401900000080018002700000075b0280009c000000000108a0190000075c020000410000075b0380009c000000010200a0390000002003200210000006f80410009c00000000020320190000004003100270000006f80410009c00000000010320190000001003200210000006eb0410009c00000000020320190000002003100270000006eb0410009c000000000103201900000008032002100000ffff0410008c0000000002032019000000100310027000000000010320190000000403200210000000ff0410008c00000000020320190000000803100270000000000103201900000002032002100000000f0410008c000000000203201900000004031002700000000001032019000000070110008c0000000001000019000000010100203900000000011201cf00000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d000000010110027000000000321800d90000000001120019000000020210008c000017ad0000413d0000000202000039000500000002001d000000000902041a000007790200004100000000002a0435000000010110027000000000321800d9000000000321004b000000000802001900000000080140190000000001000414000000040270008c000600000006001d000016a50000c13d0000000103000031000000200130008c00000020040000390000000004034019000016de0000013d000100000008001d000200000009001d000300000005001d000006eb02000041000006eb0310009c0000000001028019000006eb03a0009c00000000020a40190000004002200210000000c001100210000000000121019f00000761011001c7000000000207001900040000000a001d1ba61ba10000040f000000040a00002900000000030100190000006003300270000006eb03300197000000200430008c000000200400003900000000040340190000001f0540018f0000000506400272000016c70000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000016bf0000413d000000000750004c000016d60000613d0000000506600210000000000761034f00000000066a00190000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000100000003001f000300000001035500000001022001900000000606000029000000030500002900000002090000290000000108000029000017e10000613d0000001f01400039000000600110018f0000000001a10019000006f80210009c000017b50000213d000000400010043f000000200130008c000017b30000413d00000000020a0433000000ff0120008c000017b30000213d000000000185004b0000175b0000413d0000000001850049000000000390004c000016f20000613d000000010300008a00000000439300d9000000000313004b0000175b0000413d000000010220008a000000ff0320008c0000175b0000213d000000000320004c000016fb0000613d000000010300008a00000000432300d9000000000353004b0000175b0000413d00000000325200a9000000000282001a000017ad0000613d00000000319100a9000000000312004b000017ac0000213d00000000132100d90000000501000029000000000201041a0000000001320019000000000221004b0000000002000019000000010200403900000001022001900000175b0000c13d000400000003001d0000000502000029000000000012041b0000000000600435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000017b30000613d000000000101043b000000000301041a00000004040000290000000002430019000000000332004b0000000003000019000000010300403900000001033001900000175b0000c13d000000000021041b000000400100043d0000000000410435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d0200003900000003030000390000075504000041000000000500001900000006060000291ba61b9c0000040f00000006030000290000000101200190000017b30000613d0000000501000029000000000101041a000400000001001d0000000a01000039000000000101041a000500000001001d0000000000300435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000017b30000613d00000005060000290000073702600197000000000101043b000000000101041a000000000310004c000017610000613d000000010300008a00000000341300d9000000000324004b00000004050000290000175b0000413d000000000350004c000017ad0000613d00000070036002700000073703300197000000000434004b000017660000813d000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba8000104300000000405000029000000000350004c000017ad0000613d00000070036002700000073703300197000000400600043d0000077a0460009c000017b50000213d0000006004600039000000400040043f00000000422100a900000000425200d90000073702200197000500000006001d000000000426043600000000211300a900000000215100d90000073701100197000400000004001d00000000001404350000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f00000006030000290000000102200190000017b30000613d00000005020000290000004002200039000000000101043b000006eb01100197000300000002001d000000000012043500000000003004350000000f01000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000017b30000613d000000050200002900000000020204330000073702200197000000000101043b000000000301041a0000077b03300197000000000232019f000000000021041b000000000201041a0000077c022001970000000403000029000000000303043300000070033002100000077503300197000000000232019f000000000021041b00000003020000290000000002020433000000e002200210000000000301041a0000077d03300197000000000223019f000000000021041b000000000001042d000007020100004100000000001004350000001201000039000000040010043f000007030100004100001ba800010430000000000100001900001ba800010430000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000400200043d0000001f0430018f0000000503300272000017c80000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000017c00000413d000000000540004c000017d70000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba800010430000000400200043d0000001f0430018f0000000503300272000017ee0000613d000000000500001900000005065002100000000007620019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000017e60000413d000000000540004c000017fd0000613d0000000503300210000000000131034f00000000033200190000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000006eb010000410000000103000031000006eb0430009c0000000003018019000006eb0420009c000000000102401900000040011002100000006002300210000000000112019f00001ba8000104300005000000000002000500000003001d000300000002001d000100000001001d000006ef01100197000400000001001d0000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000018620000613d000000000101043b000000000201041a0000000501000029000200000002001d000000000112004b000018640000413d00000004010000290000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f00000001022001900000000504000029000018620000613d00000002020000290000000002420049000000000101043b000000000021041b0000000301000029000006ef01100197000200000001001d0000000000100435000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f00000005040000290000000102200190000018620000613d000000000101043b000000000301041a0000000002430019000000000332004b000000000300001900000001030040390000000103300190000018790000c13d000000000021041b000000400100043d0000000000410435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d0200003900000003030000390000075504000041000000040500002900000002060000291ba61b9c0000040f0000000101200190000018620000613d0000000101000029000000030200002900000005030000291ba619070000040f000000000001042d000000000100001900001ba800010430000000400100043d00000064021000390000077e03000041000000000032043500000044021000390000077f03000041000000000032043500000024021000390000002603000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000074b011001c700001ba800010430000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba8000104300004000000000002000000000220004c000018f80000613d0000000202000039000000000302041a0000000a02000039000000000202041a000006ef01100198000018f80000613d000400000002001d000300000003001d000200000001001d0000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000018f90000613d00000004060000290000073702600197000000000101043b000000000101041a000000000310004c0000000305000029000018ae0000613d000000010300008a00000000341300d9000000000324004b000018a80000413d000000000350004c000018fb0000613d00000070036002700000073703300197000000000434004b000018b20000813d000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba800010430000000000350004c000018fb0000613d00000070036002700000073703300197000000400600043d000007720460009c000019010000813d0000006004600039000000400040043f00000000422100a900000000425200d90000073702200197000400000006001d000000000426043600000000213100a900000000215100d90000073701100197000300000004001d00000000001404350000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f0000000102200190000018f90000613d00000004020000290000004002200039000000000101043b000006eb01100197000100000002001d0000000000120435000000020100002900000000001004350000000f01000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f0000000102200190000018f90000613d000000040200002900000000020204330000073702200197000000000101043b000000000301041a0000077b03300197000000000232019f000000000021041b000000000201041a0000077c022001970000000303000029000000000303043300000070033002100000077503300197000000000232019f000000000021041b00000001020000290000000002020433000000e002200210000000000301041a0000077d03300197000000000223019f000000000021041b000000000001042d000000000100001900001ba800010430000007020100004100000000001004350000001201000039000000040010043f000007030100004100001ba800010430000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000c0000000000020000000004020019000000000230004c000019ff0000613d0000000202000039000000000202041a000600000002001d0000000a02000039000000000202041a0000073703200197000800000003001d00000070022002700000073702200197000700000002001d000006ef01100198000019880000613d000300000004001d000400000001001d0000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001a000000613d000000000101043b000000000101041a000000000210004c0000000605000029000019380000613d000000010200008a00000000231200d90000000802000029000000000223004b000019a90000413d000000000250004c00001a020000613d00000000020004150000000b0220008a00000020022000c90000000704000029000000000343004b0000193d0000813d000019a90000013d00000000020004150000000c0220008a00000020022000c9000000000350004c00001a020000613d000000070300002900000000433100a900000000435300d9000000200220011a000007370230019d0000073702300197000000400400043d000007720340009c00001a080000813d0000006003400039000000400030043f000000080300002900000000313100a900000000315100d90000073701100197000500000004001d0000000001140436000200000001001d00000000002104350000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f000000010220019000001a000000613d00000005020000290000004002200039000000000101043b000006eb01100197000100000002001d0000000000120435000000040100002900000000001004350000000f01000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001a000000613d000000050200002900000000020204330000073702200197000000000101043b000000000301041a0000077b03300197000000000232019f000000000021041b000000000201041a0000077c022001970000000203000029000000000303043300000070033002100000077503300197000000000232019f000000000021041b00000001020000290000000002020433000000e002200210000000000301041a0000077d03300197000000000223019f000000000021041b0000000304000029000006ef01400198000019ff0000613d000500000001001d0000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001a000000613d000000000101043b000000000101041a000000000210004c000019af0000613d000000010200008a00000000231200d90000000802000029000000000223004b0000000605000029000019a90000413d000000000250004c00001a020000613d0000000002000415000000090220008a00000020022000c90000000704000029000000000343004b000019b50000813d000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba80001043000000000020004150000000a0220008a00000020022000c90000000605000029000000000350004c00001a020000613d000000070300002900000000433100a900000000435300d9000000200220011a000007370230019d0000073702300197000000400400043d0000077a0340009c00001a080000213d0000006003400039000000400030043f000000080300002900000000313100a900000000315100d90000073701100197000800000004001d0000000001140436000700000001001d00000000002104350000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f000000010220019000001a000000613d00000008020000290000004002200039000000000101043b000006eb01100197000600000002001d0000000000120435000000050100002900000000001004350000000f01000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001a000000613d000000080200002900000000020204330000073702200197000000000101043b000000000301041a0000077b03300197000000000232019f000000000021041b000000000201041a0000077c022001970000000703000029000000000303043300000070033002100000077503300197000000000232019f000000000021041b00000006020000290000000002020433000000e002200210000000000301041a0000077d03300197000000000223019f000000000021041b000000000001042d000000000100001900001ba800010430000007020100004100000000001004350000001201000039000000040010043f000007030100004100001ba800010430000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000400000000000200000000040200190000000202000039000200000002001d000000000302041a0000000002430019000000000332004b00000000030000190000000103004039000000010330019000001a720000c13d0000000203000029000000000023041b000006ef01100197000400000001001d0000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c70000801002000039000300000004001d1ba61ba10000040f000000010220019000001ac30000613d000000000101043b000000000301041a00000003040000290000000002430019000000000332004b00000000030000190000000103004039000000010330019000001a720000c13d000000000021041b000000400100043d0000000000410435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d0200003900000003030000390000075504000041000000000500001900000004060000291ba61b9c0000040f000000010120019000001ac30000613d0000000301000029000000000110004c00001ac20000613d0000000201000029000000000201041a0000000a01000039000000000301041a0000000401000029000000000110004c00001ac20000613d000300000003001d000200000002001d00000004010000290000000000100435000000200000043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001ac30000613d00000003060000290000073702600197000000000101043b000000000101041a000000000310004c000000020500002900001a780000613d000000010300008a00000000341300d9000000000324004b00001a720000413d000000000350004c00001ac50000613d00000070036002700000073703300197000000000434004b00001a7c0000813d000007020100004100000000001004350000001101000039000000040010043f000007030100004100001ba800010430000000000350004c00001ac50000613d00000070036002700000073703300197000000400600043d000007720460009c00001acb0000813d0000006004600039000000400040043f00000000422100a900000000425200d90000073702200197000300000006001d000000000426043600000000211300a900000000215100d90000073701100197000200000004001d00000000001404350000073f010000410000000000100439000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000740011001c70000800b020000391ba61ba10000040f000000010220019000001ac30000613d00000003020000290000004002200039000000000101043b000006eb01100197000100000002001d0000000000120435000000040100002900000000001004350000000f01000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001ac30000613d000000030200002900000000020204330000073702200197000000000101043b000000000301041a0000077b03300197000000000232019f000000000021041b000000000201041a0000077c022001970000000203000029000000000303043300000070033002100000077503300197000000000232019f000000000021041b00000001020000290000000002020433000000e002200210000000000301041a0000077d03300197000000000223019f000000000021041b000000000001042d000000000100001900001ba800010430000007020100004100000000001004350000001201000039000000040010043f000007030100004100001ba800010430000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba8000104300003000000000002000100000003001d000300000002001d000006ef01100197000200000001001d00000000001004350000000101000039000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001b0b0000613d000000000101043b0000000302000029000006ef02200197000300000002001d0000000000200435000000200010043f000006eb010000410000000002000414000006eb0320009c0000000001024019000000c00110021000000741011001c700008010020000391ba61ba10000040f000000010220019000001b0b0000613d000000000101043b0000000102000029000000000021041b000000400100043d0000000000210435000006eb020000410000000003000414000006eb0430009c0000000003028019000006eb0410009c00000000010280190000004001100210000000c002300210000000000112019f000006fe011001c70000800d0200003900000003030000390000076404000041000000020500002900000003060000291ba61b9c0000040f000000010120019000001b0b0000613d000000000001042d000000000100001900001ba8000104300000000004010019000000400100043d00000044051000390000000000350435000000200310003900000780050000410000000000530435000006ef022001970000002405100039000000000025043500000044020000390000000000210435000007810210009c00001b7f0000813d0000008002100039000000400020043f0000000002000414000000040540008c00001b230000c13d0000000102000039000000010300003100001b370000013d000006eb05000041000006eb0630009c000000000305801900000040033002100000000001010433000006eb0610009c00000000010580190000006001100210000000000131019f000006eb0320009c0000000002058019000000c002200210000000000121019f00000000020400191ba61b9c0000040f000000010220018f00030000000103550000006001100270000106eb0010019d000006eb031001970000006001000039000000000430004c00001b650000613d0000003f01300039000000200400008a000000000441016f000000400100043d0000000004410019000000000514004b00000000050000190000000105004039000006f80640009c00001b7f0000213d000000010550019000001b7f0000c13d000000400040043f0000000003310436000000030400036700000001060000310000001f0560018f000000050660027200001b560000613d000000000700001900000005087002100000000009830019000000000884034f000000000808043b00000000008904350000000107700039000000000867004b00001b4e0000413d000000000750004c00001b650000613d0000000506600210000000000464034f00000000036300190000000305500210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000000220004c00001b850000613d0000000012010434000000000320004c00001b7e0000613d000006ee030000410000001f0420008c00000000040000190000000004032019000006ee02200197000000000520004c0000000003008019000006ee0220009c00000000020400190000000002036019000000000220004c00001b9a0000613d0000000001010433000000000210004c0000000002000019000000010200c039000000000221004b00001b9a0000c13d000000000110004c00001b850000613d000000000001042d000007020100004100000000001004350000004101000039000000040010043f000007030100004100001ba800010430000000400100043d00000064021000390000078203000041000000000032043500000044021000390000078303000041000000000032043500000024021000390000002d03000039000000000032043500000739020000410000000000210435000000040210003900000020030000390000000000320435000006eb02000041000006eb0310009c000000000102801900000040011002100000074b011001c700001ba800010430000000000100001900001ba80001043000001b9f002104210000000102000039000000000001042d0000000002000019000000000001042d00001ba4002104230000000102000039000000000001042d0000000002000019000000000001042d00001ba60000043200001ba70001042e00001ba80001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffff000000000000009f8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66511e36e5d2f401c54acf6e396173073db572b463aec87cff7b0e9eb32c669528b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f000000000000000000000000000000000000000000000000ffffffffffffff3f0200000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000095d89b4100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffbf000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffdf5a462000000000000000000000000000000000000000000000000000000000002f00000000000000000000000000000000000000000000000000000000000000204c5020546f6b656e0000000000000000000000000000000000000000000000205a464c5000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000200000000000000000000000005a46204c5020546f6b656e0000000000000000000000000000000000000000005a464c500000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000800000010000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000000200000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006a62784100000000000000000000000000000000000000000000000000000000bc25cf7600000000000000000000000000000000000000000000000000000000d505acce00000000000000000000000000000000000000000000000000000000e5ba6dac00000000000000000000000000000000000000000000000000000000e5ba6dad00000000000000000000000000000000000000000000000000000000e6262b5600000000000000000000000000000000000000000000000000000000fff6cae900000000000000000000000000000000000000000000000000000000d505accf00000000000000000000000000000000000000000000000000000000dd62ed3e00000000000000000000000000000000000000000000000000000000d21220a600000000000000000000000000000000000000000000000000000000d21220a700000000000000000000000000000000000000000000000000000000d4cadf6800000000000000000000000000000000000000000000000000000000bc25cf7700000000000000000000000000000000000000000000000000000000c45a0155000000000000000000000000000000000000000000000000000000007ecebdff0000000000000000000000000000000000000000000000000000000095d89b400000000000000000000000000000000000000000000000000000000095d89b4100000000000000000000000000000000000000000000000000000000a457c2d700000000000000000000000000000000000000000000000000000000a9059cbb000000000000000000000000000000000000000000000000000000007ecebe000000000000000000000000000000000000000000000000000000000089afcb44000000000000000000000000000000000000000000000000000000007464fc3c000000000000000000000000000000000000000000000000000000007464fc3d000000000000000000000000000000000000000000000000000000007abdd2d1000000000000000000000000000000000000000000000000000000006a6278420000000000000000000000000000000000000000000000000000000070a0823100000000000000000000000000000000000000000000000000000000313ce5660000000000000000000000000000000000000000000000000000000051415b5c000000000000000000000000000000000000000000000000000000005a3d5492000000000000000000000000000000000000000000000000000000005a3d54930000000000000000000000000000000000000000000000000000000065193e910000000000000000000000000000000000000000000000000000000065d176f50000000000000000000000000000000000000000000000000000000051415b5d000000000000000000000000000000000000000000000000000000005909c0d500000000000000000000000000000000000000000000000000000000395093500000000000000000000000000000000000000000000000000000000039509351000000000000000000000000000000000000000000000000000000004a1c830900000000000000000000000000000000000000000000000000000000313ce567000000000000000000000000000000000000000000000000000000003644e515000000000000000000000000000000000000000000000000000000000dfe16800000000000000000000000000000000000000000000000000000000023b872dc0000000000000000000000000000000000000000000000000000000023b872dd0000000000000000000000000000000000000000000000000000000030adf81f000000000000000000000000000000000000000000000000000000000dfe16810000000000000000000000000000000000000000000000000000000018160ddd000000000000000000000000000000000000000000000000000000000902f1ab000000000000000000000000000000000000000000000000000000000902f1ac00000000000000000000000000000000000000000000000000000000095ea7b300000000000000000000000000000000000000000000000000000000022c0d9f0000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000ffffffffffffffffffffffffffff464f5242494444454e000000000000000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000494e56414c49445f464545000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d95539132020000020000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000400000000000000000000000006e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9000000000000000000000000000000000000000000000000ffffffffffffff1f1901000000000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a045434453413a20696e76616c6964207369676e6174757265202776272076616c7565000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008400000000000000000000000045434453413a20696e76616c6964207369676e6174757265202773272076616c0000000000000000000000000000000000000080000000000000000000000000494e56414c49445f5349474e415455524500000000000000000000000000000045434453413a20696e76616c6964207369676e617475726500000000000000004558504952454400000000000000000000000000000000000000000000000000207a65726f00000000000000000000000000000000000000000000000000000045524332303a2064656372656173656420616c6c6f77616e63652062656c6f778a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b70a0823100000000000000000000000000000000000000000000000000000000ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d819364960000000000000000000000000000000000000040000000000000000000000000636500000000000000000000000000000000000000000000000000000000000045524332303a206275726e20616d6f756e7420657863656564732062616c616e494e53554646494349454e545f4c49515549444954595f4255524e454400000000000000000000000000000000000000ffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000100000000000000004c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f494e53554646494349454e545f4c49515549444954595f4d494e54454400000000068db8bac710cb295e9e1b089a027525460aa64c2f837b4a2339c0ebedfa4354cf2aeb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000200000000000000000000000000000000000080000000000000000000000000d78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92545524332303a20696e73756666696369656e7420616c6c6f77616e6365000000c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b494e53554646494349454e545f4f55545055545f414d4f554e54000000000000494e53554646494349454e545f4c4951554944495459000000000000000000001806aa1896bbf26568e884a7374b41e002500962caba6a15023a8d90e8508b83020000020000000000000000000000000000002400000000000000000000000010d1e85c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff5b00000000000000000000000000000000000000a4000000000000000000000000494e53554646494349454e545f494e5055545f414d4f554e54000000000000000000000000000000000000000000000000000000000000000000000005f5e1004b000000000000000000000000000000000000000000000000000000000000005265656e7472616e637947756172643a207265656e7472616e742063616c6c00000000000000000000000000000000000000000000000000ffffffffffffffa000000000000000000000000000000000000100000000000000000000000000004f564552464c4f5700000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffff00000000000000000000000000001c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1017e7e5800000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000011e3bdde00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff9fffffffffffffffffffffffffffffffffffff0000000000000000000000000000ffffffff0000000000000000000000000000ffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff616c616e6365000000000000000000000000000000000000000000000000000045524332303a207472616e7366657220616d6f756e7420657863656564732062a9059cbb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff80616e73666572206661696c6564000000000000000000000000000000000000005472616e7366657248656c7065723a3a736166655472616e736665723a2074722f326488aab04d2af0ebae3dce6e42cd8b49544e0b423ce85ae768939b0d83b1

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0x0000000000000000000000003355df6d4c9c3035724fd0e3914de96a5a83aaf40000000000000000000000005aea5775959fbc2557cc8789bc1bf90a239d9a91

-----Decoded View---------------
Arg [0] : _token0 (address): 0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4
Arg [1] : _token1 (address): 0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91

-----Encoded View---------------


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.