diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4d5742f9b..db65f61bd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -46,22 +46,6 @@ jobs: key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - - name: Install ta-lib - run: | - if ([ "$RUNNER_OS" = "macOS" ]); then - brew install ta-lib - fi - if ([ "$RUNNER_OS" = "Linux" ]); then - if [ ! -f "$GITHUB_WORKSPACE/ta-lib/src" ]; then wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -q && tar -xzf ta-lib-0.4.0-src.tar.gz; fi - cd ta-lib/ - ./configure --prefix=/usr - if [ ! -f "$HOME/ta-lib/src" ]; then make; fi - sudo make install - cd - fi - if ([ "$RUNNER_OS" = "Windows" ]); then - curl -sL http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip -o $GITHUB_WORKSPACE/ta-lib.zip --create-dirs && 7z x $GITHUB_WORKSPACE/ta-lib.zip -o/c/ta-lib && mv /c/ta-lib/ta-lib/* /c/ta-lib/ && rm -rf /c/ta-lib/ta-lib && cd /c/ta-lib/c/make/cdr/win32/msvc && nmake - fi - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 88dbf8273..8a2235383 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -15,11 +15,9 @@ concurrency: jobs: build: - runs-on: ${{matrix.os}} strategy: matrix: - os: [ubuntu-latest] include: - os: ubuntu-latest path: ~/.cache/pip @@ -28,8 +26,6 @@ jobs: #- os: windows-latest # path: ~\AppData\Local\pip\Cache - python-version: ['3.10'] # , '3.11', '3.12'] - steps: - name: Checkout @@ -39,59 +35,24 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Cache pip - uses: actions/cache@v2 + uses: actions/cache@v3 id: cache with: path: ${{ matrix.path }} key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - - name: Set up ta-lib dir - if: ${{ runner.os == 'Linux' }} - run: | - mkdir -p $HOME/.local/ta-lib - echo "LD_LIBRARY_PATH=$HOME/.local/ta-lib/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV - echo "TA_INCLUDE_PATH=$HOME/.local/ta-lib/include" >> $GITHUB_ENV - echo "TA_LIBRARY_PATH=$HOME/.local/ta-lib/lib" >> $GITHUB_ENV - - name: Set up ta-lib cache - if: ${{ runner.os == 'Linux' }} - uses: actions/cache@v2 - id: talib-cache - with: - path: | - ~/.local/ta-lib/lib - ~/.local/ta-lib/include - key: talib-cache-v0.4.0 - - name: Install ta-lib mac / windows - run: | - if ([ "$RUNNER_OS" = "macOS" ]); then - brew install ta-lib - fi - if ([ "$RUNNER_OS" = "Windows" ]); then - curl -sL http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-msvc.zip -o $GITHUB_WORKSPACE/ta-lib.zip --create-dirs && 7z x $GITHUB_WORKSPACE/ta-lib.zip -o/c/ta-lib && mv /c/ta-lib/ta-lib/* /c/ta-lib/ && rm -rf /c/ta-lib/ta-lib && cd /c/ta-lib/c/make/cdr/win32/msvc && nmake - fi - - name: Install ta-lib Linux - if: steps.talib-cache.outputs.cache-hit != 'true' - run: | - wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -q && tar -xzf ta-lib-0.4.0-src.tar.gz - cd ta-lib/ - ./configure --prefix=$HOME/.local/ta-lib - make - sudo make install - cd - name: Install dependencies + shell: bash run: | + python -m ensurepip --upgrade python -m pip install --upgrade pip + python -m pip install setuptools wheel if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - if [ ! ${{ matrix.python-version }} = "3.10"]; then pip install numba; fi + if [ ! ${{ matrix.python-version }} = "3.10" ]; then pip install numba; fi pip install -e . -U - # - name: Lint with flake8 - # run: | - # stop the build if there are Python syntax errors or undefined names - # flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - # flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest + shell: bash run: | pip install pytest pytest diff --git a/.gitignore b/.gitignore index 2be03ce93..fc2a60ed2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,6 @@ __pycache__/ *.py[cod] *$py.class -# C extensions -*.so - # Distribution / packaging .Python build/ diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..2c0733315 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 22dd33625..000000000 --- a/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: python -dist: focal -cache: - directories: - - $HOME/.cache/pip - - $HOME/ta-lib -python: - - "3.7" - - "3.8" - - "3.9" -before_install: - - cd - - pip3 install Cython numpy - - if [ ! -f "$HOME/ta-lib/src" ]; then wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz -q && tar -xzf ta-lib-0.4.0-src.tar.gz; fi - - cd ta-lib/ - - ./configure --prefix=/usr - - if [ ! -f "$HOME/ta-lib/src" ]; then make; fi - - sudo make install - - cd -# command to install dependencies -install: - - pip install codecov - - pip install pytest-cov - - cd $TRAVIS_BUILD_DIR - - pip install -r requirements.txt - - pip install -e . - -# command to run tests -script: - - pytest --cov=./ - -after_success: - - codecov diff --git a/Dockerfile b/Dockerfile index 0cea31b3c..582df97fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,11 +13,6 @@ RUN pip3 install Cython numpy RUN mkdir /jesse-docker WORKDIR /jesse-docker -# Install TA-lib -COPY docker_build_helpers/* /tmp/ -RUN cd /tmp && /tmp/install_ta-lib.sh && rm -r /tmp/*ta-lib* -ENV LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH - # Install dependencies COPY requirements.txt /jesse-docker RUN pip3 install -r requirements.txt diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..3f7ed87a9 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +rl-dev: + + +rl: + uv run python -m pytest tests/test_rl_strategy.py::TestRLStrategy::test_rl_strategy \ No newline at end of file diff --git a/README.md b/README.md index 6002f99d2..2c8c10e87 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,75 @@ Algo-trading was 😵‍💫, we made it 🤩 --- -Jesse is an advanced crypto trading framework that aims to **simplify** **researching** and defining **YOUR OWN trading strategies**. +Jesse is an advanced crypto trading framework that aims to **simplify** **researching** and defining **YOUR OWN trading strategies** for backtesting, optimizing, and live trading. + +## What is Jesse? +Watch this video to get a quick overview of Jesse: + +[![Jesse Overview](https://img.youtube.com/vi/0EqN3OOqeJM/0.jpg)](https://www.youtube.com/watch?v=0EqN3OOqeJM) ## Why Jesse? In short, Jesse is more **accurate** than other solutions, and way more **simple**. In fact, it is so simple that in case you already know Python, you can get started today, in **matter of minutes**, instead of **weeks and months**. -**[Here](https://docs.jesse.trade)** you can read more about Jesse's features and why you should use it. +## Key Features + +- 📝 **Simple Syntax**: Define both simple and advanced trading strategies with the simplest syntax in the fastest time. +- 📊 **Comprehensive Indicator Library**: Access a complete library of technical indicators with easy-to-use syntax. +- 📈 **Smart Ordering**: Supports market, limit, and stop orders, automatically choosing the best one for you. +- ⏰ **Multiple Timeframes and Symbols**: Backtest and livetrade multiple timeframes and symbols simultaneously without look-ahead bias. +- 🔒 **Self-Hosted and Privacy-First**: Designed with your privacy in mind, fully self-hosted to ensure your trading strategies and data remain secure. +- 🛡️ **Risk Management**: Built-in helper functions for robust risk management. +- 📋 **Metrics System**: A comprehensive metrics system to evaluate your trading strategy's performance. +- 🔍 **Debug Mode**: Observe your strategy in action with a detailed debug mode. +- 🔧 **Optimize Mode**: Fine-tune your strategies using AI, without needing a technical background. +- 📈 **Leveraged and Short-Selling**: First-class support for leveraged trading and short-selling. +- 🔀 **Partial Fills**: Supports entering and exiting positions in multiple orders, allowing for greater flexibility. +- 🔔 **Advanced Alerts**: Create real-time alerts within your strategies for effective monitoring. +- 🤖 **JesseGPT**: Jesse has its own GPT, JesseGPT, that can help you write strategies, optimize them, debug them, and much more. +- 🔧 **Built-in Code Editor**: Write, edit, and debug your strategies with a built-in code editor. +- 📺 **Youtube Channel**: Jesse has a Youtube channel with screencast tutorials that go through example strategies step by step. + +## Example Strategy + +```py +class SMACrossover(Strategy): + @property + def slow_sma(self): + return ta.sma(self.candles, 200) + + @property + def fast_sma(self): + return ta.sma(self.candles, 50) + + def should_long(self) -> bool: + # Fast SMA above Slow SMA + return self.fast_sma > self.slow_sma + + def should_short(self) -> bool: + # Fast SMA below Slow SMA + return self.fast_sma < self.slow_sma + + def go_long(self): + # Open long position and use entire balance to buy + qty = utils.size_to_qty(self.balance, self.price, fee_rate=self.fee_rate) + + self.buy = qty, self.price + + def go_short(self): + # Open short position and use entire balance to sell + qty = utils.size_to_qty(self.balance, self.price, fee_rate=self.fee_rate) + + self.sell = qty, self.price + + def update_position(self): + # If there exist long position, but the signal shows Death Cross, then close the position, and vice versa. + if self.is_long and self.fast_sma < self.slow_sma: + self.liquidate() + + if self.is_short and self.fast_sma > self.slow_sma: + self.liquidate() +``` ## Getting Started Head over to the "getting started" section of the [documentation](https://docs.jesse.trade/docs/getting-started). The @@ -34,62 +96,14 @@ documentation is **short yet very informative**. - [⚡️ Website](https://jesse.trade) - [🎓 Documentation](https://docs.jesse.trade) -- [🛟 Help center](https://jesse.trade/help) - [🎥 Youtube channel (screencast tutorials)](https://jesse.trade/youtube) +- [🛟 Help center](https://jesse.trade/help) - [💬 Discord community](https://jesse.trade/discord) - -## Screenshots - -Check out Jesse's [Youtube channel](https://jesse.trade/youtube) for tutorials that go through example strategies step by step. - -Here are a few screenshots just to get you excited: - -**Backtest results:** - -![image](assets/screenshots/quantstats.png) - -**Example strategy code:** - -![image](assets/screenshots/strategy.jpg) - -**Live trading (requires [live plugin](https://docs.jesse.trade/docs/livetrade.html)):** - -![image](assets/screenshots/live-mode.jpg) - +- [🤖 JesseGPT](https://jesse.trade/gpt) (Requires a free account) ## What's next? You can see the project's **[roadmap here](https://docs.jesse.trade/docs/roadmap.html)**. **Subscribe** to our mailing list at [jesse.trade](https://jesse.trade) to get the good stuff as soon they're released. Don't worry, We won't send you spam—Pinky promise. -## How to contribute - -Thank you for your interest in contributing to the project. The best way to contribute is by **participating in the community** and **helping other users**. - -You can also contribute by submitting **bug reports** and **feature requests** or writing code (submitting PRs) which can be incorporated into Jesse itself. - -In that case, here's what you need to know: - -- Before starting to work on a PR, please **reach out** to make sure it **aligns** with the **project's roadmap** and **vision**. -- If your PR makes changes to the source code, please make sure to **add unit tests**. If you're not sure how to do that, just check out some of the already existing [tests](https://github.com/jesse-ai/jesse/tree/master/tests). - -First, you need to install Jesse from the repository instead of PyPi: - -```sh -# first, make sure that the PyPi version is not installed -pip uninstall jesse - -# now install Jesse from the repository -git clone https://github.com/jesse-ai/jesse.git -cd jesse -pip install -e . -``` - -Now every change you make to the code will be affected immediately. - -After every change, **make sure** your changes did not **break** any functionality by **running tests**: -``` -pytest -``` - ## Disclaimer This software is for educational purposes only. USE THE SOFTWARE AT **YOUR OWN RISK**. THE AUTHORS AND ALL AFFILIATES ASSUME **NO RESPONSIBILITY FOR YOUR TRADING RESULTS**. **Do not risk money that you are afraid to lose**. There might be **bugs** in the code - this software DOES NOT come with **ANY warranty**. diff --git a/docker_build_helpers/install_ta-lib.sh b/docker_build_helpers/install_ta-lib.sh deleted file mode 100755 index bac363df6..000000000 --- a/docker_build_helpers/install_ta-lib.sh +++ /dev/null @@ -1,17 +0,0 @@ -if [ -z "$1" ]; then - INSTALL_LOC=/usr/local -else - INSTALL_LOC=${1} -fi -echo "Installing to ${INSTALL_LOC}" -if [ ! -f "${INSTALL_LOC}/lib/libta_lib.a" ]; then - tar zxvf ta-lib-0.4.0-src.tar.gz - cd ta-lib \ - && sed -i.bak "s|0.00000001|0.000000000000000001 |g" src/ta_func/ta_utility.h \ - && ./configure --prefix=${INSTALL_LOC}/ \ - && make \ - && which sudo && sudo make install || make install \ - && echo "export LD_LIBRARY_PATH=/usr/local/lib" >> /root/.bashrc -else - echo "TA-lib already installed, skipping installation" -fi diff --git a/docker_build_helpers/ta-lib-0.4.0-src.tar.gz b/docker_build_helpers/ta-lib-0.4.0-src.tar.gz deleted file mode 100644 index b79b70b25..000000000 Binary files a/docker_build_helpers/ta-lib-0.4.0-src.tar.gz and /dev/null differ diff --git a/jesse/__init__.py b/jesse/__init__.py index beef795eb..863fde98f 100644 --- a/jesse/__init__.py +++ b/jesse/__init__.py @@ -16,7 +16,8 @@ LoginRequestJson, ConfigRequestJson, LoginJesseTradeRequestJson, NewStrategyRequestJson, FeedbackRequestJson, \ ReportExceptionRequestJson, OptimizationRequestJson, StoreExchangeApiKeyRequestJson, \ DeleteExchangeApiKeyRequestJson, StoreNotificationApiKeyRequestJson, DeleteNotificationApiKeyRequestJson, \ - ExchangeSupportedSymbolsRequestJson + ExchangeSupportedSymbolsRequestJson, SaveStrategyRequestJson, GetStrategyRequestJson, DeleteStrategyRequestJson, \ + DeleteCandlesRequestJson import uvicorn from asyncio import Queue import jesse.helpers as jh @@ -84,8 +85,8 @@ def make_strategy(json_request: NewStrategyRequestJson, authorization: Optional[ if not authenticator.is_valid_token(authorization): return authenticator.unauthorized_response() - from jesse.services import strategy_maker - return strategy_maker.generate(json_request.name) + from jesse.services import strategy_handler + return strategy_handler.generate(json_request.name) @fastapi_app.post("/feedback") @@ -166,17 +167,20 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(...)): ch, = await async_redis.psubscribe(f"{ENV_VALUES['APP_PORT']}:channel:*") async def echo(q): - while True: - msg = await q.get() - msg = json.loads(msg) - msg['id'] = process_manager.get_client_id(msg['id']) - await websocket.send_json( - msg - ) + try: + while True: + msg = await q.get() + msg = json.loads(msg) + msg['id'] = process_manager.get_client_id(msg['id']) + await websocket.send_json(msg) + except WebSocketDisconnect: + await async_redis.punsubscribe(f"{ENV_VALUES['APP_PORT']}:channel:*") + print(jh.color('WebSocket disconnected', 'yellow')) + except Exception as e: + print(jh.color(str(e), 'red')) async def reader(channel, q): async for ch, message in channel.iter(): - # modify id and set the one that the font-end knows await q.put(message) asyncio.get_running_loop().create_task(reader(ch, queue)) @@ -184,12 +188,10 @@ async def reader(channel, q): try: while True: - # just so WebSocketDisconnect would be raised on connection close await websocket.receive_text() except WebSocketDisconnect: await async_redis.punsubscribe(f"{ENV_VALUES['APP_PORT']}:channel:*") - print('Websocket disconnected') - + print(jh.color('WebSocket disconnected', 'yellow')) # create a Click group @click.group() @@ -230,9 +232,14 @@ def run() -> None: else: port = 9000 + if 'APP_HOST' in ENV_VALUES: + host = ENV_VALUES['APP_HOST'] + else: + host = "0.0.0.0" + # run the main application process_manager.flush() - uvicorn.run(fastapi_app, host="0.0.0.0", port=port, log_level="info") + uvicorn.run(fastapi_app, host=host, port=port, log_level="info") @fastapi_app.post('/general-info') @@ -315,7 +322,6 @@ def backtest(request_json: BacktestRequestJson, authorization: Optional[str] = H None, request_json.export_chart, request_json.export_tradingview, - request_json.export_full_reports, request_json.export_csv, request_json.export_json, request_json.fast_mode, @@ -490,16 +496,49 @@ def delete_notification_api_keys( return delete_notification_api_keys(json_request.id) -# def download_optimization_log(token: str = Query(...)): -# """ -# Optimization logs don't have have session ID -# """ -# if not authenticator.is_valid_token(token): -# return authenticator.unauthorized_response() -# -# from jesse.modes import data_provider -# -# return data_provider.download_file('optimize', 'log') +@fastapi_app.get('/get-strategies') +def get_strategies(authorization: Optional[str] = Header(None)) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services import strategy_handler + return strategy_handler.get_strategies() + + +@fastapi_app.post('/get-strategy') +def get_strategy( + json_request: GetStrategyRequestJson, + authorization: Optional[str] = Header(None) +) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services import strategy_handler + return strategy_handler.get_strategy(json_request.name) + + +@fastapi_app.post('/save-strategy') +def save_strategy( + json_request: SaveStrategyRequestJson, + authorization: Optional[str] = Header(None) +) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services import strategy_handler + return strategy_handler.save_strategy(json_request.name, json_request.content) + + +@fastapi_app.post('/delete-strategy') +def delete_strategy( + json_request: DeleteStrategyRequestJson, + authorization: Optional[str] = Header(None) +) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services import strategy_handler + return strategy_handler.delete_strategy(json_request.name) # # # # # # # # # # # # # # # # # # # # # # # # # # # # @@ -592,5 +631,67 @@ def get_orders(json_request: GetOrdersRequestJson, authorization: Optional[str] 'data': arr }, status_code=200) +@fastapi_app.post("/existing-candles") +def get_existing_candles(authorization: Optional[str] = Header(None)) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services.candle import get_existing_candles + + try: + data = get_existing_candles() + return JSONResponse({'data': data}, status_code=200) + except Exception as e: + return JSONResponse({'error': str(e)}, status_code=500) + +@fastapi_app.post("/delete-candles") +def delete_candles(json_request: DeleteCandlesRequestJson, authorization: Optional[str] = Header(None)) -> JSONResponse: + if not authenticator.is_valid_token(authorization): + return authenticator.unauthorized_response() + + from jesse.services.candle import delete_candles + + try: + delete_candles(json_request.exchange, json_request.symbol) + return JSONResponse({'message': 'Candles deleted successfully'}, status_code=200) + except Exception as e: + return JSONResponse({'error': str(e)}, status_code=500) + + +@fastapi_app.get("/logs/backtest/{session_id}") +def get_logs(session_id: str, token: str = Query(...)): + """ + Get logs as text for a specific session. Similar to download but returns text content instead of file. + """ + if not authenticator.is_valid_token(token): + return authenticator.unauthorized_response() + + try: + from jesse.modes.data_provider import get_backtest_logs + content = get_backtest_logs(session_id) + + if content is None: + return JSONResponse({'error': 'Log file not found'}, status_code=404) + + return JSONResponse({'content': content}, status_code=200) + except Exception as e: + return JSONResponse({'error': str(e)}, status_code=500) + + +@fastapi_app.get("/download/backtest/log/{session_id}") +def download_backtest_log(session_id: str, token: str = Query(...)): + """ + Download log file for a specific backtest session + """ + if not authenticator.is_valid_token(token): + return authenticator.unauthorized_response() + + try: + from jesse.modes.data_provider import download_backtest_log + return download_backtest_log(session_id) + except Exception as e: + return JSONResponse({'error': str(e)}, status_code=500) + + # Mount static files.Must be loaded at the end to prevent overlapping with API endpoints fastapi_app.mount("/", StaticFiles(directory=f"{JESSE_DIR}/static"), name="static") diff --git a/jesse/config.py b/jesse/config.py index f559e429f..8134fb741 100644 --- a/jesse/config.py +++ b/jesse/config.py @@ -1,7 +1,7 @@ import jesse.helpers as jh from jesse.modes.utils import get_exchange_type from jesse.enums import exchanges -from jesse.info import exchange_info, jesse_supported_timeframes +from jesse.info import exchange_info config = { @@ -22,6 +22,7 @@ 'shorter_period_candles': False, 'trading_candles': True, 'balance_update': True, + 'exchange_ws_reconnection': True }, # fill it later in this file using data in info.py @@ -116,7 +117,7 @@ def set_config(conf: dict) -> None: # exchange info (only one because the optimize mode supports only one trading route at the moment) config['env']['optimization']['exchange'] = conf['exchange'] # warm_up_candles - config['env']['optimization']['warmup_candles_num'] = int(conf['warm_up_candles']) + config['env']['data']['warmup_candles_num'] = int(conf['warm_up_candles']) # backtest and live if jh.is_backtesting() or jh.is_live(): @@ -137,9 +138,9 @@ def set_config(conf: dict) -> None: } if config['env']['exchanges'][e['name']]['type'] == 'futures': # 1x, 2x, 10x, 50x, etc. Enter as integers - config['env']['exchanges'][e['name']]['futures_leverage'] = int(e['futures_leverage']) + config['env']['exchanges'][e['name']]['futures_leverage'] = int(e.get('futures_leverage', 1)) # accepted values are: 'cross' and 'isolated' - config['env']['exchanges'][e['name']]['futures_leverage_mode'] = e['futures_leverage_mode'] + config['env']['exchanges'][e['name']]['futures_leverage_mode'] = e.get('futures_leverage_mode', 'cross') # live mode only if jh.is_live(): diff --git a/jesse/controllers/exchange_info.py b/jesse/controllers/exchange_info.py index 70498962e..30fa7dfd7 100644 --- a/jesse/controllers/exchange_info.py +++ b/jesse/controllers/exchange_info.py @@ -2,9 +2,18 @@ from jesse.modes.import_candles_mode import CandleExchange from jesse.modes.import_candles_mode.drivers import drivers, driver_names +from jesse.services.redis import sync_redis def get_exchange_supported_symbols(exchange: str) -> JSONResponse: + # first try to get from cache + cache_key = f'exchange-symbols:{exchange}' + cached_result = sync_redis.get(cache_key) + if cached_result is not None: + return JSONResponse({ + 'data': eval(cached_result) + }, status_code=200) + arr = [] try: @@ -14,6 +23,8 @@ def get_exchange_supported_symbols(exchange: str) -> JSONResponse: try: arr = driver.get_available_symbols() + # cache successful result for 5 minutes + sync_redis.setex(cache_key, 300, str(arr)) except Exception as e: return JSONResponse({ 'error': str(e) diff --git a/jesse/enums/__init__.py b/jesse/enums/__init__.py index 481a5370a..cb93a7d3e 100644 --- a/jesse/enums/__init__.py +++ b/jesse/enums/__init__.py @@ -65,7 +65,7 @@ class exchanges: BYBIT_USDT_PERPETUAL = 'Bybit USDT Perpetual' BYBIT_USDC_PERPETUAL = 'Bybit USDC Perpetual' BYBIT_USDT_PERPETUAL_TESTNET = 'Bybit USDT Perpetual Testnet' - BYBIT_USDC_PERPETUAL_TESTNET= 'Bybit USDC Perpetual Testnet' + BYBIT_USDC_PERPETUAL_TESTNET = 'Bybit USDC Perpetual Testnet' BYBIT_SPOT = 'Bybit Spot' BYBIT_SPOT_TESTNET = 'Bybit Spot Testnet' FTX_PERPETUAL_FUTURES = 'FTX Perpetual Futures' @@ -78,6 +78,11 @@ class exchanges: DYDX_PERPETUAL_TESTNET = "Dydx Perpetual Testnet" APEX_PRO_PERPETUAL_TESTNET = 'Apex Pro Perpetual Testnet' APEX_PRO_PERPETUAL = 'Apex Pro Perpetual' + APEX_OMNI_PERPETUAL_TESTNET = 'Apex Omni Perpetual Testnet' + APEX_OMNI_PERPETUAL = 'Apex Omni Perpetual' + GATE_USDT_PERPETUAL = 'Gate USDT Perpetual' + GATE_SPOT = 'Gate Spot' + class migration_actions: ADD = 'add' diff --git a/jesse/exceptions/__init__.py b/jesse/exceptions/__init__.py index 0ad5e6789..1bfb09bfc 100644 --- a/jesse/exceptions/__init__.py +++ b/jesse/exceptions/__init__.py @@ -32,7 +32,7 @@ class SymbolNotFound(Exception): class RouteNotFound(Exception): def __init__(self, symbol, timeframe): - message = f"Date route is required but missing: symbol='{symbol}', timeframe='{timeframe}'" + message = f"Data route is required but missing: symbol='{symbol}', timeframe='{timeframe}'" super().__init__(message) @@ -52,6 +52,10 @@ class ExchangeRejectedOrder(Exception): pass +class ExchangeOrderNotFound(Exception): + pass + + class InvalidShape(Exception): pass @@ -94,3 +98,7 @@ class ExchangeError(Exception): class NotSupportedError(Exception): pass + + +class CandlesNotFound(Exception): + pass diff --git a/jesse/helpers.py b/jesse/helpers.py index bef5b57bc..4a0a61c20 100644 --- a/jesse/helpers.py +++ b/jesse/helpers.py @@ -1,6 +1,8 @@ import hashlib import math import os +import gzip +import json from functools import lru_cache import random import string @@ -10,8 +12,9 @@ from pprint import pprint import arrow import click -import numpy import numpy as np +import base64 + CACHED_CONFIG = dict() @@ -132,8 +135,10 @@ def dashy_symbol(symbol: str) -> str: return symbol[:-3] + '-MIM' if symbol.endswith('TRY'): return symbol[:-3] + '-TRY' - if symbol.endswith('USD'): - return symbol[:-3] + '-USD' + if symbol.endswith('FDUSD'): + return symbol[:-5] + '-FDUSD' + if symbol.endswith('TUSD'): + return symbol[:-4] + '-TUSD' if symbol.endswith('UST'): return symbol[:-3] + '-UST' if symbol.endswith('USDT'): @@ -146,6 +151,8 @@ def dashy_symbol(symbol: str) -> str: return symbol[:-4] + '-USDP' if symbol.endswith('USDU'): return symbol[:-4] + '-USDU' + if symbol.endswith('USD'): + return symbol[:-3] + '-USD' if len(symbol) > 7 and symbol.endswith('SUSDT'): # ex: SETHSUSDT => SETH-SUSDT @@ -154,6 +161,14 @@ def dashy_symbol(symbol: str) -> str: return f"{symbol[0:3]}-{symbol[3:]}" +def underline_to_dashy_symbol(symbol: str) -> str: + return symbol.replace('_', '-') + + +def dashy_to_underline(symbol: str) -> str: + return symbol.replace('-', '_') + + def date_diff_in_days(date1: arrow.arrow.Arrow, date2: arrow.arrow.Arrow) -> int: if type(date1) is not arrow.arrow.Arrow or type( date2) is not arrow.arrow.Arrow: @@ -339,9 +354,47 @@ def get_store(): def get_strategy_class(strategy_name: str): from pydoc import locate + import os + import re if not is_unit_testing(): - return locate(f'strategies.{strategy_name}.{strategy_name}') + strategy_class = locate(f'strategies.{strategy_name}.{strategy_name}') + if strategy_class is None: + # Try to find any class that inherits from Strategy in the module + module = locate(f'strategies.{strategy_name}') + if module: + strategy_file = os.path.join('strategies', strategy_name, '__init__.py') + if os.path.exists(strategy_file): + with open(strategy_file, 'r') as f: + content = f.read() + + # Find the class definition + class_pattern = r'class\s+(\w+)' + match = re.search(class_pattern, content) + if match: + old_class_name = match.group(1) + if old_class_name != strategy_name: + # Replace the class name in the file + new_content = re.sub(f'class {old_class_name}', f'class {strategy_name}', content) + with open(strategy_file, 'w') as f: + f.write(new_content) + + # Reload the module to get the updated class + import importlib + module_path = f'strategies.{strategy_name}' + if module_path in sys.modules: + del sys.modules[module_path] + strategy_class = locate(f'strategies.{strategy_name}.{strategy_name}') + return strategy_class + + for attr_name in dir(module): + attr = getattr(module, attr_name) + if isinstance(attr, type) and attr.__module__ == f'strategies.{strategy_name}': + # Create a new class with the correct name as fallback + strategy_class = type(strategy_name, (attr,), {}) + break + return strategy_class + path = sys.path[0] # live plugin if path.endswith('jesse-live'): @@ -372,14 +425,12 @@ def is_backtesting() -> bool: return config['app']['trading_mode'] == 'backtest' -def is_collecting_data() -> bool: - from jesse.config import config - return config['app']['trading_mode'] == 'collect' - - def is_debuggable(debug_item) -> bool: from jesse.config import config - return is_debugging() and config['env']['logging'][debug_item] + try: + return is_debugging() and config['env']['logging'][debug_item] + except KeyError: + return True def is_debugging() -> bool: @@ -392,20 +443,24 @@ def is_importing_candles() -> bool: return config['app']['trading_mode'] == 'candles' +@lru_cache def is_live() -> bool: return is_livetrading() or is_paper_trading() + @lru_cache def is_livetrading() -> bool: from jesse.config import config return config['app']['trading_mode'] == 'livetrade' + @lru_cache def is_optimizing() -> bool: from jesse.config import config return config['app']['trading_mode'] == 'optimize' +@lru_cache def is_paper_trading() -> bool: from jesse.config import config return config['app']['trading_mode'] == 'papertrade' @@ -489,11 +544,11 @@ def now(force_fresh=False) -> int: """ Always returns the current time in milliseconds but rounds time in matter of seconds """ - return now_to_timestamp(force_fresh) + return int(now_to_timestamp(force_fresh)) def now_to_timestamp(force_fresh=False) -> int: - if not force_fresh and (not (is_live() or is_collecting_data() or is_importing_candles())): + if not force_fresh and (not (is_live() or is_importing_candles())): from jesse.store import store return store.app.time @@ -553,6 +608,7 @@ def opposite_side(s: str) -> str: else: raise ValueError(f'{s} is not a valid input for side') + @lru_cache def opposite_type(t: str) -> str: from jesse.enums import trade_types @@ -739,6 +795,7 @@ def secure_hash(msg: str) -> str: def should_execute_silently() -> bool: return is_optimizing() or is_unit_testing() + @lru_cache def side_to_type(s: str) -> str: from jesse.enums import trade_types, sides @@ -805,38 +862,6 @@ def _print_error(msg: str) -> None: print(color(msg, 'red')) print(color('====================================', 'red')) -@lru_cache -def timeframe_to_one_minutes(timeframe: str) -> int: - from jesse.enums import timeframes - from jesse.exceptions import InvalidTimeframe - - dic = { - timeframes.MINUTE_1: 1, - timeframes.MINUTE_3: 3, - timeframes.MINUTE_5: 5, - timeframes.MINUTE_15: 15, - timeframes.MINUTE_30: 30, - timeframes.MINUTE_45: 45, - timeframes.HOUR_1: 60, - timeframes.HOUR_2: 60 * 2, - timeframes.HOUR_3: 60 * 3, - timeframes.HOUR_4: 60 * 4, - timeframes.HOUR_6: 60 * 6, - timeframes.HOUR_8: 60 * 8, - timeframes.HOUR_12: 60 * 12, - timeframes.DAY_1: 60 * 24, - timeframes.DAY_3: 60 * 24 * 3, - timeframes.WEEK_1: 60 * 24 * 7, - timeframes.MONTH_1: 60 * 24 * 30, - } - - try: - return dic[timeframe] - except KeyError: - all_timeframes = [timeframe for timeframe in class_iter(timeframes)] - raise InvalidTimeframe( - f'Timeframe "{timeframe}" is invalid. Supported timeframes are {", ".join(all_timeframes)}.') - def timestamp_to_arrow(timestamp: int) -> arrow.arrow.Arrow: return arrow.get(timestamp / 1000) @@ -981,6 +1006,22 @@ def dump(*item): ) +def debug(*item): + """ + Used for debugging when developing Jesse. Prints the item in pretty format in both + the terminal and the log file. + """ + if len(item) == 1: + dump(f"==> {item[0]}") + else: + dump(f"==> {', '.join(str(x) for x in item)}") + from jesse.services import logger + if len(item) == 1: + logger.info(f"==> {item[0]}") + else: + logger.info(f"==> {', '.join(str(x) for x in item)}") + + def float_or_none(item): """ Return the float of the value if it's not None @@ -1002,7 +1043,7 @@ def str_or_none(item, encoding='utf-8'): if isinstance(item, str): return item - if type(item) == numpy.float64: + if type(item) == np.float64: return str(item) try: @@ -1082,12 +1123,40 @@ def get_candle_start_timestamp_based_on_timeframe(timeframe: str, num_candles_to return finish_date - (num_candles_to_fetch * one_min_count * 60_000) -def is_price_near(order_price, price_to_compare, percentage_threshold=0.0001): +def is_price_near(order_price, price_to_compare, percentage_threshold=0.00015): """ Check if the given order price is near the specified price. - Default percentage_threshold is 0.01% (0.0001) + Default percentage_threshold is 0.015% (0.00015) We calculate percentage difference between the two prices rounded to 4 decimal places, - so low-priced orders can be properly compared within 0.01% range. + so low-priced orders can be properly compared within 0.015% range. """ - return round(abs(1 - (order_price / price_to_compare)), 4) <= percentage_threshold + return abs(1 - (order_price / price_to_compare)) <= percentage_threshold + + +def gzip_compress(data): + """Compress data using gzip.""" + json_data = json.dumps(data).encode('utf-8') + # Compress the JSON string + return gzip.compress(json_data) + +def timeframe_to_one_minutes(timeframe: str) -> int: + from jesse.utils import timeframe_to_one_minutes + return timeframe_to_one_minutes(timeframe) + + +def compressed_response(content: str) -> dict: + """ + Helper function to handle compression for HTTP responses. + Returns a dict with compression info and content. + + :param content: string content to potentially compress + :return: dict with is_compressed flag and content + """ + # check if content is large enough to warrant compression + compressed = gzip_compress(content) + # encode as base64 string for safe transmission + return { + 'is_compressed': True, + 'data': base64.b64encode(compressed).decode('utf-8') + } diff --git a/jesse/indicators/__init__.py b/jesse/indicators/__init__.py index 05ded9464..c51ef6ab0 100644 --- a/jesse/indicators/__init__.py +++ b/jesse/indicators/__init__.py @@ -57,12 +57,6 @@ from .high_pass import high_pass from .high_pass_2_pole import high_pass_2_pole from .hma import hma -from .ht_dcperiod import ht_dcperiod -from .ht_dcphase import ht_dcphase -from .ht_phasor import ht_phasor -from .ht_sine import ht_sine -from .ht_trendline import ht_trendline -from .ht_trendmode import ht_trendmode from .hurst_exponent import hurst_exponent from .hwma import hwma from .ichimoku_cloud import ichimoku_cloud @@ -87,7 +81,6 @@ from .maaq import maaq from .mab import mab from .macd import macd -from .macdext import macdext from .mama import mama from .marketfi import marketfi from .mass import mass @@ -100,13 +93,11 @@ from .midprice import midprice from .minmax import minmax from .mom import mom -from .msw import msw from .mwdx import mwdx from .natr import natr from .nma import nma from .nvi import nvi from .obv import obv -from .pattern_recognition import pattern_recognition from .pfe import pfe from .pivot import pivot from .pma import pma @@ -127,7 +118,6 @@ from .rvi import rvi from .safezonestop import safezonestop from .sar import sar -from .sarext import sarext from .sinwma import sinwma from .skew import skew from .sma import sma @@ -181,3 +171,4 @@ from .support_resistance_with_break import support_resistance_with_breaks from .squeeze_momentum import squeeze_momentum from .hull_suit import hull_suit +from .volume import volume diff --git a/jesse/indicators/acosc.py b/jesse/indicators/acosc.py index 77707c784..025a12657 100644 --- a/jesse/indicators/acosc.py +++ b/jesse/indicators/acosc.py @@ -1,12 +1,19 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles AC = namedtuple('AC', ['osc', 'change']) +def sma(arr: np.ndarray, period: int) -> np.ndarray: + if len(arr) < period: + return np.full_like(arr, np.nan, dtype=float) + conv = np.convolve(arr, np.ones(period, dtype=float)/period, mode='valid') + return np.concatenate((np.full(period-1, np.nan), conv)) + +def mom(arr: np.ndarray, period: int = 1) -> np.ndarray: + return np.concatenate(([np.nan], np.diff(arr))) def acosc(candles: np.ndarray, sequential: bool = False) -> AC: """ @@ -19,13 +26,15 @@ def acosc(candles: np.ndarray, sequential: bool = False) -> AC: """ candles = slice_candles(candles, sequential) - med = talib.MEDPRICE(candles[:, 3], candles[:, 4]) - ao = talib.SMA(med, 5) - talib.SMA(med, 34) - - res = ao - talib.SMA(ao, 5) - mom = talib.MOM(res, timeperiod=1) + med = (candles[:, 3] + candles[:, 4]) / 2 + sma5_med = sma(med, 5) + sma34_med = sma(med, 34) + ao = sma5_med - sma34_med + sma5_ao = sma(ao, 5) + res = ao - sma5_ao + mom_value = mom(res, 1) if sequential: - return AC(res, mom) + return AC(res, mom_value) else: - return AC(res[-1], mom[-1]) + return AC(res[-1], mom_value[-1]) diff --git a/jesse/indicators/ad.py b/jesse/indicators/ad.py index 028d1322a..eaadf5b54 100644 --- a/jesse/indicators/ad.py +++ b/jesse/indicators/ad.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,18 @@ def ad(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarray """ candles = slice_candles(candles, sequential) - res = talib.AD(candles[:, 3], candles[:, 4], candles[:, 2], candles[:, 5]) + high = candles[:, 3].astype(np.float64) + low = candles[:, 4].astype(np.float64) + close = candles[:, 2].astype(np.float64) + volume = candles[:, 5].astype(np.float64) - return res if sequential else res[-1] + # Calculate Money Flow Multiplier. Safeguard division by zero in case high equals low. + mfm = np.where(high != low, ((close - low) - (high - close)) / (high - low), 0.0) + + # Calculate Money Flow Volume + mfv = mfm * volume + + # Compute the Accumulation/Distribution line as the cumulative sum of Money Flow Volume + ad_line = np.cumsum(mfv) + + return ad_line if sequential else ad_line[-1] diff --git a/jesse/indicators/adosc.py b/jesse/indicators/adosc.py index ba7b86024..bcf0597ff 100644 --- a/jesse/indicators/adosc.py +++ b/jesse/indicators/adosc.py @@ -1,26 +1,85 @@ from typing import Union import numpy as np -import talib - +from numba import njit from jesse.helpers import slice_candles -def adosc(candles: np.ndarray, fast_period: int = 3, slow_period: int = 10, sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def compute_multiplier(high: np.ndarray, low: np.ndarray, close: np.ndarray) -> np.ndarray: + n = high.shape[0] + out = np.empty(n, dtype=high.dtype) + for i in range(n): + rng = high[i] - low[i] + if rng != 0: + out[i] = ((close[i] - low[i]) - (high[i] - close[i])) / rng + else: + out[i] = 0.0 + return out + + +@njit(cache=True) +def elementwise_multiply(a: np.ndarray, b: np.ndarray) -> np.ndarray: + n = a.shape[0] + out = np.empty(n, dtype=a.dtype) + for i in range(n): + out[i] = a[i] * b[i] + return out + + +@njit(cache=True) +def cumulative_sum(arr: np.ndarray) -> np.ndarray: + n = arr.shape[0] + out = np.empty(n, dtype=arr.dtype) + total = 0.0 + for i in range(n): + total += arr[i] + out[i] = total + return out + + +@njit(cache=True) +def ema(values: np.ndarray, period: int) -> np.ndarray: + n = values.shape[0] + result = np.empty(n, dtype=values.dtype) + alpha = 2.0 / (period + 1) + result[0] = values[0] + for i in range(1, n): + result[i] = alpha * values[i] + (1.0 - alpha) * result[i - 1] + return result + + +@njit(cache=True) +def subtract_arrays(a: np.ndarray, b: np.ndarray) -> np.ndarray: + n = a.shape[0] + out = np.empty(n, dtype=a.dtype) + for i in range(n): + out[i] = a[i] - b[i] + return out + + +def adosc(candles: np.ndarray, fast_period: int = 3, slow_period: int = 10, sequential: bool = False) -> Union[float, np.ndarray]: """ - ADOSC - Chaikin A/D Oscillator + ADOSC - Chaikin A/D Oscillator (Numba accelerated version) - :param candles: np.ndarray + :param candles: np.ndarray of candles :param fast_period: int - default: 3 :param slow_period: int - default: 10 :param sequential: bool - default: False - - :return: float | np.ndarray + :return: float or np.ndarray """ candles = slice_candles(candles, sequential) + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + volume = candles[:, 5] + + multiplier = compute_multiplier(high, low, close) + mf_volume = elementwise_multiply(multiplier, volume) + ad_line = cumulative_sum(mf_volume) - res = talib.ADOSC(candles[:, 3], candles[:, 4], candles[:, 2], candles[:, 5], fastperiod=fast_period, - slowperiod=slow_period) + fast_ema = ema(ad_line, fast_period) + slow_ema = ema(ad_line, slow_period) + adosc_vals = subtract_arrays(fast_ema, slow_ema) - return res if sequential else res[-1] + return adosc_vals if sequential else adosc_vals[-1] diff --git a/jesse/indicators/adx.py b/jesse/indicators/adx.py index b19409602..589459be5 100644 --- a/jesse/indicators/adx.py +++ b/jesse/indicators/adx.py @@ -1,23 +1,114 @@ from typing import Union - import numpy as np -import talib - +from numba import njit from jesse.helpers import slice_candles +@njit +def _wilder_smooth(arr: np.ndarray, period: int) -> np.ndarray: + """ + Wilder's smoothing helper function + """ + n = len(arr) + result = np.full(n, np.nan) + # First value is sum of first "period" values + result[period] = np.sum(arr[1:period + 1]) + # Apply smoothing formula + for i in range(period + 1, n): + result[i] = result[i - 1] - (result[i - 1] / period) + arr[i] + return result + + +@njit +def _calculate_adx(high: np.ndarray, low: np.ndarray, close: np.ndarray, period: int) -> np.ndarray: + """ + Core ADX calculation using Numba + """ + n = len(close) + TR = np.zeros(n) + plusDM = np.zeros(n) + minusDM = np.zeros(n) + + # Calculate True Range and Directional Movement + for i in range(1, n): + hl = high[i] - low[i] + hc = abs(high[i] - close[i-1]) + lc = abs(low[i] - close[i-1]) + TR[i] = max(max(hl, hc), lc) + + h_diff = high[i] - high[i-1] + l_diff = low[i-1] - low[i] + + if h_diff > l_diff and h_diff > 0: + plusDM[i] = h_diff + else: + plusDM[i] = 0 + + if l_diff > h_diff and l_diff > 0: + minusDM[i] = l_diff + else: + minusDM[i] = 0 + + # Smooth the TR and DM values + tr_smooth = _wilder_smooth(TR, period) + plus_dm_smooth = _wilder_smooth(plusDM, period) + minus_dm_smooth = _wilder_smooth(minusDM, period) + + # Calculate DI+ and DI- + DI_plus = np.full(n, np.nan) + DI_minus = np.full(n, np.nan) + DX = np.full(n, np.nan) + + for i in range(period, n): + if tr_smooth[i] != 0: + DI_plus[i] = 100 * plus_dm_smooth[i] / tr_smooth[i] + DI_minus[i] = 100 * minus_dm_smooth[i] / tr_smooth[i] + + if (DI_plus[i] + DI_minus[i]) != 0: + DX[i] = 100 * abs(DI_plus[i] - DI_minus[i]) / (DI_plus[i] + DI_minus[i]) + else: + DX[i] = 0 + else: + DI_plus[i] = 0 + DI_minus[i] = 0 + DX[i] = 0 + + # Calculate ADX + ADX = np.full(n, np.nan) + start_index = period * 2 + + if start_index < n: + # Calculate first ADX value + ADX[start_index] = np.mean(DX[period:start_index]) + + # Calculate subsequent ADX values + for i in range(start_index + 1, n): + ADX[i] = (ADX[i-1] * (period - 1) + DX[i]) / period + + return ADX + + def adx(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ - ADX - Average Directional Movement Index + ADX - Average Directional Movement Index using Numba for optimization. - :param candles: np.ndarray + :param candles: np.ndarray, expected 2D array with OHLCV data where index 3 is high, index 4 is low, and index 2 is close :param period: int - default: 14 - :param sequential: bool - default: False - + :param sequential: bool - if True, return full series, else return last value :return: float | np.ndarray """ + if len(candles.shape) < 2: + raise ValueError("adx indicator requires a 2D array of candles") + candles = slice_candles(candles, sequential) - res = talib.ADX(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) + if len(candles) <= period: + return np.nan if sequential else np.nan + + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + + result = _calculate_adx(high, low, close, period) - return res if sequential else res[-1] + return result if sequential else result[-1] diff --git a/jesse/indicators/adxr.py b/jesse/indicators/adxr.py index 5a50ec8fa..5b5159717 100644 --- a/jesse/indicators/adxr.py +++ b/jesse/indicators/adxr.py @@ -1,23 +1,106 @@ from typing import Union import numpy as np -import talib - from jesse.helpers import slice_candles +from numba import njit + +@njit(cache=True) +def _adxr(high, low, close, period): + n = len(high) + TR = np.zeros(n) + DMP = np.zeros(n) + DMM = np.zeros(n) + + # First value + TR[0] = high[0] - low[0] + + # Calculate TR, DMP, DMM + for i in range(1, n): + hl = high[i] - low[i] + hc = abs(high[i] - close[i-1]) + lc = abs(low[i] - close[i-1]) + TR[i] = max(hl, hc, lc) + + up_move = high[i] - high[i-1] + down_move = low[i-1] - low[i] + + if up_move > down_move and up_move > 0: + DMP[i] = up_move + else: + DMP[i] = 0 + + if down_move > up_move and down_move > 0: + DMM[i] = down_move + else: + DMM[i] = 0 + + # Smoothed TR, DMP, DMM + STR = np.zeros(n) + S_DMP = np.zeros(n) + S_DMM = np.zeros(n) + + # Initialize first value + STR[0] = TR[0] + S_DMP[0] = DMP[0] + S_DMM[0] = DMM[0] + + # Calculate smoothed values + for i in range(1, n): + STR[i] = STR[i-1] - (STR[i-1] / period) + TR[i] + S_DMP[i] = S_DMP[i-1] - (S_DMP[i-1] / period) + DMP[i] + S_DMM[i] = S_DMM[i-1] - (S_DMM[i-1] / period) + DMM[i] + + # Calculate DI+ and DI- + DI_plus = np.zeros(n) + DI_minus = np.zeros(n) + for i in range(n): + if STR[i] != 0: + DI_plus[i] = (S_DMP[i] / STR[i]) * 100 + DI_minus[i] = (S_DMM[i] / STR[i]) * 100 + + # Calculate DX + DX = np.zeros(n) + for i in range(n): + denom = DI_plus[i] + DI_minus[i] + if denom != 0: + DX[i] = (abs(DI_plus[i] - DI_minus[i]) / denom) * 100 + + # Calculate ADX + ADX = np.full(n, np.nan) + if n >= period: + for i in range(period-1, n): + sum_dx = 0 + for j in range(period): + sum_dx += DX[i-j] + ADX[i] = sum_dx / period + + # Calculate ADXR + ADXR = np.full(n, np.nan) + if n > period: + for i in range(period, n): + ADXR[i] = (ADX[i] + ADX[i-period]) / 2 + + return ADXR def adxr(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ + @author KivancOzbilgic + credits: https://www.tradingview.com/v/9f5zDi3r/ + ADXR - Average Directional Movement Index Rating - :param candles: np.ndarray - :param period: int - default: 14 - :param sequential: bool - default: False - - :return: float | np.ndarray + :param candles: np.ndarray with at least 5 columns where index 3 is high, index 4 is low and index 2 is close + :param period: int - period for smoothing and moving average (default: 14) + :param sequential: bool - returns full series if True, else only the last computed value + :return: ADXR as float or np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.ADXR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - - return res if sequential else res[-1] + + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + + ADXR = _adxr(high, low, close, period) + + return ADXR if sequential else ADXR[-1] diff --git a/jesse/indicators/alligator.py b/jesse/indicators/alligator.py index a46ea6ac9..f0526013a 100644 --- a/jesse/indicators/alligator.py +++ b/jesse/indicators/alligator.py @@ -1,49 +1,36 @@ from collections import namedtuple - import numpy as np - +from numba import njit from jesse.helpers import get_candle_source, np_shift, slice_candles AG = namedtuple('AG', ['jaw', 'teeth', 'lips']) - -def alligator(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> AG: - """ - Alligator - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: AG(jaw, teeth, lips) - """ +def smma(source: np.ndarray, length: int) -> np.ndarray: + return _smma_numba(source, length) + +@njit +def _smma_numba(source, length): + alpha = 1.0 / length + total = 0.0 + for i in range(length): + total += source[i] + init_val = total / length + N = len(source) + result = np.empty(N, dtype=np.float64) + result[0] = alpha * source[0] + (init_val * (1 - alpha)) + for i in range(1, N): + result[i] = alpha * source[i] + (1 - alpha) * result[i-1] + return result + +def alligator(candles: np.ndarray, source_type: str = "hl2", sequential: bool = False) -> AG: candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - jaw = np_shift(numpy_ewma(source, 13), 8, fill_value=np.nan) - teeth = np_shift(numpy_ewma(source, 8), 5, fill_value=np.nan) - lips = np_shift(numpy_ewma(source, 5), 3, fill_value=np.nan) + jaw = np_shift(smma(source, 13), 8, fill_value=np.nan) + teeth = np_shift(smma(source, 8), 5, fill_value=np.nan) + lips = np_shift(smma(source, 5), 3, fill_value=np.nan) if sequential: return AG(jaw, teeth, lips) else: return AG(jaw[-1], teeth[-1], lips[-1]) - - -def numpy_ewma(data: np.ndarray, window: int): - """ - - :param data: - :param window: - :return: - """ - alpha = 1 / window - # scale = 1 / (1 - alpha) - n = data.shape[0] - scale_arr = (1 - alpha) ** (-1 * np.arange(n)) - weights = (1 - alpha) ** np.arange(n) - pw0 = (1 - alpha) ** (n - 1) - mult = data * pw0 * scale_arr - cumsums = mult.cumsum() - return cumsums * scale_arr[::-1] / weights.cumsum() diff --git a/jesse/indicators/ao.py b/jesse/indicators/ao.py index e6726ed8c..34c5a4d5f 100644 --- a/jesse/indicators/ao.py +++ b/jesse/indicators/ao.py @@ -1,12 +1,17 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles +from .sma import sma AO = namedtuple('AO', ['osc', 'change']) +def momentum(arr): + ret = np.full(arr.shape, np.nan) + if len(arr) > 1: + ret[1:] = arr[1:] - arr[:-1] + return ret def ao(candles: np.ndarray, sequential: bool = False) -> AO: """ @@ -19,12 +24,17 @@ def ao(candles: np.ndarray, sequential: bool = False) -> AO: """ candles = slice_candles(candles, sequential) - med = talib.MEDPRICE(candles[:, 3], candles[:, 4]) - res = talib.SMA(med, 5) - talib.SMA(med, 34) + # Calculate hl2 as (high+low)/2 + hl2 = (candles[:, 3] + candles[:, 4]) / 2 + # Calculate simple moving averages on hl2 for periods 5 and 34 + sma5 = sma(hl2, 5, sequential=True) + sma34 = sma(hl2, 34, sequential=True) + ao = sma5 - sma34 - mom = talib.MOM(res, timeperiod=1) + # Calculate momentum as the difference between consecutive values + mom = momentum(ao) if sequential: - return AO(res, mom) + return AO(ao, mom) else: - return AO(res[-1], mom[-1]) + return AO(ao[-1], mom[-1]) diff --git a/jesse/indicators/apo.py b/jesse/indicators/apo.py index 1b4389d4a..f6c7d9e8c 100644 --- a/jesse/indicators/apo.py +++ b/jesse/indicators/apo.py @@ -24,6 +24,9 @@ def apo(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, matyp source = get_candle_source(candles, source_type=source_type) - res = ma(source, period=fast_period, matype=matype, sequential=True) - ma(source, period=slow_period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + res = ma(candles, period=fast_period, matype=matype, source_type=source_type, sequential=True) - ma(candles, period=slow_period, matype=matype, source_type=source_type, sequential=True) + else: + res = ma(source, period=fast_period, matype=matype, sequential=True) - ma(source, period=slow_period, matype=matype, sequential=True) return res if sequential else res[-1] diff --git a/jesse/indicators/aroon.py b/jesse/indicators/aroon.py index 38cc016af..10c0650b5 100644 --- a/jesse/indicators/aroon.py +++ b/jesse/indicators/aroon.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles @@ -10,19 +9,34 @@ def aroon(candles: np.ndarray, period: int = 14, sequential: bool = False) -> AROON: """ - AROON - Aroon + AROON indicator - :param candles: np.ndarray - :param period: int - default: 14 - :param sequential: bool - default: False - - :return: AROON(down, up) + :param candles: np.ndarray, expected to have at least 5 columns, with high at index 3 and low at index 4. + :param period: int - period for the indicator (default: 14) + :param sequential: bool - whether to return the whole series (default: False) + :return: AROON(down, up) where each value is computed as above. """ candles = slice_candles(candles, sequential) - - aroondown, aroonup = talib.AROON(candles[:, 3], candles[:, 4], timeperiod=period) + highs = candles[:, 3] + lows = candles[:, 4] if sequential: - return AROON(aroondown, aroonup) + aroon_up = np.full(highs.shape, np.nan, dtype=float) + aroon_down = np.full(lows.shape, np.nan, dtype=float) + if len(highs) >= period + 1: + # Create sliding window view of period+1 elements for highs and lows + windows_high = np.lib.stride_tricks.sliding_window_view(highs, window_shape=period+1) + windows_low = np.lib.stride_tricks.sliding_window_view(lows, window_shape=period+1) + aroon_up[period:] = 100 * (np.argmax(windows_high, axis=1) / period) + aroon_down[period:] = 100 * (np.argmin(windows_low, axis=1) / period) + return AROON(down=aroon_down, up=aroon_up) else: - return AROON(aroondown[-1], aroonup[-1]) + if len(highs) < period + 1: + up_val = float('nan') + down_val = float('nan') + else: + window_high = highs[-(period + 1):] + window_low = lows[-(period + 1):] + up_val = 100 * (np.argmax(window_high) / period) + down_val = 100 * (np.argmin(window_low) / period) + return AROON(down=down_val, up=up_val) diff --git a/jesse/indicators/aroonosc.py b/jesse/indicators/aroonosc.py index 5587812f8..a84d2746b 100644 --- a/jesse/indicators/aroonosc.py +++ b/jesse/indicators/aroonosc.py @@ -1,10 +1,40 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import slice_candles +@njit(cache=True) +def _compute_aroonosc_nb(high: np.ndarray, low: np.ndarray, period: int) -> np.ndarray: + n = high.shape[0] + result = np.empty(n, dtype=np.float64) + if n < period: + for i in range(n): + result[i] = np.nan + return result + + for i in range(period - 1): + result[i] = np.nan + + for i in range(period - 1, n): + start = i - period + 1 + best_val = high[start] + best_idx = 0 + worst_val = low[start] + worst_idx = 0 + for j in range(period): + cur_high = high[start + j] + cur_low = low[start + j] + if cur_high > best_val: + best_val = cur_high + best_idx = j + if cur_low < worst_val: + worst_val = cur_low + worst_idx = j + result[i] = 100.0 * (best_idx - worst_idx) / period + return result + def aroonosc(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ @@ -17,7 +47,7 @@ def aroonosc(candles: np.ndarray, period: int = 14, sequential: bool = False) -> :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.AROONOSC(candles[:, 3], candles[:, 4], timeperiod=period) - - return res if sequential else res[-1] + high = candles[:, 3] + low = candles[:, 4] + result = _compute_aroonosc_nb(high, low, period) + return result if sequential else result[-1] diff --git a/jesse/indicators/atr.py b/jesse/indicators/atr.py index 751972f31..5ca94b153 100644 --- a/jesse/indicators/atr.py +++ b/jesse/indicators/atr.py @@ -1,14 +1,42 @@ from typing import Union - import numpy as np -import talib - +from numba import njit from jesse.helpers import slice_candles +@njit +def _atr(high: np.ndarray, low: np.ndarray, close: np.ndarray, period: int) -> np.ndarray: + """ + Calculate ATR using Numba + """ + n = len(close) + tr = np.empty(n) + atr_values = np.full(n, np.nan) + + # Calculate True Range + tr[0] = high[0] - low[0] + for i in range(1, n): + hl = high[i] - low[i] + hc = abs(high[i] - close[i-1]) + lc = abs(low[i] - close[i-1]) + tr[i] = max(max(hl, hc), lc) + + if n < period: + return atr_values + + # First ATR value is the simple average of the first 'period' true ranges + atr_values[period-1] = np.mean(tr[:period]) + + # Calculate subsequent ATR values using Wilder's smoothing + for i in range(period, n): + atr_values[i] = (atr_values[i-1] * (period - 1) + tr[i]) / period + + return atr_values + + def atr(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ - ATR - Average True Range + ATR - Average True Range using Numba for optimization :param candles: np.ndarray :param period: int - default: 14 @@ -18,6 +46,10 @@ def atr(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Unio """ candles = slice_candles(candles, sequential) - res = talib.ATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] - return res if sequential else res[-1] + result = _atr(high, low, close, period) + + return result if sequential else result[-1] diff --git a/jesse/indicators/avgprice.py b/jesse/indicators/avgprice.py index 9c64db8e2..672626c70 100644 --- a/jesse/indicators/avgprice.py +++ b/jesse/indicators/avgprice.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,6 @@ def avgprice(candles: np.ndarray, sequential: bool = False) -> Union[float, np.n """ candles = slice_candles(candles, sequential) - res = talib.AVGPRICE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) + res = (candles[:, 1] + candles[:, 3] + candles[:, 4] + candles[:, 2]) / 4 return res if sequential else res[-1] diff --git a/jesse/indicators/beta.py b/jesse/indicators/beta.py index 7873171a5..ba84e5c6d 100644 --- a/jesse/indicators/beta.py +++ b/jesse/indicators/beta.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -import talib +from numpy.lib.stride_tricks import sliding_window_view from jesse.helpers import slice_candles @@ -20,6 +20,29 @@ def beta(candles: np.ndarray, benchmark_candles: np.ndarray, period: int = 5, se candles = slice_candles(candles, sequential) benchmark_candles = slice_candles(benchmark_candles, sequential) - res = talib.BETA(candles[:, 2], benchmark_candles[:, 2], timeperiod=period) + x = candles[:, 2] + y = benchmark_candles[:, 2] - return res if sequential else res[-1] + if len(x) < period: + out = np.full_like(x, fill_value=np.nan, dtype=float) + return out if sequential else np.nan + + windows_x = sliding_window_view(x, window_shape=period) + windows_y = sliding_window_view(y, window_shape=period) + + mean_x = windows_x.mean(axis=1) + mean_y = windows_y.mean(axis=1) + + diff_x = windows_x - mean_x[:, None] + diff_y = windows_y - mean_y[:, None] + + numerator = (diff_x * diff_y).sum(axis=1) + denominator = (diff_y ** 2).sum(axis=1) + + with np.errstate(divide='ignore', invalid='ignore'): + beta_vals = numerator / denominator + + out = np.full_like(x, fill_value=np.nan, dtype=float) + out[period - 1:] = beta_vals + + return out if sequential else out[-1] diff --git a/jesse/indicators/bollinger_bands.py b/jesse/indicators/bollinger_bands.py index a95365e47..50b245900 100644 --- a/jesse/indicators/bollinger_bands.py +++ b/jesse/indicators/bollinger_bands.py @@ -1,7 +1,7 @@ from collections import namedtuple import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles from jesse.indicators.ma import ma @@ -11,6 +11,35 @@ BollingerBands = namedtuple('BollingerBands', ['upperband', 'middleband', 'lowerband']) +@njit +def _moving_std_numba(source, period): + n = len(source) + result = np.empty(n, dtype=np.float64) + # Fill the first period-1 entries with NaN + for i in range(period - 1): + result[i] = np.nan + # Calculate standard deviation for each window of 'period' elements + for i in range(period - 1, n): + sum_val = 0.0 + sum_sq = 0.0 + for j in range(i - period + 1, i + 1): + x = source[j] + sum_val += x + sum_sq += x * x + mean = sum_val / period + variance = sum_sq / period - mean * mean + # Guard against possible negative variance from precision issues + if variance < 0.0: + variance = 0.0 + result[i] = variance ** 0.5 + return result + + +def moving_std(source, period): + # Use the Numba-accelerated function instead of the Python loop with np.std + return _moving_std_numba(source, period) + + def bollinger_bands( candles: np.ndarray, period: int = 20, @@ -35,12 +64,14 @@ def bollinger_bands( :return: BollingerBands(upperband, middleband, lowerband) """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) + if len(candles.shape) == 1: + source = candles + else: + candles = slice_candles(candles, sequential) + source = get_candle_source(candles, source_type=source_type) if devtype == 0: - dev = talib.STDDEV(source, period) + dev = moving_std(source, period) elif devtype == 1: dev = mean_ad(source, period, sequential=True) elif devtype == 2: @@ -48,7 +79,10 @@ def bollinger_bands( else: raise ValueError("devtype not in (0, 1, 2)") - middlebands = ma(source, period=period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + middlebands = ma(candles, period=period, matype=matype, source_type=source_type, sequential=True) + else: + middlebands = ma(source, period=period, matype=matype, sequential=True) upperbands = middlebands + devup * dev lowerbands = middlebands - devdn * dev diff --git a/jesse/indicators/bollinger_bands_width.py b/jesse/indicators/bollinger_bands_width.py index 3e1cea1a2..667f0c569 100644 --- a/jesse/indicators/bollinger_bands_width.py +++ b/jesse/indicators/bollinger_bands_width.py @@ -1,51 +1,63 @@ from typing import Union - import numpy as np -import talib - +from numba import njit from jesse.helpers import get_candle_source, slice_candles -from jesse.indicators.ma import ma -from jesse.indicators.mean_ad import mean_ad -from jesse.indicators.median_ad import median_ad -def bollinger_bands_width(candles: np.ndarray, period: int = 20, devup: float = 2, devdn: float = 2, matype: int = 0, - devtype: int = 0, - source_type: str = "close", - sequential: bool = False) -> Union[float, np.ndarray]: +@njit(cache=True) +def _bb_width(source: np.ndarray, period: int, mult: float) -> np.ndarray: + """ + Calculate Bollinger Bands Width using Numba """ - BBW - Bollinger Bands Width - Bollinger Bands Bandwidth + n = len(source) + bbw = np.full(n, np.nan) + + if n < period: + return bbw + + # Pre-calculate sum and sum of squares for optimization + sum_x = np.zeros(n - period + 1) + sum_x2 = np.zeros(n - period + 1) + + # Initial window + sum_x[0] = np.sum(source[:period]) + sum_x2[0] = np.sum(source[:period] ** 2) + + # Rolling window calculations + for i in range(1, n - period + 1): + sum_x[i] = sum_x[i-1] - source[i-1] + source[i+period-1] + sum_x2[i] = sum_x2[i-1] - source[i-1]**2 + source[i+period-1]**2 + + # Calculate mean and standard deviation + mean = sum_x / period + std = np.sqrt((sum_x2 / period) - (mean ** 2)) + + # Calculate BBW + for i in range(period - 1, n): + idx = i - period + 1 + basis = mean[idx] + upper = basis + mult * std[idx] + lower = basis - mult * std[idx] + bbw[i] = (upper - lower) / basis + + return bbw + + +def bollinger_bands_width(candles: np.ndarray, period: int = 20, mult: float = 2.0, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: + """ + BBW - Bollinger Bands Width - Bollinger Bands Bandwidth using Numba for optimization :param candles: np.ndarray :param period: int - default: 20 - :param devup: float - default: 2 - :param devdn: float - default: 2 - :param matype: int - default: 0 - :param devtype: int - default: 0 + :param mult: float - default: 2 :param source_type: str - default: "close" :param sequential: bool - default: False - :return: BollingerBands(upperband, middleband, lowerband) + :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - - if devtype == 0: - dev = talib.STDDEV(source, period) - elif devtype == 1: - dev = mean_ad(source, period, sequential=True) - elif devtype == 2: - dev = median_ad(source, period, sequential=True) - - middlebands = ma(source, period=period, matype=matype, sequential=True) - upperbands = middlebands + devup * dev - lowerbands = middlebands - devdn * dev - - if sequential: - return (upperbands - lowerbands) / middlebands - else: - return (upperbands[-1] - lowerbands[-1]) / middlebands[-1] - - - + + result = _bb_width(source, period, mult) + + return result if sequential else result[-1] diff --git a/jesse/indicators/bop.py b/jesse/indicators/bop.py index 41e6f9062..3ae076a45 100644 --- a/jesse/indicators/bop.py +++ b/jesse/indicators/bop.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,11 @@ def bop(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarra """ candles = slice_candles(candles, sequential) - res = talib.BOP(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) + open_prices = candles[:, 1] + high_prices = candles[:, 3] + low_prices = candles[:, 4] + close_prices = candles[:, 2] + denominator = high_prices - low_prices + bop_values = np.where(denominator != 0, (close_prices - open_prices) / denominator, 0) - return res if sequential else res[-1] + return bop_values if sequential else bop_values[-1] diff --git a/jesse/indicators/cc.py b/jesse/indicators/cc.py index 91405ea1e..78806f605 100644 --- a/jesse/indicators/cc.py +++ b/jesse/indicators/cc.py @@ -1,9 +1,10 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles +from .roc import roc +from .wma import wma def cc(candles: np.ndarray, wma_period: int = 10, roc_short_period: int = 11, roc_long_period: int = 14, @@ -24,7 +25,9 @@ def cc(candles: np.ndarray, wma_period: int = 10, roc_short_period: int = 11, ro candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.WMA(talib.ROC(source, timeperiod=roc_long_period) + talib.ROC(source, timeperiod=roc_short_period), - timeperiod=wma_period) + roc_long = roc(source, roc_long_period, sequential=True) + roc_short = roc(source, roc_short_period, sequential=True) + roc_sum = roc_long + roc_short + res = wma(roc_sum, wma_period, sequential=True) return res if sequential else res[-1] diff --git a/jesse/indicators/cci.py b/jesse/indicators/cci.py index c0fa0b88b..da70977b9 100644 --- a/jesse/indicators/cci.py +++ b/jesse/indicators/cci.py @@ -1,10 +1,38 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import slice_candles +@njit(cache=True) +def calculate_cci_loop(tp, period): + n = tp.shape[0] + result = np.empty(n) + # initialize result with NaNs + for i in range(n): + result[i] = np.nan + if n < period: + return result + for i in range(period - 1, n): + sum_tp = 0.0 + for j in range(i - period + 1, i + 1): + sum_tp += tp[j] + sma = sum_tp / period + sum_diff = 0.0 + for j in range(i - period + 1, i + 1): + # Calculate absolute deviation + if tp[j] >= sma: + sum_diff += tp[j] - sma + else: + sum_diff += sma - tp[j] + md = sum_diff / period + if md == 0.0: + result[i] = 0.0 + else: + result[i] = (tp[i] - sma) / (0.015 * md) + return result + def cci(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ @@ -18,6 +46,10 @@ def cci(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Unio """ candles = slice_candles(candles, sequential) - res = talib.CCI(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + tp = (high + low + close) / 3.0 - return res if sequential else res[-1] + result = calculate_cci_loop(tp, period) + return result if sequential else result[-1] diff --git a/jesse/indicators/cfo.py b/jesse/indicators/cfo.py index 3eb7a7bad..46a3385d9 100644 --- a/jesse/indicators/cfo.py +++ b/jesse/indicators/cfo.py @@ -1,14 +1,45 @@ from typing import Union - import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles - -def cfo(candles: np.ndarray, period: int = 14, scalar: float = 100, source_type: str = "close", - sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def _compute_cfo(source: np.ndarray, period: int, scalar: float) -> np.ndarray: + n = source.shape[0] + res = np.empty(n, dtype=np.float64) + # fill initial values with nan for indices where a full period is not available + for i in range(period - 1): + res[i] = np.nan + + # Precompute constants for x = 0, 1, ..., period-1 + Sx = 0.0 + Sxx = 0.0 + for j in range(period): + Sx += j + Sxx += j * j + denom = period * Sxx - Sx * Sx + + # For each valid window, compute the linear regression and forecast value + for i in range(period - 1, n): + sum_y = 0.0 + sum_xy = 0.0 + for j in range(period): + y_val = source[i - period + 1 + j] + sum_y += y_val + sum_xy += y_val * j + slope = (period * sum_xy - Sx * sum_y) / denom + intercept = (sum_y - slope * Sx) / period + reg_val = intercept + slope * (period - 1) + # Avoid division by zero + if source[i] != 0.0: + res[i] = scalar * (source[i] - reg_val) / source[i] + else: + res[i] = np.nan + return res + + +def cfo(candles: np.ndarray, period: int = 14, scalar: float = 100, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ CFO - Chande Forcast Oscillator @@ -21,12 +52,10 @@ def cfo(candles: np.ndarray, period: int = 14, scalar: float = 100, source_type: :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = scalar * (source - talib.LINEARREG(source, timeperiod=period)) - res /= source - + res = _compute_cfo(source, period, scalar) + if sequential: return res else: diff --git a/jesse/indicators/chande.py b/jesse/indicators/chande.py index dc97faaf9..02fbaf3bd 100644 --- a/jesse/indicators/chande.py +++ b/jesse/indicators/chande.py @@ -1,12 +1,37 @@ from typing import Union import numpy as np -import talib from scipy.ndimage import maximum_filter1d, minimum_filter1d +from numba import njit from jesse.helpers import slice_candles +@njit(cache=True) +def custom_atr(high: np.ndarray, low: np.ndarray, close: np.ndarray, period: int) -> np.ndarray: + """Compute the Average True Range (ATR) using Wilder's smoothing method.""" + # Compute previous close + prev_close = np.empty_like(close) + prev_close[0] = close[0] + prev_close[1:] = close[:-1] + + # Compute True Range (TR) + range1 = high - low + range2 = np.abs(high - prev_close) + range3 = np.abs(low - prev_close) + tr = np.maximum(range1, range2) + tr = np.maximum(tr, range3) + + atr = np.full(len(close), np.nan, dtype=close.dtype) + if len(close) >= period: + initial_atr = np.mean(tr[:period]) + atr[period - 1] = initial_atr + alpha = 1.0 / period + for i in range(period, len(close)): + atr[i] = (atr[i - 1] * (period - 1) + tr[i]) / period + return atr + + def chande(candles: np.ndarray, period: int = 22, mult: float = 3.0, direction: str = "long", sequential: bool = False) -> Union[float, np.ndarray]: """ @@ -26,7 +51,7 @@ def chande(candles: np.ndarray, period: int = 22, mult: float = 3.0, direction: candles_high = candles[:, 3] candles_low = candles[:, 4] - atr = talib.ATR(candles_high, candles_low, candles_close, timeperiod=period) + atr = custom_atr(candles_high, candles_low, candles_close, period) if direction == 'long': maxp = filter1d_same(candles_high, period, 'max') diff --git a/jesse/indicators/chop.py b/jesse/indicators/chop.py index 950a898a4..03ee8be76 100644 --- a/jesse/indicators/chop.py +++ b/jesse/indicators/chop.py @@ -1,36 +1,131 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import slice_candles -def chop(candles: np.ndarray, period: int = 14, scalar: float = 100, drift: int = 1, sequential: bool = False) -> Union[ - float, np.ndarray]: +def chop(candles: np.ndarray, period: int = 14, scalar: float = 100, drift: int = 1, sequential: bool = False) -> Union[float, np.ndarray]: """ Choppiness Index (CHOP) :param candles: np.ndarray - :param period: int - default: 30 + :param period: int - default: 14 :param scalar: float - default: 100 :param drift: int - default: 1 :param sequential: bool - default: False :return: float | np.ndarray """ + # Preprocess candles using original slicing candles = slice_candles(candles, sequential) + res = _chop_numba(candles, period, scalar, drift) + return res if sequential else res[-1] - candles_close = candles[:, 2] - candles_high = candles[:, 3] - candles_low = candles[:, 4] +@njit(cache=True) +def _chop_numba(candles, period, scalar, drift): + n = candles.shape[0] + # Extract the necessary candle values + close = candles[:, 2] + high = candles[:, 3] + low = candles[:, 4] - atr_sum = talib.SUM(talib.ATR(candles_high, candles_low, candles_close, timeperiod=drift), period) + # Compute True Range (TR) + tr = np.empty(n, dtype=np.float64) + tr[0] = high[0] - low[0] + for i in range(1, n): + d1 = high[i] - low[i] + d2 = abs(high[i] - close[i - 1]) + d3 = abs(low[i] - close[i - 1]) + if d1 >= d2 and d1 >= d3: + tr[i] = d1 + elif d2 >= d1 and d2 >= d3: + tr[i] = d2 + else: + tr[i] = d3 - hh = talib.MAX(candles_high, period) - ll = talib.MIN(candles_low, period) + # Compute Average True Range (ATR) + atr = np.empty(n, dtype=np.float64) + if drift == 1: + for i in range(n): + atr[i] = tr[i] + else: + # Set initial values to NaN for indices before drift - 1 + for i in range(drift - 1): + atr[i] = np.nan + # Compute initial ATR as the average of the first 'drift' TR values + total = 0.0 + for i in range(drift): + total += tr[i] + initial_atr = total / drift + atr[drift - 1] = initial_atr + for i in range(drift, n): + atr[i] = (atr[i - 1] * (drift - 1) + tr[i]) / drift - res = (scalar * (np.log10(atr_sum) - np.log10(hh - ll))) / np.log10(period) + # Compute rolling sum of ATR over 'period' + atr_sum = np.empty(n, dtype=np.float64) + for i in range(n): + atr_sum[i] = np.nan + for i in range(period - 1, n): + valid = True + window_sum = 0.0 + for j in range(i - period + 1, i + 1): + if np.isnan(atr[j]): + valid = False + break + window_sum += atr[j] + if valid: + atr_sum[i] = window_sum + else: + atr_sum[i] = np.nan - return res if sequential else res[-1] + # Compute rolling maximum of high over 'period' + hh = np.empty(n, dtype=np.float64) + for i in range(n): + hh[i] = np.nan + for i in range(period - 1, n): + max_val = -1e100 # very low number as initial max + valid = True + for j in range(i - period + 1, i + 1): + if np.isnan(high[j]): + valid = False + break + if high[j] > max_val: + max_val = high[j] + if valid: + hh[i] = max_val + else: + hh[i] = np.nan + + # Compute rolling minimum of low over 'period' + ll = np.empty(n, dtype=np.float64) + for i in range(n): + ll[i] = np.nan + for i in range(period - 1, n): + min_val = 1e100 # very high number as initial min + valid = True + for j in range(i - period + 1, i + 1): + if np.isnan(low[j]): + valid = False + break + if low[j] < min_val: + min_val = low[j] + if valid: + ll[i] = min_val + else: + ll[i] = np.nan + + # Compute the Choppiness Index result + res = np.empty(n, dtype=np.float64) + for i in range(n): + res[i] = np.nan + log_period = np.log10(period) + for i in range(period - 1, n): + if np.isnan(atr_sum[i]) or np.isnan(hh[i]) or np.isnan(ll[i]) or (hh[i] - ll[i]) <= 0: + res[i] = np.nan + else: + res[i] = (scalar * (np.log10(atr_sum[i]) - np.log10(hh[i] - ll[i]))) / log_period + + return res diff --git a/jesse/indicators/cksp.py b/jesse/indicators/cksp.py index b8317a7fe..974e93cac 100644 --- a/jesse/indicators/cksp.py +++ b/jesse/indicators/cksp.py @@ -1,23 +1,71 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles CKSP = namedtuple('CKSP', ['long', 'short']) +def atr(high: np.ndarray, low: np.ndarray, close: np.ndarray, timeperiod: int = 10) -> np.ndarray: + tr = np.empty_like(close) + tr[0] = high[0] - low[0] + tr[1:] = np.maximum.reduce([ + high[1:] - low[1:], + np.abs(high[1:] - close[:-1]), + np.abs(low[1:] - close[:-1]) + ]) + atr_vals = np.empty_like(close) + if len(close) < timeperiod: + return np.full_like(close, np.nan) + atr_vals[:timeperiod-1] = np.nan + atr_vals[timeperiod-1] = np.mean(tr[:timeperiod]) + for t in range(timeperiod, len(close)): + atr_vals[t] = (atr_vals[t-1]*(timeperiod-1) + tr[t]) / timeperiod + return atr_vals + +def rolling_max(arr: np.ndarray, window: int) -> np.ndarray: + n = len(arr) + if n == 0: + return arr + result = np.empty(n) + if window > 1: + result[:window-1] = np.maximum.accumulate(arr[:window-1]) + if n >= window: + shape = (n - window + 1, window) + strides = (arr.strides[0], arr.strides[0]) + windows = np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides) + result[window-1:] = np.max(windows, axis=1) + else: + result = arr.copy() + return result + +def rolling_min(arr: np.ndarray, window: int) -> np.ndarray: + n = len(arr) + if n == 0: + return arr + result = np.empty(n) + if window > 1: + result[:window-1] = np.minimum.accumulate(arr[:window-1]) + if n >= window: + shape = (n - window + 1, window) + strides = (arr.strides[0], arr.strides[0]) + windows = np.lib.stride_tricks.as_strided(arr, shape=shape, strides=strides) + result[window-1:] = np.min(windows, axis=1) + else: + result = arr.copy() + return result + def cksp(candles: np.ndarray, p: int = 10, x: float = 1.0, q: int = 9, sequential: bool = False) -> CKSP: """ Chande Kroll Stop (CKSP) :param candles: np.ndarray - :param p: int - default: 10 - :param x: float - default: 1.0 - :param q: int - default: 9 + :param p: int - default: 10 (ATR period) + :param x: float - default: 1.0 (ATR multiplier) + :param q: int - default: 9 (rolling window period) :param sequential: bool - default: False - :return: float | np.ndarray + :return: CKSP namedtuple containing long and short values """ candles = slice_candles(candles, sequential) @@ -25,13 +73,13 @@ def cksp(candles: np.ndarray, p: int = 10, x: float = 1.0, q: int = 9, sequenti candles_high = candles[:, 3] candles_low = candles[:, 4] - atr = talib.ATR(candles_high, candles_low, candles_close, timeperiod=p) + atr_vals = atr(candles_high, candles_low, candles_close, timeperiod=p) - LS0 = talib.MAX(candles_high, q) - x * atr - LS = talib.MAX(LS0, q) + LS0 = rolling_max(candles_high, window=q) - x * atr_vals + LS = rolling_max(LS0, window=q) - SS0 = talib.MIN(candles_low, q) + x * atr - SS = talib.MIN(SS0, q) + SS0 = rolling_min(candles_low, window=q) + x * atr_vals + SS = rolling_min(SS0, window=q) if sequential: return CKSP(LS, SS) diff --git a/jesse/indicators/cmo.py b/jesse/indicators/cmo.py index d32d82363..63be41a00 100644 --- a/jesse/indicators/cmo.py +++ b/jesse/indicators/cmo.py @@ -1,13 +1,46 @@ from typing import Union - import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles - -def cmo(candles: np.ndarray, period: int = 14, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def _cmo_numba(source: np.ndarray, period: int) -> np.ndarray: + n = source.shape[0] + result = np.empty(n, dtype=np.float64) + # Initialize result with NaN values + for i in range(n): + result[i] = np.nan + + if n <= 1: + return result + + # Compute the differences manually + diff = np.empty(n - 1, dtype=np.float64) + for i in range(n - 1): + diff[i] = source[i + 1] - source[i] + + # Only compute CMO if we have enough diff values + if diff.shape[0] >= period: + for i in range(period, n): + pos_sum = 0.0 + neg_sum = 0.0 + # Calculate sums over the window diff[i-period:i] + for j in range(i - period, i): + d = diff[j] + if d > 0: + pos_sum += d + elif d < 0: + neg_sum += -d + denom = pos_sum + neg_sum + if denom == 0.0: + result[i] = 0.0 + else: + result[i] = 100.0 * (pos_sum - neg_sum) / denom + return result + + +def cmo(candles: np.ndarray, period: int = 14, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ CMO - Chande Momentum Oscillator @@ -19,8 +52,6 @@ def cmo(candles: np.ndarray, period: int = 14, source_type: str = "close", seque :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = talib.CMO(source, timeperiod=period) - - return res if sequential else res[-1] + result = _cmo_numba(source, period) + return result if sequential else result[-1] diff --git a/jesse/indicators/correl.py b/jesse/indicators/correl.py index aa4bc3cd0..2d2a80f91 100644 --- a/jesse/indicators/correl.py +++ b/jesse/indicators/correl.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,7 +16,33 @@ def correl(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Un :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.CORREL(candles[:, 3], candles[:, 4], timeperiod=period) - - return res if sequential else res[-1] + x = candles[:, 3] + y = candles[:, 4] + n = len(x) + + # If not enough data, return an array of NaNs + if n < period: + res = np.empty(n) + res[:] = np.nan + return res if sequential else res[-1] + + # Use numpy's sliding_window_view for vectorized rolling window computation + windows_x = np.lib.stride_tricks.sliding_window_view(x, window_shape=period) + windows_y = np.lib.stride_tricks.sliding_window_view(y, window_shape=period) + + mean_x = np.mean(windows_x, axis=1) + mean_y = np.mean(windows_y, axis=1) + + # Calculate numerator and denominator for Pearson correlation coefficient + numerator = np.sum((windows_x - mean_x[:, None]) * (windows_y - mean_y[:, None]), axis=1) + denominator = np.sqrt(np.sum((windows_x - mean_x[:, None])**2, axis=1) * np.sum((windows_y - mean_y[:, None])**2, axis=1)) + + with np.errstate(divide='ignore', invalid='ignore'): + corr_vals = numerator / denominator + + # Prepare full result array with initial NaNs for indices with insufficient data + res_full = np.empty(n) + res_full[:period-1] = np.nan + res_full[period-1:] = corr_vals + + return res_full if sequential else res_full[-1] diff --git a/jesse/indicators/cvi.py b/jesse/indicators/cvi.py index 1bc940d33..2ba4da2fd 100644 --- a/jesse/indicators/cvi.py +++ b/jesse/indicators/cvi.py @@ -1,9 +1,16 @@ from typing import Union - import numpy as np -import tulipy as ti +from numba import njit +import jesse.helpers as jh +from jesse.indicators.ema import ema + -from jesse.helpers import same_length, slice_candles +@njit +def _calculate_cvi(ema_diff: np.ndarray, period: int) -> np.ndarray: + # Calculate rate of change + result = np.zeros_like(ema_diff) + result[period:] = ((ema_diff[period:] - ema_diff[:-period]) / ema_diff[:-period]) * 100 + return result def cvi(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Union[float, np.ndarray]: @@ -16,8 +23,17 @@ def cvi(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Union :return: float | np.ndarray """ - candles = slice_candles(candles, sequential) + candles = jh.slice_candles(candles, sequential) + + high = np.ascontiguousarray(candles[:, 3]) + low = np.ascontiguousarray(candles[:, 4]) + + # Calculate high-low difference + hl_diff = high - low + + # Calculate EMA of the difference using existing EMA indicator + ema_diff = ema(hl_diff, period, sequential=True) - res = ti.cvi(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), period=period) + res = _calculate_cvi(ema_diff, period) - return same_length(candles, res) if sequential else res[-1] + return jh.same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/damiani_volatmeter.py b/jesse/indicators/damiani_volatmeter.py index eea44cca5..8bd704251 100644 --- a/jesse/indicators/damiani_volatmeter.py +++ b/jesse/indicators/damiani_volatmeter.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from numba import njit from jesse.helpers import get_candle_source, slice_candles @@ -9,6 +8,36 @@ DamianiVolatmeter = namedtuple('DamianiVolatmeter', ['vol', 'anti']) +def atr(high: np.ndarray, low: np.ndarray, close: np.ndarray, timeperiod: int) -> np.ndarray: + tr = np.empty_like(high, dtype=float) + tr[0] = high[0] - low[0] + if high.shape[0] > 1: + diff1 = high[1:] - low[1:] + diff2 = np.abs(high[1:] - close[:-1]) + diff3 = np.abs(low[1:] - close[:-1]) + tr[1:] = np.maximum(diff1, np.maximum(diff2, diff3)) + atr_array = np.full(high.shape, np.nan, dtype=float) + if high.shape[0] < timeperiod: + atr_array[-1] = np.mean(tr) + return atr_array + n = high.shape[0] + m = n - timeperiod + 1 + alpha = 1.0 / timeperiod + initial = np.mean(tr[:timeperiod]) + ema_vector = np.empty(m) + ema_vector[0] = initial + if m > 1: + k = np.arange(m) # k = 0,..., m-1 + initial_contrib = initial * (1 - alpha) ** k + # Build a lower-triangular matrix for weights for indices 1 to m-1 + exp_matrix = np.tril((1 - alpha) ** (np.subtract.outer(np.arange(m - 1), np.arange(m - 1)))) + # tr[timeperiod:] has length m-1 + sum_vals = alpha * (exp_matrix @ tr[timeperiod:]) + ema_vector[1:] = initial_contrib[1:] + sum_vals + atr_array[:timeperiod - 1] = np.nan + atr_array[timeperiod - 1:] = ema_vector + return atr_array + def damiani_volatmeter(candles: np.ndarray, vis_atr: int = 13, vis_std: int = 20, sed_atr: int = 40, sed_std: int = 100, threshold: float = 1.4, source_type: str = "close", sequential: bool = False) -> DamianiVolatmeter: @@ -26,13 +55,14 @@ def damiani_volatmeter(candles: np.ndarray, vis_atr: int = 13, vis_std: int = 20 :return: float | np.ndarray """ + if len(candles.shape) == 1: + source = candles + else: + candles = slice_candles(candles, sequential) + source = get_candle_source(candles, source_type=source_type) - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - - atrvis = talib.ATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=vis_atr) - atrsed = talib.ATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=sed_atr) + atrvis = atr(candles[:, 3], candles[:, 4], candles[:, 2], vis_atr) + atrsed = atr(candles[:, 3], candles[:, 4], candles[:, 2], sed_atr) vol, t = damiani_volatmeter_fast(source, sed_std, atrvis, atrsed, vis_std, threshold) @@ -41,17 +71,26 @@ def damiani_volatmeter(candles: np.ndarray, vis_atr: int = 13, vis_std: int = 20 else: return DamianiVolatmeter(vol[-1], t[-1]) +def damiani_volatmeter_fast(source, sed_std, atrvis, atrsed, vis_std, threshold): + from scipy.signal import lfilter + from numpy.lib.stride_tricks import sliding_window_view -@njit(cache=True) -def damiani_volatmeter_fast(source, sed_std, atrvis, atrsed, vis_std, - threshold): # Function is compiled to machine code when called the first time lag_s = 0.5 + n = source.shape[0] + + # Compute vol using a linear filter to solve the recurrence: + # vol[i] - lag_s*vol[i-1] + lag_s*vol[i-3] = atrvis[i]/atrsed[i] + u = np.zeros(n) + u[sed_std:] = atrvis[sed_std:] / atrsed[sed_std:] + b = [1.0] + a = [1.0, -lag_s, 0.0, lag_s] + vol = lfilter(b, a, u) - vol = np.full_like(source, 0) - t = np.full_like(source, 0) - for i in range(source.shape[0]): - if i >= sed_std: - vol[i] = atrvis[i] / atrsed[i] + lag_s * (vol[i - 1] - vol[i - 3]) - anti_thres = np.std(source[i - vis_std:i]) / np.std(source[i - sed_std:i]) - t[i] = threshold - anti_thres + # Compute t vectorized by calculating moving standard deviations without loops + t = np.zeros(n) + if n >= sed_std: + std_vis = np.std(sliding_window_view(source, vis_std), axis=-1) + std_sed = np.std(sliding_window_view(source, sed_std), axis=-1) + idx = np.arange(sed_std, n) + t[idx] = threshold - (std_vis[idx - vis_std] / std_sed[idx - sed_std]) return vol, t diff --git a/jesse/indicators/dema.py b/jesse/indicators/dema.py index 8371d574f..3b002a7cd 100644 --- a/jesse/indicators/dema.py +++ b/jesse/indicators/dema.py @@ -1,11 +1,22 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles +@njit(cache=True) +def _ema(x: np.ndarray, period: int) -> np.ndarray: + alpha = 2.0 / (period + 1) + n = len(x) + ema = np.empty(n, dtype=x.dtype) + ema[0] = x[0] + for i in range(1, n): + ema[i] = alpha * x[i] + (1 - alpha) * ema[i - 1] + return ema + + def dema(candles: np.ndarray, period: int = 30, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: """ @@ -24,6 +35,8 @@ def dema(candles: np.ndarray, period: int = 30, source_type: str = "close", sequ candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.DEMA(source, timeperiod=period) + ema = _ema(source, period) + ema_of_ema = _ema(ema, period) + res = 2 * ema - ema_of_ema return res if sequential else res[-1] diff --git a/jesse/indicators/devstop.py b/jesse/indicators/devstop.py index 049523e14..314d9db32 100644 --- a/jesse/indicators/devstop.py +++ b/jesse/indicators/devstop.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -import talib +from numpy.lib.stride_tricks import sliding_window_view from jesse.helpers import slice_candles from jesse.indicators.mean_ad import mean_ad @@ -28,18 +28,54 @@ def devstop(candles: np.ndarray, period: int = 20, mult: float = 0, devtype: int high = candles[:, 3] low = candles[:, 4] - AVTR = talib.SMA(talib.MAX(high, 2) - talib.MIN(low, 2), period) + AVTR = rolling_mean(rolling_max(high, 2) - rolling_min(low, 2), period) if devtype == 0: - SD = talib.STDDEV(talib.MAX(high, 2) - talib.MIN(low, 2), period) + SD = rolling_std(rolling_max(high, 2) - rolling_min(low, 2), period) elif devtype == 1: - SD = mean_ad(talib.MAX(high, 2) - talib.MIN(low, 2), period, sequential=True) + SD = mean_ad(rolling_max(high, 2) - rolling_min(low, 2), period, sequential=True) elif devtype == 2: - SD = median_ad(talib.MAX(high, 2) - talib.MIN(low, 2), period, sequential=True) + SD = median_ad(rolling_max(high, 2) - rolling_min(low, 2), period, sequential=True) if direction == "long": - res = talib.MAX(high - AVTR - mult * SD, period) + res = rolling_max(high - AVTR - mult * SD, period) else: - res = talib.MIN(low + AVTR + mult * SD, period) + res = rolling_min(low + AVTR + mult * SD, period) return res if sequential else res[-1] + +def rolling_max(arr, window): + if len(arr) < window: + return np.full(arr.shape, np.nan) + windows = sliding_window_view(arr, window) + res = np.empty(len(arr)) + res[:window-1] = np.nan + res[window-1:] = np.max(windows, axis=1) + return res + +def rolling_min(arr, window): + if len(arr) < window: + return np.full(arr.shape, np.nan) + windows = sliding_window_view(arr, window) + res = np.empty(len(arr)) + res[:window-1] = np.nan + res[window-1:] = np.min(windows, axis=1) + return res + +def rolling_mean(arr, window): + if len(arr) < window: + return np.full(arr.shape, np.nan) + windows = sliding_window_view(arr, window) + res = np.empty(len(arr)) + res[:window-1] = np.nan + res[window-1:] = np.mean(windows, axis=1) + return res + +def rolling_std(arr, window): + if len(arr) < window: + return np.full(arr.shape, np.nan) + windows = sliding_window_view(arr, window) + res = np.empty(len(arr)) + res[:window-1] = np.nan + res[window-1:] = np.std(windows, axis=1, ddof=0) + return res diff --git a/jesse/indicators/di.py b/jesse/indicators/di.py index 28010f0e0..91b66f6e9 100644 --- a/jesse/indicators/di.py +++ b/jesse/indicators/di.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles @@ -12,18 +11,70 @@ def di(candles: np.ndarray, period: int = 14, sequential: bool = False) -> DI: """ DI - Directional Indicator - :param candles: np.ndarray + :param candles: np.ndarray, where columns are expected to be: index 2: close, index 3: high, index 4: low. :param period: int - default: 14 :param sequential: bool - default: False :return: DI(plus, minus) """ candles = slice_candles(candles, sequential) + n = len(candles) + if n < 2: + if sequential: + return DI(np.full(n, np.nan), np.full(n, np.nan)) + else: + return DI(np.nan, np.nan) - MINUS_DI = talib.MINUS_DI(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - PLUS_DI = talib.PLUS_DI(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) + # Extract high, low, and close assuming columns: index 3 -> high, index 4 -> low, index 2 -> close + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + + # Calculate directional movements + up_move = high[1:] - high[:-1] + down_move = low[:-1] - low[1:] + plus_dm = np.where((up_move > down_move) & (up_move > 0), up_move, 0) + minus_dm = np.where((down_move > up_move) & (down_move > 0), down_move, 0) + + # Calculate True Range (TR) + high_low = high[1:] - low[1:] + high_close = np.abs(high[1:] - close[:-1]) + low_close = np.abs(low[1:] - close[:-1]) + tr = np.maximum.reduce([high_low, high_close, low_close]) + + m = len(tr) # m = n - 1 + # Initialize arrays for Wilder's smoothing + atr = np.full(m, np.nan) + plus_smoothed = np.full(m, np.nan) + minus_smoothed = np.full(m, np.nan) + + if m < period: + plus_DI_arr = np.full(n, np.nan) + minus_DI_arr = np.full(n, np.nan) + if sequential: + return DI(plus_DI_arr, minus_DI_arr) + else: + return DI(np.nan, np.nan) + + # Initial Wilder's smoothing + atr[period - 1] = np.sum(tr[:period]) / period + plus_smoothed[period - 1] = np.sum(plus_dm[:period]) + minus_smoothed[period - 1] = np.sum(minus_dm[:period]) + + # Wilder's smoothing recursion + for i in range(period, m): + atr[i] = (atr[i - 1] * (period - 1) + tr[i]) / period + plus_smoothed[i] = (plus_smoothed[i - 1] * (period - 1) + plus_dm[i]) / period + minus_smoothed[i] = (minus_smoothed[i - 1] * (period - 1) + minus_dm[i]) / period + + # Prepare DI arrays: first 'period' candles are not computed (set to NaN) + plus_DI_arr = np.full(n, np.nan) + minus_DI_arr = np.full(n, np.nan) + valid_indices = np.arange(period, n) + plus_DI_arr[valid_indices] = np.where(atr[valid_indices - 1] == 0, 0, 100 * plus_smoothed[valid_indices - 1] / atr[valid_indices - 1]) + minus_DI_arr[valid_indices] = np.where(atr[valid_indices - 1] == 0, 0, 100 * minus_smoothed[valid_indices - 1] / atr[valid_indices - 1]) if sequential: - return DI(PLUS_DI, MINUS_DI) + return DI(plus_DI_arr, minus_DI_arr) else: - return DI(PLUS_DI[-1], MINUS_DI[-1]) + return DI(plus_DI_arr[-1], minus_DI_arr[-1]) diff --git a/jesse/indicators/dm.py b/jesse/indicators/dm.py index 5aadac8d0..b2cfe7297 100644 --- a/jesse/indicators/dm.py +++ b/jesse/indicators/dm.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles @@ -19,11 +18,37 @@ def dm(candles: np.ndarray, period: int = 14, sequential: bool = False) -> DM: :return: DM(plus, minus) """ candles = slice_candles(candles, sequential) - - MINUS_DI = talib.MINUS_DM(candles[:, 3], candles[:, 4], timeperiod=period) - PLUS_DI = talib.PLUS_DM(candles[:, 3], candles[:, 4], timeperiod=period) + high = candles[:, 3] + low = candles[:, 4] + n = len(high) + + # Compute raw directional movements + raw_plus = np.full(n, np.nan) + raw_minus = np.full(n, np.nan) + if n > 0: + raw_plus[0] = np.nan # first value is undefined + raw_minus[0] = np.nan + if n > 1: + diff_high = high[1:] - high[:-1] + diff_low = low[:-1] - low[1:] + plus = np.where((diff_high > diff_low) & (diff_high > 0), diff_high, 0) + minus = np.where((diff_low > diff_high) & (diff_low > 0), diff_low, 0) + raw_plus[1:] = plus + raw_minus[1:] = minus + + # Apply Wilder's smoothing: the first valid smoothed value is at index 'period' + smoothed_plus = np.full(n, np.nan, dtype=float) + smoothed_minus = np.full(n, np.nan, dtype=float) + if n > period: + initial_plus = np.nansum(raw_plus[1:period+1]) + initial_minus = np.nansum(raw_minus[1:period+1]) + smoothed_plus[period] = initial_plus + smoothed_minus[period] = initial_minus + for i in range(period+1, n): + smoothed_plus[i] = smoothed_plus[i-1] - (smoothed_plus[i-1] / period) + raw_plus[i] + smoothed_minus[i] = smoothed_minus[i-1] - (smoothed_minus[i-1] / period) + raw_minus[i] if sequential: - return DM(PLUS_DI, MINUS_DI) + return DM(smoothed_plus, smoothed_minus) else: - return DM(PLUS_DI[-1], MINUS_DI[-1]) + return DM(smoothed_plus[-1], smoothed_minus[-1]) diff --git a/jesse/indicators/donchian.py b/jesse/indicators/donchian.py index 894d05c81..a80b49350 100644 --- a/jesse/indicators/donchian.py +++ b/jesse/indicators/donchian.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles @@ -19,12 +18,28 @@ def donchian(candles: np.ndarray, period: int = 20, sequential: bool = False) -> :return: DonchianChannel(upperband, middleband, lowerband) """ candles = slice_candles(candles, sequential) - - UC = talib.MAX(candles[:, 3], timeperiod=period) - LC = talib.MIN(candles[:, 4], timeperiod=period) - MC = ((UC + LC) / 2) + high = candles[:, 3] + low = candles[:, 4] if sequential: - return DonchianChannel(UC, MC, LC) + # Compute rolling maximum and minimum using sliding_window_view, vectorized without explicit loops + from numpy.lib.stride_tricks import sliding_window_view + n = high.shape[0] + # Prepare output arrays with NaN for the initial period-1 values + rolling_max = np.empty(n) + rolling_min = np.empty(n) + rolling_max[:period - 1] = np.nan + rolling_min[:period - 1] = np.nan + # Compute sliding window view for the valid windows + windowed_high = sliding_window_view(high, window_shape=period) + windowed_low = sliding_window_view(low, window_shape=period) + rolling_max[period - 1:] = np.max(windowed_high, axis=1) + rolling_min[period - 1:] = np.min(windowed_low, axis=1) + middleband = (rolling_max + rolling_min) / 2 + return DonchianChannel(rolling_max, middleband, rolling_min) else: - return DonchianChannel(UC[-1], MC[-1], LC[-1]) + # Non-sequential: compute only the last period's max and min + uc = np.max(high[-period:]) + lc = np.min(low[-period:]) + mc = (uc + lc) / 2 + return DonchianChannel(uc, mc, lc) diff --git a/jesse/indicators/dpo.py b/jesse/indicators/dpo.py index 1347ad675..2755ed62d 100644 --- a/jesse/indicators/dpo.py +++ b/jesse/indicators/dpo.py @@ -1,16 +1,31 @@ from typing import Union - import numpy as np -import tulipy as ti - +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +from jesse.indicators.sma import sma + + +@njit +def _dpo(source, period, sma): + # Calculate the X/2 + 1 shift + shift = period // 2 + 1 + + # Shift the price series and subtract SMA + shifted_source = np.roll(source, shift) + dpo = shifted_source - sma + # First (period-1 + shift) elements will be invalid due to the rolling calculations + dpo[:period-1+shift] = np.nan -def dpo(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: + return dpo + + +def dpo(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ DPO - Detrended Price Oscillator + Formula: Price {X/2 + 1} periods ago less the X-period simple moving average + :param candles: np.ndarray :param period: int - default: 5 :param source_type: str - default: "close" @@ -19,8 +34,8 @@ def dpo(candles: np.ndarray, period: int = 5, source_type: str = "close", sequen :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = ti.dpo(np.ascontiguousarray(source), period=period) + t_sma = sma(candles, period, source_type=source_type, sequential=True) + res = _dpo(source, period, t_sma) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/dti.py b/jesse/indicators/dti.py index adf6925e3..5e6430e17 100644 --- a/jesse/indicators/dti.py +++ b/jesse/indicators/dti.py @@ -1,45 +1,68 @@ from typing import Union import numpy as np -import talib +from numba import njit import jesse.helpers as jh from jesse.helpers import slice_candles -def dti(candles: np.ndarray, r: int = 14, s: int = 10, u: int = 5, sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def _ema(arr: np.ndarray, period: int) -> np.ndarray: """ - DTI by William Blau + Compute the exponential moving average (EMA) using a simple for loop, accelerated with numba. + The formula is: EMA[i] = sum_{j=0}^{i} (alpha * (1-alpha)**(i - j) * arr[j]) where alpha = 2/(period+1). + This is computed iteratively: + EMA[0] = alpha * arr[0] + EMA[i] = alpha * arr[i] + (1 - alpha) * EMA[i-1] for i >= 1 + """ + alpha = 2.0 / (period + 1) + n = arr.shape[0] + result = np.empty(n, dtype=arr.dtype) + result[0] = alpha * arr[0] + for i in range(1, n): + result[i] = alpha * arr[i] + (1 - alpha) * result[i - 1] + return result - :param candles: np.ndarray - :param r: int - default: 14 - :param s: int - default: 10 - :param u: int - default: 5 - :param sequential: bool - default: False - :return: float +def dti(candles: np.ndarray, r: int = 14, s: int = 10, u: int = 5, sequential: bool = False) -> Union[float, np.ndarray]: """ - candles = slice_candles(candles, sequential) + DTI by William Blau calculated using numba accelerated EMA loops. + :param candles: np.ndarray of candles data + :param r: period for the first EMA smoothing (default 14) + :param s: period for the second EMA smoothing (default 10) + :param u: period for the third EMA smoothing (default 5) + :param sequential: if True, returns the full sequence, otherwise only the last value + :return: float or np.ndarray of DTI values + """ + candles = slice_candles(candles, sequential) high = candles[:, 3] low = candles[:, 4] high_1 = jh.np_shift(high, 1, np.nan) low_1 = jh.np_shift(low, 1, np.nan) + # Compute upward and downward movements xHMU = np.where(high - high_1 > 0, high - high_1, 0) xLMD = np.where(low - low_1 < 0, -(low - low_1), 0) xPrice = xHMU - xLMD - xPriceAbs = np.absolute(xPrice) + xPriceAbs = np.abs(xPrice) + + # Apply triple EMA using the numba accelerated _ema + temp = _ema(xPrice, r) + temp = _ema(temp, s) + xuXA = _ema(temp, u) - xuXA = talib.EMA(talib.EMA(talib.EMA(xPrice, r), s), u) - xuXAAbs = talib.EMA(talib.EMA(talib.EMA(xPriceAbs, r), s), u) + temp_abs = _ema(xPriceAbs, r) + temp_abs = _ema(temp_abs, s) + xuXAAbs = _ema(temp_abs, u) Val1 = 100 * xuXA Val2 = xuXAAbs - dti_val = np.where(Val2 != 0, Val1 / Val2, 0) + with np.errstate(divide='ignore', invalid='ignore'): + dti_val = np.divide(Val1, Val2, out=np.zeros_like(Val1, dtype=float), where=Val2 != 0) if sequential: return dti_val diff --git a/jesse/indicators/dx.py b/jesse/indicators/dx.py index 73cb0cf1d..e0d22f0f8 100644 --- a/jesse/indicators/dx.py +++ b/jesse/indicators/dx.py @@ -1,23 +1,74 @@ +from collections import namedtuple + from typing import Union import numpy as np -import talib - from jesse.helpers import slice_candles +from jesse.indicators.rma import rma +from numba import njit +DX = namedtuple('DX', ['adx', 'plusDI', 'minusDI']) -def dx(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: +@njit(cache=True) +def _fast_dm_tr(high: np.ndarray, low: np.ndarray, close: np.ndarray) -> tuple: + n = len(high) + up = np.zeros(n) + down = np.zeros(n) + plusDM = np.zeros(n) + minusDM = np.zeros(n) + true_range = np.zeros(n) + + for i in range(n): + if i == 0: + up[i] = 0 + down[i] = 0 + plusDM[i] = 0 + minusDM[i] = 0 + true_range[i] = high[i] - low[i] + else: + up[i] = high[i] - high[i - 1] + down[i] = low[i - 1] - low[i] + plusDM[i] = up[i] if (up[i] > down[i] and up[i] > 0) else 0 + minusDM[i] = down[i] if (down[i] > up[i] and down[i] > 0) else 0 + a = high[i] - low[i] + b = abs(high[i] - close[i - 1]) + c = abs(low[i] - close[i - 1]) + true_range[i] = max(a, b, c) + + return plusDM, minusDM, true_range + +def dx(candles: np.ndarray, di_length: int = 14, adx_smoothing: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: """ DX - Directional Movement Index - + :param candles: np.ndarray - :param period: int - default: 14 + :param di_length: int - default: 14 + :param adx_smoothing: int - default: 14 :param sequential: bool - default: False - - :return: float | np.ndarray + + :return: DX(adx, plusDI, minusDI) """ candles = slice_candles(candles, sequential) - - res = talib.DX(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - - return res if sequential else res[-1] + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + + plusDM, minusDM, true_range = _fast_dm_tr(high, low, close) + + tr_rma = rma(true_range, di_length, sequential=True) + plus_rma = rma(plusDM, di_length, sequential=True) + minus_rma = rma(minusDM, di_length, sequential=True) + + # Compute +DI and -DI, avoiding division by zero + plusDI = np.where(tr_rma == 0, 0, 100 * plus_rma / tr_rma) + minusDI = np.where(tr_rma == 0, 0, 100 * minus_rma / tr_rma) + + di_sum = plusDI + minusDI + di_diff = np.abs(plusDI - minusDI) + directional_index = di_diff / np.where(di_sum == 0, 1, di_sum) + adx = 100 * rma(directional_index, adx_smoothing, sequential=True) + + if sequential: + return DX(adx, plusDI, minusDI) + else: + return DX(adx[-1], plusDI[-1], minusDI[-1]) diff --git a/jesse/indicators/efi.py b/jesse/indicators/efi.py index 544908241..2da1e1539 100644 --- a/jesse/indicators/efi.py +++ b/jesse/indicators/efi.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles @@ -25,7 +24,7 @@ def efi(candles: np.ndarray, period: int = 13, source_type: str = "close", seque dif = efi_fast(source, candles[:, 5]) - res = talib.EMA(dif, timeperiod=period) + res = ema(dif, period) res_with_nan = same_length(candles, res) return res_with_nan if sequential else res_with_nan[-1] @@ -37,3 +36,26 @@ def efi_fast(source, volume): for i in range(1, source.size): dif[i - 1] = (source[i] - source[i - 1]) * volume[i] return dif + + +@njit(cache=True) +def ema(data: np.ndarray, period: int) -> np.ndarray: + n = data.shape[0] + # Initialize output array and fill with NaN + out = np.empty(n) + for i in range(n): + out[i] = np.nan + if n < period: + return out + alpha = 2.0 / (period + 1) + # Compute seed as the simple average of the first 'period' values + sum_value = 0.0 + for i in range(period): + sum_value += data[i] + ema_val = sum_value / period + out[period - 1] = ema_val + # Recursively compute EMA for the rest of the data + for i in range(period, n): + ema_val = alpha * data[i] + (1 - alpha) * ema_val + out[i] = ema_val + return out diff --git a/jesse/indicators/ema.py b/jesse/indicators/ema.py index ef1222e60..2dd203000 100644 --- a/jesse/indicators/ema.py +++ b/jesse/indicators/ema.py @@ -1,15 +1,35 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles +@njit(cache=True) +def _ema(source: np.ndarray, period: int) -> np.ndarray: + """ + Compute the Exponential Moving Average using a loop. + """ + n = len(source) + result = np.full(n, np.nan) + if n < period: + return result + alpha = 2 / (period + 1) + # Initialize EMA with the simple average of the first "period" values + initial = np.mean(source[:period]) + result[period - 1] = initial + prev = initial + for i in range(period, n): + current = alpha * source[i] + (1 - alpha) * prev + result[i] = current + prev = current + return result + def ema(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: """ - EMA - Exponential Moving Average + EMA - Exponential Moving Average using Numba for optimization :param candles: np.ndarray :param period: int - default: 5 @@ -24,6 +44,5 @@ def ema(candles: np.ndarray, period: int = 5, source_type: str = "close", sequen candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.EMA(source, timeperiod=period) - - return res if sequential else res[-1] + result = _ema(source, period) + return result if sequential else result[-1] diff --git a/jesse/indicators/emd.py b/jesse/indicators/emd.py index a9e739753..949e44293 100644 --- a/jesse/indicators/emd.py +++ b/jesse/indicators/emd.py @@ -1,9 +1,8 @@ from collections import namedtuple import numpy as np -import talib from numba import njit - +from jesse.indicators.sma import sma from jesse.helpers import slice_candles EMD = namedtuple('EMD', ['upperband', 'middleband', 'lowerband']) @@ -27,11 +26,11 @@ def emd(candles: np.ndarray, period: int = 20, delta=0.5, fraction=0.1, sequenti bp = bp_fast(price, period, delta) - mean = talib.SMA(bp, timeperiod=2 * period) + mean = sma(bp, 2 * period, sequential=True) peak, valley = peak_valley_fast(bp, price) - avg_peak = fraction * talib.SMA(peak, timeperiod=50) - avg_valley = fraction * talib.SMA(valley, timeperiod=50) + avg_peak = fraction * sma(peak, 50, sequential=True) + avg_valley = fraction * sma(valley, 50, sequential=True) if sequential: return EMD(avg_peak, mean, avg_valley) diff --git a/jesse/indicators/emv.py b/jesse/indicators/emv.py index 0995d5a82..bc1b54be7 100644 --- a/jesse/indicators/emv.py +++ b/jesse/indicators/emv.py @@ -1,23 +1,44 @@ from typing import Union - import numpy as np -import tulipy as ti - +from numba import njit from jesse.helpers import same_length, slice_candles +from jesse.indicators import sma + + +@njit +def _emv(high: np.ndarray, low: np.ndarray, volume: np.ndarray, length, div) -> np.ndarray: + hl2 = (high + low) / 2 + hl2_change = np.zeros_like(hl2) + hl2_change[1:] = hl2[1:] - hl2[:-1] + # Calculate EMV + emv_raw = div * hl2_change * (high - low) / volume -def emv(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarray]: + # Calculate SMA of EMV + result = np.zeros_like(emv_raw) + for i in range(length - 1, len(emv_raw)): + result[i] = np.mean(emv_raw[i - length + 1:i + 1]) + + return result + + +def emv(candles: np.ndarray, length: int = 14, div: int = 10000, sequential: bool = False) -> Union[float, np.ndarray]: """ EMV - Ease of Movement :param candles: np.ndarray + :param length: int - default: 14 + :param div: int - default: 10000 :param sequential: bool - default: False :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - res = ti.emv(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), - np.ascontiguousarray(candles[:, 5])) + high = candles[:, 3] + low = candles[:, 4] + volume = candles[:, 5] + + res = _emv(high, low, volume, length, div) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/eri.py b/jesse/indicators/eri.py index 7faccda1b..e37c0249b 100644 --- a/jesse/indicators/eri.py +++ b/jesse/indicators/eri.py @@ -25,7 +25,11 @@ def eri(candles: np.ndarray, period: int = 13, matype: int = 1, source_type: str source = get_candle_source(candles, source_type=source_type) - ema = ma(source, period=period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + ema = ma(candles, period=period, matype=matype, source_type=source_type, sequential=True) + else: + ema = ma(source, period=period, matype=matype, sequential=True) + bull = candles[:, 3] - ema bear = candles[:, 4] - ema diff --git a/jesse/indicators/fisher.py b/jesse/indicators/fisher.py index f4710e873..ef1beb904 100644 --- a/jesse/indicators/fisher.py +++ b/jesse/indicators/fisher.py @@ -1,13 +1,47 @@ from collections import namedtuple - import numpy as np -import tulipy as ti - +from numba import njit from jesse.helpers import same_length, slice_candles FisherTransform = namedtuple('FisherTransform', ['fisher', 'signal']) +@njit +def _fisher_transform(high: np.ndarray, low: np.ndarray, period: int) -> tuple: + """ + Numba-optimized implementation of Fisher Transform + """ + length = len(high) + mid_price = (high + low) / 2 + fisher = np.zeros(length) + fisher_signal = np.zeros(length) + + # Initialize first value + value1 = 0.0 + + for i in range(period, length): + # Find the highest high and lowest low in the period + max_h = np.max(mid_price[i-period+1:i+1]) + min_l = np.min(mid_price[i-period+1:i+1]) + + # Avoid division by zero + if max_h - min_l == 0: + value0 = 0 + else: + value0 = 0.33 * 2 * ((mid_price[i] - min_l) / (max_h - min_l) - 0.5) + 0.67 * value1 + + if value0 > 0.99: + value0 = 0.999 + elif value0 < -0.99: + value0 = -0.999 + + fisher[i] = 0.5 * np.log((1 + value0) / (1 - value0)) + 0.5 * fisher[i-1] + fisher_signal[i] = fisher[i-1] + value1 = value0 + + return fisher, fisher_signal + + def fisher(candles: np.ndarray, period: int = 9, sequential: bool = False) -> FisherTransform: """ The Fisher Transform helps identify price reversals. @@ -20,8 +54,11 @@ def fisher(candles: np.ndarray, period: int = 9, sequential: bool = False) -> Fi """ candles = slice_candles(candles, sequential) - fisher_val, fisher_signal = ti.fisher(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), - period=period) + fisher_val, fisher_signal = _fisher_transform( + np.ascontiguousarray(candles[:, 3]), + np.ascontiguousarray(candles[:, 4]), + period + ) if sequential: return FisherTransform(same_length(candles, fisher_val), same_length(candles, fisher_signal)) diff --git a/jesse/indicators/fosc.py b/jesse/indicators/fosc.py index 63759f33b..188d85aff 100644 --- a/jesse/indicators/fosc.py +++ b/jesse/indicators/fosc.py @@ -1,13 +1,24 @@ from typing import Union - import numpy as np -import tulipy as ti - from jesse.helpers import get_candle_source, same_length, slice_candles +from numba import njit + + +@njit +def linear_regression_line(x, y): + n = len(x) + sum_x = np.sum(x) + sum_y = np.sum(y) + sum_xy = np.sum(x * y) + sum_xx = np.sum(x * x) + + slope = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x * sum_x) + intercept = (sum_y - slope * sum_x) / n + return slope * x + intercept -def fosc(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: + +def fosc(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ FOSC - Forecast Oscillator @@ -19,8 +30,19 @@ def fosc(candles: np.ndarray, period: int = 5, source_type: str = "close", seque :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = ti.fosc(np.ascontiguousarray(source), period=period) + + # Prepare the result array + res = np.zeros_like(source) + + # Calculate FOSC for each window + for i in range(period - 1, len(source)): + window = source[i - period + 1:i + 1] + x = np.arange(period) + predicted = linear_regression_line(x, window) + res[i] = 100 * (window[-1] - predicted[-1]) / window[-1] + + # Replace initial NaN values with 0 + res[:period - 1] = 0 return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/gatorosc.py b/jesse/indicators/gatorosc.py index e154899f2..4048327fb 100644 --- a/jesse/indicators/gatorosc.py +++ b/jesse/indicators/gatorosc.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import get_candle_source, np_shift, slice_candles @@ -30,8 +29,15 @@ def gatorosc(candles: np.ndarray, source_type: str = "close", sequential: bool = upper = np.abs(jaw - teeth) lower = -np.abs(teeth - lips) - upper_change = talib.MOM(upper, timeperiod=1) - lower_change = -talib.MOM(lower, timeperiod=1) + # Calculate momentum for upper: difference from previous value, first element is np.nan + upper_change = np.empty_like(upper) + upper_change[0] = np.nan + upper_change[1:] = np.diff(upper) + + # Calculate momentum for lower: negative difference from previous value, first element is np.nan + lower_change = np.empty_like(lower) + lower_change[0] = np.nan + lower_change[1:] = -np.diff(lower) if sequential: return GATOR(upper, lower, upper_change, lower_change) diff --git a/jesse/indicators/hma.py b/jesse/indicators/hma.py index baf72f96d..a7d18c594 100644 --- a/jesse/indicators/hma.py +++ b/jesse/indicators/hma.py @@ -1,13 +1,24 @@ from typing import Union - import numpy as np -import tulipy as ti - +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles -def hma(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit +def _wma(arr: np.ndarray, period: int) -> np.ndarray: + """ + Weighted Moving Average - optimized with Numba + """ + weights = np.arange(1, period + 1) + wma = np.zeros_like(arr) + + for i in range(period - 1, len(arr)): + wma[i] = np.sum(arr[i - period + 1:i + 1] * weights) / np.sum(weights) + + return wma + + +def hma(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ Hull Moving Average @@ -25,6 +36,18 @@ def hma(candles: np.ndarray, period: int = 5, source_type: str = "close", sequen candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.hma(np.ascontiguousarray(source), period=period) + # Calculate components for HMA + half_length = int(period / 2) + sqrt_length = int(np.sqrt(period)) + + # Calculate WMAs + wma_half = _wma(source, half_length) + wma_full = _wma(source, period) + + # Calculate 2 * WMA(n/2) - WMA(n) + raw_hma = 2 * wma_half - wma_full + + # Calculate final HMA + hma = _wma(raw_hma, sqrt_length) - return same_length(candles, res) if sequential else res[-1] + return same_length(candles, hma) if sequential else hma[-1] diff --git a/jesse/indicators/ht_dcperiod.py b/jesse/indicators/ht_dcperiod.py deleted file mode 100644 index d798cc7a8..000000000 --- a/jesse/indicators/ht_dcperiod.py +++ /dev/null @@ -1,24 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - - -def ht_dcperiod(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: - """ - HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: float | np.ndarray - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - res = talib.HT_DCPERIOD(source) - - return res if sequential else res[-1] diff --git a/jesse/indicators/ht_dcphase.py b/jesse/indicators/ht_dcphase.py deleted file mode 100644 index 0adb21319..000000000 --- a/jesse/indicators/ht_dcphase.py +++ /dev/null @@ -1,24 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - - -def ht_dcphase(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: - """ - HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: float | np.ndarray - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - res = talib.HT_DCPHASE(source) - - return res if sequential else res[-1] diff --git a/jesse/indicators/ht_phasor.py b/jesse/indicators/ht_phasor.py deleted file mode 100644 index 2dccb3a8c..000000000 --- a/jesse/indicators/ht_phasor.py +++ /dev/null @@ -1,29 +0,0 @@ -from collections import namedtuple - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - -IQ = namedtuple('IQ', ['inphase', 'quadrature']) - - -def ht_phasor(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> IQ: - """ - HT_PHASOR - Hilbert Transform - Phasor Components - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: IQ(inphase, quadrature) - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - inphase, quadrature = talib.HT_PHASOR(source) - - if sequential: - return IQ(inphase, quadrature) - else: - return IQ(inphase[-1], quadrature[-1]) diff --git a/jesse/indicators/ht_sine.py b/jesse/indicators/ht_sine.py deleted file mode 100644 index 1518481ee..000000000 --- a/jesse/indicators/ht_sine.py +++ /dev/null @@ -1,29 +0,0 @@ -from collections import namedtuple - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - -SINEWAVE = namedtuple('SINEWAVE', ['sine', 'lead']) - - -def ht_sine(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> SINEWAVE: - """ - HT_SINE - Hilbert Transform - SineWave - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: SINEWAVE(sine, lead) - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - sine, leadsine = talib.HT_SINE(source) - - if sequential: - return SINEWAVE(sine, leadsine) - else: - return SINEWAVE(sine[-1], leadsine[-1]) diff --git a/jesse/indicators/ht_trendline.py b/jesse/indicators/ht_trendline.py deleted file mode 100644 index da5d32817..000000000 --- a/jesse/indicators/ht_trendline.py +++ /dev/null @@ -1,27 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - - -def ht_trendline(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: - """ - HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: float | np.ndarray - """ - if len(candles.shape) == 1: - source = candles - else: - candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - - res = talib.HT_TRENDLINE(source) - - return res if sequential else res[-1] diff --git a/jesse/indicators/ht_trendmode.py b/jesse/indicators/ht_trendmode.py deleted file mode 100644 index 4f0003527..000000000 --- a/jesse/indicators/ht_trendmode.py +++ /dev/null @@ -1,24 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import get_candle_source, slice_candles - - -def ht_trendmode(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: - """ - HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode - - :param candles: np.ndarray - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: int | np.ndarray - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - res = talib.HT_TRENDMODE(source) - - return res if sequential else res[-1] diff --git a/jesse/indicators/hull_suit.py b/jesse/indicators/hull_suit.py index 31a9b5157..7935d4ef4 100644 --- a/jesse/indicators/hull_suit.py +++ b/jesse/indicators/hull_suit.py @@ -32,27 +32,23 @@ def hull_suit(candles: np.ndarray, mode_switch: str = 'Hma', length: int = 55, l mode_len = int(length * length_mult) if mode_switch == 'Hma': - mode = wma(2*wma(source, mode_len / 2, sequential=True) - wma(source, - mode_len, sequential=True), round(mode_len ** 0.5), sequential=True) + mode = wma(2*wma(source, int(mode_len / 2), sequential=True) - wma(source, mode_len, sequential=True), round(mode_len ** 0.5), sequential=True) elif mode_switch == 'Ehma': - mode = ema(2*ema(source, mode_len / 2, sequential=True) - ema(source, + mode = ema(2*ema(source, int(mode_len / 2), sequential=True) - ema(source, mode_len, sequential=True), round(mode_len ** 0.5), sequential=True) elif mode_switch == 'Thma': - mode = wma(3*wma(source, mode_len / 6, sequential=True) - wma(source, mode_len / 4, sequential=True) - - wma(source, mode_len / 2, sequential=True), mode_len / 2, sequential=True) - - s_hull = [] - m_hull = [] - signal = [] - for i in range(len(mode)): - if i > 1: - s_hull.append(mode[i - 2]) - m_hull.append(mode[i]) - signal.append('buy' if mode[i - 2] < mode[i] else 'sell') - else: - s_hull.append(None) - m_hull.append(None) - signal.append(None) + mode = wma(3*wma(source, int(mode_len / 6), sequential=True) - wma(source, int(mode_len / 4), sequential=True) - + wma(source, int(mode_len / 2), sequential=True), int(mode_len / 2), sequential=True) + + # Vectorized computation for s_hull, m_hull, and signal + n = len(mode) + s_hull = np.full(n, None, dtype=object) + m_hull = np.full(n, None, dtype=object) + signal = np.full(n, None, dtype=object) + if n > 2: + s_hull[2:] = mode[:-2] + m_hull[2:] = mode[2:] + signal[2:] = np.where(mode[:-2] < mode[2:], 'buy', 'sell') if sequential: return HullSuit(s_hull, m_hull, signal) diff --git a/jesse/indicators/ichimoku_cloud.py b/jesse/indicators/ichimoku_cloud.py index b64e856fd..d83194a26 100644 --- a/jesse/indicators/ichimoku_cloud.py +++ b/jesse/indicators/ichimoku_cloud.py @@ -1,10 +1,50 @@ from collections import namedtuple - import numpy as np +from numba import njit IchimokuCloud = namedtuple('IchimokuCloud', ['conversion_line', 'base_line', 'span_a', 'span_b']) +@njit +def _get_period_hl(candles: np.ndarray, period: int) -> tuple: + """ + Calculate period high and low using Numba + """ + period_high = candles[-period:, 3].max() # high prices + period_low = candles[-period:, 4].min() # low prices + return period_high, period_low + + +@njit +def _calculate_ichimoku(candles: np.ndarray, conversion_line_period: int, + base_line_period: int, lagging_line_period: int, + displacement: int) -> tuple: + """ + Core Ichimoku Cloud calculation using Numba + """ + # Calculate for earlier period (displaced) + earlier_candles = candles[:-(displacement - 1)] + + # Earlier periods calculations + small_ph, small_pl = _get_period_hl(earlier_candles, conversion_line_period) + mid_ph, mid_pl = _get_period_hl(earlier_candles, base_line_period) + long_ph, long_pl = _get_period_hl(earlier_candles, lagging_line_period) + + early_conversion_line = (small_ph + small_pl) / 2 + early_base_line = (mid_ph + mid_pl) / 2 + span_a = (early_conversion_line + early_base_line) / 2 + span_b = (long_ph + long_pl) / 2 + + # Current period calculations + current_small_ph, current_small_pl = _get_period_hl(candles, conversion_line_period) + current_mid_ph, current_mid_pl = _get_period_hl(candles, base_line_period) + + current_conversion_line = (current_small_ph + current_small_pl) / 2 + current_base_line = (current_mid_ph + current_mid_pl) / 2 + + return current_conversion_line, current_base_line, span_a, span_b + + def ichimoku_cloud(candles: np.ndarray, conversion_line_period: int = 9, base_line_period: int = 26, lagging_line_period: int = 52, displacement: int = 26) -> IchimokuCloud: """ @@ -23,37 +63,10 @@ def ichimoku_cloud(candles: np.ndarray, conversion_line_period: int = 9, base_li if candles.shape[0] > 80: candles = candles[-80:] - - # earlier - arr = candles[:-(displacement - 1)] - - small_period = arr[-conversion_line_period:] - mid_period = arr[-base_line_period:] - long_period = arr[-lagging_line_period:] - - small_ph = small_period[:, 3].max() - small_pl = small_period[:, 4].min() - mid_ph = mid_period[:, 3].max() - mid_pl = mid_period[:, 4].min() - long_ph = long_period[:, 3].max() - long_pl = long_period[:, 4].min() - - early_conversion_line = (small_ph + small_pl) / 2 - early_base_line = (mid_ph + mid_pl) / 2 - span_a = (early_conversion_line + early_base_line) / 2 - span_b = (long_ph + long_pl) / 2 - - # current - arr = candles - small_period = arr[-conversion_line_period:] - mid_period = arr[-base_line_period:] - - small_ph = small_period[:, 3].max() - small_pl = small_period[:, 4].min() - mid_ph = mid_period[:, 3].max() - mid_pl = mid_period[:, 4].min() - - current_conversion_line = (small_ph + small_pl) / 2 - current_base_line = (mid_ph + mid_pl) / 2 - - return IchimokuCloud(current_conversion_line, current_base_line, span_a, span_b) + + conversion_line, base_line, span_a, span_b = _calculate_ichimoku( + candles, conversion_line_period, base_line_period, + lagging_line_period, displacement + ) + + return IchimokuCloud(conversion_line, base_line, span_a, span_b) diff --git a/jesse/indicators/ichimoku_cloud_seq.py b/jesse/indicators/ichimoku_cloud_seq.py index f78b20b59..8cba487e5 100644 --- a/jesse/indicators/ichimoku_cloud_seq.py +++ b/jesse/indicators/ichimoku_cloud_seq.py @@ -1,7 +1,7 @@ from collections import namedtuple import numpy as np -import talib +from numpy.lib.stride_tricks import sliding_window_view from jesse.helpers import np_shift, slice_candles @@ -46,6 +46,26 @@ def ichimoku_cloud_seq(candles: np.ndarray, conversion_line_period: int = 9, bas span_a_pre[-1], span_b_pre[-1]) def _line_helper(candles, period): - small_ph = talib.MAX(candles[:, 3], period) - small_pl = talib.MIN(candles[:, 4], period) + small_ph = _rolling_max(candles[:, 3], period) + small_pl = _rolling_min(candles[:, 4], period) return (small_ph + small_pl) / 2 + +def _rolling_max(a, period): + n = len(a) + if n < period: + return np.full(n, np.nan) + windows = sliding_window_view(a, window_shape=period) + r = np.empty(n, dtype=a.dtype) + r[:period-1] = np.nan + r[period-1:] = np.max(windows, axis=-1) + return r + +def _rolling_min(a, period): + n = len(a) + if n < period: + return np.full(n, np.nan) + windows = sliding_window_view(a, window_shape=period) + r = np.empty(n, dtype=a.dtype) + r[:period-1] = np.nan + r[period-1:] = np.min(windows, axis=-1) + return r diff --git a/jesse/indicators/ift_rsi.py b/jesse/indicators/ift_rsi.py index 3f296a07f..021072427 100644 --- a/jesse/indicators/ift_rsi.py +++ b/jesse/indicators/ift_rsi.py @@ -1,11 +1,10 @@ from typing import Union - +from jesse.indicators.wma import wma +from jesse.indicators.rsi import rsi import numpy as np -import talib from jesse.helpers import get_candle_source, same_length, slice_candles - def ift_rsi(candles: np.ndarray, rsi_period: int = 5, wma_period: int =9, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: """ @@ -20,13 +19,11 @@ def ift_rsi(candles: np.ndarray, rsi_period: int = 5, wma_period: int =9, source :return: float | np.ndarray """ - candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - v1 = 0.1 * (talib.RSI(source, rsi_period) - 50) - - v2 = talib.WMA(v1, wma_period) + v1 = 0.1 * (rsi(source, rsi_period, sequential=True) - 50) + v2 = wma(v1, wma_period, sequential=True) res = (((2*v2) ** 2 - 1) / ((2*v2) ** 2 + 1)) diff --git a/jesse/indicators/kama.py b/jesse/indicators/kama.py index dff02c8c8..f7835ba12 100644 --- a/jesse/indicators/kama.py +++ b/jesse/indicators/kama.py @@ -1,29 +1,67 @@ from typing import Union - import numpy as np -import talib - +from numba import njit from jesse.helpers import get_candle_source, slice_candles -def kama(candles: np.ndarray, period: int = 30, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def _calculate_kama(src: np.ndarray, period: int, fast_length: int, slow_length: int) -> np.ndarray: """ - KAMA - Kaufman Adaptive Moving Average + Core KAMA calculation using Numba + """ + n = len(src) + result = np.empty(n, dtype=np.float64) + result[:period] = src[:period] # First 'period' values are same as source + + if n <= period: + return result + + # Calculate the efficiency ratio multiplier + fast_alpha = 2.0 / (fast_length + 1) + slow_alpha = 2.0 / (slow_length + 1) + alpha_diff = fast_alpha - slow_alpha + + # Start the calculation after the initial period + for i in range(period, n): + # Calculate Efficiency Ratio + change = abs(src[i] - src[i - period]) + volatility = 0.0 + for j in range(i - period + 1, i + 1): + volatility += abs(src[j] - src[j - 1]) + + er = change / volatility if volatility != 0 else 0.0 + + # Calculate smoothing constant + sc = (er * alpha_diff + slow_alpha) ** 2 + + # Calculate KAMA + result[i] = result[i - 1] + sc * (src[i] - result[i - 1]) + + return result + +def kama(candles: np.ndarray, period: int = 14, fast_length: int = 2, slow_length: int = 30, + source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: + """ + KAMA - Kaufman Adaptive Moving Average using Numba for optimization + :param candles: np.ndarray - :param period: int - default: 30 - :param source_type: str - default: "close" - :param sequential: bool - default: False + :param period: int - default: 14, lookback period for the calculation + :param fast_length: int - default: 2, fast EMA length for smoothing factor + :param slow_length: int - default: 30, slow EMA length for smoothing factor + :param source_type: str - default: "close", specifies the candle field + :param sequential: bool - default: False, if True returns the full array, otherwise only the last value :return: float | np.ndarray """ - if len(candles.shape) == 1: - source = candles + if candles.ndim == 1: + src = candles else: candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - - res = talib.KAMA(source, timeperiod=period) + src = get_candle_source(candles, source_type=source_type) - return res if sequential else res[-1] + src = np.asarray(src, dtype=np.float64) + + result = _calculate_kama(src, period, fast_length, slow_length) + + return result if sequential else result[-1] diff --git a/jesse/indicators/kaufmanstop.py b/jesse/indicators/kaufmanstop.py index 4e98f1613..1d34cbdb5 100644 --- a/jesse/indicators/kaufmanstop.py +++ b/jesse/indicators/kaufmanstop.py @@ -21,11 +21,14 @@ def kaufmanstop(candles: np.ndarray, period: int = 22, mult: float = 2, directio :return: float | np.ndarray """ + if matype == 24 or matype == 29: + raise ValueError("VWMA (matype 24) and VWAP (matype 29) cannot be used in kaufmanstop indicator.") + candles = slice_candles(candles, sequential) high = candles[:, 3] low = candles[:, 4] - + hl_diff = ma(high - low, period=period, matype=matype, sequential=True) res = low - hl_diff * mult if direction == "long" else high + hl_diff * mult diff --git a/jesse/indicators/kdj.py b/jesse/indicators/kdj.py index 6222f5c5a..9d23158b2 100644 --- a/jesse/indicators/kdj.py +++ b/jesse/indicators/kdj.py @@ -1,13 +1,36 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles from jesse.indicators.ma import ma KDJ = namedtuple('KDJ', ['k', 'd', 'j']) +def _rolling_max(a, window): + from numpy.lib.stride_tricks import sliding_window_view + a = np.asarray(a) + if len(a) < window: + return np.maximum.accumulate(a) + result = np.empty_like(a) + # Use vectorized cumulative maximum for the first window-1 elements + result[:window-1] = np.maximum.accumulate(a)[:window-1] + windows = sliding_window_view(a, window_shape=window) + result[window-1:] = np.max(windows, axis=1) + return result + +def _rolling_min(a, window): + from numpy.lib.stride_tricks import sliding_window_view + a = np.asarray(a) + if len(a) < window: + return np.minimum.accumulate(a) + result = np.empty_like(a) + # Use vectorized cumulative minimum for the first window-1 elements + result[:window-1] = np.minimum.accumulate(a)[:window-1] + windows = sliding_window_view(a, window_shape=window) + result[window-1:] = np.min(windows, axis=1) + return result + def kdj(candles: np.ndarray, fastk_period: int = 9, slowk_period: int = 3, slowk_matype: int = 0, slowd_period: int = 3, slowd_matype: int = 0, sequential: bool = False) -> KDJ: """ @@ -23,16 +46,20 @@ def kdj(candles: np.ndarray, fastk_period: int = 9, slowk_period: int = 3, slowk :return: KDJ(k, d, j) """ + if any(matype in (24, 29) for matype in (slowk_matype, slowd_matype)): + raise ValueError("VWMA (matype 24) and VWAP (matype 29) cannot be used in kdj indicator.") + candles = slice_candles(candles, sequential) candles_close = candles[:, 2] candles_high = candles[:, 3] candles_low = candles[:, 4] - hh = talib.MAX(candles_high, fastk_period) - ll = talib.MIN(candles_low, fastk_period) + hh = _rolling_max(candles_high, fastk_period) + ll = _rolling_min(candles_low, fastk_period) stoch = 100 * (candles_close - ll) / (hh - ll) + k = ma(stoch, period=slowk_period, matype=slowk_matype, sequential=True) d = ma(k, period=slowd_period, matype=slowd_matype, sequential=True) j = 3 * k - 2 * d diff --git a/jesse/indicators/keltner.py b/jesse/indicators/keltner.py index a8f807800..365d3e019 100644 --- a/jesse/indicators/keltner.py +++ b/jesse/indicators/keltner.py @@ -1,18 +1,60 @@ from collections import namedtuple - import numpy as np -import talib - +from numba import njit from jesse.helpers import get_candle_source, slice_candles from jesse.indicators.ma import ma KeltnerChannel = namedtuple('KeltnerChannel', ['upperband', 'middleband', 'lowerband']) -def keltner(candles: np.ndarray, period: int = 20, multiplier: float = 2, matype: int = 1, source_type: str = "close", - sequential: bool = False) -> KeltnerChannel: +@njit +def _atr(high: np.ndarray, low: np.ndarray, close: np.ndarray, period: int) -> np.ndarray: + """ + Calculate ATR using Numba + """ + n = len(close) + tr = np.empty(n) + atr_vals = np.full(n, np.nan) + + # Calculate True Range + tr[0] = high[0] - low[0] + for i in range(1, n): + hl = high[i] - low[i] + hc = abs(high[i] - close[i-1]) + lc = abs(low[i] - close[i-1]) + tr[i] = max(max(hl, hc), lc) + + if n < period: + return atr_vals + + # First ATR value is the simple average of the first 'period' true ranges + atr_vals[period-1] = np.mean(tr[:period]) + + # Calculate subsequent ATR values using Wilder's smoothing + for i in range(period, n): + atr_vals[i] = (atr_vals[i-1] * (period - 1) + tr[i]) / period + + return atr_vals + + +@njit +def _calculate_keltner(source: np.ndarray, high: np.ndarray, low: np.ndarray, close: np.ndarray, + ma_values: np.ndarray, period: int, multiplier: float) -> tuple: + """ + Core Keltner Channel calculation using Numba """ - Keltner Channels + atr_vals = _atr(high, low, close, period) + + up = ma_values + atr_vals * multiplier + low = ma_values - atr_vals * multiplier + + return up, ma_values, low + + +def keltner(candles: np.ndarray, period: int = 20, multiplier: float = 2, matype: int = 1, + source_type: str = "close", sequential: bool = False) -> KeltnerChannel: + """ + Keltner Channels using Numba for optimization :param candles: np.ndarray :param period: int - default: 20 @@ -23,16 +65,23 @@ def keltner(candles: np.ndarray, period: int = 20, multiplier: float = 2, matype :return: KeltnerChannel(upperband, middleband, lowerband) """ - candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - e = ma(source, period=period, matype=matype, sequential=True) - a = talib.ATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - - up = e + a * multiplier - mid = e - low = e - a * multiplier + if matype == 24 or matype == 29: + ma_values = ma(candles, period=period, matype=matype, source_type=source_type, sequential=True) + else: + ma_values = ma(source, period=period, matype=matype, sequential=True) + + up, mid, low = _calculate_keltner( + source, + candles[:, 3], # high + candles[:, 4], # low + candles[:, 2], # close + ma_values, + period, + multiplier + ) if sequential: return KeltnerChannel(up, mid, low) diff --git a/jesse/indicators/kst.py b/jesse/indicators/kst.py index d83b97a44..2b4148014 100644 --- a/jesse/indicators/kst.py +++ b/jesse/indicators/kst.py @@ -1,7 +1,8 @@ from collections import namedtuple +from jesse.indicators.roc import roc as _roc +from jesse.indicators.sma import sma as _sma import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -30,16 +31,21 @@ def kst(candles: np.ndarray, sma_period1: int = 10, sma_period2: int = 10, sma_p :return: KST(line, signal) """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - aroc1 = talib.SMA(talib.ROC(source, timeperiod=roc_period1), sma_period1) - aroc2 = talib.SMA(talib.ROC(source, timeperiod=roc_period2), sma_period2) - aroc3 = talib.SMA(talib.ROC(source, timeperiod=roc_period3), sma_period3) - aroc4 = talib.SMA(talib.ROC(source, timeperiod=roc_period4), sma_period4) - line = aroc1[aroc1.size - aroc4.size:] + 2 * aroc2[aroc2.size - aroc4.size:] + \ - 3 * aroc3[aroc3.size - aroc4.size:] + 4 * aroc4 - signal = talib.SMA(line, signal_period) + aroc1 = _sma(_roc(source, roc_period1, sequential=True), sma_period1, sequential=True) + aroc2 = _sma(_roc(source, roc_period2, sequential=True), sma_period2, sequential=True) + aroc3 = _sma(_roc(source, roc_period3, sequential=True), sma_period3, sequential=True) + aroc4 = _sma(_roc(source, roc_period4, sequential=True), sma_period4, sequential=True) + + # Align arrays so that all have the same length as aroc4 + aligned_len = aroc4.size + aroc1_aligned = aroc1[aroc1.size - aligned_len:] + aroc2_aligned = aroc2[aroc2.size - aligned_len:] + aroc3_aligned = aroc3[aroc3.size - aligned_len:] + + line = aroc1_aligned + 2 * aroc2_aligned + 3 * aroc3_aligned + 4 * aroc4 + signal = _sma(line, signal_period, sequential=True) if sequential: return KST(line, signal) diff --git a/jesse/indicators/kvo.py b/jesse/indicators/kvo.py index 2f658df12..0709820e2 100644 --- a/jesse/indicators/kvo.py +++ b/jesse/indicators/kvo.py @@ -1,27 +1,52 @@ from typing import Union - import numpy as np -import tulipy as ti - -from jesse.helpers import same_length, slice_candles +from jesse.helpers import slice_candles +from jesse.indicators import ema -def kvo(candles: np.ndarray, short_period: int = 2, long_period: int = 5, sequential: bool = False) -> Union[ - float, np.ndarray]: +def kvo(candles: np.ndarray, short_period: int = 34, long_period: int = 55, sequential: bool = False) -> Union[float, np.ndarray]: """ KVO - Klinger Volume Oscillator :param candles: np.ndarray - :param short_period: int - default: 2 - :param long_period: int - default: 5 + :param short_period: int - default: 34 + :param long_period: int - default: 55 :param sequential: bool - default: False :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - res = ti.kvo(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), - np.ascontiguousarray(candles[:, 2]), np.ascontiguousarray(candles[:, 5]), short_period=short_period, - long_period=long_period) - - return same_length(candles, res) if sequential else res[-1] + # Calculate HLC3 + hlc3 = (candles[:, 3] + candles[:, 4] + candles[:, 2]) / 3 + + # Calculate momentum (change in HLC3) + mom = np.diff(hlc3, prepend=hlc3[0]) + + # Calculate trend + trend = np.zeros_like(mom) + trend[1:] = np.where(mom[1:] > 0, 1, np.where(mom[1:] < 0, -1, trend[:-1])) + + # Daily Measurement (High - Low) + dm = candles[:, 3] - candles[:, 4] + + # Cumulative Measurement + cm = np.zeros_like(dm) + for i in range(1, len(trend)): + if trend[i] == trend[i-1]: + cm[i] = cm[i-1] + dm[i] + else: + cm[i] = dm[i] + dm[i-1] + + # Volume Force + volume = candles[:, 5] + with np.errstate(divide='ignore', invalid='ignore'): + expr = np.abs(np.divide(2 * dm, cm, out=np.zeros_like(dm, dtype=float), where=cm != 0) - 1) + vf = 100 * volume * trend * expr + vf[cm == 0] = 0 + + # Calculate EMAs + fast_ema = ema(vf, period=short_period, sequential=True) + slow_ema = ema(vf, period=long_period, sequential=True) + res = fast_ema - slow_ema + return res if sequential else res[-1] diff --git a/jesse/indicators/linearreg.py b/jesse/indicators/linearreg.py index af51592d4..b44ad1c59 100644 --- a/jesse/indicators/linearreg.py +++ b/jesse/indicators/linearreg.py @@ -1,11 +1,28 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles +@njit(cache=True) +def _fast_linearreg(source: np.ndarray, period: int) -> np.ndarray: + n = len(source) + result = np.full(n, np.nan) + x = np.arange(period) + mean_x = (period - 1) / 2.0 + S_xx = np.sum((x - mean_x) ** 2) + + for i in range(n - period + 1): + window = source[i:i+period] + mean_y = np.mean(window) + S_xy = np.sum((window - mean_y) * (x - mean_x)) + result[i + period - 1] = mean_y + ((period - 1) / 2.0) * (S_xy / S_xx) + + return result + + def linearreg(candles: np.ndarray, period: int = 14, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: """ @@ -24,6 +41,21 @@ def linearreg(candles: np.ndarray, period: int = 14, source_type: str = "close", candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.LINEARREG(source, timeperiod=period) + n = len(source) + if n >= period: + try: + from numpy.lib.stride_tricks import sliding_window_view + windows = sliding_window_view(source, window_shape=period) # shape (n - period + 1, period) + mean_y = np.mean(windows, axis=1) + x = np.arange(period) + mean_x = (period - 1) / 2.0 + S_xx = np.sum((x - mean_x) ** 2) + S_xy = np.sum((windows - mean_y[:, None]) * (x - mean_x), axis=1) + result = np.full(n, np.nan) + result[period-1:] = mean_y + ((period - 1) / 2.0) * (S_xy / S_xx) + except ImportError: + result = _fast_linearreg(source, period) + else: + result = np.full(n, np.nan) - return res if sequential else res[-1] + return result if sequential else result[-1] diff --git a/jesse/indicators/linearreg_angle.py b/jesse/indicators/linearreg_angle.py index d1d782859..22acb6a0c 100644 --- a/jesse/indicators/linearreg_angle.py +++ b/jesse/indicators/linearreg_angle.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -24,6 +23,18 @@ def linearreg_angle(candles: np.ndarray, period: int = 14, source_type: str = "c candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.LINEARREG_ANGLE(source, timeperiod=period) - + N = len(source) + res = np.full(N, np.nan) + if N >= period: + # Create rolling windows of length 'period' + windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + x = np.arange(period) + sum_x = x.sum() + sum_x2 = (x * x).sum() + common_den = period * sum_x2 - sum_x ** 2 + sum_y = np.sum(windows, axis=1) + sum_xy = windows.dot(x) + slopes = (period * sum_xy - sum_x * sum_y) / common_den + angles = np.degrees(np.arctan(slopes)) + res[period - 1:] = angles return res if sequential else res[-1] diff --git a/jesse/indicators/linearreg_intercept.py b/jesse/indicators/linearreg_intercept.py index 15b363a8a..ce918faf5 100644 --- a/jesse/indicators/linearreg_intercept.py +++ b/jesse/indicators/linearreg_intercept.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -24,6 +23,28 @@ def linearreg_intercept(candles: np.ndarray, period: int = 14, source_type: str candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.LINEARREG_INTERCEPT(source, timeperiod=period) - - return res if sequential else res[-1] + # Compute linear regression intercept using vectorized operations + if len(source) < period: + if sequential: + return np.full_like(source, np.nan, dtype=float) + else: + return np.nan + + x = np.arange(period, dtype=float) + x_mean = x.mean() + sxx = ((x - x_mean) ** 2).sum() + + if sequential: + # Compute rolling windows using a vectorized approach + windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + means = windows.mean(axis=1) + slopes = np.dot(windows - means[:, None], (x - x_mean)) / sxx + intercepts = means - slopes * x_mean + result = np.concatenate((np.full(period - 1, np.nan), intercepts)) + return result + else: + window = source[-period:] + mean_val = window.mean() + slope = np.dot(window - mean_val, (x - x_mean)) / sxx + intercept = mean_val - slope * x_mean + return intercept diff --git a/jesse/indicators/linearreg_slope.py b/jesse/indicators/linearreg_slope.py index cabeee40b..fbbae3900 100644 --- a/jesse/indicators/linearreg_slope.py +++ b/jesse/indicators/linearreg_slope.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -24,6 +23,23 @@ def linearreg_slope(candles: np.ndarray, period: int = 14, source_type: str = "c candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.LINEARREG_SLOPE(source, timeperiod=period) - - return res if sequential else res[-1] + n = len(source) + result = np.full(n, np.nan, dtype=float) + if n < period: + return result if sequential else result[-1] + + # Create a constant x-axis for the regression + X = np.arange(period, dtype=float) + sumX = X.sum() + sumX2 = (X**2).sum() + denom = period * sumX2 - sumX**2 + + # Compute the rolling window slopes using vectorized operations + windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + sum_y = windows.sum(axis=1) + sum_xy = (windows * X).sum(axis=1) + slopes = (period * sum_xy - sumX * sum_y) / denom + + result[period-1:] = slopes + + return result if sequential else result[-1] diff --git a/jesse/indicators/ma.py b/jesse/indicators/ma.py index 886e1e1e2..6c41c4728 100644 --- a/jesse/indicators/ma.py +++ b/jesse/indicators/ma.py @@ -25,8 +25,6 @@ def ma(candles: np.ndarray, period: int = 30, matype: int = 0, source_type: str 4: tema (triple exponential) 5: trima (triangular) 6: kama (Kaufman adaptive) - 7: mama (Mesa adaptive) - 8: T3 (triple exponential T3) 9: fwma (Fibonacci's Weighted Moving Average) 10: hma (Hull Moving Average) 11: linearreg (Linear Regression) @@ -63,11 +61,27 @@ def ma(candles: np.ndarray, period: int = 30, matype: int = 0, source_type: str candles = slice_candles(candles, sequential) - if matype <= 8: - from talib import MA - if len(candles.shape) != 1: - candles = get_candle_source(candles, source_type=source_type) - res = MA(candles, timeperiod=period, matype=matype) + if matype == 0: + from . import sma + res = sma(candles, period, source_type=source_type, sequential=True) + elif matype == 1: + from . import ema + res = ema(candles, period, source_type=source_type, sequential=True) + elif matype == 2: + from . import wma + res = wma(candles, period, source_type=source_type, sequential=True) + elif matype == 3: + from . import dema + res = dema(candles, period, source_type=source_type, sequential=True) + elif matype == 4: + from . import tema + res = tema(candles, period, source_type=source_type, sequential=True) + elif matype == 5: + from . import trima + res = trima(candles, period, source_type=source_type, sequential=True) + elif matype == 6: + from . import kama + res = kama(candles, period, source_type=source_type, sequential=True) elif matype == 9: from . import fwma res = fwma(candles, period, source_type=source_type, sequential=True) @@ -75,10 +89,8 @@ def ma(candles: np.ndarray, period: int = 30, matype: int = 0, source_type: str from . import hma res = hma(candles, period, source_type=source_type, sequential=True) elif matype == 11: - from talib import LINEARREG - if len(candles.shape) != 1: - candles = get_candle_source(candles, source_type=source_type) - res = LINEARREG(candles, period) + from . import linearreg + res = linearreg(candles, period, source_type=source_type, sequential=True) elif matype == 12: from . import wilders res = wilders(candles, period, source_type=source_type, sequential=True) @@ -100,11 +112,6 @@ def ma(candles: np.ndarray, period: int = 30, matype: int = 0, source_type: str elif matype == 18: from . import high_pass_2_pole res = high_pass_2_pole(candles, period, source_type=source_type, sequential=True) - elif matype == 19: - from talib import HT_TRENDLINE - if len(candles.shape) != 1: - candles = get_candle_source(candles, source_type=source_type) - res = HT_TRENDLINE(candles) elif matype == 20: from . import jma res = jma(candles, period, source_type=source_type, sequential=True) @@ -169,5 +176,7 @@ def ma(candles: np.ndarray, period: int = 30, matype: int = 0, source_type: str elif matype == 39: from . import epma res = epma(candles, period, source_type=source_type, sequential=True) + elif matype == 7 or matype == 8 or matype == 19: + raise ValueError("Invalid matype value.") return res if sequential else res[-1] diff --git a/jesse/indicators/maaq.py b/jesse/indicators/maaq.py index fff64da5c..1157c8187 100644 --- a/jesse/indicators/maaq.py +++ b/jesse/indicators/maaq.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from numba import njit from jesse.helpers import (get_candle_source, np_shift, same_length, @@ -33,7 +32,7 @@ def maaq(candles: np.ndarray, period: int = 11, fast_period: int = 2, slow_perio diff = np.abs(source - np_shift(source, 1, np.nan)) signal = np.abs(source - np_shift(source, period, np.nan)) - noise = talib.SUM(diff, period) + noise = np.concatenate((np.full(period - 1, np.nan, dtype=source.dtype), np.convolve(diff, np.ones(period, dtype=source.dtype), mode='valid'))) # Safely divide signal by noise ratio = np.divide(signal, noise, out=np.zeros_like(signal), where=(noise != 0)) diff --git a/jesse/indicators/mab.py b/jesse/indicators/mab.py index fac1bb796..1eb68b6a8 100644 --- a/jesse/indicators/mab.py +++ b/jesse/indicators/mab.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles from jesse.indicators.ma import ma @@ -31,9 +30,13 @@ def mab(candles: np.ndarray, fast_period: int = 10, slow_period: int = 50, devup source = get_candle_source(candles, source_type=source_type) - fastEma = ma(source, period=fast_period, matype=fast_matype, sequential=True) - slowEma = ma(source, period=slow_period, matype=slow_matype, sequential=True) - sqAvg = talib.SUM(np.power(fastEma - slowEma, 2), fast_period) / fast_period + if any(matype in (24, 29) for matype in (fast_matype, slow_matype)): + fastEma = ma(candles, period=fast_period, matype=fast_matype, source_type=source_type, sequential=True) + slowEma = ma(candles, period=slow_period, matype=slow_matype, source_type=source_type, sequential=True) + else: + fastEma = ma(source, period=fast_period, matype=fast_matype, source_type=source_type, sequential=True) + slowEma = ma(source, period=slow_period, matype=slow_matype, source_type=source_type, sequential=True) + sqAvg = np.sum(np.power(fastEma - slowEma, 2)[-fast_period:]) / fast_period dev = np.sqrt(sqAvg) middlebands = fastEma diff --git a/jesse/indicators/macd.py b/jesse/indicators/macd.py index 0132b0ee0..7d8aecda3 100644 --- a/jesse/indicators/macd.py +++ b/jesse/indicators/macd.py @@ -1,18 +1,41 @@ from collections import namedtuple import numpy as np -import talib - +from numba import njit from jesse.helpers import get_candle_source, slice_candles MACD = namedtuple('MACD', ['macd', 'signal', 'hist']) +@njit +def ema_numba(source, period): + ema_array = np.empty_like(source) + alpha = 2.0 / (period + 1) + ema_array[0] = source[0] + for i in range(1, len(source)): + ema_array[i] = alpha * source[i] + (1 - alpha) * ema_array[i - 1] + return ema_array + +@njit +def subtract_arrays(a, b): + c = np.empty_like(a) + for i in range(len(a)): + c[i] = a[i] - b[i] + return c + +@njit +def clean_nan(arr): + # Replace NaN with 0.0 using a simple loop (nan != nan is True) + for i in range(arr.shape[0]): + if arr[i] != arr[i]: + arr[i] = 0.0 + return arr + def macd(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, signal_period: int = 9, source_type: str = "close", sequential: bool = False) -> MACD: """ - MACD - Moving Average Convergence/Divergence + MACD - Moving Average Convergence/Divergence using numba for faster computation :param candles: np.ndarray :param fast_period: int - default: 12 @@ -30,10 +53,21 @@ def macd(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, sign candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - macd_val, macdsignal, macdhist = talib.MACD(source, fastperiod=fast_period, slowperiod=slow_period, - signalperiod=signal_period) + # Compute fast and slow EMAs using numba accelerated function + ema_fast = ema_numba(source, fast_period) + ema_slow = ema_numba(source, slow_period) + + # Compute the MACD line using a numba-compiled subtraction loop + macd_line = subtract_arrays(ema_fast, ema_slow) + macd_line_cleaned = clean_nan(macd_line) + + # Compute the signal line as the EMA of the MACD line + signal_line = ema_numba(macd_line_cleaned, signal_period) + + # Calculate histogram as the difference between MACD line and signal line + hist = subtract_arrays(macd_line, signal_line) if sequential: - return MACD(macd_val, macdsignal, macdhist) + return MACD(macd_line_cleaned, signal_line, hist) else: - return MACD(macd_val[-1], macdsignal[-1], macdhist[-1]) + return MACD(macd_line_cleaned[-1], signal_line[-1], hist[-1]) diff --git a/jesse/indicators/macdext.py b/jesse/indicators/macdext.py deleted file mode 100644 index 29498ea31..000000000 --- a/jesse/indicators/macdext.py +++ /dev/null @@ -1,53 +0,0 @@ -from collections import namedtuple - -import numpy as np - -from jesse.helpers import get_candle_source, same_length, slice_candles -from jesse.indicators.ma import ma - -MACDEXT = namedtuple('MACDEXT', ['macd', 'signal', 'hist']) - - -def macdext(candles: np.ndarray, fast_period: int = 12, fast_matype: int = 0, slow_period: int = 26, - slow_matype: int = 0, signal_period: int = 9, signal_matype: int = 0, source_type: str = "close", - sequential: bool = False) -> MACDEXT: - """ - MACDEXT - MACD with controllable MA type - - :param candles: np.ndarray - :param fast_period: int - default: 12 - :param fast_matype: int - default: 0 - :param slow_period: int - default: 26 - :param slow_matype: int - default: 0 - :param signal_period: int - default: 9 - :param signal_matype: int - default: 0 - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: MACDEXT(macd, signal, hist) - """ - candles = slice_candles(candles, sequential) - - if fast_matype == 29 or slow_matype == 29 or signal_matype == 29: - raise ValueError("VWAP not supported in macdext.") - - ma_fast = ma(candles, period=fast_period, matype=fast_matype, source_type=source_type, sequential=True) - ma_slow = ma(candles, period=slow_period, matype=slow_matype, source_type=source_type, sequential=True) - macd = ma_fast - ma_slow - - if signal_matype == 24: - # volume needed. - candles[:, 2] = macd - candles_without_nan = candles[~np.isnan(candles).any(axis=1)] - macdsignal = ma(candles_without_nan, period=signal_period, matype=signal_matype, source_type="close", sequential=True) - else: - macd_without_nan = macd[~np.isnan(macd)] - macdsignal = ma(macd_without_nan, period=signal_period, matype=signal_matype, sequential=True) - - macdsignal = same_length(candles, macdsignal) - macdhist = macd - macdsignal - - if sequential: - return MACDEXT(macd, macdsignal, macdhist) - else: - return MACDEXT(macd[-1], macdsignal[-1], macdhist[-1]) diff --git a/jesse/indicators/mama.py b/jesse/indicators/mama.py index 4bac153a9..6a5fee334 100644 --- a/jesse/indicators/mama.py +++ b/jesse/indicators/mama.py @@ -1,7 +1,7 @@ from collections import namedtuple import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles @@ -11,14 +11,14 @@ def mama(candles: np.ndarray, fastlimit: float = 0.5, slowlimit: float = 0.05, source_type: str = "close", sequential: bool = False) -> MAMA: """ - MAMA - MESA Adaptive Moving Average + MAMA - MESA Adaptive Moving Average (custom implementation) - :param candles: np.ndarray + + :param candles: np.ndarray of candle data or price series :param fastlimit: float - default: 0.5 :param slowlimit: float - default: 0.05 :param source_type: str - default: "close" - :param sequential: bool - default: False - + :param sequential: bool - if True, returns full arrays; else returns only the last value :return: MAMA(mama, fama) """ if len(candles.shape) == 1: @@ -27,9 +27,119 @@ def mama(candles: np.ndarray, fastlimit: float = 0.5, slowlimit: float = 0.05, s candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - mama_val, fama = talib.MAMA(source, fastlimit=fastlimit, slowlimit=slowlimit) + n = len(source) + mama_arr = np.zeros(n) + fama_arr = np.zeros(n) + # Initialize first element + mama_arr[0] = source[0] + fama_arr[0] = source[0] + + mama_arr, fama_arr = fast_mama(source, fastlimit, slowlimit) + + # Iterate over the series to compute the indicator recursively if sequential: - return MAMA(mama_val, fama) + return MAMA(mama_arr, fama_arr) else: - return MAMA(mama_val[-1], fama[-1]) + return MAMA(mama_arr[-1], fama_arr[-1]) + +@njit(cache=True) +def fast_mama(source, fastlimit, slowlimit): + n = len(source) + sp = np.zeros(n) + dt = np.zeros(n) + q1 = np.zeros(n) + i1_arr = np.zeros(n) + jI = np.zeros(n) + jq = np.zeros(n) + i2_arr = np.zeros(n) + q2_arr = np.zeros(n) + re_arr = np.zeros(n) + im_arr = np.zeros(n) + p1_arr = np.zeros(n) + p2_arr = np.zeros(n) + p3_arr = np.zeros(n) + p_arr = np.zeros(n) + spp = np.zeros(n) + phase = np.zeros(n) + dphase = np.zeros(n) + alpha_arr = np.zeros(n) + mama_arr = np.zeros(n) + fama_arr = np.zeros(n) + pi = 3.1415926 + + for i in range(1, n): + # sp: weighted average of the source over 4 bars + sp[i] = (4 * source[i] + + 3 * (source[i-1] if i-1 >= 0 else 0) + + 2 * (source[i-2] if i-2 >= 0 else 0) + + (source[i-3] if i-3 >= 0 else 0)) / 10.0 + + dt[i] = (0.0962 * sp[i] + + 0.5769 * (sp[i-2] if i-2 >= 0 else 0) - + 0.5769 * (sp[i-4] if i-4 >= 0 else 0) - + 0.0962 * (sp[i-6] if i-6 >= 0 else 0)) * (0.075 * (p_arr[i-1] if i-1 >= 0 else 0) + 0.54) + + q1[i] = (0.0962 * dt[i] + + 0.5769 * (dt[i-2] if i-2 >= 0 else 0) - + 0.5769 * (dt[i-4] if i-4 >= 0 else 0) - + 0.0962 * (dt[i-6] if i-6 >= 0 else 0)) * (0.075 * (p_arr[i-1] if i-1 >= 0 else 0) + 0.54) + + i1_arr[i] = dt[i-3] if i-3 >= 0 else 0 + + jI[i] = (0.0962 * i1_arr[i] + + 0.5769 * (i1_arr[i-2] if i-2 >= 0 else 0) - + 0.5769 * (i1_arr[i-4] if i-4 >= 0 else 0) - + 0.0962 * (i1_arr[i-6] if i-6 >= 0 else 0)) * (0.075 * (p_arr[i-1] if i-1 >= 0 else 0) + 0.54) + + jq[i] = (0.0962 * q1[i] + + 0.5769 * (q1[i-2] if i-2 >= 0 else 0) - + 0.5769 * (q1[i-4] if i-4 >= 0 else 0) - + 0.0962 * (q1[i-6] if i-6 >= 0 else 0)) * (0.075 * (p_arr[i-1] if i-1 >= 0 else 0) + 0.54) + + i2_temp = i1_arr[i] - jq[i] + q2_temp = q1[i] + jI[i] + + i2_arr[i] = 0.2 * i2_temp + 0.8 * (i2_arr[i-1] if i-1 >= 0 else 0) + q2_arr[i] = 0.2 * q2_temp + 0.8 * (q2_arr[i-1] if i-1 >= 0 else 0) + + re_temp = i2_arr[i] * (i2_arr[i-1] if i-1 >= 0 else 0) + q2_arr[i] * (q2_arr[i-1] if i-1 >= 0 else 0) + im_temp = i2_arr[i] * (q2_arr[i-1] if i-1 >= 0 else 0) - q2_arr[i] * (i2_arr[i-1] if i-1 >= 0 else 0) + + re_arr[i] = 0.2 * re_temp + 0.8 * (re_arr[i-1] if i-1 >= 0 else 0) + im_arr[i] = 0.2 * im_temp + 0.8 * (im_arr[i-1] if i-1 >= 0 else 0) + + if im_arr[i] != 0 and re_arr[i] != 0: + p1_arr[i] = 2 * pi / np.arctan(im_arr[i] / re_arr[i]) + else: + p1_arr[i] = p_arr[i-1] if i-1 >= 0 else 0 + + if p1_arr[i] > 1.5 * (p_arr[i-1] if i-1 >= 0 else 0): + p2 = 1.5 * (p_arr[i-1] if i-1 >= 0 else 0) + elif p1_arr[i] < 0.67 * (p_arr[i-1] if i-1 >= 0 else 0): + p2 = 0.67 * (p_arr[i-1] if i-1 >= 0 else 0) + else: + p2 = p1_arr[i] + p2_arr[i] = p2 + + p3_arr[i] = 6 if p2_arr[i] < 6 else (50 if p2_arr[i] > 50 else p2_arr[i]) + p_arr[i] = 0.2 * p3_arr[i] + 0.8 * (p_arr[i-1] if i-1 >= 0 else 0) + spp[i] = 0.33 * p_arr[i] + 0.67 * (spp[i-1] if i-1 >= 0 else 0) + + phase[i] = (180 / pi) * np.arctan(q1[i] / i1_arr[i]) if i1_arr[i] != 0 else 0 + dphase_val = (phase[i-1] if i-1 >= 0 else 0) - phase[i] + dphase_val = dphase_val if dphase_val >= 1 else 1 + dphase[i] = dphase_val + + alpha_temp = fastlimit / dphase[i] + if alpha_temp < slowlimit: + alpha_arr[i] = slowlimit + elif alpha_temp > fastlimit: + alpha_arr[i] = fastlimit + else: + alpha_arr[i] = alpha_temp + + mama_arr[i] = alpha_arr[i] * source[i] + (1 - alpha_arr[i]) * (mama_arr[i-1] if i-1 >= 0 else source[i]) + fama_arr[i] = 0.5 * alpha_arr[i] * mama_arr[i] + (1 - 0.5 * alpha_arr[i]) * (fama_arr[i-1] if i-1 >= 0 else source[i]) + + return mama_arr, fama_arr \ No newline at end of file diff --git a/jesse/indicators/marketfi.py b/jesse/indicators/marketfi.py index b12b7c2a0..c0691cf93 100644 --- a/jesse/indicators/marketfi.py +++ b/jesse/indicators/marketfi.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import tulipy as ti from jesse.helpers import same_length, slice_candles @@ -9,6 +8,7 @@ def marketfi(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarray]: """ MARKETFI - Market Facilitation Index + Formula: (High - Low) / Volume :param candles: np.ndarray :param sequential: bool - default: False @@ -17,7 +17,7 @@ def marketfi(candles: np.ndarray, sequential: bool = False) -> Union[float, np.n """ candles = slice_candles(candles, sequential) - res = ti.marketfi(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), - np.ascontiguousarray(candles[:, 5])) + # high is at index 3, low at index 4, volume at index 5 + res = (candles[:, 3] - candles[:, 4]) / candles[:, 5] return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/mass.py b/jesse/indicators/mass.py index cfd457476..5b9703f91 100644 --- a/jesse/indicators/mass.py +++ b/jesse/indicators/mass.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import same_length, slice_candles @@ -9,6 +9,9 @@ def mass(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Union[float, np.ndarray]: """ MASS - Mass Index + The Mass Index uses the high-low range to identify trend reversals based on range expansions. + It suggests that a reversal of the current trend may be imminent when the range widens beyond + a certain point and then contracts. :param candles: np.ndarray :param period: int - default: 5 @@ -18,6 +21,39 @@ def mass(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Unio """ candles = slice_candles(candles, sequential) - res = ti.mass(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), period=period) + # Calculate high-low range + high_low_range = candles[:, 3] - candles[:, 4] # high - low + + # Calculate 9-period EMA of high-low range + ema1 = calc_ema(high_low_range, 9) + + # Calculate 9-period EMA of the first EMA + ema2 = calc_ema(ema1, 9) + + # Calculate EMA ratio + ratio = np.divide(ema1, ema2, out=np.zeros_like(ema1), where=ema2 != 0) + + # Calculate period-sum of ratio using Numba for optimization + res = mass_sum(ratio, period) return same_length(candles, res) if sequential else res[-1] + + +@njit(cache=True) +def mass_sum(ratio: np.ndarray, period: int) -> np.ndarray: + """Calculate the sum of the ratio over the specified period""" + result = np.zeros_like(ratio) + for i in range(period - 1, len(ratio)): + result[i] = np.sum(ratio[i-period+1:i+1]) + return result + + +@njit(cache=True) +def calc_ema(data, n): + alpha = 2.0 / (n + 1) + result = np.empty(data.shape[0]) + result[0] = data[0] + for i in range(1, data.shape[0]): + result[i] = alpha * data[i] + (1 - alpha) * result[i-1] + return result + diff --git a/jesse/indicators/medprice.py b/jesse/indicators/medprice.py index 665991516..04a9a3a86 100644 --- a/jesse/indicators/medprice.py +++ b/jesse/indicators/medprice.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,6 @@ def medprice(candles: np.ndarray, sequential: bool = False) -> Union[float, np.n """ candles = slice_candles(candles, sequential) - res = talib.MEDPRICE(candles[:, 3], candles[:, 4]) + res = (candles[:, 3] + candles[:, 4]) / 2 return res if sequential else res[-1] diff --git a/jesse/indicators/mfi.py b/jesse/indicators/mfi.py index cd83c170e..52ddaa438 100644 --- a/jesse/indicators/mfi.py +++ b/jesse/indicators/mfi.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -18,6 +17,38 @@ def mfi(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Unio """ candles = slice_candles(candles, sequential) - res = talib.MFI(candles[:, 3], candles[:, 4], candles[:, 2], candles[:, 5], timeperiod=period) + # Extract high, low, close and volume from candles array + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + volume = candles[:, 5] - return res if sequential else res[-1] + # Compute Typical Price for each candle + typical_prices = (high + low + close) / 3.0 + + # Compute Raw Money Flow = Typical Price * Volume + raw_mf = typical_prices * volume + + # Initialize positive and negative flows + pos_flow = np.zeros_like(typical_prices) + neg_flow = np.zeros_like(typical_prices) + # For each candle (starting from 1) decide if it's positive or negative money flow + pos_flow[1:] = np.where(typical_prices[1:] > typical_prices[:-1], raw_mf[1:], 0) + neg_flow[1:] = np.where(typical_prices[1:] < typical_prices[:-1], raw_mf[1:], 0) + + # Compute rolling sums over the specified period using convolution + roll_pos = np.convolve(pos_flow, np.ones(period), mode='valid') + roll_neg = np.convolve(neg_flow, np.ones(period), mode='valid') + + # Compute Money Flow Ratio; handle division by zero by treating as infinity + with np.errstate(divide='ignore', invalid='ignore'): + ratio = np.divide(roll_pos, roll_neg, out=np.full_like(roll_pos, np.inf, dtype=float), where=roll_neg != 0) + + # Compute MFI + mfi_values = 100 - (100 / (1 + ratio)) + + # Prepend NaNs for indices that couldn't compute a full period + pad = np.full(period - 1, np.nan) + mfi_values = np.concatenate((pad, mfi_values)) + + return mfi_values if sequential else mfi_values[-1] diff --git a/jesse/indicators/midpoint.py b/jesse/indicators/midpoint.py index a12ff33f7..3d9694d94 100644 --- a/jesse/indicators/midpoint.py +++ b/jesse/indicators/midpoint.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -21,6 +20,23 @@ def midpoint(candles: np.ndarray, period: int = 14, source_type: str = "close", candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.MIDPOINT(source, timeperiod=period) - return res if sequential else res[-1] + # If there is not enough data, return nan values + if len(source) < period: + if sequential: + return np.full_like(source, np.nan) + else: + return np.nan + + # Use a sliding window to compute the midpoint: (max + min) / 2 over each rolling window + windows = np.lib.stride_tricks.sliding_window_view(source, period) + midpoints = (np.max(windows, axis=1) + np.min(windows, axis=1)) / 2.0 + + # Pad the beginning with nans to match the input length if sequential is True + if sequential: + result = np.empty_like(source, dtype=float) + result[:period - 1] = np.nan + result[period - 1:] = midpoints + return result + else: + return midpoints[-1] diff --git a/jesse/indicators/midprice.py b/jesse/indicators/midprice.py index 31378574b..3ec40b258 100644 --- a/jesse/indicators/midprice.py +++ b/jesse/indicators/midprice.py @@ -1,9 +1,8 @@ from typing import Union import numpy as np -import talib - from jesse.helpers import slice_candles +from numpy.lib.stride_tricks import sliding_window_view def midprice(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Union[float, np.ndarray]: @@ -17,7 +16,25 @@ def midprice(candles: np.ndarray, period: int = 14, sequential: bool = False) -> :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.MIDPRICE(candles[:, 3], candles[:, 4], timeperiod=period) - - return res if sequential else res[-1] + high = candles[:, 3] + low = candles[:, 4] + + if sequential: + n = len(candles) + if n < period: + return np.full(n, np.nan) + + # Create sliding windows for high and low prices + windows_high = sliding_window_view(high, window_shape=period) + windows_low = sliding_window_view(low, window_shape=period) + + # Calculate midprice for each window + midprices = (np.max(windows_high, axis=1) + np.min(windows_low, axis=1)) / 2 + + # Prepend NaN for the initial period-1 values to match the typical TA-Lib output length + result = np.concatenate((np.full(period - 1, np.nan), midprices)) + return result + else: + if len(candles) < period: + return np.nan + return (np.max(high[-period:]) + np.min(low[-period:])) / 2 diff --git a/jesse/indicators/mom.py b/jesse/indicators/mom.py index f2c18ffb6..bada74a2f 100644 --- a/jesse/indicators/mom.py +++ b/jesse/indicators/mom.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -21,6 +20,11 @@ def mom(candles: np.ndarray, period: int = 10, source_type: str = "close", seque candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.MOM(source, timeperiod=period) + res = np.empty_like(source, dtype=float) + if len(source) >= period: + res[:period] = np.nan + res[period:] = source[period:] - source[:-period] + else: + res[:] = np.nan return res if sequential else res[-1] diff --git a/jesse/indicators/msw.py b/jesse/indicators/msw.py deleted file mode 100644 index cb661d56a..000000000 --- a/jesse/indicators/msw.py +++ /dev/null @@ -1,33 +0,0 @@ -from collections import namedtuple - -import numpy as np -import tulipy as ti - -from jesse.helpers import get_candle_source, same_length, slice_candles - -MSW = namedtuple('MSW', ['sine', 'lead']) - - -def msw(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> MSW: - """ - MSW - Mesa Sine Wave - - :param candles: np.ndarray - :param period: int - default: 5 - :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: MSW(sine, lead) - """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - msw_sine, msw_lead = ti.msw(np.ascontiguousarray(source), period=period) - - s = same_length(candles, msw_sine) - l = same_length(candles, msw_lead) - - if sequential: - return MSW(s, l) - else: - return MSW(s[-1], l[-1]) diff --git a/jesse/indicators/natr.py b/jesse/indicators/natr.py index f8b90e44e..6f893634e 100644 --- a/jesse/indicators/natr.py +++ b/jesse/indicators/natr.py @@ -1,7 +1,5 @@ -from typing import Union - import numpy as np -import talib +from typing import Union from jesse.helpers import slice_candles @@ -17,7 +15,43 @@ def natr(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Uni :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.NATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - - return res if sequential else res[-1] + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + + # Compute True Range (TR) + n = len(candles) + tr = np.empty(n, dtype=float) + tr[0] = high[0] - low[0] + if n > 1: + diff1 = high[1:] - low[1:] + diff2 = np.abs(high[1:] - close[:-1]) + diff3 = np.abs(low[1:] - close[:-1]) + tr[1:] = np.maximum(np.maximum(diff1, diff2), diff3) + + # Initialize ATR array + atr = np.empty(n, dtype=float) + atr[:period-1] = np.nan # not enough data for smoothing + base = np.mean(tr[:period]) + atr[period-1] = base + + # If there's no additional data after the initial period, return the current NATR + if n == period: + result = (base / close[period-1]) * 100 + return result if not sequential else np.concatenate((np.full(period-1, np.nan), [result])) + + # Wilder's smoothing is equivalent to an exponential moving average with alpha = 1/period + alpha = 1.0 / period + beta = 1 - alpha + # For indices from period to end, we compute the recursive ATR as: + # ATR[t] = beta^(t - (period-1)) * base + sum_{i=period}^{t} (alpha * beta^(t-i) * tr[i]) + # We vectorize the summation using convolution. + x = tr[period:] + m = len(x) + weights = alpha * beta ** np.arange(m) + conv = np.convolve(x, weights, mode='full')[:m] + base_adjustment = beta ** (np.arange(1, m + 1)) * base + atr[period:] = base_adjustment + conv + + natr_arr = (atr / close) * 100 + return natr_arr if sequential else natr_arr[-1] diff --git a/jesse/indicators/nvi.py b/jesse/indicators/nvi.py index 7a6c4ec63..a39c3120d 100644 --- a/jesse/indicators/nvi.py +++ b/jesse/indicators/nvi.py @@ -1,15 +1,32 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +@njit +def _nvi_fast(source: np.ndarray, volume: np.ndarray) -> np.ndarray: + res = np.ones_like(source) + res[0] = 1000 # Starting value (conventional) + + for i in range(1, len(source)): + if volume[i] < volume[i-1]: + res[i] = res[i-1] * (1 + ((source[i] - source[i-1]) / source[i-1])) + else: + res[i] = res[i-1] + + return res + + def nvi(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ NVI - Negative Volume Index + The Negative Volume Index (NVI) is a cumulative indicator that uses the change in volume to decide when to track the price of an asset. + It suggests that smart money is at work when volume decreases and vice versa. + :param candles: np.ndarray :param source_type: str - default: "close" :param sequential: bool - default: False @@ -19,6 +36,6 @@ def nvi(candles: np.ndarray, source_type: str = "close", sequential: bool = Fals candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.nvi(np.ascontiguousarray(source), np.ascontiguousarray(candles[:, 5])) + res = _nvi_fast(source, candles[:, 5]) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/obv.py b/jesse/indicators/obv.py index 9f1be61b8..04fa7d57e 100644 --- a/jesse/indicators/obv.py +++ b/jesse/indicators/obv.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,12 @@ def obv(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarra """ candles = slice_candles(candles, sequential) - res = talib.OBV(candles[:, 2], candles[:, 5]) - - return res if sequential else res[-1] + close = candles[:, 2] + volume = candles[:, 5] + # Compute the change in OBV: add volume if price increases, subtract if decreases, else 0 + delta = np.where(close[1:] > close[:-1], volume[1:], np.where(close[1:] < close[:-1], -volume[1:], 0)) + obv_arr = np.empty_like(volume, dtype=np.float64) + obv_arr[0] = volume[0] + if len(volume) > 1: + obv_arr[1:] = volume[0] + np.cumsum(delta) + return obv_arr if sequential else obv_arr[-1] diff --git a/jesse/indicators/pattern_recognition.py b/jesse/indicators/pattern_recognition.py deleted file mode 100644 index 8a0fe0c45..000000000 --- a/jesse/indicators/pattern_recognition.py +++ /dev/null @@ -1,152 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import slice_candles - - -def pattern_recognition(candles: np.ndarray, pattern_type: str, penetration: int = 0, sequential: bool = False) -> \ - Union[int, np.ndarray]: - """ - Pattern Recognition - - :param candles: np.ndarray - :param penetration: int - default = 0 - :param pattern_type: str - :param sequential: bool - default: False - - :return: int | np.ndarray - """ - candles = slice_candles(candles, sequential) - - if pattern_type == "CDL2CROWS": - res = talib.CDL2CROWS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3BLACKCROWS": - res = talib.CDL3BLACKCROWS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3INSIDE": - res = talib.CDL3INSIDE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3LINESTRIKE": - res = talib.CDL3LINESTRIKE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3OUTSIDE": - res = talib.CDL3OUTSIDE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3STARSINSOUTH": - res = talib.CDL3STARSINSOUTH(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDL3WHITESOLDIERS": - res = talib.CDL3WHITESOLDIERS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLABANDONEDBABY": - res = talib.CDLABANDONEDBABY(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], - penetration=penetration) - elif pattern_type == "CDLADVANCEBLOCK": - res = talib.CDLADVANCEBLOCK(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLBELTHOLD": - res = talib.CDLBELTHOLD(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLBREAKAWAY": - res = talib.CDLBREAKAWAY(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLCLOSINGMARUBOZU": - res = talib.CDLCLOSINGMARUBOZU(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLCONCEALBABYSWALL": - res = talib.CDLCONCEALBABYSWALL(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLCOUNTERATTACK": - res = talib.CDLCOUNTERATTACK(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLDARKCLOUDCOVER": - res = talib.CDLDARKCLOUDCOVER(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], - penetration=penetration) - elif pattern_type == "CDLDOJI": - res = talib.CDLDOJI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLDOJISTAR": - res = talib.CDLDOJISTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLDRAGONFLYDOJI": - res = talib.CDLDRAGONFLYDOJI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLENGULFING": - res = talib.CDLENGULFING(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLEVENINGDOJISTAR": - res = talib.CDLEVENINGDOJISTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], - penetration=penetration) - elif pattern_type == "CDLEVENINGSTAR": - res = talib.CDLEVENINGSTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], penetration=penetration) - elif pattern_type == "CDLGAPSIDESIDEWHITE": - res = talib.CDLGAPSIDESIDEWHITE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLGRAVESTONEDOJI": - res = talib.CDLGRAVESTONEDOJI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHAMMER": - res = talib.CDLHAMMER(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHANGINGMAN": - res = talib.CDLHANGINGMAN(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHARAMI": - res = talib.CDLHARAMI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHARAMICROSS": - res = talib.CDLHARAMICROSS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHIGHWAVE": - res = talib.CDLHIGHWAVE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHIKKAKE": - res = talib.CDLHIKKAKE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHIKKAKEMOD": - res = talib.CDLHIKKAKEMOD(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLHOMINGPIGEON": - res = talib.CDLHOMINGPIGEON(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLIDENTICAL3CROWS": - res = talib.CDLIDENTICAL3CROWS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLINNECK": - res = talib.CDLINNECK(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLINVERTEDHAMMER": - res = talib.CDLINVERTEDHAMMER(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLKICKING": - res = talib.CDLKICKING(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLKICKINGBYLENGTH": - res = talib.CDLKICKINGBYLENGTH(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLLADDERBOTTOM": - res = talib.CDLLADDERBOTTOM(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLLONGLEGGEDDOJI": - res = talib.CDLLONGLEGGEDDOJI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLLONGLINE": - res = talib.CDLLONGLINE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLMARUBOZU": - res = talib.CDLMARUBOZU(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLMATCHINGLOW": - res = talib.CDLMATCHINGLOW(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLMATHOLD": - res = talib.CDLMATHOLD(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], penetration=penetration) - elif pattern_type == "CDLMORNINGDOJISTAR": - res = talib.CDLMORNINGDOJISTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], - penetration=penetration) - elif pattern_type == "CDLMORNINGSTAR": - res = talib.CDLMORNINGSTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2], penetration=penetration) - elif pattern_type == "CDLONNECK": - res = talib.CDLONNECK(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLPIERCING": - res = talib.CDLPIERCING(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLRICKSHAWMAN": - res = talib.CDLRICKSHAWMAN(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLRISEFALL3METHODS": - res = talib.CDLRISEFALL3METHODS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSEPARATINGLINES": - res = talib.CDLSEPARATINGLINES(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSHOOTINGSTAR": - res = talib.CDLSHOOTINGSTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSHORTLINE": - res = talib.CDLSHORTLINE(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSPINNINGTOP": - res = talib.CDLSPINNINGTOP(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSTALLEDPATTERN": - res = talib.CDLSTALLEDPATTERN(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLSTICKSANDWICH": - res = talib.CDLSTICKSANDWICH(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLTAKURI": - res = talib.CDLTAKURI(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLTASUKIGAP": - res = talib.CDLTASUKIGAP(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLTHRUSTING": - res = talib.CDLTHRUSTING(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLTRISTAR": - res = talib.CDLTRISTAR(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLUNIQUE3RIVER": - res = talib.CDLUNIQUE3RIVER(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLUPSIDEGAP2CROWS": - res = talib.CDLUPSIDEGAP2CROWS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - elif pattern_type == "CDLXSIDEGAP3METHODS": - res = talib.CDLXSIDEGAP3METHODS(candles[:, 1], candles[:, 3], candles[:, 4], candles[:, 2]) - else: - raise ValueError('pattern type string not recognised') - - return res / 100 if sequential else res[-1] / 100 diff --git a/jesse/indicators/pfe.py b/jesse/indicators/pfe.py index e0ed24411..dfa6fc525 100644 --- a/jesse/indicators/pfe.py +++ b/jesse/indicators/pfe.py @@ -1,10 +1,30 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +@njit(cache=True) +def numpy_ema(data: np.ndarray, period: int) -> np.ndarray: + alpha = 2 / (period + 1) + # Initialize the EMA with the first value + ema = np.zeros_like(data) + ema[0] = data[0] + # Calculate EMA using vectorized operations + for i in range(1, len(data)): + ema[i] = data[i] * alpha + ema[i-1] * (1 - alpha) + return ema + + +def rolling_sum(arr: np.ndarray, window: int) -> np.ndarray: + # Create a rolling window sum using convolution + window_ones = np.ones(window) + sum_result = np.convolve(arr, window_ones, mode='valid') + # Pad the beginning to maintain array length + padding = np.array([np.nan] * (len(arr) - len(sum_result))) + return np.concatenate((padding, sum_result)) + def pfe(candles: np.ndarray, period: int = 10, smoothing: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: @@ -26,8 +46,18 @@ def pfe(candles: np.ndarray, period: int = 10, smoothing: int = 5, source_type: ln = period - 1 diff = np.diff(source, ln) a = np.sqrt(np.power(diff, 2) + np.power(period, 2)) - b = talib.SUM(np.sqrt(1 + np.power(np.diff(source, 1), 2)), ln) + + # Calculate rolling sum of sqrt(1 + diff^2) + diff_1 = np.diff(source, 1) + sqrt_term = np.sqrt(1 + np.power(diff_1, 2)) + b = rolling_sum(sqrt_term, ln) + pfetmp = 100 * same_length(source, a) / same_length(source, b) - res = talib.EMA(np.where(same_length(source, diff) > 0, pfetmp, -pfetmp), smoothing) + # Replace NaN values with 0 to avoid issues in calculations + pfetmp = np.nan_to_num(pfetmp, 0) + + # Calculate the sign based on diff + sign = np.where(same_length(source, diff) > 0, 1, -1) + res = numpy_ema(sign * pfetmp, smoothing) return res if sequential else res[-1] diff --git a/jesse/indicators/ppo.py b/jesse/indicators/ppo.py index 723213a75..3855e9e8a 100644 --- a/jesse/indicators/ppo.py +++ b/jesse/indicators/ppo.py @@ -24,8 +24,12 @@ def ppo(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, matyp source = get_candle_source(candles, source_type=source_type) - fast_ma = ma(source, period=fast_period, matype=matype, sequential=True) - slow_ma = ma(source, period=slow_period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + fast_ma = ma(candles, period=fast_period, matype=matype, source_type=source_type, sequential=True) + slow_ma = ma(candles, period=slow_period, matype=matype, source_type=source_type, sequential=True) + else: + fast_ma = ma(source, period=fast_period, matype=matype, sequential=True) + slow_ma = ma(source, period=slow_period, matype=matype, sequential=True) res = 100 * (fast_ma - slow_ma) / slow_ma return res if sequential else res[-1] diff --git a/jesse/indicators/pvi.py b/jesse/indicators/pvi.py index ea8e3c7a5..cc25eea81 100644 --- a/jesse/indicators/pvi.py +++ b/jesse/indicators/pvi.py @@ -1,15 +1,35 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +@njit +def _pvi_fast(source: np.ndarray, volume: np.ndarray) -> np.ndarray: + """ + Numba optimized PVI calculation + """ + pvi = np.zeros_like(source) + pvi[0] = 1000 # Starting value + + for i in range(1, len(source)): + if volume[i] > volume[i-1]: + pvi[i] = pvi[i-1] * (1 + (source[i] - source[i-1]) / source[i-1]) + else: + pvi[i] = pvi[i-1] + + return pvi + + def pvi(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ PVI - Positive Volume Index + The Positive Volume Index (PVI) focuses on days when volume increases from the previous day. + The premise behind the PVI is that price changes accompanied by increased volume are more significant. + :param candles: np.ndarray :param source_type: str - default: "close" :param sequential: bool - default: False @@ -19,6 +39,6 @@ def pvi(candles: np.ndarray, source_type: str = "close", sequential: bool = Fals candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.pvi(np.ascontiguousarray(source), np.ascontiguousarray(candles[:, 5])) + res = _pvi_fast(np.ascontiguousarray(source), np.ascontiguousarray(candles[:, 5])) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/qstick.py b/jesse/indicators/qstick.py index 21dca95c9..e723c7648 100644 --- a/jesse/indicators/qstick.py +++ b/jesse/indicators/qstick.py @@ -1,14 +1,32 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import same_length, slice_candles +@njit +def _qstick_fast(open_prices: np.ndarray, close_prices: np.ndarray, period: int) -> np.ndarray: + """ + Calculate QStick values using Numba for optimization + """ + # Pre-allocate output array + qstick_values = np.zeros_like(open_prices, dtype=np.float64) + + # Calculate close-open difference + diff = close_prices - open_prices + + # Calculate moving average of the difference + for i in range(period - 1, len(diff)): + qstick_values[i] = np.mean(diff[i - period + 1:i + 1]) + + return qstick_values + + def qstick(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Union[float, np.ndarray]: """ - Qstick + QStick - Moving average of the difference between closing and opening prices :param candles: np.ndarray :param period: int - default: 5 @@ -18,6 +36,10 @@ def qstick(candles: np.ndarray, period: int = 5, sequential: bool = False) -> Un """ candles = slice_candles(candles, sequential) - res = ti.qstick(np.ascontiguousarray(candles[:, 1]), np.ascontiguousarray(candles[:, 2]), period=period) + res = _qstick_fast( + np.ascontiguousarray(candles[:, 1]), # open + np.ascontiguousarray(candles[:, 2]), # close + period + ) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/roc.py b/jesse/indicators/roc.py index f4e4e2dc5..ebdf073f9 100644 --- a/jesse/indicators/roc.py +++ b/jesse/indicators/roc.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -18,9 +17,15 @@ def roc(candles: np.ndarray, period: int = 10, source_type: str = "close", seque :return: float | np.ndarray """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - res = talib.ROC(source, timeperiod=period) + if len(candles.shape) == 1: + source = candles + else: + candles = slice_candles(candles, sequential) + source = get_candle_source(candles, source_type=source_type) + + n = len(source) + res = np.full(n, np.nan, dtype=float) + if n > period: + res[period:] = (source[period:] / source[:-period] - 1) * 100 return res if sequential else res[-1] diff --git a/jesse/indicators/rocp.py b/jesse/indicators/rocp.py index dd94e91d1..8f394c154 100644 --- a/jesse/indicators/rocp.py +++ b/jesse/indicators/rocp.py @@ -1,8 +1,6 @@ from typing import Union import numpy as np -import talib - from jesse.helpers import get_candle_source, slice_candles @@ -21,6 +19,8 @@ def rocp(candles: np.ndarray, period: int = 10, source_type: str = "close", sequ candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.ROCP(source, timeperiod=period) + res = np.full(source.shape, np.nan, dtype=float) + if len(source) > period: + res[period:] = (source[period:] - source[:-period]) / source[:-period] return res if sequential else res[-1] diff --git a/jesse/indicators/rocr.py b/jesse/indicators/rocr.py index ac6bb9f3a..1a5e1c8f6 100644 --- a/jesse/indicators/rocr.py +++ b/jesse/indicators/rocr.py @@ -1,15 +1,13 @@ -from typing import Union - import numpy as np -import talib + +from typing import Union from jesse.helpers import get_candle_source, slice_candles -def rocr(candles: np.ndarray, period: int = 10, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +def rocr(candles: np.ndarray, period: int = 10, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ - ROCR - Rate of change ratio: (price/prevPrice) + ROCR - Rate of change ratio: (price / price_lagged) :param candles: np.ndarray :param period: int - default: 10 @@ -19,8 +17,14 @@ def rocr(candles: np.ndarray, period: int = 10, source_type: str = "close", sequ :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = talib.ROCR(source, timeperiod=period) + + # Initialize an array of NaNs with the same shape as source + res = np.full(source.shape, np.nan, dtype=float) + + # Only compute if there are enough data points + if source.shape[0] > period: + # Compute rate of change ratio using vectorized operation; for indices < period, remains NaN + res[period:] = source[period:] / source[:-period] return res if sequential else res[-1] diff --git a/jesse/indicators/rocr100.py b/jesse/indicators/rocr100.py index 0791bde1f..aff89edf6 100644 --- a/jesse/indicators/rocr100.py +++ b/jesse/indicators/rocr100.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -21,6 +20,7 @@ def rocr100(candles: np.ndarray, period: int = 10, source_type: str = "close", s candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.ROCR100(source, timeperiod=period) - + # Vectorized calculation: for indices >= period, ROCR100 = (source[i] / source[i - period]) * 100; first period set to np.nan + res = np.full(source.shape, np.nan, dtype=float) + res[period:] = (source[period:] / source[:-period]) * 100 return res if sequential else res[-1] diff --git a/jesse/indicators/rsi.py b/jesse/indicators/rsi.py index 1f3166c19..a432ca7b2 100644 --- a/jesse/indicators/rsi.py +++ b/jesse/indicators/rsi.py @@ -1,15 +1,61 @@ -from typing import Union - import numpy as np -import talib +from typing import Union +from numba import njit from jesse.helpers import get_candle_source, slice_candles -def rsi(candles: np.ndarray, period: int = 14, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit(cache=True) +def _rsi(p: np.ndarray, period: int) -> np.ndarray: """ - RSI - Relative Strength Index + Compute the Relative Strength Index using a loop and Wilder's smoothing. + """ + n = len(p) + rsi_arr = np.full(n, np.nan) + if n < period + 1: + return rsi_arr + # Calculate differences between consecutive prices. + diff = np.empty(n - 1) + for i in range(n - 1): + diff[i] = p[i+1] - p[i] + + # Compute initial average gain and loss over the first 'period' differences. + sum_gain = 0.0 + sum_loss = 0.0 + for i in range(period): + change = diff[i] + if change > 0: + sum_gain += change + else: + sum_loss += -change + avg_gain = sum_gain / period + avg_loss = sum_loss / period + + # Compute first RSI value at index 'period' + if avg_loss == 0: + rsi_arr[period] = 100.0 + else: + rs = avg_gain / avg_loss + rsi_arr[period] = 100 - (100 / (1 + rs)) + + # Recursively update average gain and loss and compute subsequent RSI values. + for i in range(period, n - 1): + change = diff[i] + gain = change if change > 0 else 0.0 + loss = -change if change < 0 else 0.0 + avg_gain = (avg_gain * (period - 1) + gain) / period + avg_loss = (avg_loss * (period - 1) + loss) / period + if avg_loss == 0: + rsi_arr[i+1] = 100.0 + else: + rs = avg_gain / avg_loss + rsi_arr[i+1] = 100 - (100 / (1 + rs)) + return rsi_arr + + +def rsi(candles: np.ndarray, period: int = 14, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: + """ + RSI - Relative Strength Index using Numba for optimization :param candles: np.ndarray :param period: int - default: 14 @@ -18,9 +64,12 @@ def rsi(candles: np.ndarray, period: int = 14, source_type: str = "close", seque :return: float | np.ndarray """ - candles = slice_candles(candles, sequential) - - source = get_candle_source(candles, source_type=source_type) - r = talib.RSI(source, timeperiod=period) + if len(candles.shape) == 1: + source = candles + else: + candles = slice_candles(candles, sequential) + source = get_candle_source(candles, source_type=source_type) - return r if sequential else r[-1] + p = np.asarray(source, dtype=float) + result = _rsi(p, period) + return result if sequential else result[-1] diff --git a/jesse/indicators/rsmk.py b/jesse/indicators/rsmk.py index c607e2b55..726482705 100644 --- a/jesse/indicators/rsmk.py +++ b/jesse/indicators/rsmk.py @@ -1,17 +1,14 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import get_candle_source -from jesse.indicators.ma import ma RSMK = namedtuple('RSMK', ['indicator', 'signal']) def rsmk(candles: np.ndarray, candles_compare: np.ndarray, lookback: int = 90, period: int = 3, signal_period: int = 20, - matype: int = 1, - signal_matype: int = 1, source_type: str = "close", sequential: bool = False) -> RSMK: + source_type: str = "close", sequential: bool = False) -> RSMK: """ RSMK - Relative Strength @@ -20,8 +17,6 @@ def rsmk(candles: np.ndarray, candles_compare: np.ndarray, lookback: int = 90, p :param lookback: int - default: 90 :param period: int - default: 3 :param signal_period: int - default: 20 - :param matype: int - default: 1 - :param signal_matype: int - default: 1 :param source_type: str - default: "close" :param sequential: bool - default: False @@ -34,15 +29,49 @@ def rsmk(candles: np.ndarray, candles_compare: np.ndarray, lookback: int = 90, p source = get_candle_source(candles, source_type=source_type) source_compare = get_candle_source(candles_compare, source_type=source_type) - a = np.log(source / source_compare) - b = talib.MOM(a, timeperiod=lookback) + # Calculate log ratio of asset to index + log_ratio = np.log(source / source_compare) - res = ma(b, period=period, matype=matype, sequential=True) * 100 + # Calculate momentum: difference between current log ratio and the one from 'lookback' periods ago using vectorized operation + mom = np.full_like(log_ratio, np.nan) + if len(log_ratio) > lookback: + mom[lookback:] = log_ratio[lookback:] - log_ratio[:-lookback] - signal = ma(res, period=signal_period, matype=signal_matype, sequential=True) + def ema(series: np.ndarray, period_val: float) -> np.ndarray: + alpha = 2.0 / (max(1.0, period_val) + 1.0) + n = series.shape[0] + out = np.full_like(series, np.nan) - if sequential: - return RSMK(res, signal) - else: - return RSMK(res[-1], signal[-1]) + # Identify the first valid (non-NaN) index + valid_indices = np.flatnonzero(~np.isnan(series)) + if valid_indices.size == 0: + return out + start_idx = valid_indices[0] + segment = series[start_idx:] + m = segment.shape[0] + + # Create matrices for vectorized computation + t = np.arange(m).reshape(-1, 1) # shape (m, 1) + i = np.arange(m).reshape(1, -1) # shape (1, m) + lag = t - i + + # Compute weights: + # For t >= i, if i == 0 then weight = (1 - alpha)^(t - i), else weight = alpha * (1 - alpha)^(t - i) + weights = np.where(lag < 0, 0, np.where(i == 0, (1 - alpha)**lag, alpha * (1 - alpha)**lag)) + + ema_segment = np.sum(weights * segment.reshape(1, -1), axis=1) + out[start_idx:] = ema_segment + return out + + # Calculate RSMK indicator: EMA of the momentum scaled by 100 + rsmk_indicator = ema(mom, period) * 100.0 + + # Calculate signal line as EMA of the RSMK indicator + rsmk_signal = ema(rsmk_indicator, signal_period) + + if not sequential: + rsmk_indicator = rsmk_indicator[-1] + rsmk_signal = rsmk_signal[-1] + + return RSMK(rsmk_indicator, rsmk_signal) diff --git a/jesse/indicators/rvi.py b/jesse/indicators/rvi.py index e6fbc672d..33bef78cb 100644 --- a/jesse/indicators/rvi.py +++ b/jesse/indicators/rvi.py @@ -1,14 +1,13 @@ from typing import Union import numpy as np -import talib +from numpy.lib.stride_tricks import sliding_window_view from jesse.helpers import get_candle_source, same_length, slice_candles from jesse.indicators.ma import ma from jesse.indicators.mean_ad import mean_ad from jesse.indicators.median_ad import median_ad - def rvi(candles: np.ndarray, period: int = 10, ma_len: int = 14, matype: int = 1, devtype: int = 0, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ @@ -22,12 +21,15 @@ def rvi(candles: np.ndarray, period: int = 10, ma_len: int = 14, matype: int = 1 :param sequential: bool - default: False :return: float | np.ndarray """ + if matype == 24 or matype == 29: + raise ValueError("VWMA (matype 24) and VWAP (matype 29) cannot be used in rvi indicator.") + candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) if devtype == 0: - dev = talib.STDDEV(source, period) + dev = _rolling_std(source, period) elif devtype == 1: dev = mean_ad(source, period, sequential=True) elif devtype == 2: @@ -45,3 +47,11 @@ def rvi(candles: np.ndarray, period: int = 10, ma_len: int = 14, matype: int = 1 result = 100 * (up_avg / (up_avg + down_avg)) return result if sequential else result[-1] + + +def _rolling_std(arr: np.ndarray, window: int) -> np.ndarray: + if len(arr) < window: + return np.full(len(arr), np.nan) + windows = sliding_window_view(arr, window_shape=window) + stds = np.std(windows, axis=1, ddof=0) + return np.concatenate((np.full(window - 1, np.nan), stds)) diff --git a/jesse/indicators/safezonestop.py b/jesse/indicators/safezonestop.py index 273370705..6e90e7b72 100644 --- a/jesse/indicators/safezonestop.py +++ b/jesse/indicators/safezonestop.py @@ -1,15 +1,52 @@ from typing import Union import numpy as np -import talib - +from numba import njit from jesse.helpers import np_shift, slice_candles +@njit(cache=True) +def wilder_smoothing_numba(raw: np.ndarray, period: int) -> np.ndarray: + smoothed = np.zeros_like(raw) + alpha = 1 - 1/period + smoothed[0] = raw[0] + for i in range(1, len(raw)): + smoothed[i] = alpha * smoothed[i-1] + raw[i] + return smoothed + +@njit(cache=True) +def rolling_max_numba(arr: np.ndarray, window: int) -> np.ndarray: + n = len(arr) + result = np.empty_like(arr) + + # Handle first window-1 elements + for i in range(window-1): + result[i] = np.max(arr[:i+1]) + + # Handle remaining elements with sliding window + for i in range(window-1, n): + result[i] = np.max(arr[i-window+1:i+1]) + + return result + +@njit(cache=True) +def rolling_min_numba(arr: np.ndarray, window: int) -> np.ndarray: + n = len(arr) + result = np.empty_like(arr) + + # Handle first window-1 elements + for i in range(window-1): + result[i] = np.min(arr[:i+1]) + + # Handle remaining elements with sliding window + for i in range(window-1, n): + result[i] = np.min(arr[i-window+1:i+1]) + + return result def safezonestop(candles: np.ndarray, period: int = 22, mult: float = 2.5, max_lookback: int = 3, direction: str = "long", sequential: bool = False) -> Union[float, np.ndarray]: """ - Safezone Stops + Safezone Stops - Numba optimized version :param candles: np.ndarray :param period: int - default: 22 @@ -28,9 +65,22 @@ def safezonestop(candles: np.ndarray, period: int = 22, mult: float = 2.5, max_l last_high = np_shift(high, 1, fill_value=np.nan) last_low = np_shift(low, 1, fill_value=np.nan) + diff_high = high - last_high + diff_low = last_low - low + diff_high = np.where(np.isnan(diff_high), 0, diff_high) + diff_low = np.where(np.isnan(diff_low), 0, diff_low) + + raw_plus_dm = np.where((diff_high > diff_low) & (diff_high > 0), diff_high, 0) + raw_minus_dm = np.where((diff_low > diff_high) & (diff_low > 0), diff_low, 0) + + plus_dm = wilder_smoothing_numba(raw_plus_dm, period) + minus_dm = wilder_smoothing_numba(raw_minus_dm, period) + if direction == "long": - res = talib.MAX(last_low - mult * talib.MINUS_DM(high, low, timeperiod=period), max_lookback) + intermediate = last_low - mult * minus_dm + res = rolling_max_numba(intermediate, max_lookback) else: - res = talib.MIN(last_high + mult * talib.PLUS_DM(high, low, timeperiod=period), max_lookback) + intermediate = last_high + mult * plus_dm + res = rolling_min_numba(intermediate, max_lookback) return res if sequential else res[-1] diff --git a/jesse/indicators/sar.py b/jesse/indicators/sar.py index 67a909990..86ebbdd47 100644 --- a/jesse/indicators/sar.py +++ b/jesse/indicators/sar.py @@ -1,13 +1,11 @@ from typing import Union import numpy as np -import talib - from jesse.helpers import slice_candles +from numba import njit -def sar(candles: np.ndarray, acceleration: float = 0.02, maximum: float = 0.2, sequential: bool = False) -> Union[ - float, np.ndarray]: +def sar(candles: np.ndarray, acceleration: float = 0.02, maximum: float = 0.2, sequential: bool = False) -> Union[float, np.ndarray]: """ SAR - Parabolic SAR @@ -19,7 +17,72 @@ def sar(candles: np.ndarray, acceleration: float = 0.02, maximum: float = 0.2, s :return: float | np.ndarray """ candles = slice_candles(candles, sequential) + # Assuming candle format where index 3 is high and index 4 is low + high = candles[:, 3] + low = candles[:, 4] + + n = len(candles) + if n == 0: + return np.array([]) + if n < 2: + return low[-1] + + # Use numba-compiled function to calculate SAR values + sar_values = _fast_sar(high, low, acceleration, maximum, n) + return sar_values if sequential else sar_values[-1] + + +@njit(cache=True) +def _fast_sar(high, low, acceleration, maximum, n): + sar_values = np.zeros(n) + if high[1] > high[0]: + uptrend = True + sar_values[0] = low[0] + ep = high[0] # extreme point + else: + uptrend = False + sar_values[0] = high[0] + ep = low[0] + af = acceleration # initial acceleration factor + for i in range(1, n): + prev_sar = sar_values[i - 1] + if uptrend: + sar_temp = prev_sar + af * (ep - prev_sar) + if i >= 2: + sar_temp = min(sar_temp, low[i - 1], low[i - 2]) + else: + sar_temp = min(sar_temp, low[i - 1]) + else: + sar_temp = prev_sar - af * (prev_sar - ep) + if i >= 2: + sar_temp = max(sar_temp, high[i - 1], high[i - 2]) + else: + sar_temp = max(sar_temp, high[i - 1]) - res = talib.SAR(candles[:, 3], candles[:, 4], acceleration=acceleration, maximum=maximum) + if uptrend: + if low[i] < sar_temp: + sar_temp = ep + uptrend = False + af = acceleration # reset acceleration factor + ep = low[i] + else: + if high[i] > ep: + ep = high[i] + af = af + acceleration + if af > maximum: + af = maximum + else: + if high[i] > sar_temp: + sar_temp = ep + uptrend = True + af = acceleration + ep = high[i] + else: + if low[i] < ep: + ep = low[i] + af = af + acceleration + if af > maximum: + af = maximum - return res if sequential else res[-1] + sar_values[i] = sar_temp + return sar_values diff --git a/jesse/indicators/sarext.py b/jesse/indicators/sarext.py deleted file mode 100644 index 28d546606..000000000 --- a/jesse/indicators/sarext.py +++ /dev/null @@ -1,36 +0,0 @@ -from typing import Union - -import numpy as np -import talib - -from jesse.helpers import slice_candles - - -def sarext(candles: np.ndarray, start_value: float = 0, offset_on_reverse: float = 0, acceleration_init_long: float = 0, - acceleration_long: float = 0, acceleration_max_long: float = 0, acceleration_init_short: float = 0, - acceleration_short: float = 0, acceleration_max_short: float = 0, sequential: bool = False) -> Union[ - float, np.ndarray]: - """ - SAREXT - Parabolic SAR - Extended - - :param candles: np.ndarray - :param start_value: float - default: 0 - :param offset_on_reverse: float - default: 0 - :param acceleration_init_long: float - default: 0 - :param acceleration_long: float - default: 0 - :param acceleration_max_long: float - default: 0 - :param acceleration_init_short: float - default: 0 - :param acceleration_short: float - default: 0 - :param acceleration_max_short: float - default: 0 - :param sequential: bool - default: False - - :return: float | np.ndarray - """ - candles = slice_candles(candles, sequential) - - res = talib.SAREXT(candles[:, 3], candles[:, 4], startvalue=start_value, offsetonreverse=offset_on_reverse, - accelerationinitlong=acceleration_init_long, accelerationlong=acceleration_long, - accelerationmaxlong=acceleration_max_long, accelerationinitshort=acceleration_init_short, - accelerationshort=acceleration_short, accelerationmaxshort=acceleration_max_short) - - return res if sequential else res[-1] diff --git a/jesse/indicators/sma.py b/jesse/indicators/sma.py index 2f8d00adb..a3d754523 100644 --- a/jesse/indicators/sma.py +++ b/jesse/indicators/sma.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -25,6 +24,8 @@ def sma(candles: np.ndarray, period: int = 5, source_type: str = "close", sequen candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.SMA(source, timeperiod=period) + res = np.full(source.shape, np.nan) + if len(source) >= period: + res[period-1:] = np.convolve(source, np.ones(period, dtype=float)/period, mode='valid') return res if sequential else res[-1] diff --git a/jesse/indicators/srsi.py b/jesse/indicators/srsi.py index ec741aa4c..1bdf09e40 100644 --- a/jesse/indicators/srsi.py +++ b/jesse/indicators/srsi.py @@ -1,14 +1,80 @@ from collections import namedtuple import numpy as np -import talib -import tulipy as ti +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles StochasticRSI = namedtuple('StochasticRSI', ['k', 'd']) +@njit(cache=True) +def _rolling_window(a, window): + """Helper function to create rolling windows of data""" + shape = a.shape[:-1] + (a.shape[-1] - window + 1, window) + strides = a.strides + (a.strides[-1],) + return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) + + +@njit(cache=True) +def _calculate_stoch(data, period_stoch, k_period, d_period): + """Calculate stochastic oscillator values""" + # Calculate rolling min and max + rolling_mins = np.array([np.min(w) for w in _rolling_window(data, period_stoch)]) + rolling_maxs = np.array([np.max(w) for w in _rolling_window(data, period_stoch)]) + + # Calculate %K + k_fast = 100 * (data[period_stoch-1:] - rolling_mins) / (rolling_maxs - rolling_mins) + + # Calculate smoothed %K (which becomes the final %K) + k = np.zeros_like(k_fast) + for i in range(k_period-1, len(k_fast)): + k[i] = np.mean(k_fast[i-k_period+1:i+1]) + + # Calculate %D (SMA of %K) + d = np.zeros_like(k) + for i in range(d_period-1, len(k)): + d[i] = np.mean(k[i-d_period+1:i+1]) + + return k, d + + +@njit(cache=True) +def _calculate_rsi(source, period): + n = len(source) + rsi = np.full(n, np.nan) # initialize all values as NaN + if n <= period: + return rsi + + # Vectorized computation of price differences + delta = source[1:] - source[:-1] + + # Compute ups and downs using numpy where + ups = np.where(delta > 0, delta, 0.0) + downs = np.where(delta < 0, -delta, 0.0) + + # Initial average gain and loss + avg_gain = np.mean(ups[:period]) + avg_loss = np.mean(downs[:period]) + + # First RSI value at index 'period' + if avg_loss == 0: + rsi[period] = 100.0 + else: + rsi[period] = 100.0 - 100.0 / (1.0 + avg_gain / avg_loss) + + # Recursive calculation for subsequent RSI values + for i in range(period, len(ups)): + avg_gain = (avg_gain * (period - 1) + ups[i]) / period + avg_loss = (avg_loss * (period - 1) + downs[i]) / period + if avg_loss == 0: + rsi[i + 1] = 100.0 + else: + rsi[i + 1] = 100.0 - 100.0 / (1.0 + avg_gain / avg_loss) + + return rsi + + def srsi(candles: np.ndarray, period: int = 14, period_stoch: int = 14, k: int = 3, d: int = 3, source_type: str = "close", sequential: bool = False) -> StochasticRSI: """ @@ -27,13 +93,17 @@ def srsi(candles: np.ndarray, period: int = 14, period_stoch: int = 14, k: int = candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - rsi_np = talib.RSI(source, timeperiod=period) + rsi_np = _calculate_rsi(source, period) rsi_np = rsi_np[np.logical_not(np.isnan(rsi_np))] - fast_k, fast_d = ti.stoch(rsi_np, rsi_np, rsi_np, period_stoch, k, d) + + # Calculate stochastic values + fast_k, fast_d = _calculate_stoch(rsi_np, period_stoch, k, d) if sequential: - fast_k = same_length(candles, fast_k) - fast_d = same_length(candles, fast_d) + # Pad the beginning with NaN to match the original length + pad_length = len(candles) - len(fast_k) + fast_k = np.concatenate((np.full(pad_length, np.nan), fast_k)) + fast_d = np.concatenate((np.full(pad_length, np.nan), fast_d)) return StochasticRSI(fast_k, fast_d) else: return StochasticRSI(fast_k[-1], fast_d[-1]) diff --git a/jesse/indicators/stc.py b/jesse/indicators/stc.py index 33f59de46..c45bfddcf 100644 --- a/jesse/indicators/stc.py +++ b/jesse/indicators/stc.py @@ -1,43 +1,75 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles -from jesse.indicators.ma import ma -def stc(candles: np.ndarray, fast_period: int = 23, fast_matype: int = 1, slow_period: int = 50, slow_matype: int = 1, - k_period: int = 10, d_period: int = 3, - source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +def ema(series: np.ndarray, period: int) -> np.ndarray: + """Calculates the Exponential Moving Average (EMA) for a series using a simple recursive formula.""" + alpha = 2 / (period + 1) + out = np.empty_like(series, dtype=float) + out[0] = series[0] + for i in range(1, len(series)): + out[i] = alpha * series[i] + (1 - alpha) * out[i - 1] + return out + + +def stoch(series: np.ndarray, period: int) -> np.ndarray: + """Calculates the stochastic oscillator for a series over the specified period.""" + result = np.full_like(series, np.nan, dtype=float) + for i in range(len(series)): + if i < period - 1: + result[i] = np.nan + else: + window = series[i - period + 1: i + 1] + low = np.min(window) + high = np.max(window) + if high == low: + result[i] = 0 + else: + result[i] = 100 * ((series[i] - low) / (high - low)) + return result + + +def stc(candles: np.ndarray, fast_period: int = 23, slow_period: int = 50, k_period: int = 10, d1_period: int = 3, d2_period: int = 3, + source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ STC - Schaff Trend Cycle (Oscillator) - :param candles: np.ndarray + The indicator is computed as follows: + 1. macd = EMA(src, fast_period) - EMA(src, slow_period) + 2. k = stoch(macd, k_period) with NaNs replaced by 0 + 3. d = EMA(k, d1_period) -> First %D + 4. kd = stoch(d, k_period) with NaNs replaced by 0 + 5. stc_val = EMA(kd, d2_period) clamped between 0 and 100 + + :param candles: np.ndarray of candles :param fast_period: int - default: 23 - :param fast_matype: int - default: 1 :param slow_period: int - default: 50 - :param slow_matype: int - default: 1 - :param k_period: int - default: 10 - :param d_period: int - default: 3 + :param k_period: int - default: 10, cycle length for stoch computation + :param d1_period: int - default: 3, used for first EMA smoothing of k + :param d2_period: int - default: 3, used for EMA smoothing of kd :param source_type: str - default: "close" - :param sequential: bool - default: False - - :return: float | np.ndarray + :param sequential: bool - default: False. When False, returns only the last value. + :return: float or np.ndarray depending on sequential """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - macd = ma(source, period=fast_period, matype=fast_matype, sequential=True) - ma(source, period=slow_period, matype=slow_matype, sequential=True) - - stok = (macd - talib.MIN(macd, k_period)) / (talib.MAX(macd, k_period) - talib.MIN(macd, k_period)) * 100 + ema_fast = ema(source, fast_period) + ema_slow = ema(source, slow_period) + macd = ema_fast - ema_slow - d = talib.EMA(stok, d_period) + k = stoch(macd, k_period) + k = np.nan_to_num(k, nan=0) - kd = (d - talib.MIN(d, k_period)) / (talib.MAX(d, k_period) - talib.MIN(d, k_period)) * 100 + d_val = ema(k, d1_period) + kd = stoch(d_val, k_period) + kd = np.nan_to_num(kd, nan=0) - res = talib.EMA(kd, d_period) + stc_val = ema(kd, d2_period) + stc_val = np.clip(stc_val, 0, 100) - return res if sequential else res[-1] + return stc_val if sequential else stc_val[-1] + \ No newline at end of file diff --git a/jesse/indicators/stddev.py b/jesse/indicators/stddev.py index 54116afec..7f2ad493f 100644 --- a/jesse/indicators/stddev.py +++ b/jesse/indicators/stddev.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -25,6 +24,20 @@ def stddev(candles: np.ndarray, period: int = 5, nbdev: float = 1, source_type: candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.STDDEV(source, timeperiod=period, nbdev=nbdev) + n = len(source) + # Initialize result array with nan values + result = np.full(n, np.nan, dtype=float) - return res if sequential else res[-1] + if n < period: + # Not enough data for full period, result remains as nans + output = result + else: + # Create rolling windows using numpy's sliding_window_view + windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + # Compute standard deviation over the rolling windows using population std (ddof=0) and multiply by nbdev + rolling_std = np.std(windows, axis=1, ddof=0) * nbdev + # Fill the result array from index 'period - 1' onward with the computed rolling std + result[period - 1:] = rolling_std + output = result + + return output if sequential else output[-1] diff --git a/jesse/indicators/stiffness.py b/jesse/indicators/stiffness.py index ff0522920..7414b4d1d 100644 --- a/jesse/indicators/stiffness.py +++ b/jesse/indicators/stiffness.py @@ -8,10 +8,8 @@ from jesse.helpers import get_candle_source, slice_candles -Stiffness = namedtuple('Stiffness', ['stiffness', 'threshold']) - -def stiffness(candles: np.ndarray, ma_length: int = 100, stiff_length: int = 60, stiff_smooth: int = 3, threshold: int = 90, source_type: str = "close") -> Stiffness: +def stiffness(candles: np.ndarray, ma_length: int = 100, stiff_length: int = 60, stiff_smooth: int = 3, source_type: str = "close") -> float: """ @author daviddtech credits: https://www.tradingview.com/script/MOw6mUQl-Stiffness-Indicator-DaviddTech @@ -22,7 +20,6 @@ def stiffness(candles: np.ndarray, ma_length: int = 100, stiff_length: int = 60, :param ma_length: int - default: 100 :param stiff_length: int - default: 60 :param stiff_smooth: int - default: 3 - :param threshold: int - default: 90 :param source_type: str - default: "close" :return: Stiffness(stiffness, threshold) @@ -36,9 +33,7 @@ def stiffness(candles: np.ndarray, ma_length: int = 100, stiff_length: int = 60, bound_stiffness = sma(source, ma_length, sequential=True) - 0.2 * \ stddev(source, ma_length, sequential=True) sum_above_stiffness = _count_price_exceed_series(source, bound_stiffness, stiff_length) - stiffness = ema(np.array(sum_above_stiffness) * 100 / stiff_length, period=stiff_smooth) - - return Stiffness(stiffness, threshold) + return ema(np.array(sum_above_stiffness) * 100 / stiff_length, period=stiff_smooth) def _count_price_exceed_series(close_prices, art_series, length): diff --git a/jesse/indicators/stochastic.py b/jesse/indicators/stochastic.py index bf5a13be3..9d98d560b 100644 --- a/jesse/indicators/stochastic.py +++ b/jesse/indicators/stochastic.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles from jesse.indicators.ma import ma @@ -24,14 +23,17 @@ def stoch(candles: np.ndarray, fastk_period: int = 14, slowk_period: int = 3, sl :return: Stochastic(k, d) """ + if any(matype in (24, 29) for matype in (slowk_matype, slowd_matype)): + raise ValueError("VWMA (matype 24) and VWAP (matype 29) cannot be used in stochastic indicator.") + candles = slice_candles(candles, sequential) candles_close = candles[:, 2] candles_high = candles[:, 3] candles_low = candles[:, 4] - - hh = talib.MAX(candles_high, fastk_period) - ll = talib.MIN(candles_low, fastk_period) + + hh = _rolling_max(candles_high, fastk_period) + ll = _rolling_min(candles_low, fastk_period) stoch_val = 100 * (candles_close - ll) / (hh - ll) k = ma(stoch_val, period=slowk_period, matype=slowk_matype, sequential=True) @@ -41,3 +43,19 @@ def stoch(candles: np.ndarray, fastk_period: int = 14, slowk_period: int = 3, sl return Stochastic(k, d) else: return Stochastic(k[-1], d[-1]) + +def _rolling_max(x, window): + if len(x) < window: + return np.full(x.shape, np.nan, dtype=np.float64) + windows = np.lib.stride_tricks.sliding_window_view(x, window_shape=window) + result = np.full(x.shape, np.nan, dtype=np.float64) + result[window - 1:] = np.max(windows, axis=1) + return result + +def _rolling_min(x, window): + if len(x) < window: + return np.full(x.shape, np.nan, dtype=np.float64) + windows = np.lib.stride_tricks.sliding_window_view(x, window_shape=window) + result = np.full(x.shape, np.nan, dtype=np.float64) + result[window - 1:] = np.min(windows, axis=1) + return result diff --git a/jesse/indicators/stochf.py b/jesse/indicators/stochf.py index 50b91814e..ffb0df054 100644 --- a/jesse/indicators/stochf.py +++ b/jesse/indicators/stochf.py @@ -1,14 +1,12 @@ from collections import namedtuple import numpy as np -import talib from jesse.helpers import slice_candles from jesse.indicators.ma import ma StochasticFast = namedtuple('StochasticFast', ['k', 'd']) - def stochf(candles: np.ndarray, fastk_period: int = 5, fastd_period: int = 3, fastd_matype: int = 0, sequential: bool = False) -> StochasticFast: """ @@ -22,14 +20,17 @@ def stochf(candles: np.ndarray, fastk_period: int = 5, fastd_period: int = 3, fa :return: StochasticFast(k, d) """ + if fastd_matype == 24 or fastd_matype == 29: + raise ValueError("VWMA (matype 24) and VWAP (matype 29) cannot be used in stochf indicator.") + candles = slice_candles(candles, sequential) candles_close = candles[:, 2] candles_high = candles[:, 3] candles_low = candles[:, 4] - hh = talib.MAX(candles_high, fastk_period) - ll = talib.MIN(candles_low, fastk_period) + hh = _rolling_max(candles_high, fastk_period) + ll = _rolling_min(candles_low, fastk_period) k = 100 * (candles_close - ll) / (hh - ll) d = ma(k, period=fastd_period, matype=fastd_matype, sequential=True) @@ -38,3 +39,25 @@ def stochf(candles: np.ndarray, fastk_period: int = 5, fastd_period: int = 3, fa return StochasticFast(k, d) else: return StochasticFast(k[-1], d[-1]) + +def _rolling_min(arr: np.ndarray, window: int) -> np.ndarray: + n = arr.shape[0] + if n < window: + return np.minimum.accumulate(arr) + out = np.empty_like(arr) + if window > 1: + out[:window-1] = np.minimum.accumulate(arr[:window-1]) + view = np.lib.stride_tricks.sliding_window_view(arr, window_shape=window) + out[window-1:] = np.min(view, axis=-1) + return out + +def _rolling_max(arr: np.ndarray, window: int) -> np.ndarray: + n = arr.shape[0] + if n < window: + return np.maximum.accumulate(arr) + out = np.empty_like(arr) + if window > 1: + out[:window-1] = np.maximum.accumulate(arr[:window-1]) + view = np.lib.stride_tricks.sliding_window_view(arr, window_shape=window) + out[window-1:] = np.max(view, axis=-1) + return out diff --git a/jesse/indicators/supertrend.py b/jesse/indicators/supertrend.py index faa32237b..418a33976 100644 --- a/jesse/indicators/supertrend.py +++ b/jesse/indicators/supertrend.py @@ -1,7 +1,6 @@ from collections import namedtuple import numpy as np -import talib from numba import njit from jesse.helpers import slice_candles @@ -11,84 +10,118 @@ def supertrend(candles: np.ndarray, period: int = 10, factor: float = 3, sequential: bool = False) -> SuperTrend: """ - SuperTrend - :param candles: np.ndarray - :param period: int - default=14 - :param factor: float - default=3 - :param sequential: bool - default=False - :return: SuperTrend(trend, changed) + SuperTrend indicator optimized with numba and loop-based calculations. + :param candles: np.ndarray - candle data + :param period: period for ATR calculation + :param factor: multiplier for the bands + :param sequential: if True, returns full arrays; else, returns last value + :return: SuperTrend named tuple with trend and changed arrays/values """ - candles = slice_candles(candles, sequential) - - # calculation of ATR using TALIB function - atr = talib.ATR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) - + atr = atr_loop(candles[:, 3], candles[:, 4], candles[:, 2], period) super_trend, changed = supertrend_fast(candles, atr, factor, period) - if sequential: return SuperTrend(super_trend, changed) else: return SuperTrend(super_trend[-1], changed[-1]) +@njit(cache=True) +def atr_loop(high, low, close, period): + n = len(close) + tr = np.empty(n, dtype=np.float64) + tr[0] = high[0] - low[0] + for i in range(1, n): + diff1 = high[i] - low[i] + diff2 = np.abs(high[i] - close[i-1]) + diff3 = np.abs(low[i] - close[i-1]) + # manual max of the three differences + if diff1 >= diff2 and diff1 >= diff3: + tr[i] = diff1 + elif diff2 >= diff1 and diff2 >= diff3: + tr[i] = diff2 + else: + tr[i] = diff3 + + atr = np.empty(n, dtype=np.float64) + # Set initial values to NaN for indices before period-1 + for i in range(period - 1): + atr[i] = np.nan + # First ATR value is the simple average of the first 'period' TR values + sum_init = 0.0 + for i in range(period): + sum_init += tr[i] + atr[period - 1] = sum_init / period + # Recursive ATR calculation + for i in range(period, n): + atr[i] = ((atr[i-1] * (period - 1)) + tr[i]) / period + return atr + + @njit(cache=True) def supertrend_fast(candles, atr, factor, period): - # Calculation of SuperTrend - upper_basic = (candles[:, 3] + candles[:, 4]) / 2 + (factor * atr) - lower_basic = (candles[:, 3] + candles[:, 4]) / 2 - (factor * atr) - upper_band = upper_basic - lower_band = lower_basic - super_trend = np.zeros(len(candles)) - changed = np.zeros(len(candles)) - - # calculate the bands: - # in an UPTREND, lower band does not decrease - # in a DOWNTREND, upper band does not increase - for i in range(period, len(candles)): - # if currently in DOWNTREND (i.e. price is below upper band) - prevClose = candles[:, 2][i - 1] - prevUpperBand = upper_band[i - 1] - currUpperBasic = upper_basic[i] - if prevClose <= prevUpperBand: - # upper band will DECREASE in value only - upper_band[i] = min(currUpperBasic, prevUpperBand) - - # if currently in UPTREND (i.e. price is above lower band) - prevLowerBand = lower_band[i - 1] - currLowerBasic = lower_basic[i] - if prevClose >= prevLowerBand: - # lower band will INCREASE in value only - lower_band[i] = max(currLowerBasic, prevLowerBand) - - # >>>>>>>> previous period SuperTrend <<<<<<<< - if prevClose <= prevUpperBand: - super_trend[i - 1] = prevUpperBand + n = len(candles) + super_trend = np.zeros(n, dtype=np.float64) + changed = np.zeros(n, dtype=np.int8) + + # Precompute basic bands and initialize band arrays + upper_basic = np.empty(n, dtype=np.float64) + lower_basic = np.empty(n, dtype=np.float64) + upper_band = np.empty(n, dtype=np.float64) + lower_band = np.empty(n, dtype=np.float64) + + for i in range(n): + mid = (candles[i, 3] + candles[i, 4]) / 2.0 + upper_basic[i] = mid + factor * atr[i] + lower_basic[i] = mid - factor * atr[i] + upper_band[i] = upper_basic[i] + lower_band[i] = lower_basic[i] + + # Set the initial supertrend for index period-1 + idx = period - 1 + if candles[idx, 2] <= upper_band[idx]: + super_trend[idx] = upper_band[idx] + else: + super_trend[idx] = lower_band[idx] + changed[idx] = 0 + + # Combined loop: update bands and compute supertrend + for i in range(period, n): + p = i - 1 + prevClose = candles[p, 2] + + # Update upper_band + if prevClose <= upper_band[p]: + if upper_basic[i] < upper_band[p]: + upper_band[i] = upper_basic[i] + else: + upper_band[i] = upper_band[p] else: - super_trend[i - 1] = prevLowerBand - prevSuperTrend = super_trend[i - 1] - - for i in range(period, len(candles)): - prevClose = candles[:, 2][i - 1] - prevUpperBand = upper_band[i - 1] - currUpperBand = upper_band[i] - prevLowerBand = lower_band[i - 1] - currLowerBand = lower_band[i] - prevSuperTrend = super_trend[i - 1] - - # >>>>>>>>> current period SuperTrend <<<<<<<<< - if prevSuperTrend == prevUpperBand: # if currently in DOWNTREND - if candles[:, 2][i] <= currUpperBand: - super_trend[i] = currUpperBand # remain in DOWNTREND - changed[i] = False + upper_band[i] = upper_basic[i] + + # Update lower_band + if prevClose >= lower_band[p]: + if lower_basic[i] > lower_band[p]: + lower_band[i] = lower_basic[i] else: - super_trend[i] = currLowerBand # switch to UPTREND - changed[i] = True - elif prevSuperTrend == prevLowerBand: # if currently in UPTREND - if candles[:, 2][i] >= currLowerBand: - super_trend[i] = currLowerBand # remain in UPTREND - changed[i] = False + lower_band[i] = lower_band[p] + else: + lower_band[i] = lower_basic[i] + + # Compute current supertrend based on previous supertrend value + if super_trend[p] == upper_band[p]: + if candles[i, 2] <= upper_band[i]: + super_trend[i] = upper_band[i] + changed[i] = 0 + else: + super_trend[i] = lower_band[i] + changed[i] = 1 + else: # super_trend[p] equals lower_band[p] + if candles[i, 2] >= lower_band[i]: + super_trend[i] = lower_band[i] + changed[i] = 0 else: - super_trend[i] = currUpperBand # switch to DOWNTREND - changed[i] = True + super_trend[i] = upper_band[i] + changed[i] = 1 + return super_trend, changed diff --git a/jesse/indicators/t3.py b/jesse/indicators/t3.py index 883830879..01152ec64 100644 --- a/jesse/indicators/t3.py +++ b/jesse/indicators/t3.py @@ -1,8 +1,7 @@ from typing import Union +from numba import njit import numpy as np -import talib - from jesse.helpers import get_candle_source, slice_candles @@ -10,13 +9,16 @@ def t3(candles: np.ndarray, period: int = 5, vfactor: float = 0, source_type: st sequential: bool = False) -> Union[float, np.ndarray]: """ T3 - Triple Exponential Moving Average (T3) - + + The T3 moving average is a type of moving average that uses the DEMA (Double Exponential Moving Average) + calculations multiple times with a volume factor weighting. + :param candles: np.ndarray :param period: int - default: 5 :param vfactor: float - default: 0 :param source_type: str - default: "close" :param sequential: bool - default: False - + :return: float | np.ndarray """ if len(candles.shape) == 1: @@ -24,7 +26,49 @@ def t3(candles: np.ndarray, period: int = 5, vfactor: float = 0, source_type: st else: candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) + + k = 2 / (period + 1) + + # Calculate weights based on volume factor + w1 = -vfactor ** 3 + w2 = 3 * vfactor ** 2 + 3 * vfactor ** 3 + w3 = -6 * vfactor ** 2 - 3 * vfactor - 3 * vfactor ** 3 + w4 = 1 + 3 * vfactor + vfactor ** 3 + 3 * vfactor ** 2 + + t3 = _t3_fast(source, k, w1, w2, w3, w4) + + return t3 if sequential else t3[-1] - res = talib.T3(source, timeperiod=period, vfactor=vfactor) - return res if sequential else res[-1] +@njit(cache=True) +def _t3_fast(source: np.ndarray, k: float, w1: float, w2: float, w3: float, w4: float) -> np.ndarray: + n = len(source) + e1 = np.zeros(n) + e2 = np.zeros(n) + e3 = np.zeros(n) + e4 = np.zeros(n) + e5 = np.zeros(n) + e6 = np.zeros(n) + t3 = np.zeros(n) + + # Initialize first values + e1[0] = source[0] + e2[0] = e1[0] + e3[0] = e2[0] + e4[0] = e3[0] + e5[0] = e4[0] + e6[0] = e5[0] + + k_rev = 1 - k + + # Calculate all EMAs in a single loop for better cache utilization + for i in range(1, n): + e1[i] = k * source[i] + k_rev * e1[i-1] + e2[i] = k * e1[i] + k_rev * e2[i-1] + e3[i] = k * e2[i] + k_rev * e3[i-1] + e4[i] = k * e3[i] + k_rev * e4[i-1] + e5[i] = k * e4[i] + k_rev * e5[i-1] + e6[i] = k * e5[i] + k_rev * e6[i-1] + t3[i] = w1 * e6[i] + w2 * e5[i] + w3 * e4[i] + w4 * e3[i] + + return t3 \ No newline at end of file diff --git a/jesse/indicators/tema.py b/jesse/indicators/tema.py index a3a9c5fe5..8c3e540da 100644 --- a/jesse/indicators/tema.py +++ b/jesse/indicators/tema.py @@ -1,10 +1,19 @@ from typing import Union import numpy as np -import talib - +from numba import njit from jesse.helpers import get_candle_source, slice_candles +@njit(cache=True) +def _ema(source: np.ndarray, period: int) -> np.ndarray: + alpha = 2.0 / (period + 1.0) + result = np.zeros_like(source) + result[0] = source[0] + + for i in range(1, len(source)): + result[i] = alpha * source[i] + (1 - alpha) * result[i-1] + + return result def tema(candles: np.ndarray, period: int = 9, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: @@ -24,6 +33,10 @@ def tema(candles: np.ndarray, period: int = 9, source_type: str = "close", seque candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.TEMA(source, timeperiod=period) - + ema1 = _ema(source, period) + ema2 = _ema(ema1, period) + ema3 = _ema(ema2, period) + res = 3 * ema1 - 3 * ema2 + ema3 + return res if sequential else res[-1] + diff --git a/jesse/indicators/trange.py b/jesse/indicators/trange.py index f37e28280..c4247df70 100644 --- a/jesse/indicators/trange.py +++ b/jesse/indicators/trange.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -16,7 +15,18 @@ def trange(candles: np.ndarray, sequential: bool = False) -> Union[float, np.nda :return: float | np.ndarray """ candles = slice_candles(candles, sequential) + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] - res = talib.TRANGE(candles[:, 3], candles[:, 4], candles[:, 2]) + true_range = np.empty_like(high) + true_range[0] = high[0] - low[0] + if len(candles) > 1: + diff_hl = high[1:] - low[1:] + diff_hpc = np.abs(high[1:] - close[:-1]) + diff_lpc = np.abs(low[1:] - close[:-1]) + true_range[1:] = np.maximum(np.maximum(diff_hl, diff_hpc), diff_lpc) + + res = true_range return res if sequential else res[-1] diff --git a/jesse/indicators/trima.py b/jesse/indicators/trima.py index a8bc051db..eb34fc326 100644 --- a/jesse/indicators/trima.py +++ b/jesse/indicators/trima.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -24,6 +23,20 @@ def trima(candles: np.ndarray, period: int = 30, source_type: str = "close", seq candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.TRIMA(source, timeperiod=period) + # Compute triangular weights + if period % 2 != 0: + mid = period // 2 + weights = np.concatenate((np.arange(1, mid + 2), np.arange(mid, 0, -1))) + else: + mid = period // 2 + weights = np.concatenate((np.arange(1, mid + 1), np.arange(mid, 0, -1))) + weights_norm = weights / weights.sum() + + n = source.shape[0] + if n < period: + res = np.full(n, np.nan) + else: + conv = np.convolve(source, weights_norm, mode='valid') + res = np.concatenate((np.full(period - 1, np.nan), conv)) return res if sequential else res[-1] diff --git a/jesse/indicators/trix.py b/jesse/indicators/trix.py index cbe6dc72a..40aefaa74 100644 --- a/jesse/indicators/trix.py +++ b/jesse/indicators/trix.py @@ -1,13 +1,27 @@ from typing import Union import numpy as np -import talib +from numba import njit from jesse.helpers import get_candle_source, slice_candles -def trix(candles: np.ndarray, period: int = 18, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +@njit +def _ema_numba(data, period): + N = len(data) + result = np.empty(N, dtype=np.float64) + alpha = 2.0 / (period + 1) + result[0] = data[0] + for i in range(1, N): + result[i] = alpha * data[i] + (1 - alpha) * result[i - 1] + return result + + +def ema(data: np.ndarray, period: int) -> np.ndarray: + return _ema_numba(data, period) + + +def trix(candles: np.ndarray, period: int = 18, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA @@ -19,8 +33,18 @@ def trix(candles: np.ndarray, period: int = 18, source_type: str = "close", sequ :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - r = talib.TRIX(source, timeperiod=period) * 100 - return r if sequential else r[-1] + # Compute triple EMA on the logarithm of the source prices + log_source = np.log(source) + ema1 = ema(log_source, period) + ema2 = ema(ema1, period) + ema3 = ema(ema2, period) + + # Calculate the change (current ema3 minus previous ema3), prepending NaN to maintain same length + diff = np.empty_like(ema3) + diff[0] = np.nan + diff[1:] = ema3[1:] - ema3[:-1] + result = diff * 10000 + + return result if sequential else result[-1] diff --git a/jesse/indicators/tsf.py b/jesse/indicators/tsf.py index 01f26ab62..b7a07e4e6 100644 --- a/jesse/indicators/tsf.py +++ b/jesse/indicators/tsf.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -10,6 +9,9 @@ def tsf(candles: np.ndarray, period: int = 14, source_type: str = "close", seque float, np.ndarray]: """ TSF - Time Series Forecast + + A linear regression projection into the future. It calculates a linear regression line + using the specified period and projects it forward. :param candles: np.ndarray :param period: int - default: 14 @@ -19,8 +21,40 @@ def tsf(candles: np.ndarray, period: int = 14, source_type: str = "close", seque :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - res = talib.TSF(source, timeperiod=period) - - return res if sequential else res[-1] + + if sequential: + result = np.full_like(source, np.nan) + if len(source) >= period: + # Create time indices array + x = np.arange(period) + # Calculate means for x + x_mean = np.mean(x) + # Calculate denominator term (sum of squared deviations) + x_diff = x - x_mean + denominator = np.sum(x_diff ** 2) + + # Create sliding windows view of the data + windows = np.lib.stride_tricks.sliding_window_view(source, period) + # Calculate means for each window + y_means = np.mean(windows, axis=1) + + # Calculate slopes using vectorized operations + slopes = np.sum((windows - y_means[:, None]) * x_diff, axis=1) / denominator + # Calculate intercepts + intercepts = y_means - slopes * x_mean + + # Calculate forecast values + forecasts = intercepts + slopes * period + + # Place forecasts in result array + result[period-1:] = forecasts + + return result + else: + # For non-sequential, just calculate the last window + x = np.arange(period) + X = np.vstack((np.ones(period), x)).T + y = source[-period:] + beta = np.linalg.inv(X.T @ X) @ X.T @ y + return beta[0] + beta[1] * period diff --git a/jesse/indicators/tsi.py b/jesse/indicators/tsi.py index 17d4575b7..b0a212aba 100644 --- a/jesse/indicators/tsi.py +++ b/jesse/indicators/tsi.py @@ -1,8 +1,6 @@ from typing import Union import numpy as np -import talib - from jesse.helpers import get_candle_source, slice_candles @@ -22,7 +20,35 @@ def tsi(candles: np.ndarray, long_period: int = 25, short_period: int = 13, sour candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - r = 100 * (talib.EMA((talib.EMA(talib.MOM(source, 1), long_period)), short_period)) / ( - talib.EMA((talib.EMA(np.absolute(talib.MOM(source, 1)), long_period)), short_period)) + + mom = _mom(source, 1) + ema_mom = _ema(mom, long_period) + double_ema_mom = _ema(ema_mom, short_period) + + ema_abs_mom = _ema(np.abs(mom), long_period) + double_ema_abs_mom = _ema(ema_abs_mom, short_period) + + # Avoid division by zero and invalid results + with np.errstate(divide='ignore', invalid='ignore'): + r = 100 * double_ema_mom / double_ema_abs_mom + r[~np.isfinite(r)] = 0 return r if sequential else r[-1] + + +def _mom(series, period): + # Calculate momentum as difference between current and period ago value + return np.concatenate((np.zeros(period), series[period:] - series[:-period])) + +def _ema(series, period): + # Exponential Moving Average using a vectorized approach with convolution + alpha = 2 / (period + 1) + n = len(series) + t_arr = np.arange(n) + # Calculate the contribution from the first element + ema_vals = series[0] * ((1 - alpha) ** t_arr) + if n > 1: + # For t>=1, add the convolution of the rest of the series with the weights alpha*(1-alpha)^(t) + conv = np.convolve(series[1:], alpha * ((1 - alpha) ** np.arange(n - 1)), mode='full')[:n-1] + ema_vals[1:] += conv + return ema_vals diff --git a/jesse/indicators/typprice.py b/jesse/indicators/typprice.py index c08071a0f..d37173710 100644 --- a/jesse/indicators/typprice.py +++ b/jesse/indicators/typprice.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,6 @@ def typprice(candles: np.ndarray, sequential: bool = False) -> Union[float, np.n """ candles = slice_candles(candles, sequential) - res = talib.TYPPRICE(candles[:, 3], candles[:, 4], candles[:, 2]) + res = (candles[:, 2] + candles[:, 3] + candles[:, 4]) / 3 return res if sequential else res[-1] diff --git a/jesse/indicators/ui.py b/jesse/indicators/ui.py index 81487c0e5..d9f6e2e06 100644 --- a/jesse/indicators/ui.py +++ b/jesse/indicators/ui.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -20,12 +19,28 @@ def ui(candles: np.ndarray, period: int = 14, scalar: float = 100, source_type: """ candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - - highest_close = talib.MAX(source, period) - downside = scalar * (source - highest_close) - downside /= highest_close - d2 = downside * downside - - res = np.sqrt(talib.SUM(d2, period) / period) + n = source.shape[0] + + # Compute rolling maximum over the period + if n < period: + highest_close = np.full_like(source, np.nan) + else: + # sliding_window_view creates a rolling window view: shape (n-period+1, period) + highest_window = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + highest_max = np.max(highest_window, axis=1) + highest_close = np.concatenate((np.full(period - 1, np.nan), highest_max)) + + # Calculate downside percentage + downside = scalar * (source - highest_close) / highest_close + d2 = downside ** 2 + + # Compute rolling sum of squared downside values + if n < period: + rolling_d2_sum = np.full_like(d2, np.nan) + else: + rolling_sum_valid = np.convolve(d2, np.ones(period), mode='valid') + rolling_d2_sum = np.concatenate((np.full(period - 1, np.nan), rolling_sum_valid)) + + res = np.sqrt(rolling_d2_sum / period) return res if sequential else res[-1] diff --git a/jesse/indicators/ultosc.py b/jesse/indicators/ultosc.py index 0eda32e04..c6ec7364e 100644 --- a/jesse/indicators/ultosc.py +++ b/jesse/indicators/ultosc.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -20,8 +19,40 @@ def ultosc(candles: np.ndarray, timeperiod1: int = 7, timeperiod2: int = 14, tim :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - - res = talib.ULTOSC(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod1=timeperiod1, timeperiod2=timeperiod2, - timeperiod3=timeperiod3) - - return res if sequential else res[-1] + high = candles[:, 3] + low = candles[:, 4] + close = candles[:, 2] + n = len(close) + + bp = np.empty(n, dtype=float) + tr = np.empty(n, dtype=float) + bp[0] = 0.0 + tr[0] = high[0] - low[0] + bp[1:] = close[1:] - np.minimum(low[1:], close[:-1]) + tr[1:] = np.maximum(high[1:], close[:-1]) - np.minimum(low[1:], close[:-1]) + + sum_bp_1 = _rolling_sum(bp, timeperiod1) + sum_tr_1 = _rolling_sum(tr, timeperiod1) + avg1 = np.where(sum_tr_1 != 0, sum_bp_1 / sum_tr_1, np.nan) + + sum_bp_2 = _rolling_sum(bp, timeperiod2) + sum_tr_2 = _rolling_sum(tr, timeperiod2) + avg2 = np.where(sum_tr_2 != 0, sum_bp_2 / sum_tr_2, np.nan) + + sum_bp_3 = _rolling_sum(bp, timeperiod3) + sum_tr_3 = _rolling_sum(tr, timeperiod3) + avg3 = np.where(sum_tr_3 != 0, sum_bp_3 / sum_tr_3, np.nan) + + ult = 100 * (4 * avg1 + 2 * avg2 + avg3) / 7 + + return ult if sequential else ult[-1] + +def _rolling_sum(data, window): + n = len(data) + if n < window: + return np.full(n, np.nan) + conv = np.convolve(data, np.ones(window, dtype=float), mode='valid') + out = np.empty(n, dtype=float) + out[:window-1] = np.nan + out[window-1:] = conv + return out diff --git a/jesse/indicators/var.py b/jesse/indicators/var.py index e32bb8b13..0d59b14fe 100644 --- a/jesse/indicators/var.py +++ b/jesse/indicators/var.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles @@ -22,6 +21,15 @@ def var(candles: np.ndarray, period: int = 14, nbdev: float = 1, source_type: st candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.VAR(source, timeperiod=period, nbdev=nbdev) - - return res if sequential else res[-1] + n = len(source) + result = np.empty(n) + result[:period-1] = np.nan + if n >= period: + windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + window_mean = np.mean(windows, axis=1) + window_mean_sq = np.mean(windows ** 2, axis=1) + result[period-1:] = (window_mean_sq - window_mean**2) * nbdev + else: + result[:] = np.nan + + return result if sequential else result[-1] diff --git a/jesse/indicators/vidya.py b/jesse/indicators/vidya.py index 2e3e20751..0ee59fe68 100644 --- a/jesse/indicators/vidya.py +++ b/jesse/indicators/vidya.py @@ -1,20 +1,60 @@ from typing import Union - import numpy as np -import tulipy as ti - +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles -def vidya(candles: np.ndarray, short_period: int = 2, long_period: int = 5, alpha: float = 0.2, - source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: +@njit +def vidya_numba(source: np.ndarray, length: int, fix_cmo: bool, select: bool) -> np.ndarray: + alpha = 2 / (length + 1) + momm = np.zeros_like(source) + momm[1:] = source[1:] - source[:-1] + momm[0] = 0 + + # Initialize arrays for positive and negative momentum + m1 = np.where(momm >= 0, momm, 0) + m2 = np.where(momm < 0, -momm, 0) + + # Calculate rolling sums + cmo_length = 9 if fix_cmo else length + sm1 = np.zeros_like(source) + sm2 = np.zeros_like(source) + + for i in range(len(source)): + start_idx = max(0, i - cmo_length + 1) + sm1[i] = np.sum(m1[start_idx:i+1]) + sm2[i] = np.sum(m2[start_idx:i+1]) + + # Calculate Chande Momentum + total_sum = sm1 + sm2 + chande_mo = np.where(total_sum != 0, 100 * (sm1 - sm2) / total_sum, 0) + + # Calculate k factor + if select: + k = np.abs(chande_mo) / 100 + else: + k = np.zeros_like(source) + for i in range(len(source)): + start_idx = max(0, i - length + 1) + k[i] = np.std(source[start_idx:i+1]) + + # Calculate VIDYA + vidya = np.zeros_like(source) + vidya[0] = source[0] + for i in range(1, len(source)): + vidya[i] = alpha * k[i] * source[i] + (1 - alpha * k[i]) * vidya[i-1] + + return vidya + + +def vidya(candles: np.ndarray, length: int = 9, fix_cmo: bool = True, select: bool = True, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ VIDYA - Variable Index Dynamic Average :param candles: np.ndarray - :param short_period: int - default: 2 - :param long_period: int - default: 5 - :param alpha: float - default: 0.2 + :param length: int - default: 9 + :param fix_cmo: bool - default: True Fixed CMO Length (9)? + :param select: bool - default: True Calculation Method: CMO/StDev? :param source_type: str - default: "close" :param sequential: bool - default: False @@ -26,6 +66,6 @@ def vidya(candles: np.ndarray, short_period: int = 2, long_period: int = 5, alph candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.vidya(np.ascontiguousarray(source), short_period=short_period, long_period=long_period, alpha=alpha) + res = vidya_numba(source, length, fix_cmo, select) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/vlma.py b/jesse/indicators/vlma.py index 5dc5e84e0..dddbda30e 100644 --- a/jesse/indicators/vlma.py +++ b/jesse/indicators/vlma.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from numba import njit from jesse.helpers import get_candle_source, slice_candles @@ -9,6 +8,31 @@ from jesse.indicators.mean_ad import mean_ad from jesse.indicators.median_ad import median_ad +def moving_std(source: np.ndarray, window: int) -> np.ndarray: + n = len(source) + stdArr = np.empty_like(source) + if n < window: + # Vectorized cumulative standard deviation for all indices + cumsum = np.cumsum(source) + cumsum2 = np.cumsum(source**2) + counts = np.arange(1, n + 1) + means = cumsum / counts + variances = cumsum2 / counts - means**2 + stdArr[:] = np.sqrt(np.maximum(variances, 0)) + else: + # For indices with less than a full window, use cumulative statistics + cumsum_init = np.cumsum(source[:window-1]) + cumsum2_init = np.cumsum(source[:window-1]**2) + counts_init = np.arange(1, window) + means_init = cumsum_init / counts_init + variances_init = cumsum2_init / counts_init - means_init**2 + stdArr[:window-1] = np.sqrt(np.maximum(variances_init, 0)) + + # For full windows, use sliding window view and compute standard deviation + sw = np.lib.stride_tricks.sliding_window_view(source, window_shape=window) + stdArr[window-1:] = np.std(sw, axis=1) + return stdArr + def vlma(candles: np.ndarray, min_period: int = 5, max_period: int = 50, matype: int = 0, devtype: int = 0, source_type: str = "close", sequential: bool = False) -> Union[ float, np.ndarray]: @@ -33,10 +57,13 @@ def vlma(candles: np.ndarray, min_period: int = 5, max_period: int = 50, matype: candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - mean = ma(source, period=max_period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + mean = ma(candles, period=max_period, matype=matype, source_type=source_type, sequential=True) + else: + mean = ma(source, period=max_period, matype=matype, sequential=True) if devtype == 0: - stdDev = talib.STDDEV(source, max_period) + stdDev = moving_std(source, max_period) elif devtype == 1: stdDev = mean_ad(source, max_period, sequential=True) elif devtype == 2: diff --git a/jesse/indicators/volume.py b/jesse/indicators/volume.py new file mode 100644 index 000000000..dd8f635ee --- /dev/null +++ b/jesse/indicators/volume.py @@ -0,0 +1,35 @@ +from collections import namedtuple + +import numpy as np + +from jesse.helpers import slice_candles + +Volume = namedtuple("Volume", ["volume", "ma"]) + + +def volume( + candles: np.ndarray, + period: int = 20, + sequential: bool = False +) -> Volume: + """ + Volume with Moving Average + + :param candles: np.ndarray + :param period: int - default: 20 + :param sequential: bool - default: False + + :return: Volume(volume, ma) + """ + candles = slice_candles(candles, sequential) + + volume_data = candles[:, 5] + if len(volume_data) < period: + volume_ma = np.full(len(volume_data), np.nan) + else: + volume_ma = np.concatenate((np.full(period - 1, np.nan), np.convolve(volume_data, np.ones(period) / period, mode='valid'))) + + if sequential: + return Volume(volume_data, volume_ma) + else: + return Volume(volume_data[-1], volume_ma[-1]) diff --git a/jesse/indicators/vosc.py b/jesse/indicators/vosc.py index 1c8dacb2d..f0ae59c38 100644 --- a/jesse/indicators/vosc.py +++ b/jesse/indicators/vosc.py @@ -1,13 +1,9 @@ from typing import Union - +from jesse.indicators.sma import sma import numpy as np -import tulipy as ti - -from jesse.helpers import same_length, slice_candles -def vosc(candles: np.ndarray, short_period: int = 2, long_period: int = 5, sequential: bool = False) -> Union[ - float, np.ndarray]: +def vosc(candles: np.ndarray, short_period: int = 2, long_period: int = 5, sequential: bool = False) -> Union[float, np.ndarray]: """ VOSC - Volume Oscillator @@ -18,8 +14,16 @@ def vosc(candles: np.ndarray, short_period: int = 2, long_period: int = 5, seque :return: float | np.ndarray """ + from jesse.helpers import same_length, slice_candles + candles = slice_candles(candles, sequential) + volume = candles[:, 5] + + short_sma = sma(volume, short_period, sequential=True) + long_sma = sma(volume, long_period, sequential=True) + + vosc_values = (short_sma - long_sma) / long_sma * 100 - res = ti.vosc(np.ascontiguousarray(candles[:, 5]), short_period=short_period, long_period=long_period) + vosc_result = same_length(candles, vosc_values) - return same_length(candles, res) if sequential else res[-1] + return vosc_result if sequential else vosc_result[-1] diff --git a/jesse/indicators/vpci.py b/jesse/indicators/vpci.py index 77a984d27..6c659451d 100644 --- a/jesse/indicators/vpci.py +++ b/jesse/indicators/vpci.py @@ -1,7 +1,7 @@ from collections import namedtuple +from jesse.indicators.sma import sma import numpy as np -import talib from jesse.helpers import slice_candles @@ -21,16 +21,16 @@ def vpci(candles: np.ndarray, short_range: int = 5, long_range: int = 25, sequen """ candles = slice_candles(candles, sequential) - vwma_long = talib.SMA(candles[:, 2] * candles[:, 5], long_range) / talib.SMA(candles[:, 5], long_range) - VPC = vwma_long - talib.SMA(candles[:, 2], long_range) + vwma_long = sma(candles[:, 2] * candles[:, 5], long_range, sequential=True) / sma(candles[:, 5], long_range, sequential=True) + VPC = vwma_long - sma(candles[:, 2], long_range, sequential=True) - vwma_short = talib.SMA(candles[:, 2] * candles[:, 5], short_range) / talib.SMA(candles[:, 5], short_range) - VPR = vwma_short / talib.SMA(candles[:, 2], short_range) + vwma_short = sma(candles[:, 2] * candles[:, 5], short_range, sequential=True) / sma(candles[:, 5], short_range, sequential=True) + VPR = vwma_short / sma(candles[:, 2], short_range, sequential=True) - VM = talib.SMA(candles[:, 5], short_range) / talib.SMA(candles[:, 5], long_range) + VM = sma(candles[:, 5], short_range, sequential=True) / sma(candles[:, 5], long_range, sequential=True) VPCI_val = VPC * VPR * VM - VPCIS = talib.SMA(VPCI_val * candles[:, 5], short_range) / talib.SMA(candles[:, 5], short_range) + VPCIS = sma(VPCI_val * candles[:, 5], short_range, sequential=True) / sma(candles[:, 5], short_range, sequential=True) if sequential: return VPCI(VPCI_val, VPCIS) diff --git a/jesse/indicators/vwap.py b/jesse/indicators/vwap.py index 8d1bd2686..3efba589d 100644 --- a/jesse/indicators/vwap.py +++ b/jesse/indicators/vwap.py @@ -1,9 +1,6 @@ from typing import Union - import numpy as np from numba import njit -from numpy_groupies import aggregate_nb as aggregate - from jesse.helpers import get_candle_source, slice_candles @@ -21,14 +18,44 @@ def vwap( :return: float | np.ndarray """ candles = slice_candles(candles, sequential) - source = get_candle_source(candles, source_type=source_type) - - group_idx = candles[:, 0].astype('datetime64[ms]').astype(f'datetime64[{anchor}]').astype('int') - vwap_values = aggregate(group_idx, candles[:, 5] * source, func='cumsum') - vwap_values /= aggregate(group_idx, candles[:, 5], func='cumsum') + + # Convert timestamps to period indices + timestamps = candles[:, 0].astype('datetime64[ms]').astype(f'datetime64[{anchor}]') + group_indices = np.zeros(len(timestamps), dtype=np.int64) + + # Mark the start of each new period + group_indices[1:] = (timestamps[1:] != timestamps[:-1]).astype(np.int64) + group_indices = np.cumsum(group_indices) + + vwap_values = _calculate_vwap(source, candles[:, 5], group_indices) if sequential: return vwap_values else: return None if np.isnan(vwap_values[-1]) else vwap_values[-1] + + +@njit +def _calculate_vwap(source: np.ndarray, volume: np.ndarray, group_indices: np.ndarray) -> np.ndarray: + """ + Calculate VWAP values using Numba for optimization + """ + vwap_values = np.zeros_like(source) + cum_vol = 0.0 + cum_vol_price = 0.0 + current_group = group_indices[0] + + for i in range(len(source)): + if group_indices[i] != current_group: + cum_vol = 0.0 + cum_vol_price = 0.0 + current_group = group_indices[i] + + vol_price = volume[i] * source[i] + cum_vol_price += vol_price + cum_vol += volume[i] + + vwap_values[i] = cum_vol_price / cum_vol if cum_vol != 0 else np.nan + + return vwap_values diff --git a/jesse/indicators/vwma.py b/jesse/indicators/vwma.py index 8b250d99f..cc48e1d5a 100644 --- a/jesse/indicators/vwma.py +++ b/jesse/indicators/vwma.py @@ -1,13 +1,12 @@ from typing import Union import numpy as np -import tulipy as ti from jesse.helpers import get_candle_source, same_length, slice_candles def vwma(candles: np.ndarray, period: int = 20, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: + float, np.ndarray]: """ VWMA - Volume Weighted Moving Average @@ -20,10 +19,26 @@ def vwma(candles: np.ndarray, period: int = 20, source_type: str = "close", sequ """ if len(candles.shape) == 1: source = candles + volume = np.ones_like(candles) else: candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) + volume = candles[:, 5] - res = ti.vwma(np.ascontiguousarray(source), np.ascontiguousarray(candles[:, 5]), period=period) + # Calculate price * volume + weighted = source * volume + + # Compute cumulative sums for weighted price and volume + cumsum_weighted = np.cumsum(weighted) + cumsum_volume = np.cumsum(volume) - return same_length(candles, res) if sequential else res[-1] + # Allocate array for VWMA values + vwma_vals = np.empty_like(source, dtype=float) + + # For initial indices where full period is not available, use cumulative sums + vwma_vals[:period] = cumsum_weighted[:period] / np.where(cumsum_volume[:period] == 0, 1, cumsum_volume[:period]) + + # For indices with a complete period, use the rolling difference of cumulative sums + vwma_vals[period:] = (cumsum_weighted[period:] - cumsum_weighted[:-period]) / np.where((cumsum_volume[period:] - cumsum_volume[:-period]) == 0, 1, (cumsum_volume[period:] - cumsum_volume[:-period])) + + return same_length(candles, vwma_vals) if sequential else vwma_vals[-1] diff --git a/jesse/indicators/vwmacd.py b/jesse/indicators/vwmacd.py index c1da1b425..0012550e5 100644 --- a/jesse/indicators/vwmacd.py +++ b/jesse/indicators/vwmacd.py @@ -1,7 +1,7 @@ from collections import namedtuple import numpy as np -import talib +from .vwma import vwma from jesse.helpers import slice_candles @@ -11,6 +11,8 @@ def vwmacd(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, signal_period: int = 9, sequential: bool = False) -> VWMACD: """ + @author David. + credits: https://www.tradingview.com/script/33Y1LzRq-Volume-Weighted-Moving-Average-Convergence-Divergence-MACD/ VWMACD - Volume Weighted Moving Average Convergence/Divergence :param candles: np.ndarray @@ -21,15 +23,14 @@ def vwmacd(candles: np.ndarray, fast_period: int = 12, slow_period: int = 26, si :return: VWMACD(macd, signal, hist) """ - candles = slice_candles(candles, sequential) + fastWMA = vwma(candles, fast_period, sequential=True) + slowWMA = vwma(candles, slow_period, sequential=True) - vwma_slow = talib.SMA(candles[:, 2] * candles[:, 5], slow_period) / talib.SMA(candles[:, 5], slow_period) - vwma_fast = talib.SMA(candles[:, 2] * candles[:, 5], fast_period) / talib.SMA(candles[:, 5], fast_period) - vwmacd_val = vwma_fast - vwma_slow - signal = talib.EMA(vwmacd_val, signal_period) - hist = vwmacd_val - signal + macd_val = fastWMA - slowWMA + signal = vwma(macd_val, signal_period, sequential=True) + hist = macd_val - signal if sequential: - return VWMACD(vwmacd_val, signal, hist) + return VWMACD(macd_val, signal, hist) else: - return VWMACD(vwmacd_val[-1], signal[-1], hist[-1]) + return VWMACD(macd_val[-1], signal[-1], hist[-1]) diff --git a/jesse/indicators/wad.py b/jesse/indicators/wad.py index a1a32cbde..dad339f51 100644 --- a/jesse/indicators/wad.py +++ b/jesse/indicators/wad.py @@ -1,11 +1,33 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import same_length, slice_candles +@njit +def _wad_numba(high: np.ndarray, low: np.ndarray, close: np.ndarray) -> np.ndarray: + n = len(close) + ad = np.zeros(n, dtype=np.float64) + + # The first element doesn't have a previous close, so set its adjustment to 0 + ad[0] = 0 + + # Calculate the Acc/Dist component iteratively + for i in range(1, n): + if close[i] > close[i - 1]: + ad[i] = close[i] - min(low[i], close[i - 1]) + elif close[i] < close[i - 1]: + ad[i] = close[i] - max(high[i], close[i - 1]) + else: + ad[i] = 0 + + # Williams Accumulation/Distribution is the cumulative sum of these adjustments + wad_values = np.cumsum(ad) + return wad_values + + def wad(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarray]: """ WAD - Williams Accumulation/Distribution @@ -17,7 +39,14 @@ def wad(candles: np.ndarray, sequential: bool = False) -> Union[float, np.ndarra """ candles = slice_candles(candles, sequential) - res = ti.wad(np.ascontiguousarray(candles[:, 3]), np.ascontiguousarray(candles[:, 4]), - np.ascontiguousarray(candles[:, 1])) + # In this project, candle columns are arranged such that: + # candles[:,3] -> high + # candles[:,4] -> low + # candles[:,1] -> close + res = _wad_numba( + np.ascontiguousarray(candles[:, 3]), + np.ascontiguousarray(candles[:, 4]), + np.ascontiguousarray(candles[:, 1]) + ) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/wclprice.py b/jesse/indicators/wclprice.py index a9d363656..36dd35f6c 100644 --- a/jesse/indicators/wclprice.py +++ b/jesse/indicators/wclprice.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import slice_candles @@ -17,6 +16,7 @@ def wclprice(candles: np.ndarray, sequential: bool = False) -> Union[float, np.n """ candles = slice_candles(candles, sequential) - res = talib.WCLPRICE(candles[:, 3], candles[:, 4], candles[:, 2]) + # Calculate weighted close price as (high + low + 2*close) / 4, with high=candles[:,3], low=candles[:,4], close=candles[:,2] + res = (candles[:,3] + candles[:,4] + 2 * candles[:,2]) / 4.0 return res if sequential else res[-1] diff --git a/jesse/indicators/wilders.py b/jesse/indicators/wilders.py index d85c5eaa3..abdbc06d3 100644 --- a/jesse/indicators/wilders.py +++ b/jesse/indicators/wilders.py @@ -1,13 +1,27 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +@njit +def _wilders_fast(source: np.ndarray, period: int) -> np.ndarray: + # Pre-allocate the output array + res = np.zeros_like(source) + # First value is a simple copy + res[0] = source[0] + + # Calculate Wilder's Smoothing + for i in range(1, len(source)): + res[i] = (res[i - 1] * (period - 1) + source[i]) / period + + return res + + def wilders(candles: np.ndarray, period: int = 5, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: + float, np.ndarray]: """ WILDERS - Wilders Smoothing @@ -24,6 +38,6 @@ def wilders(candles: np.ndarray, period: int = 5, source_type: str = "close", se candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.wilders(np.ascontiguousarray(source), period=period) + res = _wilders_fast(source, period) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/willr.py b/jesse/indicators/willr.py index b3cc6d6f7..1c12f28d9 100644 --- a/jesse/indicators/willr.py +++ b/jesse/indicators/willr.py @@ -1,7 +1,7 @@ from typing import Union import numpy as np -import talib +from numpy.lib.stride_tricks import sliding_window_view from jesse.helpers import slice_candles @@ -18,6 +18,32 @@ def willr(candles: np.ndarray, period: int = 14, sequential: bool = False) -> Un """ candles = slice_candles(candles, sequential) - res = talib.WILLR(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod=period) + # Extract required price series: close, high, and low + close = candles[:, 2] + high = candles[:, 3] + low = candles[:, 4] + n = len(candles) + # Initialize result array with NaNs + res = np.full(close.shape, np.nan, dtype=np.float64) + + # If there are not enough candles, return NaNs + if n < period: + return res if sequential else res[-1] + + # Compute rolling high and low using sliding_window_view for vectorized operations + high_windows = sliding_window_view(high, window_shape=period) # shape: (n - period + 1, period) + low_windows = sliding_window_view(low, window_shape=period) + + rolling_max = np.max(high_windows, axis=1) + rolling_min = np.min(low_windows, axis=1) + + denom = rolling_max - rolling_min + close_window = close[period-1:] + + # Avoid division by zero: if denom is 0, set willr value to 0 + willr_values = ((rolling_max - close_window) / np.where(denom == 0, 1, denom)) * -100 + willr_values = np.where(denom == 0, 0, willr_values) + + res[period-1:] = willr_values return res if sequential else res[-1] diff --git a/jesse/indicators/wma.py b/jesse/indicators/wma.py index a8d497f80..acc42696c 100644 --- a/jesse/indicators/wma.py +++ b/jesse/indicators/wma.py @@ -1,13 +1,22 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles -def wma(candles: np.ndarray, period: int = 30, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: +def weighted_moving_average_custom(source: np.ndarray, period: int) -> np.ndarray: + weights = np.arange(1, period + 1) + weight_sum = weights.sum() + result = np.full(len(source), np.nan, dtype=float) + if len(source) < period: + return result + windowed = np.lib.stride_tricks.sliding_window_view(source, period) + result[period-1:] = np.dot(windowed, weights) / weight_sum + return result + + +def wma(candles: np.ndarray, period: int = 30, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ WMA - Weighted Moving Average @@ -24,5 +33,5 @@ def wma(candles: np.ndarray, period: int = 30, source_type: str = "close", seque candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = talib.WMA(source, timeperiod=period) + res = weighted_moving_average_custom(source, period) return res if sequential else res[-1] diff --git a/jesse/indicators/wt.py b/jesse/indicators/wt.py index 68498a301..9a84a2f3c 100644 --- a/jesse/indicators/wt.py +++ b/jesse/indicators/wt.py @@ -1,8 +1,6 @@ from collections import namedtuple - import numpy as np -import talib as ta - +from numba import jit from jesse.helpers import get_candle_source, slice_candles Wavetrend = namedtuple('Wavetrend', ['wt1', 'wt2', 'wtCrossUp', 'wtCrossDown', 'wtOversold', 'wtOverbought', 'wtVwap']) @@ -16,15 +14,64 @@ # # See https://github.com/ysdede/lazarus3/blob/partialexit/strategies/lazarus3/__init__.py for working jesse.ai example. +@jit(cache=True) +def _ema(arr: np.ndarray, period: int) -> np.ndarray: + """ + Calculate EMA using Numba-optimized implementation + """ + alpha = 2.0 / (period + 1.0) + result = np.zeros_like(arr) + result[0] = arr[0] + + for i in range(1, len(arr)): + result[i] = alpha * arr[i] + (1 - alpha) * result[i-1] + + return result + +@jit(cache=True) +def _sma(arr: np.ndarray, period: int) -> np.ndarray: + """ + Calculate SMA using Numba-optimized implementation + """ + result = np.zeros_like(arr) + + # Handle first period-1 elements + cumsum = 0.0 + for i in range(period-1): + cumsum += arr[i] + result[i] = cumsum / (i + 1) + + # Handle remaining elements with sliding window + cumsum = sum(arr[0:period]) + result[period-1] = cumsum / period + + for i in range(period, len(arr)): + cumsum = cumsum - arr[i-period] + arr[i] + result[i] = cumsum / period + + return result -def wt(candles: np.ndarray, - wtchannellen: int = 9, - wtaveragelen: int = 12, - wtmalen: int = 3, - oblevel: int = 53, - oslevel: int = -53, - source_type: str = "hlc3", - sequential: bool = False) -> Wavetrend: +@jit(cache=True) +def _fast_wt(src: np.ndarray, wtchannellen: int, wtaveragelen: int, wtmalen: int) -> tuple: + """ + Calculate Wavetrend components using Numba + """ + esa = _ema(src, wtchannellen) + + # Calculate absolute difference + abs_diff = np.abs(src - esa) + de = _ema(abs_diff, wtchannellen) + + # Avoid division by zero + de = np.where(de == 0, 1e-10, de) + ci = (src - esa) / (0.015 * de) + + wt1 = _ema(ci, wtaveragelen) + wt2 = _sma(wt1, wtmalen) + + return wt1, wt2 + +def wt(candles: np.ndarray, wtchannellen: int = 9, wtaveragelen: int = 12, wtmalen: int = 3, oblevel: int = 53, oslevel: int = -53, source_type: str = "hlc3", sequential: bool = False) -> Wavetrend: """ Wavetrend indicator @@ -40,16 +87,15 @@ def wt(candles: np.ndarray, :return: Wavetrend """ candles = slice_candles(candles, sequential) - src = get_candle_source(candles, source_type=source_type) - - # wt - esa = ta.EMA(src, wtchannellen) - de = ta.EMA(abs(src - esa), wtchannellen) - ci = (src - esa) / (0.015 * de) - wt1 = ta.EMA(ci, wtaveragelen) - wt2 = ta.SMA(wt1, wtmalen) - + + # Convert inputs to float64 for better numerical stability + src = src.astype(np.float64) + + # Calculate main components + wt1, wt2 = _fast_wt(src, wtchannellen, wtaveragelen, wtmalen) + + # Calculate additional components wtVwap = wt1 - wt2 wtOversold = wt2 <= oslevel wtOverbought = wt2 >= oblevel diff --git a/jesse/indicators/zlema.py b/jesse/indicators/zlema.py index 30936c0c5..9cf962b48 100644 --- a/jesse/indicators/zlema.py +++ b/jesse/indicators/zlema.py @@ -1,13 +1,39 @@ from typing import Union import numpy as np -import tulipy as ti +from numba import njit from jesse.helpers import get_candle_source, same_length, slice_candles +@njit +def _zlema_fast(source: np.ndarray, period: int) -> np.ndarray: + lag = (period - 1) / 2 + lag = int(lag) + + # Pre-allocate the output array + res = np.zeros_like(source) + + # Calculate the smoothing factor + alpha = 2 / (period + 1) + + # Calculate ema_data = price + (price - price_lag) + ema_data = np.zeros_like(source) + for i in range(lag, len(source)): + ema_data[i] = source[i] + (source[i] - source[i - lag]) + + # First value is a simple copy + res[lag] = ema_data[lag] + + # Calculate ZLEMA + for i in range(lag + 1, len(source)): + res[i] = (alpha * ema_data[i]) + ((1 - alpha) * res[i - 1]) + + return res + + def zlema(candles: np.ndarray, period: int = 20, source_type: str = "close", sequential: bool = False) -> Union[ - float, np.ndarray]: + float, np.ndarray]: """ Zero-Lag Exponential Moving Average @@ -24,6 +50,6 @@ def zlema(candles: np.ndarray, period: int = 20, source_type: str = "close", seq candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - res = ti.zlema(np.ascontiguousarray(source), period=period) + res = _zlema_fast(source, period) return same_length(candles, res) if sequential else res[-1] diff --git a/jesse/indicators/zscore.py b/jesse/indicators/zscore.py index c6434b9d7..712692b82 100644 --- a/jesse/indicators/zscore.py +++ b/jesse/indicators/zscore.py @@ -1,7 +1,6 @@ from typing import Union import numpy as np -import talib from jesse.helpers import get_candle_source, slice_candles from jesse.indicators.ma import ma @@ -27,10 +26,22 @@ def zscore(candles: np.ndarray, period: int = 14, matype: int = 0, nbdev: float candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) - means = ma(source, period=period, matype=matype, sequential=True) + if matype == 24 or matype == 29: + means = ma(candles, period=period, matype=matype, source_type=source_type, sequential=True) + else: + means = ma(source, period=period, matype=matype, sequential=True) if devtype == 0: - sigmas = talib.STDDEV(source, period) * nbdev + if len(source) < period: + sigmas = np.full_like(source, np.nan, dtype=np.float64) + else: + # Create a sliding window view of the source array + rolling_windows = np.lib.stride_tricks.sliding_window_view(source, window_shape=period) + # Calculate std using population formula (ddof=0) + std_values = np.std(rolling_windows, axis=1, ddof=0) + sigmas = np.full(source.shape, np.nan, dtype=np.float64) + sigmas[period-1:] = std_values + sigmas = sigmas * nbdev elif devtype == 1: sigmas = mean_ad(source, period, sequential=True) * nbdev elif devtype == 2: diff --git a/jesse/info.py b/jesse/info.py index e8d603267..c95f0ebf4 100644 --- a/jesse/info.py +++ b/jesse/info.py @@ -7,334 +7,395 @@ BYBIT_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_3, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_12, timeframes.DAY_1] -FTX_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_3, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, - timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_12, timeframes.DAY_1] BINANCE_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_3, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_8, timeframes.HOUR_12, timeframes.DAY_1] COINBASE_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.HOUR_1, timeframes.HOUR_6, timeframes.DAY_1] +APEX_PRO_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, + timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_12, timeframes.DAY_1] +GATE_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, + timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_8, timeframes.HOUR_12, timeframes.DAY_1, timeframes.WEEK_1] +FTX_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_3, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, + timeframes.HOUR_1, timeframes.HOUR_2, timeframes.HOUR_4, timeframes.HOUR_6, timeframes.HOUR_12, timeframes.DAY_1] BITGET_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_4, timeframes.HOUR_12, timeframes.DAY_1] DYDX_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_4, timeframes.DAY_1] -APEX_PRO_TIMEFRAMES = [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, - timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_4, timeframes.DAY_1] exchange_info = { # BYBIT_USDT_PERPETUAL exchanges_enums.BYBIT_USDT_PERPETUAL: { - 'name': exchanges_enums.BYBIT_USDT_PERPETUAL, - 'url': JESSE_WEBSITE_URL + '/bybit', - 'fee': 0.00055, - 'type': 'futures', - 'settlement_currency': 'USDT', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BYBIT_USDT_PERPETUAL, + "url": JESSE_WEBSITE_URL + "/bybit", + "fee": 0.00055, + "type": "futures", + "settlement_currency": "USDT", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BYBIT_USDT_PERPETUAL_TESTNET exchanges_enums.BYBIT_USDT_PERPETUAL_TESTNET: { - 'name': exchanges_enums.BYBIT_USDT_PERPETUAL_TESTNET, - 'url': JESSE_WEBSITE_URL + '/bybit', - 'fee': 0.00055, - 'type': 'futures', - 'settlement_currency': 'USDT', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BYBIT_USDT_PERPETUAL_TESTNET, + "url": JESSE_WEBSITE_URL + "/bybit", + "fee": 0.00055, + "type": "futures", + "settlement_currency": "USDT", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BYBIT_USDT_PERPETUAL exchanges_enums.BYBIT_USDC_PERPETUAL: { - 'name': exchanges_enums.BYBIT_USDC_PERPETUAL, - 'url': JESSE_WEBSITE_URL + '/bybit', - 'fee': 0.00055, - 'type': 'futures', - 'settlement_currency': 'USDC', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BYBIT_USDC_PERPETUAL, + "url": JESSE_WEBSITE_URL + "/bybit", + "fee": 0.00055, + "type": "futures", + "settlement_currency": "USDC", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BYBIT_USDC_PERPETUAL_TESTNET exchanges_enums.BYBIT_USDC_PERPETUAL_TESTNET: { - 'name': exchanges_enums.BYBIT_USDC_PERPETUAL_TESTNET, - 'url': JESSE_WEBSITE_URL + '/bybit', - 'fee': 0.00055, - 'type': 'futures', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'settlement_currency': 'USDC', - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BYBIT_USDC_PERPETUAL_TESTNET, + "url": JESSE_WEBSITE_URL + "/bybit", + "fee": 0.00055, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "settlement_currency": "USDC", + "modes": { + "backtesting": False, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BYBIT_SPOT_TESTNET exchanges_enums.BYBIT_SPOT: { - 'name': exchanges_enums.BYBIT_SPOT, - 'url': 'https://jesse.trade/bybit', - 'fee': 0.001, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BYBIT_SPOT, + "url": "https://jesse.trade/bybit", + "fee": 0.001, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BYBIT_SPOT_TESTNET exchanges_enums.BYBIT_SPOT_TESTNET: { - 'name': exchanges_enums.BYBIT_SPOT_TESTNET, - 'url': 'https://jesse.trade/bybit', - 'fee': 0.001, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BYBIT_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, - }, - 'required_live_plan': 'premium' - }, - # FTX_PERPETUAL_FUTURES - exchanges_enums.FTX_PERPETUAL_FUTURES: { - 'name': exchanges_enums.FTX_PERPETUAL_FUTURES, - 'url': 'https://ftx.com/markets/future', - 'fee': 0.0006, - 'type': 'futures', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': FTX_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': False, - }, - 'required_live_plan': 'premium' - }, - # FTX_SPOT - exchanges_enums.FTX_SPOT: { - 'name': exchanges_enums.FTX_SPOT, - 'url': 'https://ftx.com/markets/spot', - 'fee': 0.0007, - 'type': 'spot', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': FTX_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': False, + "name": exchanges_enums.BYBIT_SPOT_TESTNET, + "url": "https://jesse.trade/bybit", + "fee": 0.001, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BYBIT_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, }, - 'required_live_plan': 'premium' - }, - # FTX_US_SPOT - exchanges_enums.FTX_US_SPOT: { - 'name': exchanges_enums.FTX_US_SPOT, - 'url': 'https://ftx.us', - 'fee': 0.002, - 'type': 'spot', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': FTX_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': False, - }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BITFINEX_SPOT exchanges_enums.BITFINEX_SPOT: { - 'name': exchanges_enums.BITFINEX_SPOT, - 'url': 'https://bitfinex.com', - 'fee': 0.002, - 'type': 'spot', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': [timeframes.MINUTE_1, timeframes.MINUTE_5, timeframes.MINUTE_15, timeframes.MINUTE_30, timeframes.HOUR_1, timeframes.HOUR_3, timeframes.HOUR_6, timeframes.HOUR_12, timeframes.DAY_1], - 'modes': { - 'backtesting': True, - 'live_trading': False, + "name": exchanges_enums.BITFINEX_SPOT, + "url": "https://bitfinex.com", + "fee": 0.002, + "type": "spot", + "supported_leverage_modes": ["cross"], + "supported_timeframes": [ + timeframes.MINUTE_1, + timeframes.MINUTE_5, + timeframes.MINUTE_15, + timeframes.MINUTE_30, + timeframes.HOUR_1, + timeframes.HOUR_3, + timeframes.HOUR_6, + timeframes.HOUR_12, + timeframes.DAY_1, + ], + "modes": { + "backtesting": True, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BINANCE_SPOT exchanges_enums.BINANCE_SPOT: { - 'name': exchanges_enums.BINANCE_SPOT, - 'url': 'https://binance.com', - 'fee': 0.001, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BINANCE_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BINANCE_SPOT, + "url": "https://binance.com", + "fee": 0.001, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BINANCE_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BINANCE_US_SPOT exchanges_enums.BINANCE_US_SPOT: { - 'name': exchanges_enums.BINANCE_US_SPOT, - 'url': 'https://binance.us', - 'fee': 0.001, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BINANCE_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BINANCE_US_SPOT, + "url": "https://binance.us", + "fee": 0.001, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BINANCE_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BINANCE_PERPETUAL_FUTURES exchanges_enums.BINANCE_PERPETUAL_FUTURES: { - 'name': exchanges_enums.BINANCE_PERPETUAL_FUTURES, - 'url': 'https://binance.com', - 'fee': 0.0004, - 'type': 'futures', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BINANCE_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BINANCE_PERPETUAL_FUTURES, + "url": "https://binance.com", + "fee": 0.0004, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BINANCE_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BINANCE_PERPETUAL_FUTURES_TESTNET exchanges_enums.BINANCE_PERPETUAL_FUTURES_TESTNET: { - 'name': exchanges_enums.BINANCE_PERPETUAL_FUTURES_TESTNET, - 'url': 'https://binance.com', - 'fee': 0.0004, - 'type': 'futures', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BINANCE_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.BINANCE_PERPETUAL_FUTURES_TESTNET, + "url": "https://binance.com", + "fee": 0.0004, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BINANCE_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # COINBASE_SPOT exchanges_enums.COINBASE_SPOT: { - 'name': exchanges_enums.COINBASE_SPOT, - 'url': 'https://www.coinbase.com/advanced-trade/spot/BTC-USD', - 'fee': 0.0003, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': COINBASE_TIMEFRAMES, - 'modes': { - 'backtesting': True, - 'live_trading': True, + "name": exchanges_enums.COINBASE_SPOT, + "url": "https://www.coinbase.com/advanced-trade/spot/BTC-USD", + "fee": 0.0003, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": COINBASE_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, + }, + "required_live_plan": "premium", + }, + # APEX_PRO_PERPETUAL_TESTNET + exchanges_enums.APEX_PRO_PERPETUAL_TESTNET: { + "name": exchanges_enums.APEX_PRO_PERPETUAL_TESTNET, + "url": "https://testnet.pro.apex.exchange/trade/BTCUSD", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": APEX_PRO_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, + }, + "required_live_plan": "free", + }, + exchanges_enums.APEX_PRO_PERPETUAL: { + "name": exchanges_enums.APEX_PRO_PERPETUAL, + "url": "https://pro.apex.exchange/trade/BTCUSD", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": APEX_PRO_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, + }, + "required_live_plan": "premium", + }, + exchanges_enums.APEX_OMNI_PERPETUAL_TESTNET: { + "name": exchanges_enums.APEX_OMNI_PERPETUAL_TESTNET, + "url": "https://testnet.omni.apex.exchange/trade/BTCUSD", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": APEX_PRO_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "free", + }, + exchanges_enums.APEX_OMNI_PERPETUAL: { + "name": exchanges_enums.APEX_OMNI_PERPETUAL, + "url": "https://omni.apex.exchange/trade/BTCUSD", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": APEX_PRO_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, + }, + "required_live_plan": "premium", + }, + exchanges_enums.GATE_USDT_PERPETUAL: { + "name": exchanges_enums.GATE_USDT_PERPETUAL, + "url": "https://jesse.trade/gate", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": GATE_TIMEFRAMES, + "modes": { + "backtesting": True, + "live_trading": True, + }, + "required_live_plan": "premium", + }, + exchanges_enums.GATE_SPOT: { + "name": exchanges_enums.GATE_SPOT, + "url": "https://jesse.trade/gate", + "fee": 0.0005, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": GATE_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": True, + }, + "required_live_plan": "premium", + }, + # FTX_PERPETUAL_FUTURES + exchanges_enums.FTX_PERPETUAL_FUTURES: { + "name": exchanges_enums.FTX_PERPETUAL_FUTURES, + "url": "https://ftx.com/markets/future", + "fee": 0.0006, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": FTX_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, + }, + "required_live_plan": "premium", + }, + # FTX_SPOT + exchanges_enums.FTX_SPOT: { + "name": exchanges_enums.FTX_SPOT, + "url": "https://ftx.com/markets/spot", + "fee": 0.0007, + "type": "spot", + "supported_leverage_modes": ["cross"], + "supported_timeframes": FTX_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, + }, + "required_live_plan": "premium", + }, + # FTX_US_SPOT + exchanges_enums.FTX_US_SPOT: { + "name": exchanges_enums.FTX_US_SPOT, + "url": "https://ftx.us", + "fee": 0.002, + "type": "spot", + "supported_leverage_modes": ["cross"], + "supported_timeframes": FTX_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, + }, + "required_live_plan": "premium", }, # BITGET_USDT_PERPETUAL_TESTNET exchanges_enums.BITGET_USDT_PERPETUAL_TESTNET: { - 'name': exchanges_enums.BITGET_USDT_PERPETUAL_TESTNET, - 'url': JESSE_WEBSITE_URL + '/bitget', - 'fee': 0.0006, - 'type': 'futures', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BITGET_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': False, + "name": exchanges_enums.BITGET_USDT_PERPETUAL_TESTNET, + "url": JESSE_WEBSITE_URL + "/bitget", + "fee": 0.0006, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BITGET_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BITGET_USDT_PERPETUAL exchanges_enums.BITGET_USDT_PERPETUAL: { - 'name': exchanges_enums.BITGET_USDT_PERPETUAL, - 'url': JESSE_WEBSITE_URL + '/bitget', - 'fee': 0.0006, - 'type': 'futures', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BITGET_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': True, + "name": exchanges_enums.BITGET_USDT_PERPETUAL, + "url": JESSE_WEBSITE_URL + "/bitget", + "fee": 0.0006, + "type": "futures", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BITGET_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # BITGET_SPOT exchanges_enums.BITGET_SPOT: { - 'name': exchanges_enums.BITGET_SPOT, - 'url': JESSE_WEBSITE_URL + '/bitget', - 'fee': 0.0006, - 'type': 'spot', - 'supported_leverage_modes': ['cross', 'isolated'], - 'supported_timeframes': BITGET_TIMEFRAMES, - 'modes': { - 'backtesting': False, - # disabled for now - 'live_trading': False, + "name": exchanges_enums.BITGET_SPOT, + "url": JESSE_WEBSITE_URL + "/bitget", + "fee": 0.0006, + "type": "spot", + "supported_leverage_modes": ["cross", "isolated"], + "supported_timeframes": BITGET_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # DyDx exchanges_enums.DYDX_PERPETUAL: { - 'name': exchanges_enums.DYDX_PERPETUAL, - 'url': JESSE_WEBSITE_URL + '/dydx', - 'fee': 0.0005, - 'type': 'futures', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': DYDX_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': True, + "name": exchanges_enums.DYDX_PERPETUAL, + "url": JESSE_WEBSITE_URL + "/dydx", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": DYDX_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, # DyDx Testnet exchanges_enums.DYDX_PERPETUAL_TESTNET: { - 'name': exchanges_enums.DYDX_PERPETUAL_TESTNET, - 'url': 'https://trade.stage.dydx.exchange/trade/ETH-USD', - 'fee': 0.0005, - 'type': 'futures', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': DYDX_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': True, + "name": exchanges_enums.DYDX_PERPETUAL_TESTNET, + "url": "https://trade.stage.dydx.exchange/trade/ETH-USD", + "fee": 0.0005, + "type": "futures", + "supported_leverage_modes": ["cross"], + "supported_timeframes": DYDX_TIMEFRAMES, + "modes": { + "backtesting": False, + "live_trading": False, }, - 'required_live_plan': 'premium' + "required_live_plan": "premium", }, - - exchanges_enums.APEX_PRO_PERPETUAL_TESTNET: { - 'name': exchanges_enums.APEX_PRO_PERPETUAL_TESTNET, - 'url': 'https://testnet.pro.apex.exchange/trade/BTCUSD', - 'fee': 0.0005, - 'type': 'futures', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': APEX_PRO_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': True, - }, - 'required_live_plan': 'premium' - }, - - exchanges_enums.APEX_PRO_PERPETUAL: { - 'name': exchanges_enums.APEX_PRO_PERPETUAL, - 'url': 'https://pro.apex.exchange/trade/BTCUSD', - 'fee': 0.0005, - 'type': 'futures', - 'supported_leverage_modes': ['cross'], - 'supported_timeframes': APEX_PRO_TIMEFRAMES, - 'modes': { - 'backtesting': False, - 'live_trading': True, - }, - 'required_live_plan': 'premium' - } - } # list of supported exchanges for backtesting diff --git a/jesse/libs/dynamic_numpy_array/__init__.py b/jesse/libs/dynamic_numpy_array/__init__.py index 3d0e266e8..4c7dafccb 100644 --- a/jesse/libs/dynamic_numpy_array/__init__.py +++ b/jesse/libs/dynamic_numpy_array/__init__.py @@ -137,7 +137,7 @@ def append_multiple(self, items: np.ndarray) -> None: def delete(self, index: int, axis=None) -> None: self.array = np.delete(self.array, index, axis=axis) self.index -= 1 - if self.index == -1: + if self.array.shape[0] <= self.shape[0]: new_bucket = np.zeros(self.shape) self.array = np.concatenate((self.array, new_bucket), axis=0) diff --git a/jesse/math_utils.py b/jesse/math_utils.py new file mode 100644 index 000000000..a01825366 --- /dev/null +++ b/jesse/math_utils.py @@ -0,0 +1,39 @@ +def igcdex(a, b): + """Returns x, y, g such that g = x*a + y*b = gcd(a, b). + >>> igcdex(2, 3) + (-1, 1, 1) + >>> igcdex(10, 12) + (-1, 1, 2) + + >>> x, y, g = igcdex(100, 2004) + >>> x, y, g + (-20, 1, 4) + >>> x*100 + y*2004 + 4 + + """ + if (not a) and (not b): + return (0, 1, 0) + + if not a: + return (0, b // abs(b), abs(b)) + if not b: + return (a // abs(a), 0, abs(a)) + + if a < 0: + a, x_sign = -a, -1 + else: + x_sign = 1 + + if b < 0: + b, y_sign = -b, -1 + else: + y_sign = 1 + + x, y, r, s = 1, 0, 0, 1 + + while b: + (c, q) = (a % b, a // b) + (a, b, r, s, x, y) = (b, c, x - q * r, y - q * s, r, s) + + return (x * x_sign, y * y_sign, a) diff --git a/jesse/models/ClosedTrade.py b/jesse/models/ClosedTrade.py index de862d099..ad94787a2 100644 --- a/jesse/models/ClosedTrade.py +++ b/jesse/models/ClosedTrade.py @@ -85,6 +85,12 @@ def to_dict(self) -> dict: "holding_period": self.holding_period, } + @property + def to_dict_with_orders(self) -> dict: + data = self.to_dict + data['orders'] = [order.to_dict for order in self.orders] + return data + @property def fee(self) -> float: trading_fee = jh.get_config(f'env.exchanges.{self.exchange}.fee') diff --git a/jesse/models/FuturesExchange.py b/jesse/models/FuturesExchange.py index 1a0ba1679..7e825e579 100644 --- a/jesse/models/FuturesExchange.py +++ b/jesse/models/FuturesExchange.py @@ -116,7 +116,8 @@ def on_order_submission(self, order: Order) -> None: if effective_order_size > self.available_margin: raise InsufficientMargin( - f'You cannot submit an order for ${round(order.qty * order.price)} when your effective margin balance is ${round(self.available_margin)} considering leverage') + f'Cannot submit an order with a value of ${round(order.qty * order.price)} when your available margin is ${round(self.available_margin)}. Consider increasing leverage number from the settings or reducing the order size.' + ) self.available_assets[base_asset] += order.qty diff --git a/jesse/models/SpotExchange.py b/jesse/models/SpotExchange.py index ce7374095..50cb8dea0 100644 --- a/jesse/models/SpotExchange.py +++ b/jesse/models/SpotExchange.py @@ -56,8 +56,8 @@ def on_order_submission(self, order: Order) -> None: ) # sell order else: - # sell order's qty cannot be bigger than the amount of existing base asset base_balance = self.assets[base_asset] + # sell order's qty cannot be bigger than the amount of existing base asset if order.type == order_types.MARKET: order_qty = sum_floats(abs(order.qty), self.limit_orders_sum.get(order.symbol, 0)) elif order.type == order_types.STOP: @@ -90,10 +90,19 @@ def on_order_execution(self, order: Order) -> None: self.assets[base_asset] = sum_floats(self.assets[base_asset], abs(order.qty) * (1 - self.fee_rate)) # sell order else: + current_balance = self.assets[base_asset] + if abs(order.qty) > current_balance: + adjusted_qty = current_balance + order_qty = abs(adjusted_qty) + else: + order_qty = abs(order.qty) + # settlement currency's balance is increased by the amount of the order's qty after fees are deducted - self.assets[self.settlement_currency] = sum_floats(self.assets[self.settlement_currency], (abs(order.qty) * order.price) * (1 - self.fee_rate)) + self.assets[self.settlement_currency] = sum_floats( + self.assets[self.settlement_currency], (order_qty * order.price) * (1 - self.fee_rate) + ) # now reduce base asset's balance by the amount of the order's qty - self.assets[base_asset] = subtract_floats(self.assets[base_asset], abs(order.qty)) + self.assets[base_asset] = subtract_floats(self.assets[base_asset], order_qty) def on_order_cancellation(self, order: Order) -> None: if jh.is_livetrading(): @@ -112,7 +121,11 @@ def on_order_cancellation(self, order: Order) -> None: self.assets[self.settlement_currency] = sum_floats(self.assets[self.settlement_currency], abs(order.qty) * order.price) # sell order else: - self.assets[base_asset] = sum_floats(self.assets[base_asset], abs(order.qty)) + if order.type == order_types.STOP: + self.stop_orders_sum[order.symbol] = subtract_floats(self.stop_orders_sum[order.symbol], abs(order.qty)) + elif order.type == order_types.LIMIT: + self.limit_orders_sum[order.symbol] = subtract_floats(self.limit_orders_sum[order.symbol], abs(order.qty)) + def update_from_stream(self, data: dict) -> None: """ diff --git a/jesse/modes/backtest_mode.py b/jesse/modes/backtest_mode.py index adf9d232c..6ceb1de43 100644 --- a/jesse/modes/backtest_mode.py +++ b/jesse/modes/backtest_mode.py @@ -2,9 +2,6 @@ import re from typing import Dict, List, Tuple import numpy as np -import pandas as pd -from agilerl.algorithms.ppo import PPO - import jesse.helpers as jh import jesse.services.metrics as stats @@ -16,7 +13,6 @@ from jesse.modes.utils import save_daily_portfolio_balance from jesse.routes import router from jesse.services import charts -from jesse.services import quantstats from jesse.services import report from jesse.services.candle import generate_candle_from_one_minutes, print_candle, candle_includes_price, split_candle, \ get_candles, inject_warmup_candles_to_store @@ -43,7 +39,6 @@ def run( candles: dict = None, chart: bool = False, tradingview: bool = False, - full_reports: bool = False, csv: bool = False, json: bool = False, fast_mode: bool = False, @@ -70,7 +65,7 @@ def handle_time(): _execute_backtest( client_id, debug_mode, user_config, exchange, routes, data_routes, start_date, finish_date, candles, chart, - tradingview, full_reports, csv, json, fast_mode, benchmark + tradingview, csv, json, fast_mode, benchmark ) @@ -86,7 +81,6 @@ def _execute_backtest( candles: dict = None, chart: bool = False, tradingview: bool = False, - full_reports: bool = False, csv: bool = False, json: bool = False, fast_mode: bool = False, @@ -120,11 +114,25 @@ def _execute_backtest( # load historical candles if candles is None: - warmup_candles, candles = load_candles( - jh.date_to_timestamp(start_date), - jh.date_to_timestamp(finish_date) - ) - _handle_warmup_candles(warmup_candles) + try: + warmup_candles, candles = load_candles( + jh.date_to_timestamp(start_date), + jh.date_to_timestamp(finish_date) + ) + _handle_warmup_candles(warmup_candles, start_date) + except exceptions.CandlesNotFound as e: + # Extract symbol and exchange from error message + match = re.search(r"for (.*?) on (.*?)$", str(e)) + if match: + symbol, exchange = match.groups() + raise exceptions.CandlesNotFound({ + 'message': str(e), + 'symbol': symbol, + 'exchange': exchange, + 'start_date': start_date, + 'type': 'missing_candles' + }) + raise e if not jh.should_execute_silently(): sync_publish('general_info', { @@ -138,13 +146,12 @@ def _execute_backtest( sync_publish('routes_info', stats.routes(router.routes)) # run backtest simulation + result = None try: result = simulator( candles, run_silently=jh.should_execute_silently(), - generate_charts=chart, generate_tradingview=tradingview, - generate_quantstats=full_reports, generate_csv=csv, generate_json=json, generate_equity_curve=True, @@ -174,7 +181,7 @@ def _execute_backtest( # retry the backtest simulation _execute_backtest( client_id, debug_mode, user_config, exchange, routes, data_routes, start_date, finish_date, candles, - chart, tradingview, full_reports, csv, json, fast_mode, benchmark + chart, tradingview, csv, json, fast_mode, benchmark ) else: raise e @@ -186,39 +193,107 @@ def _execute_backtest( }) sync_publish('hyperparameters', result['hyperparameters']) sync_publish('metrics', result['metrics']) - sync_publish('equity_curve', result['equity_curve']) + sync_publish('equity_curve', result['equity_curve'], compression=True) + sync_publish('trades', result['trades'], compression=True) + if chart: + sync_publish('candles_chart', _get_formatted_candles_for_frontend(), compression=True) + sync_publish('orders_chart', _get_formatted_orders_for_frontend(), compression=True) + sync_publish('add_line_to_candle_chart', _get_add_line_to_candle_chart(), compression=True) + sync_publish('add_extra_line_chart', _get_add_extra_line_chart(), compression=True) + sync_publish('add_horizontal_line_to_candle_chart', _get_add_horizontal_line_to_candle_chart(), compression=True) + sync_publish('add_horizontal_line_to_extra_chart', _get_add_horizontal_line_to_extra_chart(), compression=True) # close database connection from jesse.services.db import database database.close_connection() -def _generate_quantstats_report(candles_dict: dict) -> str: - if store.completed_trades.count == 0: - return None +def _get_formatted_candles_for_frontend(): + arr = [] + for r in router.routes: + candles_arr = store.candles.get_candles(r.exchange, r.symbol, r.timeframe) + # Find the index where the starting time actually begins. + starting_index = 0 + for i, c in enumerate(candles_arr): + if c[0] >= store.app.starting_time: + starting_index = i + break + + candles = [{ + 'time': int(c[0]/1000), + 'open': c[1], + 'close': c[2], + 'high': c[3], + 'low': c[4], + 'volume': c[5] + } for c in candles_arr[starting_index:]] + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'candles': candles + }) + return arr - price_data = [] - timestamps = [] - # load close candles for Buy and hold and calculate pct_change - for index, c in enumerate(config['app']['considering_candles']): - exchange, symbol = c[0], c[1] - if exchange in config['app']['trading_exchanges'] and symbol in config['app']['trading_symbols']: - candles = candles_dict[jh.key(exchange, symbol)]['candles'] - # if timestamps is empty, fill it with the first candles timestamps because it's the same for all candles - if timestamps == []: - timestamps = candles[:, 0] - price_data.append(candles[:, 1]) +def _get_formatted_orders_for_frontend(): + arr = [] + for r in router.routes: + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'orders': r.strategy._executed_orders + }) + return arr + + +def _get_add_line_to_candle_chart(): + arr = [] + for r in router.routes: + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'lines': r.strategy._add_line_to_candle_chart_values + }) + return arr + + +def _get_add_extra_line_chart(): + arr = [] + for r in router.routes: + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'charts': r.strategy._add_extra_line_chart_values + }) + return arr - price_data = np.transpose(price_data) - price_df = pd.DataFrame( - price_data, index=pd.to_datetime(timestamps, unit="ms"), dtype=float - ).resample('D').mean() - price_pct_change = price_df.pct_change(1).fillna(0) - buy_and_hold_daily_returns_all_routes = price_pct_change.mean(1) - study_name = _get_study_name() - res = quantstats.quantstats_tearsheet(buy_and_hold_daily_returns_all_routes, study_name) - return res + +def _get_add_horizontal_line_to_candle_chart(): + arr = [] + for r in router.routes: + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'lines': r.strategy._add_horizontal_line_to_candle_chart_values + }) + return arr + + +def _get_add_horizontal_line_to_extra_chart(): + arr = [] + for r in router.routes: + arr.append({ + 'exchange': r.exchange, + 'symbol': r.symbol, + 'timeframe': r.timeframe, + 'lines': r.strategy._add_horizontal_line_to_extra_chart_values + }) + return arr def _get_study_name() -> str: @@ -261,10 +336,38 @@ def load_candles(start_date: int, finish_date: int) -> Tuple[dict, dict]: return warmup_candles, trading_candles -def _handle_warmup_candles(warmup_candles: dict) -> None: - for c in config['app']['considering_candles']: - exchange, symbol = c[0], c[1] - inject_warmup_candles_to_store(warmup_candles[jh.key(exchange, symbol)]['candles'], exchange, symbol) +def _handle_warmup_candles(warmup_candles: dict, start_date: str) -> None: + try: + for c in config['app']['considering_candles']: + exchange, symbol = c[0], c[1] + inject_warmup_candles_to_store(warmup_candles[jh.key(exchange, symbol)]['candles'], exchange, symbol) + except ValueError as e: + # Extract exchange and symbol from error message + match = re.search(r"for (.*?)/(.*?)\?", str(e)) + if match: + exchange, symbol = match.groups() + + # Calculate warmup start date using the same logic as load_candles() + warmup_num = jh.get_config('env.data.warmup_candles_num', 210) + max_timeframe = jh.max_timeframe(config['app']['considering_timeframes']) + # Convert max_timeframe to minutes and multiply by warmup_num + warmup_minutes = timeframe_to_one_minutes[max_timeframe] * warmup_num + warmup_start_timestamp = jh.date_to_timestamp(start_date) - (warmup_minutes * 60_000) + warmup_start_date = jh.timestamp_to_date(warmup_start_timestamp) + # Publish the missing candles error to the frontend + # This will trigger the alert in the BacktestTab.vue component + # so that the user can import the missing candles + sync_publish( + "missing_candles", + { + "message": f'Missing warmup candles for {symbol} on {exchange} from {warmup_start_date}', + "symbol": symbol, + "exchange": exchange, + "start_date": warmup_start_date, + }, + ) + raise exceptions.CandlesNotFound(str(e)) + raise e def simulator(*args, fast_mode: bool = False, **kwargs) -> dict: @@ -278,9 +381,7 @@ def _step_simulator( candles: dict, run_silently: bool, hyperparameters: dict = None, - generate_charts: bool = False, generate_tradingview: bool = False, - generate_quantstats: bool = False, generate_csv: bool = False, generate_json: bool = False, generate_equity_curve: bool = False, @@ -335,7 +436,7 @@ def _step_simulator( if timeframe == '1m': continue - count = jh.timeframe_to_one_minutes(timeframe) + count = timeframe_to_one_minutes[timeframe] # until = count - ((i + 1) % count) if (i + 1) % count == 0: @@ -352,7 +453,7 @@ def _step_simulator( # now that all new generated candles are ready, execute for r in router.routes: - count = jh.timeframe_to_one_minutes(r.timeframe) + count = timeframe_to_one_minutes[r.timeframe] # 1m timeframe if r.timeframe == timeframes.MINUTE_1: r.strategy._execute() @@ -391,9 +492,7 @@ def _step_simulator( result = _generate_outputs( candles, - generate_charts=generate_charts, generate_tradingview=generate_tradingview, - generate_quantstats=generate_quantstats, generate_csv=generate_csv, generate_json=generate_json, generate_equity_curve=generate_equity_curve, @@ -440,8 +539,8 @@ def _prepare_routes(hyperparameters: dict = None) -> None: r.strategy = StrategyClass() except TypeError: raise exceptions.InvalidStrategy( - "Looks like the structure of your strategy directory is incorrect. Make sure to include the strategy INSIDE the __init__.py file. Another reason for this error might be that your strategy is missing the mandatory methods such as should_long(), go_long(), and should_cancel_entry(). " - "\nIf you need working examples, check out: https://github.com/jesse-ai/example-strategies" + "Strategy validation failed. Make sure your strategy has the mandatory methods such as should_long(), " + "go_long(), etc. For working examples, visit: https://jesse.trade/strategies" ) except: raise @@ -560,7 +659,10 @@ def _simulate_price_change_effect(real_candle: np.ndarray, exchange: str, symbol executed_order = True order.execute() - executing_orders = _get_executing_orders(exchange, symbol, real_candle) + executing_orders = _get_executing_orders(exchange, symbol, current_temp_candle) + if len(executing_orders) > 1: + # extend the candle shape from (6,) to (1,6) + executing_orders = _sort_execution_orders(executing_orders, current_temp_candle[None, :]) # break from the for loop, we'll try again inside the while # loop with the new current_temp_candle @@ -619,9 +721,7 @@ def _check_for_liquidations(candle: np.ndarray, exchange: str, symbol: str) -> N def _generate_outputs( candles: dict, - generate_charts: bool = False, generate_tradingview: bool = False, - generate_quantstats: bool = False, generate_csv: bool = False, generate_json: bool = False, generate_equity_curve: bool = False, @@ -633,6 +733,7 @@ def _generate_outputs( if generate_hyperparameters: result["hyperparameters"] = stats.hyperparameters(router.routes) result["metrics"] = report.portfolio_metrics() + result["trades"] = report.trades() # generate logs in json, csv and tradingview's pine-editor format logs_path = store_logs(generate_json, generate_tradingview, generate_csv) if generate_json: @@ -641,12 +742,8 @@ def _generate_outputs( result["tradingview"] = logs_path["tradingview"] if generate_csv: result["csv"] = logs_path["csv"] - if generate_charts: - result["charts"] = charts.portfolio_vs_asset_returns(_get_study_name()) if generate_equity_curve: result["equity_curve"] = charts.equity_curve(benchmark) - if generate_quantstats: - result["quantstats"] = _generate_quantstats_report(candles) if generate_logs: result["logs"] = f"storage/logs/backtest-mode/{jh.get_session_id()}.txt" return result @@ -656,9 +753,7 @@ def _skip_simulator( candles: dict, run_silently: bool, hyperparameters: dict = None, - generate_charts: bool = False, generate_tradingview: bool = False, - generate_quantstats: bool = False, generate_csv: bool = False, generate_json: bool = False, generate_equity_curve: bool = False, @@ -688,7 +783,8 @@ def _skip_simulator( # store.app.time = first_candles_set[i][0] + (60_000 * candles_step) _simulate_new_candles(candles, i, candles_step) - last_update_time = _update_progress_bar(progressbar, run_silently, i, candles_step, last_update_time=last_update_time) + last_update_time = _update_progress_bar(progressbar, run_silently, i, candles_step, + last_update_time=last_update_time) _execute_routes(i, candles_step) @@ -718,9 +814,7 @@ def _skip_simulator( result = _generate_outputs( candles, - generate_charts=generate_charts, generate_tradingview=generate_tradingview, - generate_quantstats=generate_quantstats, generate_csv=generate_csv, generate_json=generate_json, generate_equity_curve=generate_equity_curve, @@ -739,12 +833,32 @@ def _calculate_minimum_candle_step(): # config["app"]["considering_timeframes"] use '1m' also even if not required by the user so take only what the user # is requested. consider_time_frames = [ - jh.timeframe_to_one_minutes(route["timeframe"]) + timeframe_to_one_minutes[route["timeframe"]] for route in router.all_formatted_routes ] return np.gcd.reduce(consider_time_frames) +timeframe_to_one_minutes = { + timeframes.MINUTE_1: 1, + timeframes.MINUTE_3: 3, + timeframes.MINUTE_5: 5, + timeframes.MINUTE_15: 15, + timeframes.MINUTE_30: 30, + timeframes.MINUTE_45: 45, + timeframes.HOUR_1: 60, + timeframes.HOUR_2: 60 * 2, + timeframes.HOUR_3: 60 * 3, + timeframes.HOUR_4: 60 * 4, + timeframes.HOUR_6: 60 * 6, + timeframes.HOUR_8: 60 * 8, + timeframes.HOUR_12: 60 * 12, + timeframes.DAY_1: 60 * 24, + timeframes.DAY_3: 60 * 24 * 3, + timeframes.WEEK_1: 60 * 24 * 7, + timeframes.MONTH_1: 60 * 24 * 30, +} + def _simulate_new_candles(candles: dict, candle_index: int, candles_step: int) -> None: i = candle_index # add candles @@ -769,7 +883,7 @@ def _simulate_new_candles(candles: dict, candle_index: int, candles_step: int) - if timeframe == "1m": continue - count = jh.timeframe_to_one_minutes(timeframe) + count = timeframe_to_one_minutes[timeframe] if (i + candles_step) % count == 0: generated_candle = generate_candle_from_one_minutes( @@ -808,6 +922,9 @@ def _simulate_price_change_effect_multiple_candles( for i in range(len(short_timeframes_candles)): current_temp_candle = short_timeframes_candles[i].copy() + if i > 0: + current_temp_candle[3] = max(current_temp_candle[3], short_timeframes_candles[i-1, 2]) + current_temp_candle[4] = min(current_temp_candle[4], short_timeframes_candles[i-1, 2]) is_executed_order = False while True: @@ -875,16 +992,13 @@ def _simulate_price_change_effect_multiple_candles( def _update_all_routes_a_partial_candle( - exchange: str, - symbol: str, - storable_temp_candle: np.ndarray, + exchange: str, + symbol: str, + storable_temp_candle: np.ndarray, ) -> None: """ This function get called when an order is getting executed you need to update the other timeframe how their last candles looks like - Args: - short_timeframes_candles: 1m candles until storable_temp_candle - storable_temp_candle: storable_temp_candle the last 1m candle but not yet closed """ store.candles.add_candle( storable_temp_candle, @@ -901,7 +1015,7 @@ def _update_all_routes_a_partial_candle( continue if timeframe == '1m': continue - tf_minutes = jh.timeframe_to_one_minutes(timeframe) + tf_minutes = timeframe_to_one_minutes[timeframe] number_of_needed_candles = int(storable_temp_candle[0] % (tf_minutes * 60_000) // 60000) + 1 candles_1m = store.candles.get_candles(exchange, symbol, '1m')[-number_of_needed_candles:] generated_candle = generate_candle_from_one_minutes( @@ -922,7 +1036,7 @@ def _update_all_routes_a_partial_candle( def _execute_routes(candle_index: int, candles_step: int) -> None: # now that all new generated candles are ready, execute for r in router.routes: - count = jh.timeframe_to_one_minutes(r.timeframe) + count = timeframe_to_one_minutes[r.timeframe] # 1m timeframe if r.timeframe == timeframes.MINUTE_1: r.strategy._execute() @@ -966,13 +1080,23 @@ def _sort_execution_orders(orders: List[Order], short_candles: np.ndarray): sorted_orders.append(included_orders[0]) elif len(included_orders) > 1: # in case that the orders are above - - # note: check the first is enough because I can assume all the orders in the same direction of the price, - # in case it doesn't than i cant really know how the price react in this 1 minute candle.. - if short_candles[i, 3] > included_orders[0].price > short_candles[i, 1]: - sorted_orders += sorted(included_orders, key=lambda o: o.price) + is_red = short_candles[i, 1] > short_candles[i, 2] + above_open, on_open, below_open = [], [], [] + open_price = short_candles[i, 1] + for order in included_orders: + if order.price == open_price: + on_open.append(order) + if order.price > open_price: + above_open.append(order) + else: + below_open.append(order) + sorted_orders += on_open + if is_red: + # heuristic that first the price goes up and then down, so this is the order execution sort + sorted_orders += sorted(above_open, key=lambda o: o.price) + sorted(below_open, key=lambda o: o.price, reverse=True) else: - sorted_orders += sorted(included_orders, key=lambda o: o.price, reverse=True) + sorted_orders += sorted(below_open, key=lambda o: o.price, reverse=True) + sorted(above_open, key=lambda o: o.price) + if len(sorted_orders) == len(orders): break return sorted_orders diff --git a/jesse/modes/data_provider.py b/jesse/modes/data_provider.py index 3f811ae96..6f55bf8c9 100644 --- a/jesse/modes/data_provider.py +++ b/jesse/modes/data_provider.py @@ -1,4 +1,5 @@ import json +import os import numpy as np import peewee from fastapi.responses import FileResponse @@ -145,9 +146,6 @@ def download_file(mode: str, file_type: str, session_id: str = None): if mode == 'backtest' and file_type == 'log': path = f'storage/logs/backtest-mode/{session_id}.txt' filename = f'backtest-{session_id}.txt' - elif mode == 'backtest' and file_type == 'chart': - path = f'storage/charts/{session_id}.png' - filename = f'backtest-{session_id}.png' elif mode == 'backtest' and file_type == 'csv': path = f'storage/csv/{session_id}.csv' filename = f'backtest-{session_id}.csv' @@ -168,3 +166,32 @@ def download_file(mode: str, file_type: str, session_id: str = None): raise Exception(f'Unknown file type: {file_type} or mode: {mode}') return FileResponse(path=path, filename=filename, media_type='application/octet-stream') + + +def get_backtest_logs(session_id: str): + path = f"storage/logs/backtest-mode/{session_id}.txt" + + if not os.path.exists(path): + return None + + with open(path, "r") as f: + content = f.read() + + return jh.compressed_response(content) + + +def download_backtest_log(session_id: str): + """ + Returns the log file for a specific backtest session as a downloadable file + """ + path = f'storage/logs/backtest-mode/{session_id}.txt' + + if not os.path.exists(path): + raise Exception('Log file not found') + + filename = f'backtest-{session_id}.txt' + return FileResponse( + path=path, + filename=filename, + media_type='text/plain' + ) diff --git a/jesse/modes/import_candles_mode/__init__.py b/jesse/modes/import_candles_mode/__init__.py index 51f7c5cd4..ba896c7db 100644 --- a/jesse/modes/import_candles_mode/__init__.py +++ b/jesse/modes/import_candles_mode/__init__.py @@ -80,6 +80,11 @@ def handle_time(): loop_length = int(candles_count / driver.count) + 1 progressbar = Progressbar(loop_length, step=2) + frontend_update_counter = 0 + frontend_update_threshold = 100 # Only notify frontend after this many updates when skipping existing candles + skipped_minutes = 0 + imported_minutes = 0 + for i in range(candles_count): temp_start_timestamp = start_date.int_timestamp * 1000 temp_end_timestamp = temp_start_timestamp + (driver.count - 1) * 60000 @@ -97,7 +102,10 @@ def handle_time(): ).count() already_exists = count == driver.count - if not already_exists: + if already_exists: + skipped_minutes += driver.count + else: + imported_minutes += driver.count # it's today's candles if temp_end_timestamp < now if temp_end_timestamp > jh.now_to_timestamp(): temp_end_timestamp = arrow.utcnow().floor('minute').int_timestamp * 1000 - 60000 @@ -134,7 +142,7 @@ def handle_time(): if running_via_dashboard: sync_publish('alert', { 'message': msg, - 'type': 'success' + 'type': 'info' }) else: print(msg) @@ -153,21 +161,41 @@ def handle_time(): if i % 2 == 0: progressbar.update() - if running_via_dashboard: - sync_publish('progressbar', { - 'current': progressbar.current, - 'estimated_remaining_seconds': progressbar.estimated_remaining_seconds - }) - elif show_progressbar: - jh.clear_output() - print( - f"Progress: {progressbar.current}% - {round(progressbar.estimated_remaining_seconds)} seconds remaining") + + # For existing candles, throttle frontend updates + if already_exists: + frontend_update_counter += 1 + if frontend_update_counter >= frontend_update_threshold: + frontend_update_counter = 0 + if running_via_dashboard: + sync_publish('progressbar', { + 'current': progressbar.current, + 'estimated_remaining_seconds': progressbar.estimated_remaining_seconds + }) + # For new candles being fetched, update frontend normally + else: + if running_via_dashboard: + sync_publish('progressbar', { + 'current': progressbar.current, + 'estimated_remaining_seconds': progressbar.estimated_remaining_seconds + }) + + if show_progressbar: + jh.clear_output() + print( + f"Progress: {progressbar.current}% - {round(progressbar.estimated_remaining_seconds)} seconds remaining") # sleep so that the exchange won't get angry at us if not already_exists: time.sleep(driver.sleep_time) - success_text = f'Successfully imported candles for {symbol} from {exchange} since {jh.timestamp_to_date(start_timestamp)} until today ({days_count} days). ' + skipped_days = round(skipped_minutes / 1440, 1) + imported_days = round(imported_minutes / 1440, 1) + + success_text = ( + f'Successfully imported candles since "{jh.timestamp_to_date(start_timestamp)}" until today ' + f'({imported_days} days imported, {skipped_days} days already existed in the database). ' + ) # stop the status_checker time loop if running_via_dashboard: diff --git a/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetual.py b/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetual.py new file mode 100644 index 000000000..946d88ea2 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetual.py @@ -0,0 +1,10 @@ +from .ApexProMain import ApexProMain +from jesse.enums import exchanges + + +class ApexOmniPerpetual(ApexProMain): + def __init__(self) -> None: + super().__init__( + name=exchanges.APEX_OMNI_PERPETUAL, + rest_endpoint='https://omni.apex.exchange/api/v3' + ) diff --git a/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetualTestnet.py b/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetualTestnet.py new file mode 100644 index 000000000..b2a5c9632 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/ApexOmniPerpetualTestnet.py @@ -0,0 +1,10 @@ +from .ApexProMain import ApexProMain +from jesse.enums import exchanges + + +class ApexOmniPerpetualTestnet(ApexProMain): + def __init__(self) -> None: + super().__init__( + name=exchanges.APEX_OMNI_PERPETUAL_TESTNET, + rest_endpoint='https://testnet.omni.apex.exchange/api/v3' + ) diff --git a/jesse/modes/import_candles_mode/drivers/Apex/ApexProMain.py b/jesse/modes/import_candles_mode/drivers/Apex/ApexProMain.py index b049e900b..629dd12f0 100644 --- a/jesse/modes/import_candles_mode/drivers/Apex/ApexProMain.py +++ b/jesse/modes/import_candles_mode/drivers/Apex/ApexProMain.py @@ -23,7 +23,7 @@ def get_starting_time(self, symbol: str) -> int: 'start': 1514811660 } - response = requests.get(self.endpoint + '/v2/klines', params=payload) + response = requests.get(self.endpoint + '/klines', params=payload) self.validate_response(response) if 'data' not in response.json(): @@ -48,14 +48,14 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni 'limit': self.count } - response = requests.get(self.endpoint + '/v2/klines', params=payload) + response = requests.get(self.endpoint + '/klines', params=payload) # check data exist in response.json if 'data' not in response.json(): raise exceptions.ExchangeInMaintenance(response.json()['msg']) elif response.json()['data'] == {}: raise exceptions.InvalidSymbol('Exchange does not support the entered symbol. Please enter a valid symbol.') - + data = response.json()['data'][dashless_symbol] return [ @@ -74,18 +74,40 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni ] def get_available_symbols(self) -> list: - response = requests.get(self.endpoint + '/v2/symbols') + response = requests.get(self.endpoint + '/symbols') self.validate_response(response) data = response.json()['data'] - usdt_pairs = [] - for p in data['usdtConfig']['perpetualContract']: - usdt_pairs.append(p['symbol']) - - usdc_pairs = [] - for p in data['usdcConfig']['perpetualContract']: - usdc_pairs.append(p['symbol']) - - arr = usdt_pairs + usdc_pairs - # return sorted - return list(sorted(arr)) + # Determine which suffix to filter based on exchange name + target_suffix = '-USDT' if self.name.startswith('Apex Omni') else '-USDC' + + # For legacy API response format + if 'usdtConfig' not in data: + symbols = [] + contracts = data['contractConfig']['perpetualContract'] + for p in contracts: + symbol = p['symbol'] + if symbol.endswith(target_suffix): + symbols.append(symbol) + return list(sorted(symbols)) + + # For new API response format + pairs = [] + # For Omni (USDT pairs) + if target_suffix == '-USDT': + if 'usdtConfig' in data and 'perpetualContract' in data['usdtConfig']: + contracts = data['usdtConfig']['perpetualContract'] + for p in contracts: + symbol = p['symbol'] + if symbol.endswith(target_suffix): + pairs.append(symbol) + # For Pro (USDC pairs) + else: + if 'usdcConfig' in data and 'perpetualContract' in data['usdcConfig']: + contracts = data['usdcConfig']['perpetualContract'] + for p in contracts: + symbol = p['symbol'] + if symbol.endswith(target_suffix): + pairs.append(symbol) + + return list(sorted(pairs)) diff --git a/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetual.py b/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetual.py index 01d2ea244..96b3ee475 100644 --- a/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetual.py +++ b/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetual.py @@ -6,5 +6,5 @@ class ApexProPerpetual(ApexProMain): def __init__(self) -> None: super().__init__( name=exchanges.APEX_PRO_PERPETUAL, - rest_endpoint='https://pro.apex.exchange/api' + rest_endpoint='https://pro.apex.exchange/api/v2' ) diff --git a/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetualTestnet.py b/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetualTestnet.py index d25c3bae7..8c83436e6 100644 --- a/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetualTestnet.py +++ b/jesse/modes/import_candles_mode/drivers/Apex/ApexProPerpetualTestnet.py @@ -6,5 +6,5 @@ class ApexProPerpetualTestnet(ApexProMain): def __init__(self) -> None: super().__init__( name=exchanges.APEX_PRO_PERPETUAL_TESTNET, - rest_endpoint='https://testnet.pro.apex.exchange/api' + rest_endpoint='https://testnet.pro.apex.exchange/api/v2' ) diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/__init__.py b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/__init__.py similarity index 100% rename from jesse/modes/import_candles_mode/drivers/Bitget/__init__.py rename to jesse/modes/import_candles_mode/drivers/Apex/omni_files/__init__.py diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-arm.dylib b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-arm.dylib new file mode 100644 index 000000000..da7c06699 Binary files /dev/null and b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-arm.dylib differ diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-x86.dylib b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-x86.dylib new file mode 100755 index 000000000..9c1165821 Binary files /dev/null and b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk-x86.dylib differ diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.dylib b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.dylib new file mode 100644 index 000000000..da7c06699 Binary files /dev/null and b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.dylib differ diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.so b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.so new file mode 100755 index 000000000..436c1f46f Binary files /dev/null and b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/libzklink_sdk.so differ diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-arm.py b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-arm.py new file mode 100644 index 000000000..e515c3216 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-arm.py @@ -0,0 +1,7954 @@ +# This file was autogenerated by some hot garbage in the `uniffi` crate. +# Trust me, you don't want to mess with it! + +# Common helper code. +# +# Ideally this would live in a separate .py file where it can be unittested etc +# in isolation, and perhaps even published as a re-useable package. +# +# However, it's important that the details of how this helper code works (e.g. the +# way that different builtin types are passed across the FFI) exactly match what's +# expected by the rust code on the other side of the interface. In practice right +# now that means coming from the exact some version of `uniffi` that was used to +# compile the rust component. The easiest way to ensure this is to bundle the Python +# helpers directly inline like we're doing here. + +import os +import sys +import ctypes +import enum +import struct +import contextlib +import threading +import typing +import platform + +# Used for default argument values +_DEFAULT = object() + + +class _UniffiRustBuffer(ctypes.Structure): + _fields_ = [ + ("capacity", ctypes.c_int32), + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + @staticmethod + def alloc(size): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc, size) + + @staticmethod + def reserve(rbuf, additional): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve, rbuf, additional) + + def free(self): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_free, self) + + def __str__(self): + return "_UniffiRustBuffer(capacity={}, len={}, data={})".format( + self.capacity, + self.len, + self.data[0:self.len] + ) + + @contextlib.contextmanager + def alloc_with_builder(*args): + """Context-manger to allocate a buffer using a _UniffiRustBufferBuilder. + + The allocated buffer will be automatically freed if an error occurs, ensuring that + we don't accidentally leak it. + """ + builder = _UniffiRustBufferBuilder() + try: + yield builder + except: + builder.discard() + raise + + @contextlib.contextmanager + def consume_with_stream(self): + """Context-manager to consume a buffer using a _UniffiRustBufferStream. + + The _UniffiRustBuffer will be freed once the context-manager exits, ensuring that we don't + leak it even if an error occurs. + """ + try: + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of consume_with_stream") + finally: + self.free() + + @contextlib.contextmanager + def read_with_stream(self): + """Context-manager to read a buffer using a _UniffiRustBufferStream. + + This is like consume_with_stream, but doesn't free the buffer afterwards. + It should only be used with borrowed `_UniffiRustBuffer` data. + """ + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of read_with_stream") + +class _UniffiForeignBytes(ctypes.Structure): + _fields_ = [ + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + def __str__(self): + return "_UniffiForeignBytes(len={}, data={})".format(self.len, self.data[0:self.len]) + + +class _UniffiRustBufferStream: + """ + Helper for structured reading of bytes from a _UniffiRustBuffer + """ + + def __init__(self, data, len): + self.data = data + self.len = len + self.offset = 0 + + @classmethod + def from_rust_buffer(cls, buf): + return cls(buf.data, buf.len) + + def remaining(self): + return self.len - self.offset + + def _unpack_from(self, size, format): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + value = struct.unpack(format, self.data[self.offset:self.offset+size])[0] + self.offset += size + return value + + def read(self, size): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + data = self.data[self.offset:self.offset+size] + self.offset += size + return data + + def read_i8(self): + return self._unpack_from(1, ">b") + + def read_u8(self): + return self._unpack_from(1, ">B") + + def read_i16(self): + return self._unpack_from(2, ">h") + + def read_u16(self): + return self._unpack_from(2, ">H") + + def read_i32(self): + return self._unpack_from(4, ">i") + + def read_u32(self): + return self._unpack_from(4, ">I") + + def read_i64(self): + return self._unpack_from(8, ">q") + + def read_u64(self): + return self._unpack_from(8, ">Q") + + def read_float(self): + v = self._unpack_from(4, ">f") + return v + + def read_double(self): + return self._unpack_from(8, ">d") + + def read_c_size_t(self): + return self._unpack_from(ctypes.sizeof(ctypes.c_size_t) , "@N") + +class _UniffiRustBufferBuilder: + """ + Helper for structured writing of bytes into a _UniffiRustBuffer. + """ + + def __init__(self): + self.rbuf = _UniffiRustBuffer.alloc(16) + self.rbuf.len = 0 + + def finalize(self): + rbuf = self.rbuf + self.rbuf = None + return rbuf + + def discard(self): + if self.rbuf is not None: + rbuf = self.finalize() + rbuf.free() + + @contextlib.contextmanager + def _reserve(self, num_bytes): + if self.rbuf.len + num_bytes > self.rbuf.capacity: + self.rbuf = _UniffiRustBuffer.reserve(self.rbuf, num_bytes) + yield None + self.rbuf.len += num_bytes + + def _pack_into(self, size, format, value): + with self._reserve(size): + # XXX TODO: I feel like I should be able to use `struct.pack_into` here but can't figure it out. + for i, byte in enumerate(struct.pack(format, value)): + self.rbuf.data[self.rbuf.len + i] = byte + + def write(self, value): + with self._reserve(len(value)): + for i, byte in enumerate(value): + self.rbuf.data[self.rbuf.len + i] = byte + + def write_i8(self, v): + self._pack_into(1, ">b", v) + + def write_u8(self, v): + self._pack_into(1, ">B", v) + + def write_i16(self, v): + self._pack_into(2, ">h", v) + + def write_u16(self, v): + self._pack_into(2, ">H", v) + + def write_i32(self, v): + self._pack_into(4, ">i", v) + + def write_u32(self, v): + self._pack_into(4, ">I", v) + + def write_i64(self, v): + self._pack_into(8, ">q", v) + + def write_u64(self, v): + self._pack_into(8, ">Q", v) + + def write_float(self, v): + self._pack_into(4, ">f", v) + + def write_double(self, v): + self._pack_into(8, ">d", v) + + def write_c_size_t(self, v): + self._pack_into(ctypes.sizeof(ctypes.c_size_t) , "@N", v) +# A handful of classes and functions to support the generated data structures. +# This would be a good candidate for isolating in its own ffi-support lib. + +class InternalError(Exception): + pass + +class _UniffiRustCallStatus(ctypes.Structure): + """ + Error runtime. + """ + _fields_ = [ + ("code", ctypes.c_int8), + ("error_buf", _UniffiRustBuffer), + ] + + # These match the values from the uniffi::rustcalls module + CALL_SUCCESS = 0 + CALL_ERROR = 1 + CALL_PANIC = 2 + + def __str__(self): + if self.code == _UniffiRustCallStatus.CALL_SUCCESS: + return "_UniffiRustCallStatus(CALL_SUCCESS)" + elif self.code == _UniffiRustCallStatus.CALL_ERROR: + return "_UniffiRustCallStatus(CALL_ERROR)" + elif self.code == _UniffiRustCallStatus.CALL_PANIC: + return "_UniffiRustCallStatus(CALL_PANIC)" + else: + return "_UniffiRustCallStatus()" + +def _rust_call(fn, *args): + # Call a rust function + return _rust_call_with_error(None, fn, *args) + +def _rust_call_with_error(error_ffi_converter, fn, *args): + # Call a rust function and handle any errors + # + # This function is used for rust calls that return Result<> and therefore can set the CALL_ERROR status code. + # error_ffi_converter must be set to the _UniffiConverter for the error class that corresponds to the result. + call_status = _UniffiRustCallStatus(code=_UniffiRustCallStatus.CALL_SUCCESS, error_buf=_UniffiRustBuffer(0, 0, None)) + + args_with_error = args + (ctypes.byref(call_status),) + result = fn(*args_with_error) + _uniffi_check_call_status(error_ffi_converter, call_status) + return result + +def _uniffi_check_call_status(error_ffi_converter, call_status): + if call_status.code == _UniffiRustCallStatus.CALL_SUCCESS: + pass + elif call_status.code == _UniffiRustCallStatus.CALL_ERROR: + if error_ffi_converter is None: + call_status.error_buf.free() + raise InternalError("_rust_call_with_error: CALL_ERROR, but error_ffi_converter is None") + else: + raise error_ffi_converter.lift(call_status.error_buf) + elif call_status.code == _UniffiRustCallStatus.CALL_PANIC: + # When the rust code sees a panic, it tries to construct a _UniffiRustBuffer + # with the message. But if that code panics, then it just sends back + # an empty buffer. + if call_status.error_buf.len > 0: + msg = _UniffiConverterString.lift(call_status.error_buf) + else: + msg = "Unknown rust panic" + raise InternalError(msg) + else: + raise InternalError("Invalid _UniffiRustCallStatus code: {}".format( + call_status.code)) + +# A function pointer for a callback as defined by UniFFI. +# Rust definition `fn(handle: u64, method: u32, args: _UniffiRustBuffer, buf_ptr: *mut _UniffiRustBuffer) -> int` +_UNIFFI_FOREIGN_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_ulonglong, ctypes.c_ulong, ctypes.POINTER(ctypes.c_char), ctypes.c_int, ctypes.POINTER(_UniffiRustBuffer)) + +# UniFFI future continuation +_UNIFFI_FUTURE_CONTINUATION_T = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_int8) + +class _UniffiPointerManagerCPython: + """ + Manage giving out pointers to Python objects on CPython + + This class is used to generate opaque pointers that reference Python objects to pass to Rust. + It assumes a CPython platform. See _UniffiPointerManagerGeneral for the alternative. + """ + + def new_pointer(self, obj): + """ + Get a pointer for an object as a ctypes.c_size_t instance + + Each call to new_pointer() must be balanced with exactly one call to release_pointer() + + This returns a ctypes.c_size_t. This is always the same size as a pointer and can be + interchanged with pointers for FFI function arguments and return values. + """ + # IncRef the object since we're going to pass a pointer to Rust + ctypes.pythonapi.Py_IncRef(ctypes.py_object(obj)) + # id() is the object address on CPython + # (https://docs.python.org/3/library/functions.html#id) + return id(obj) + + def release_pointer(self, address): + py_obj = ctypes.cast(address, ctypes.py_object) + obj = py_obj.value + ctypes.pythonapi.Py_DecRef(py_obj) + return obj + + def lookup(self, address): + return ctypes.cast(address, ctypes.py_object).value + +class _UniffiPointerManagerGeneral: + """ + Manage giving out pointers to Python objects on non-CPython platforms + + This has the same API as _UniffiPointerManagerCPython, but doesn't assume we're running on + CPython and is slightly slower. + + Instead of using real pointers, it maps integer values to objects and returns the keys as + c_size_t values. + """ + + def __init__(self): + self._map = {} + self._lock = threading.Lock() + self._current_handle = 0 + + def new_pointer(self, obj): + with self._lock: + handle = self._current_handle + self._current_handle += 1 + self._map[handle] = obj + return handle + + def release_pointer(self, handle): + with self._lock: + return self._map.pop(handle) + + def lookup(self, handle): + with self._lock: + return self._map[handle] + +# Pick an pointer manager implementation based on the platform +if platform.python_implementation() == 'CPython': + _UniffiPointerManager = _UniffiPointerManagerCPython # type: ignore +else: + _UniffiPointerManager = _UniffiPointerManagerGeneral # type: ignore +# Types conforming to `_UniffiConverterPrimitive` pass themselves directly over the FFI. +class _UniffiConverterPrimitive: + @classmethod + def check(cls, value): + return value + + @classmethod + def lift(cls, value): + return value + + @classmethod + def lower(cls, value): + return cls.lowerUnchecked(cls.check(value)) + + @classmethod + def lowerUnchecked(cls, value): + return value + + @classmethod + def write(cls, value, buf): + cls.write_unchecked(cls.check(value), buf) + +class _UniffiConverterPrimitiveInt(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__index__() + except Exception: + raise TypeError("'{}' object cannot be interpreted as an integer".format(type(value).__name__)) + if not isinstance(value, int): + raise TypeError("__index__ returned non-int (type {})".format(type(value).__name__)) + if not cls.VALUE_MIN <= value < cls.VALUE_MAX: + raise ValueError("{} requires {} <= value < {}".format(cls.CLASS_NAME, cls.VALUE_MIN, cls.VALUE_MAX)) + return super().check(value) + +class _UniffiConverterPrimitiveFloat(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__float__() + except Exception: + raise TypeError("must be real number, not {}".format(type(value).__name__)) + if not isinstance(value, float): + raise TypeError("__float__ returned non-float (type {})".format(type(value).__name__)) + return super().check(value) + +# Helper class for wrapper types that will always go through a _UniffiRustBuffer. +# Classes should inherit from this and implement the `read` and `write` static methods. +class _UniffiConverterRustBuffer: + @classmethod + def lift(cls, rbuf): + with rbuf.consume_with_stream() as stream: + return cls.read(stream) + + @classmethod + def lower(cls, value): + with _UniffiRustBuffer.alloc_with_builder() as builder: + cls.write(value, builder) + return builder.finalize() + +# Contains loading, initialization code, and the FFI Function declarations. +# Define some ctypes FFI types that we use in the library + +""" +ctypes type for the foreign executor callback. This is a built-in interface for scheduling +tasks + +Args: + executor: opaque c_size_t value representing the eventloop + delay: delay in ms + task: function pointer to the task callback + task_data: void pointer to the task callback data + +Normally we should call task(task_data) after the detail. +However, when task is NULL this indicates that Rust has dropped the ForeignExecutor and we should +decrease the EventLoop refcount. +""" +_UNIFFI_FOREIGN_EXECUTOR_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int8, ctypes.c_size_t, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p) + +""" +Function pointer for a Rust task, which a callback function that takes a opaque pointer +""" +_UNIFFI_RUST_TASK = ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_int8) + +def _uniffi_future_callback_t(return_type): + """ + Factory function to create callback function types for async functions + """ + return ctypes.CFUNCTYPE(None, ctypes.c_size_t, return_type, _UniffiRustCallStatus) + +def _uniffi_load_indirect(): + """ + This is how we find and load the dynamic library provided by the component. + For now we just look it up by name. + """ + if sys.platform == "darwin": + libname = "lib{}.dylib" + elif sys.platform.startswith("win"): + # As of python3.8, ctypes does not seem to search $PATH when loading DLLs. + # We could use `os.add_dll_directory` to configure the search path, but + # it doesn't feel right to mess with application-wide settings. Let's + # assume that the `.dll` is next to the `.py` file and load by full path. + libname = os.path.join( + os.path.dirname(__file__), + "{}.dll", + ) + else: + # Anything else must be an ELF platform - Linux, *BSD, Solaris/illumos + libname = "lib{}.so" + + libname = libname.format("zklink_sdk") + path = os.path.join(os.path.dirname(__file__), libname) + lib = ctypes.cdll.LoadLibrary(path) + return lib + +def _uniffi_check_contract_api_version(lib): + # Get the bindings contract version from our ComponentInterface + bindings_contract_version = 24 + # Get the scaffolding contract version by calling the into the dylib + scaffolding_contract_version = lib.ffi_zklink_sdk_uniffi_contract_version() + if bindings_contract_version != scaffolding_contract_version: + raise InternalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") + +def _uniffi_check_api_checksums(lib): + if lib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey() != 63374: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey() != 32759: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_get_public_key_hash() != 58294: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_verify_musig() != 61749: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url() != 63488: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url() != 4933: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx() != 63490: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes() != 44684: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature() != 16515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid() != 2829: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid() != 32196: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str() != 3439: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx() != 64239: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash() != 35167: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes() != 1938: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature() != 51549: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain() != 10977: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid() != 25271: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid() != 31315: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str() != 43695: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx() != 42088: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash() != 26881: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract() != 3720: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_bytes() != 6953: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_signature() != 60348: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_long() != 52375: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_short() != 24664: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid() != 33071: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx() != 44741: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes() != 12250: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature() != 41128: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid() != 33576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid() != 55586: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str() != 42918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx() != 43065: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash() != 3288: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes() != 46958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_json_str() != 17811: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash() != 37358: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address() != 11362: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message() != 14536: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx() != 17267: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes() != 15553: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature() != 48117: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid() != 6534: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid() != 46100: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str() != 4050: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx() != 32455: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash() != 45462: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes() != 52461: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid() != 57198: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_json_str() != 24199: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx() != 51607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash() != 48511: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx() != 38824: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_bytes() != 63867: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_signature() != 29468: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid() != 50669: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_valid() != 4189: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_json_str() != 55097: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx() != 27295: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_tx_hash() != 26610: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx() != 18143: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes() != 1134: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature() != 31505: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid() != 8478: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid() != 2828: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_json_str() != 62587: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx() != 30414: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash() != 34918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_create_signed_order() != 18530: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_bytes() != 51161: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg() != 11725: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_signature() != 46876: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid() != 6764: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_valid() != 56951: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_json_str() != 20284: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx() != 27728: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes() != 13177: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature() != 35878: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid() != 54946: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid() != 51995: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str() != 33830: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx() != 23870: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash() != 3162: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging() != 3485: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth() != 39808: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth() != 63567: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data() != 26921: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching() != 27932: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit() != 37862: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_funding() != 31213: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation() != 56257: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching() != 19982: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer() != 51577: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw() != 56851: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message() != 27027: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx() != 17446: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature() != 18454: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes() != 56287: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg() != 46393: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_signature() != 55226: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid() != 31540: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_valid() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_json_str() != 28252: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx() != 64899: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash() != 16259: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes() != 40576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid() != 7961: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str() != 48653: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx() != 40091: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash() != 4261: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx() != 15886: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature() != 28825: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes() != 15999: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg() != 27813: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature() != 56920: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid() != 9636: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid() != 32004: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_json_str() != 3719: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx() != 26934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash() != 25800: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key() != 11211: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new() != 10122: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new() != 10607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contract_new() != 32968: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new() != 210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_deposit_new() != 2732: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new() != 58738: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new() != 30328: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_fullexit_new() != 27234: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_funding_new() != 62515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_liquidation_new() != 56634: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_order_new() != 13958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new() != 5934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_signer_new() != 24354: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new() != 61581: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str() != 57960: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_transfer_new() != 31981: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_typeddata_new() != 46773: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new() != 31819: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_withdraw_new() != 47491: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new() != 62411: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes() != 17619: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer() != 60210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer() != 21809: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed() != 47514: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + +# A ctypes library to expose the extern-C FFI definitions. +# This is an implementation detail which will be called internally by the public API. + +_UniffiLib = _uniffi_load_indirect() +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_order.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_order.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.argtypes = ( + ctypes.c_uint32, + ctypes.c_uint8, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_int8, + ctypes.c_int8, + ctypes.c_uint8, + ctypes.c_uint8, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_uint8, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.argtypes = ( + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.argtypes = ( + _UniffiForeignBytes, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.restype = None +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.argtypes = ( + _UniffiRustBuffer, + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.argtypes = ( + _UNIFFI_FUTURE_CONTINUATION_T, +) +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.restype = ctypes.c_uint8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.restype = ctypes.c_int8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.restype = ctypes.c_int16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.restype = ctypes.c_uint32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.restype = ctypes.c_int32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.restype = ctypes.c_uint64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.restype = ctypes.c_int64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.restype = ctypes.c_float +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.restype = ctypes.c_double +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.restype = ctypes.c_void_p +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.restype = None +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.argtypes = ( +) +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.restype = ctypes.c_uint32 +_uniffi_check_contract_api_version(_UniffiLib) +_uniffi_check_api_checksums(_UniffiLib) + +# Async support + +# Public interface members begin here. + + +class _UniffiConverterUInt8(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u8" + VALUE_MIN = 0 + VALUE_MAX = 2**8 + + @staticmethod + def read(buf): + return buf.read_u8() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u8(value) + +class _UniffiConverterUInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u16" + VALUE_MIN = 0 + VALUE_MAX = 2**16 + + @staticmethod + def read(buf): + return buf.read_u16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u16(value) + +class _UniffiConverterInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "i16" + VALUE_MIN = -2**15 + VALUE_MAX = 2**15 + + @staticmethod + def read(buf): + return buf.read_i16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_i16(value) + +class _UniffiConverterUInt32(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u32" + VALUE_MIN = 0 + VALUE_MAX = 2**32 + + @staticmethod + def read(buf): + return buf.read_u32() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u32(value) + +class _UniffiConverterUInt64(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u64" + VALUE_MIN = 0 + VALUE_MAX = 2**64 + + @staticmethod + def read(buf): + return buf.read_u64() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u64(value) + +class _UniffiConverterBool(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + return not not value + + @classmethod + def read(cls, buf): + return cls.lift(buf.read_u8()) + + @classmethod + def write_unchecked(cls, value, buf): + buf.write_u8(value) + + @staticmethod + def lift(value): + return value != 0 + +class _UniffiConverterString: + @staticmethod + def check(value): + if not isinstance(value, str): + raise TypeError("argument must be str, not {}".format(type(value).__name__)) + return value + + @staticmethod + def read(buf): + size = buf.read_i32() + if size < 0: + raise InternalError("Unexpected negative string length") + utf8_bytes = buf.read(size) + return utf8_bytes.decode("utf-8") + + @staticmethod + def write(value, buf): + value = _UniffiConverterString.check(value) + utf8_bytes = value.encode("utf-8") + buf.write_i32(len(utf8_bytes)) + buf.write(utf8_bytes) + + @staticmethod + def lift(buf): + with buf.consume_with_stream() as stream: + return stream.read(stream.remaining()).decode("utf-8") + + @staticmethod + def lower(value): + value = _UniffiConverterString.check(value) + with _UniffiRustBuffer.alloc_with_builder() as builder: + builder.write(value.encode("utf-8")) + return builder.finalize() + + + +class AutoDeleveraging: + _pointer: ctypes.c_void_p + def __init__(self, builder: "AutoDeleveragingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new, + _UniffiConverterTypeAutoDeleveragingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "AutoDeleveraging": + + return _UniffiConverterTypeAutoDeleveraging.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes,self._pointer,) + ) + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature,self._pointer,) + ) + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid,self._pointer,) + ) + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid,self._pointer,) + ) + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str,self._pointer,) + ) + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash,self._pointer,) + ) + + +class _UniffiConverterTypeAutoDeleveraging: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, AutoDeleveraging): + raise TypeError("Expected AutoDeleveraging instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return AutoDeleveraging._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ChangePubKey: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ChangePubKeyBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new, + _UniffiConverterTypeChangePubKeyBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature,self._pointer,) + ) + + + + + + + def is_onchain(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeChangePubKey: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ChangePubKey): + raise TypeError("Expected ChangePubKey instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ChangePubKey._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Contract: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new, + _UniffiConverterTypeContractBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contract, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_contract(self, zklink_signer: "ZkLinkSigner") -> "Contract": + + return _UniffiConverterTypeContract.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature,self._pointer,) + ) + + + + + + + def is_long(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long,self._pointer,) + ) + + + + + + + def is_short(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContract: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Contract): + raise TypeError("Expected Contract instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Contract._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ContractMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new, + _UniffiConverterTypeContractMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ContractMatching": + + return _UniffiConverterTypeContractMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContractMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ContractMatching): + raise TypeError("Expected ContractMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ContractMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Deposit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "DepositBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new, + _UniffiConverterTypeDepositBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_deposit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeDeposit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Deposit): + raise TypeError("Expected Deposit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Deposit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class EthSigner: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str): + + self._pointer = _rust_call_with_error(_UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new, + _UniffiConverterString.lower(private_key)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_address(self, ) -> "Address": + return _UniffiConverterTypeAddress.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address,self._pointer,) + ) + + + + + + + def sign_message(self, message: "typing.List[int]") -> "PackedEthSignature": + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message,self._pointer, + _UniffiConverterSequenceUInt8.lower(message)) + ) + + + + + + +class _UniffiConverterTypeEthSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, EthSigner): + raise TypeError("Expected EthSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return EthSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ForcedExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ForcedExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new, + _UniffiConverterTypeForcedExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ForcedExit": + + return _UniffiConverterTypeForcedExit.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeForcedExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ForcedExit): + raise TypeError("Expected ForcedExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ForcedExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class FullExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FullExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new, + _UniffiConverterTypeFullExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFullExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, FullExit): + raise TypeError("Expected FullExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return FullExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Funding: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FundingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new, + _UniffiConverterTypeFundingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_funding, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Funding": + + return _UniffiConverterTypeFunding.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFunding: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Funding): + raise TypeError("Expected Funding instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Funding._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Liquidation: + _pointer: ctypes.c_void_p + def __init__(self, builder: "LiquidationBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new, + _UniffiConverterTypeLiquidationBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Liquidation": + + return _UniffiConverterTypeLiquidation.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeLiquidation: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Liquidation): + raise TypeError("Expected Liquidation instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Liquidation._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Order: + _pointer: ctypes.c_void_p + def __init__(self, account_id: "AccountId",sub_account_id: "SubAccountId",slot_id: "SlotId",nonce: "Nonce",base_token_id: "TokenId",quote_token_id: "TokenId",amount: "BigUint",price: "BigUint",is_sell: bool,has_subsidy: bool,maker_fee_rate: "int",taker_fee_rate: "int",signature: "typing.Optional[ZkLinkSignature]"): + + + + + + + + + + + + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new, + _UniffiConverterTypeAccountId.lower(account_id), + _UniffiConverterTypeSubAccountId.lower(sub_account_id), + _UniffiConverterTypeSlotId.lower(slot_id), + _UniffiConverterTypeNonce.lower(nonce), + _UniffiConverterTypeTokenId.lower(base_token_id), + _UniffiConverterTypeTokenId.lower(quote_token_id), + _UniffiConverterTypeBigUint.lower(amount), + _UniffiConverterTypeBigUint.lower(price), + _UniffiConverterBool.lower(is_sell), + _UniffiConverterBool.lower(has_subsidy), + _UniffiConverterUInt8.lower(maker_fee_rate), + _UniffiConverterUInt8.lower(taker_fee_rate), + _UniffiConverterOptionalTypeZkLinkSignature.lower(signature)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_order, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_order(self, zklink_signer: "ZkLinkSigner") -> "Order": + + return _UniffiConverterTypeOrder.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, quote_token: str,based_token: str,decimals: "int"): + + + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(quote_token), + _UniffiConverterString.lower(based_token), + _UniffiConverterUInt8.lower(decimals)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrder: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Order): + raise TypeError("Expected Order instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Order._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class OrderMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "OrderMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new, + _UniffiConverterTypeOrderMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "OrderMatching": + + return _UniffiConverterTypeOrderMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrderMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, OrderMatching): + raise TypeError("Expected OrderMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return OrderMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Signer: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str,l1_type: "L1SignerType"): + + + self._pointer = _rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new, + _UniffiConverterString.lower(private_key), + _UniffiConverterTypeL1SignerType.lower(l1_type)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_signer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def sign_auto_deleveraging(self, tx: "AutoDeleveraging") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging,self._pointer, + _UniffiConverterTypeAutoDeleveraging.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_create2data_auth(self, tx: "ChangePubKey",crate2data: "Create2Data") -> "TxSignature": + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeCreate2Data.lower(crate2data)) + ) + + + + + + + def sign_change_pubkey_with_eth_ecdsa_auth(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_onchain_auth_data(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_contract_matching(self, tx: "ContractMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching,self._pointer, + _UniffiConverterTypeContractMatching.lower(tx)) + ) + + + + + + + def sign_forced_exit(self, tx: "ForcedExit") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit,self._pointer, + _UniffiConverterTypeForcedExit.lower(tx)) + ) + + + + + + + def sign_funding(self, tx: "Funding") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding,self._pointer, + _UniffiConverterTypeFunding.lower(tx)) + ) + + + + + + + def sign_liquidation(self, tx: "Liquidation") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation,self._pointer, + _UniffiConverterTypeLiquidation.lower(tx)) + ) + + + + + + + def sign_order_matching(self, tx: "OrderMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching,self._pointer, + _UniffiConverterTypeOrderMatching.lower(tx)) + ) + + + + + + + def sign_transfer(self, tx: "Transfer",token_sybmol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer,self._pointer, + _UniffiConverterTypeTransfer.lower(tx), + _UniffiConverterString.lower(token_sybmol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + + def sign_withdraw(self, tx: "Withdraw",l2_source_token_symbol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw,self._pointer, + _UniffiConverterTypeWithdraw.lower(tx), + _UniffiConverterString.lower(l2_source_token_symbol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Signer): + raise TypeError("Expected Signer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Signer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class StarkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_hex_str(cls, hex_str: str): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str, + _UniffiConverterString.lower(hex_str)) + return cls._make_instance_(pointer) + + + + def sign_message(self, typed_data: "TypedData",addr: str) -> "StarkEip712Signature": + + + return _UniffiConverterTypeStarkEip712Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message,self._pointer, + _UniffiConverterTypeTypedData.lower(typed_data), + _UniffiConverterString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeStarkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, StarkSigner): + raise TypeError("Expected StarkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return StarkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Transfer: + _pointer: ctypes.c_void_p + def __init__(self, builder: "TransferBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new, + _UniffiConverterTypeTransferBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_transfer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Transfer": + + return _UniffiConverterTypeTransfer.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",token_symbol: str) -> "TxLayer1Signature": + + + return _UniffiConverterTypeTxLayer1Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str): + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeTransfer: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Transfer): + raise TypeError("Expected Transfer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Transfer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class TypedData: + _pointer: ctypes.c_void_p + def __init__(self, message: "TypedDataMessage",chain_id: str): + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new, + _UniffiConverterTypeTypedDataMessage.lower(message), + _UniffiConverterString.lower(chain_id)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + +class _UniffiConverterTypeTypedData: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, TypedData): + raise TypeError("Expected TypedData instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return TypedData._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class UpdateGlobalVar: + _pointer: ctypes.c_void_p + def __init__(self, builder: "UpdateGlobalVarBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new, + _UniffiConverterTypeUpdateGlobalVarBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeUpdateGlobalVar: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, UpdateGlobalVar): + raise TypeError("Expected UpdateGlobalVar instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return UpdateGlobalVar._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Withdraw: + _pointer: ctypes.c_void_p + def __init__(self, builder: "WithdrawBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new, + _UniffiConverterTypeWithdrawBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Withdraw": + + return _UniffiConverterTypeWithdraw.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",l2_source_token_symbol: str) -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(l2_source_token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str): + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ): + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ): + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeWithdraw: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Withdraw): + raise TypeError("Expected Withdraw instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Withdraw._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ZkLinkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_bytes(cls, slice: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes, + _UniffiConverterSequenceUInt8.lower(slice)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_eth_signer(cls, eth_hex_private_key: str): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer, + _UniffiConverterString.lower(eth_hex_private_key)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_stark_signer(cls, hex_private_key: str,addr: str,chain_id: str): + + + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer, + _UniffiConverterString.lower(hex_private_key), + _UniffiConverterString.lower(addr), + _UniffiConverterString.lower(chain_id)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_seed(cls, seed: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed, + _UniffiConverterSequenceUInt8.lower(seed)) + return cls._make_instance_(pointer) + + + + def public_key(self, ) -> "PackedPublicKey": + return _UniffiConverterTypePackedPublicKey.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key,self._pointer,) + ) + + + + + + + def sign_musig(self, msg: "typing.List[int]") -> "ZkLinkSignature": + + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig,self._pointer, + _UniffiConverterSequenceUInt8.lower(msg)) + ) + + + + + + +class _UniffiConverterTypeZkLinkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ZkLinkSigner): + raise TypeError("Expected ZkLinkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ZkLinkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + +class AutoDeleveragingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";adl_account_id: "AccountId";pair_id: "PairId";adl_size: "BigUint";adl_price: "BigUint";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", adl_account_id: "AccountId", pair_id: "PairId", adl_size: "BigUint", adl_price: "BigUint", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.adl_account_id = adl_account_id + self.pair_id = pair_id + self.adl_size = adl_size + self.adl_price = adl_price + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "AutoDeleveragingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, adl_account_id={}, pair_id={}, adl_size={}, adl_price={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.adl_account_id, self.pair_id, self.adl_size, self.adl_price, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.adl_account_id != other.adl_account_id: + return False + if self.pair_id != other.pair_id: + return False + if self.adl_size != other.adl_size: + return False + if self.adl_price != other.adl_price: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeAutoDeleveragingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return AutoDeleveragingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + adl_account_id=_UniffiConverterTypeAccountId.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + adl_size=_UniffiConverterTypeBigUint.read(buf), + adl_price=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.adl_account_id, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.adl_size, buf) + _UniffiConverterTypeBigUint.write(value.adl_price, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class ChangePubKeyBuilder: + chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";new_pubkey_hash: "PubKeyHash";fee_token: "TokenId";fee: "BigUint";nonce: "Nonce";eth_signature: "typing.Optional[PackedEthSignature]";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", new_pubkey_hash: "PubKeyHash", fee_token: "TokenId", fee: "BigUint", nonce: "Nonce", eth_signature: "typing.Optional[PackedEthSignature]", timestamp: "TimeStamp"): + self.chain_id = chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.new_pubkey_hash = new_pubkey_hash + self.fee_token = fee_token + self.fee = fee + self.nonce = nonce + self.eth_signature = eth_signature + self.timestamp = timestamp + + def __str__(self): + return "ChangePubKeyBuilder(chain_id={}, account_id={}, sub_account_id={}, new_pubkey_hash={}, fee_token={}, fee={}, nonce={}, eth_signature={}, timestamp={})".format(self.chain_id, self.account_id, self.sub_account_id, self.new_pubkey_hash, self.fee_token, self.fee, self.nonce, self.eth_signature, self.timestamp) + + def __eq__(self, other): + if self.chain_id != other.chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.new_pubkey_hash != other.new_pubkey_hash: + return False + if self.fee_token != other.fee_token: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.eth_signature != other.eth_signature: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeChangePubKeyBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ChangePubKeyBuilder( + chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + new_pubkey_hash=_UniffiConverterTypePubKeyHash.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + eth_signature=_UniffiConverterOptionalTypePackedEthSignature.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypePubKeyHash.write(value.new_pubkey_hash, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterOptionalTypePackedEthSignature.write(value.eth_signature, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ContractBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";slot_id: "SlotId";nonce: "Nonce";pair_id: "PairId";size: "BigUint";price: "BigUint";direction: bool;taker_fee_rate: "int";maker_fee_rate: "int";has_subsidy: bool; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", slot_id: "SlotId", nonce: "Nonce", pair_id: "PairId", size: "BigUint", price: "BigUint", direction: bool, taker_fee_rate: "int", maker_fee_rate: "int", has_subsidy: bool): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.slot_id = slot_id + self.nonce = nonce + self.pair_id = pair_id + self.size = size + self.price = price + self.direction = direction + self.taker_fee_rate = taker_fee_rate + self.maker_fee_rate = maker_fee_rate + self.has_subsidy = has_subsidy + + def __str__(self): + return "ContractBuilder(account_id={}, sub_account_id={}, slot_id={}, nonce={}, pair_id={}, size={}, price={}, direction={}, taker_fee_rate={}, maker_fee_rate={}, has_subsidy={})".format(self.account_id, self.sub_account_id, self.slot_id, self.nonce, self.pair_id, self.size, self.price, self.direction, self.taker_fee_rate, self.maker_fee_rate, self.has_subsidy) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.slot_id != other.slot_id: + return False + if self.nonce != other.nonce: + return False + if self.pair_id != other.pair_id: + return False + if self.size != other.size: + return False + if self.price != other.price: + return False + if self.direction != other.direction: + return False + if self.taker_fee_rate != other.taker_fee_rate: + return False + if self.maker_fee_rate != other.maker_fee_rate: + return False + if self.has_subsidy != other.has_subsidy: + return False + return True + +class _UniffiConverterTypeContractBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + slot_id=_UniffiConverterTypeSlotId.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + size=_UniffiConverterTypeBigUint.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + direction=_UniffiConverterBool.read(buf), + taker_fee_rate=_UniffiConverterUInt8.read(buf), + maker_fee_rate=_UniffiConverterUInt8.read(buf), + has_subsidy=_UniffiConverterBool.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeSlotId.write(value.slot_id, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.size, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterBool.write(value.direction, buf) + _UniffiConverterUInt8.write(value.taker_fee_rate, buf) + _UniffiConverterUInt8.write(value.maker_fee_rate, buf) + _UniffiConverterBool.write(value.has_subsidy, buf) + + +class ContractMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Contract";maker: "typing.List[Contract]";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Contract", maker: "typing.List[Contract]", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "ContractMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeContractMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeContract.read(buf), + maker=_UniffiConverterSequenceTypeContract.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeContract.write(value.taker, buf) + _UniffiConverterSequenceTypeContract.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class ContractPrice: + pair_id: "PairId";market_price: "BigUint"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", market_price: "BigUint"): + self.pair_id = pair_id + self.market_price = market_price + + def __str__(self): + return "ContractPrice(pair_id={}, market_price={})".format(self.pair_id, self.market_price) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.market_price != other.market_price: + return False + return True + +class _UniffiConverterTypeContractPrice(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractPrice( + pair_id=_UniffiConverterTypePairId.read(buf), + market_price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.market_price, buf) + + +class Create2Data: + creator_address: "ZkLinkAddress";salt_arg: "H256";code_hash: "H256"; + + @typing.no_type_check + def __init__(self, creator_address: "ZkLinkAddress", salt_arg: "H256", code_hash: "H256"): + self.creator_address = creator_address + self.salt_arg = salt_arg + self.code_hash = code_hash + + def __str__(self): + return "Create2Data(creator_address={}, salt_arg={}, code_hash={})".format(self.creator_address, self.salt_arg, self.code_hash) + + def __eq__(self, other): + if self.creator_address != other.creator_address: + return False + if self.salt_arg != other.salt_arg: + return False + if self.code_hash != other.code_hash: + return False + return True + +class _UniffiConverterTypeCreate2Data(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Create2Data( + creator_address=_UniffiConverterTypeZkLinkAddress.read(buf), + salt_arg=_UniffiConverterTypeH256.read(buf), + code_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.creator_address, buf) + _UniffiConverterTypeH256.write(value.salt_arg, buf) + _UniffiConverterTypeH256.write(value.code_hash, buf) + + +class DepositBuilder: + from_address: "ZkLinkAddress";to_address: "ZkLinkAddress";from_chain_id: "ChainId";sub_account_id: "SubAccountId";l2_target_token: "TokenId";l1_source_token: "TokenId";amount: "BigUint";serial_id: "int";l2_hash: "H256";eth_hash: "typing.Optional[H256]"; + + @typing.no_type_check + def __init__(self, from_address: "ZkLinkAddress", to_address: "ZkLinkAddress", from_chain_id: "ChainId", sub_account_id: "SubAccountId", l2_target_token: "TokenId", l1_source_token: "TokenId", amount: "BigUint", serial_id: "int", l2_hash: "H256", eth_hash: "typing.Optional[H256]"): + self.from_address = from_address + self.to_address = to_address + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.l2_target_token = l2_target_token + self.l1_source_token = l1_source_token + self.amount = amount + self.serial_id = serial_id + self.l2_hash = l2_hash + self.eth_hash = eth_hash + + def __str__(self): + return "DepositBuilder(from_address={}, to_address={}, from_chain_id={}, sub_account_id={}, l2_target_token={}, l1_source_token={}, amount={}, serial_id={}, l2_hash={}, eth_hash={})".format(self.from_address, self.to_address, self.from_chain_id, self.sub_account_id, self.l2_target_token, self.l1_source_token, self.amount, self.serial_id, self.l2_hash, self.eth_hash) + + def __eq__(self, other): + if self.from_address != other.from_address: + return False + if self.to_address != other.to_address: + return False + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.l2_target_token != other.l2_target_token: + return False + if self.l1_source_token != other.l1_source_token: + return False + if self.amount != other.amount: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + if self.eth_hash != other.eth_hash: + return False + return True + +class _UniffiConverterTypeDepositBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return DepositBuilder( + from_address=_UniffiConverterTypeZkLinkAddress.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_target_token=_UniffiConverterTypeTokenId.read(buf), + l1_source_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + eth_hash=_UniffiConverterOptionalTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.from_address, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_target_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_source_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + _UniffiConverterOptionalTypeH256.write(value.eth_hash, buf) + + +class ForcedExitBuilder: + to_chain_id: "ChainId";initiator_account_id: "AccountId";initiator_sub_account_id: "SubAccountId";target: "ZkLinkAddress";target_sub_account_id: "SubAccountId";l2_source_token: "TokenId";l1_target_token: "TokenId";initiator_nonce: "Nonce";exit_amount: "BigUint";withdraw_to_l1: bool;timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", initiator_account_id: "AccountId", initiator_sub_account_id: "SubAccountId", target: "ZkLinkAddress", target_sub_account_id: "SubAccountId", l2_source_token: "TokenId", l1_target_token: "TokenId", initiator_nonce: "Nonce", exit_amount: "BigUint", withdraw_to_l1: bool, timestamp: "TimeStamp"): + self.to_chain_id = to_chain_id + self.initiator_account_id = initiator_account_id + self.initiator_sub_account_id = initiator_sub_account_id + self.target = target + self.target_sub_account_id = target_sub_account_id + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.initiator_nonce = initiator_nonce + self.exit_amount = exit_amount + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "ForcedExitBuilder(to_chain_id={}, initiator_account_id={}, initiator_sub_account_id={}, target={}, target_sub_account_id={}, l2_source_token={}, l1_target_token={}, initiator_nonce={}, exit_amount={}, withdraw_to_l1={}, timestamp={})".format(self.to_chain_id, self.initiator_account_id, self.initiator_sub_account_id, self.target, self.target_sub_account_id, self.l2_source_token, self.l1_target_token, self.initiator_nonce, self.exit_amount, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.initiator_account_id != other.initiator_account_id: + return False + if self.initiator_sub_account_id != other.initiator_sub_account_id: + return False + if self.target != other.target: + return False + if self.target_sub_account_id != other.target_sub_account_id: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.initiator_nonce != other.initiator_nonce: + return False + if self.exit_amount != other.exit_amount: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeForcedExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ForcedExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + initiator_account_id=_UniffiConverterTypeAccountId.read(buf), + initiator_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + target=_UniffiConverterTypeZkLinkAddress.read(buf), + target_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + initiator_nonce=_UniffiConverterTypeNonce.read(buf), + exit_amount=_UniffiConverterTypeBigUint.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.initiator_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.initiator_sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.target, buf) + _UniffiConverterTypeSubAccountId.write(value.target_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeNonce.write(value.initiator_nonce, buf) + _UniffiConverterTypeBigUint.write(value.exit_amount, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class FullExitBuilder: + to_chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";exit_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";serial_id: "int";l2_hash: "H256"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", exit_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", serial_id: "int", l2_hash: "H256"): + self.to_chain_id = to_chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.exit_address = exit_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.serial_id = serial_id + self.l2_hash = l2_hash + + def __str__(self): + return "FullExitBuilder(to_chain_id={}, account_id={}, sub_account_id={}, exit_address={}, l2_source_token={}, l1_target_token={}, contract_prices={}, margin_prices={}, serial_id={}, l2_hash={})".format(self.to_chain_id, self.account_id, self.sub_account_id, self.exit_address, self.l2_source_token, self.l1_target_token, self.contract_prices, self.margin_prices, self.serial_id, self.l2_hash) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.exit_address != other.exit_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + return True + +class _UniffiConverterTypeFullExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FullExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + exit_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.exit_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + + +class FundingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";funding_account_ids: "typing.List[AccountId]";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", funding_account_ids: "typing.List[AccountId]", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.funding_account_ids = funding_account_ids + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "FundingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, funding_account_ids={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.funding_account_ids, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.funding_account_ids != other.funding_account_ids: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeFundingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + funding_account_ids=_UniffiConverterSequenceTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeAccountId.write(value.funding_account_ids, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class FundingInfo: + pair_id: "PairId";price: "BigUint";funding_rate: "int"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", price: "BigUint", funding_rate: "int"): + self.pair_id = pair_id + self.price = price + self.funding_rate = funding_rate + + def __str__(self): + return "FundingInfo(pair_id={}, price={}, funding_rate={})".format(self.pair_id, self.price, self.funding_rate) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.price != other.price: + return False + if self.funding_rate != other.funding_rate: + return False + return True + +class _UniffiConverterTypeFundingInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingInfo( + pair_id=_UniffiConverterTypePairId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + funding_rate=_UniffiConverterInt16.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterInt16.write(value.funding_rate, buf) + + +class LiquidationBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";liquidation_account_id: "AccountId";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", liquidation_account_id: "AccountId", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.liquidation_account_id = liquidation_account_id + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "LiquidationBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, liquidation_account_id={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.liquidation_account_id, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.liquidation_account_id != other.liquidation_account_id: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeLiquidationBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return LiquidationBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + liquidation_account_id=_UniffiConverterTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.liquidation_account_id, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class Message: + data: str; + + @typing.no_type_check + def __init__(self, data: str): + self.data = data + + def __str__(self): + return "Message(data={})".format(self.data) + + def __eq__(self, other): + if self.data != other.data: + return False + return True + +class _UniffiConverterTypeMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Message( + data=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.data, buf) + + +class OraclePrices: + contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "OraclePrices(contract_prices={}, margin_prices={})".format(self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeOraclePrices(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OraclePrices( + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class OrderMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Order";maker: "Order";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";expect_base_amount: "BigUint";expect_quote_amount: "BigUint"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Order", maker: "Order", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", expect_base_amount: "BigUint", expect_quote_amount: "BigUint"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.expect_base_amount = expect_base_amount + self.expect_quote_amount = expect_quote_amount + + def __str__(self): + return "OrderMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={}, expect_base_amount={}, expect_quote_amount={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices, self.expect_base_amount, self.expect_quote_amount) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.expect_base_amount != other.expect_base_amount: + return False + if self.expect_quote_amount != other.expect_quote_amount: + return False + return True + +class _UniffiConverterTypeOrderMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OrderMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeOrder.read(buf), + maker=_UniffiConverterTypeOrder.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + expect_base_amount=_UniffiConverterTypeBigUint.read(buf), + expect_quote_amount=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeOrder.write(value.taker, buf) + _UniffiConverterTypeOrder.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeBigUint.write(value.expect_base_amount, buf) + _UniffiConverterTypeBigUint.write(value.expect_quote_amount, buf) + + +class SpotPriceInfo: + token_id: "TokenId";price: "BigUint"; + + @typing.no_type_check + def __init__(self, token_id: "TokenId", price: "BigUint"): + self.token_id = token_id + self.price = price + + def __str__(self): + return "SpotPriceInfo(token_id={}, price={})".format(self.token_id, self.price) + + def __eq__(self, other): + if self.token_id != other.token_id: + return False + if self.price != other.price: + return False + return True + +class _UniffiConverterTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return SpotPriceInfo( + token_id=_UniffiConverterTypeTokenId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + + +class TransferBuilder: + account_id: "AccountId";to_address: "ZkLinkAddress";from_sub_account_id: "SubAccountId";to_sub_account_id: "SubAccountId";token: "TokenId";amount: "BigUint";fee: "BigUint";nonce: "Nonce";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", to_address: "ZkLinkAddress", from_sub_account_id: "SubAccountId", to_sub_account_id: "SubAccountId", token: "TokenId", amount: "BigUint", fee: "BigUint", nonce: "Nonce", timestamp: "TimeStamp"): + self.account_id = account_id + self.to_address = to_address + self.from_sub_account_id = from_sub_account_id + self.to_sub_account_id = to_sub_account_id + self.token = token + self.amount = amount + self.fee = fee + self.nonce = nonce + self.timestamp = timestamp + + def __str__(self): + return "TransferBuilder(account_id={}, to_address={}, from_sub_account_id={}, to_sub_account_id={}, token={}, amount={}, fee={}, nonce={}, timestamp={})".format(self.account_id, self.to_address, self.from_sub_account_id, self.to_sub_account_id, self.token, self.amount, self.fee, self.nonce, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.to_address != other.to_address: + return False + if self.from_sub_account_id != other.from_sub_account_id: + return False + if self.to_sub_account_id != other.to_sub_account_id: + return False + if self.token != other.token: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeTransferBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TransferBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeSubAccountId.write(value.from_sub_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.to_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class TxMessage: + transaction: str;amount: str;fee: str;token: str;to: str;nonce: str; + + @typing.no_type_check + def __init__(self, transaction: str, amount: str, fee: str, token: str, to: str, nonce: str): + self.transaction = transaction + self.amount = amount + self.fee = fee + self.token = token + self.to = to + self.nonce = nonce + + def __str__(self): + return "TxMessage(transaction={}, amount={}, fee={}, token={}, to={}, nonce={})".format(self.transaction, self.amount, self.fee, self.token, self.to, self.nonce) + + def __eq__(self, other): + if self.transaction != other.transaction: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.token != other.token: + return False + if self.to != other.to: + return False + if self.nonce != other.nonce: + return False + return True + +class _UniffiConverterTypeTxMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxMessage( + transaction=_UniffiConverterString.read(buf), + amount=_UniffiConverterString.read(buf), + fee=_UniffiConverterString.read(buf), + token=_UniffiConverterString.read(buf), + to=_UniffiConverterString.read(buf), + nonce=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.transaction, buf) + _UniffiConverterString.write(value.amount, buf) + _UniffiConverterString.write(value.fee, buf) + _UniffiConverterString.write(value.token, buf) + _UniffiConverterString.write(value.to, buf) + _UniffiConverterString.write(value.nonce, buf) + + +class TxSignature: + tx: "ZkLinkTx";layer1_signature: "typing.Optional[TxLayer1Signature]"; + + @typing.no_type_check + def __init__(self, tx: "ZkLinkTx", layer1_signature: "typing.Optional[TxLayer1Signature]"): + self.tx = tx + self.layer1_signature = layer1_signature + + def __str__(self): + return "TxSignature(tx={}, layer1_signature={})".format(self.tx, self.layer1_signature) + + def __eq__(self, other): + if self.tx != other.tx: + return False + if self.layer1_signature != other.layer1_signature: + return False + return True + +class _UniffiConverterTypeTxSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxSignature( + tx=_UniffiConverterTypeZkLinkTx.read(buf), + layer1_signature=_UniffiConverterOptionalTypeTxLayer1Signature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkTx.write(value.tx, buf) + _UniffiConverterOptionalTypeTxLayer1Signature.write(value.layer1_signature, buf) + + +class UpdateGlobalVarBuilder: + from_chain_id: "ChainId";sub_account_id: "SubAccountId";parameter: "Parameter";serial_id: "int"; + + @typing.no_type_check + def __init__(self, from_chain_id: "ChainId", sub_account_id: "SubAccountId", parameter: "Parameter", serial_id: "int"): + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.parameter = parameter + self.serial_id = serial_id + + def __str__(self): + return "UpdateGlobalVarBuilder(from_chain_id={}, sub_account_id={}, parameter={}, serial_id={})".format(self.from_chain_id, self.sub_account_id, self.parameter, self.serial_id) + + def __eq__(self, other): + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.parameter != other.parameter: + return False + if self.serial_id != other.serial_id: + return False + return True + +class _UniffiConverterTypeUpdateGlobalVarBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return UpdateGlobalVarBuilder( + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + parameter=_UniffiConverterTypeParameter.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeParameter.write(value.parameter, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + + +class WithdrawBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";to_chain_id: "ChainId";to_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";amount: "BigUint";call_data: "typing.Optional[typing.List[int]]";fee: "BigUint";nonce: "Nonce";withdraw_fee_ratio: "int";withdraw_to_l1: bool;timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", to_chain_id: "ChainId", to_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", amount: "BigUint", call_data: "typing.Optional[typing.List[int]]", fee: "BigUint", nonce: "Nonce", withdraw_fee_ratio: "int", withdraw_to_l1: bool, timestamp: "TimeStamp"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.to_chain_id = to_chain_id + self.to_address = to_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.amount = amount + self.call_data = call_data + self.fee = fee + self.nonce = nonce + self.withdraw_fee_ratio = withdraw_fee_ratio + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "WithdrawBuilder(account_id={}, sub_account_id={}, to_chain_id={}, to_address={}, l2_source_token={}, l1_target_token={}, amount={}, call_data={}, fee={}, nonce={}, withdraw_fee_ratio={}, withdraw_to_l1={}, timestamp={})".format(self.account_id, self.sub_account_id, self.to_chain_id, self.to_address, self.l2_source_token, self.l1_target_token, self.amount, self.call_data, self.fee, self.nonce, self.withdraw_fee_ratio, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.to_chain_id != other.to_chain_id: + return False + if self.to_address != other.to_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.amount != other.amount: + return False + if self.call_data != other.call_data: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.withdraw_fee_ratio != other.withdraw_fee_ratio: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeWithdrawBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return WithdrawBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_chain_id=_UniffiConverterTypeChainId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + call_data=_UniffiConverterOptionalSequenceUInt8.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + withdraw_fee_ratio=_UniffiConverterUInt16.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterOptionalSequenceUInt8.write(value.call_data, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterUInt16.write(value.withdraw_fee_ratio, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ZkLinkSignature: + pub_key: "PackedPublicKey";signature: "PackedSignature"; + + @typing.no_type_check + def __init__(self, pub_key: "PackedPublicKey", signature: "PackedSignature"): + self.pub_key = pub_key + self.signature = signature + + def __str__(self): + return "ZkLinkSignature(pub_key={}, signature={})".format(self.pub_key, self.signature) + + def __eq__(self, other): + if self.pub_key != other.pub_key: + return False + if self.signature != other.signature: + return False + return True + +class _UniffiConverterTypeZkLinkSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ZkLinkSignature( + pub_key=_UniffiConverterTypePackedPublicKey.read(buf), + signature=_UniffiConverterTypePackedSignature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePackedPublicKey.write(value.pub_key, buf) + _UniffiConverterTypePackedSignature.write(value.signature, buf) + + + + + +class ChangePubKeyAuthData: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthData cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthData.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + eth_signature: "PackedEthSignature"; + + @typing.no_type_check + def __init__(self,eth_signature: "PackedEthSignature"): + + self.eth_signature = eth_signature + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_ECDSA(eth_signature={})".format(self.eth_signature) + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + if self.eth_signature != other.eth_signature: + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthData.ONCHAIN = type("ChangePubKeyAuthData.ONCHAIN", (ChangePubKeyAuthData.ONCHAIN, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_ECDSA = type("ChangePubKeyAuthData.ETH_ECDSA", (ChangePubKeyAuthData.ETH_ECDSA, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_CREATE2 = type("ChangePubKeyAuthData.ETH_CREATE2", (ChangePubKeyAuthData.ETH_CREATE2, ChangePubKeyAuthData,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthData(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthData.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthData.ETH_ECDSA( + _UniffiConverterTypePackedEthSignature.read(buf), + ) + if variant == 3: + return ChangePubKeyAuthData.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + _UniffiConverterTypePackedEthSignature.write(value.eth_signature, buf) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + + + + +class ChangePubKeyAuthRequest: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthRequest cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_ECDSA()".format() + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthRequest.ONCHAIN = type("ChangePubKeyAuthRequest.ONCHAIN", (ChangePubKeyAuthRequest.ONCHAIN, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_ECDSA = type("ChangePubKeyAuthRequest.ETH_ECDSA", (ChangePubKeyAuthRequest.ETH_ECDSA, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_CREATE2 = type("ChangePubKeyAuthRequest.ETH_CREATE2", (ChangePubKeyAuthRequest.ETH_CREATE2, ChangePubKeyAuthRequest,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthRequest(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthRequest.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthRequest.ETH_ECDSA( + ) + if variant == 3: + return ChangePubKeyAuthRequest.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + +# EthSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class EthSignerError(Exception): + pass + +_UniffiTempEthSignerError = EthSignerError + +class EthSignerError: # type: ignore + class InvalidEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidEthSigner = InvalidEthSigner # type: ignore + class MissingEthPrivateKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthPrivateKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthPrivateKey = MissingEthPrivateKey # type: ignore + class MissingEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthSigner = MissingEthSigner # type: ignore + class SigningFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.SigningFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.SigningFailed = SigningFailed # type: ignore + class UnlockingFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.UnlockingFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.UnlockingFailed = UnlockingFailed # type: ignore + class InvalidRawTx(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidRawTx({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidRawTx = InvalidRawTx # type: ignore + class Eip712Failed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.Eip712Failed({})".format(repr(str(self))) + _UniffiTempEthSignerError.Eip712Failed = Eip712Failed # type: ignore + class NoSigningKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.NoSigningKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.NoSigningKey = NoSigningKey # type: ignore + class DefineAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.DefineAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.DefineAddress = DefineAddress # type: ignore + class RecoverAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RecoverAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.RecoverAddress = RecoverAddress # type: ignore + class LengthMismatched(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.LengthMismatched({})".format(repr(str(self))) + _UniffiTempEthSignerError.LengthMismatched = LengthMismatched # type: ignore + class CryptoError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CryptoError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CryptoError = CryptoError # type: ignore + class InvalidSignatureStr(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidSignatureStr({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidSignatureStr = InvalidSignatureStr # type: ignore + class CustomError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CustomError = CustomError # type: ignore + class RpcSignError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempEthSignerError.RpcSignError = RpcSignError # type: ignore + +EthSignerError = _UniffiTempEthSignerError # type: ignore +del _UniffiTempEthSignerError + + +class _UniffiConverterTypeEthSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return EthSignerError.InvalidEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return EthSignerError.MissingEthPrivateKey( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return EthSignerError.MissingEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return EthSignerError.SigningFailed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return EthSignerError.UnlockingFailed( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return EthSignerError.InvalidRawTx( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return EthSignerError.Eip712Failed( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return EthSignerError.NoSigningKey( + _UniffiConverterString.read(buf), + ) + if variant == 9: + return EthSignerError.DefineAddress( + _UniffiConverterString.read(buf), + ) + if variant == 10: + return EthSignerError.RecoverAddress( + _UniffiConverterString.read(buf), + ) + if variant == 11: + return EthSignerError.LengthMismatched( + _UniffiConverterString.read(buf), + ) + if variant == 12: + return EthSignerError.CryptoError( + _UniffiConverterString.read(buf), + ) + if variant == 13: + return EthSignerError.InvalidSignatureStr( + _UniffiConverterString.read(buf), + ) + if variant == 14: + return EthSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 15: + return EthSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, EthSignerError.InvalidEthSigner): + buf.write_i32(1) + if isinstance(value, EthSignerError.MissingEthPrivateKey): + buf.write_i32(2) + if isinstance(value, EthSignerError.MissingEthSigner): + buf.write_i32(3) + if isinstance(value, EthSignerError.SigningFailed): + buf.write_i32(4) + if isinstance(value, EthSignerError.UnlockingFailed): + buf.write_i32(5) + if isinstance(value, EthSignerError.InvalidRawTx): + buf.write_i32(6) + if isinstance(value, EthSignerError.Eip712Failed): + buf.write_i32(7) + if isinstance(value, EthSignerError.NoSigningKey): + buf.write_i32(8) + if isinstance(value, EthSignerError.DefineAddress): + buf.write_i32(9) + if isinstance(value, EthSignerError.RecoverAddress): + buf.write_i32(10) + if isinstance(value, EthSignerError.LengthMismatched): + buf.write_i32(11) + if isinstance(value, EthSignerError.CryptoError): + buf.write_i32(12) + if isinstance(value, EthSignerError.InvalidSignatureStr): + buf.write_i32(13) + if isinstance(value, EthSignerError.CustomError): + buf.write_i32(14) + if isinstance(value, EthSignerError.RpcSignError): + buf.write_i32(15) + + + + + +class L1SignerType: + def __init__(self): + raise RuntimeError("L1SignerType cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ETH: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "L1SignerType.ETH()".format() + + def __eq__(self, other): + if not other.is_eth(): + return False + return True + class STARKNET: + chain_id: str;address: str; + + @typing.no_type_check + def __init__(self,chain_id: str, address: str): + + self.chain_id = chain_id + self.address = address + + + def __str__(self): + return "L1SignerType.STARKNET(chain_id={}, address={})".format(self.chain_id, self.address) + + def __eq__(self, other): + if not other.is_starknet(): + return False + if self.chain_id != other.chain_id: + return False + if self.address != other.address: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_eth(self) -> bool: + return isinstance(self, L1SignerType.ETH) + def is_starknet(self) -> bool: + return isinstance(self, L1SignerType.STARKNET) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +L1SignerType.ETH = type("L1SignerType.ETH", (L1SignerType.ETH, L1SignerType,), {}) # type: ignore +L1SignerType.STARKNET = type("L1SignerType.STARKNET", (L1SignerType.STARKNET, L1SignerType,), {}) # type: ignore + + + + +class _UniffiConverterTypeL1SignerType(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1SignerType.ETH( + ) + if variant == 2: + return L1SignerType.STARKNET( + _UniffiConverterString.read(buf), + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_eth(): + buf.write_i32(1) + if value.is_starknet(): + buf.write_i32(2) + _UniffiConverterString.write(value.chain_id, buf) + _UniffiConverterString.write(value.address, buf) + + + + + + + +class L1Type(enum.Enum): + ETH = 1 + STARKNET = 2 + + + +class _UniffiConverterTypeL1Type(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1Type.ETH + if variant == 2: + return L1Type.STARKNET + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value == L1Type.ETH: + buf.write_i32(1) + if value == L1Type.STARKNET: + buf.write_i32(2) + + + + + + + +class Parameter: + def __init__(self): + raise RuntimeError("Parameter cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class FEE_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.FEE_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_fee_account(): + return False + if self.account_id != other.account_id: + return False + return True + class INSURANCE_FUND_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.INSURANCE_FUND_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_insurance_fund_account(): + return False + if self.account_id != other.account_id: + return False + return True + class MARGIN_INFO: + margin_id: "MarginId";token_id: "TokenId";ratio: "int"; + + @typing.no_type_check + def __init__(self,margin_id: "MarginId", token_id: "TokenId", ratio: "int"): + + self.margin_id = margin_id + self.token_id = token_id + self.ratio = ratio + + + def __str__(self): + return "Parameter.MARGIN_INFO(margin_id={}, token_id={}, ratio={})".format(self.margin_id, self.token_id, self.ratio) + + def __eq__(self, other): + if not other.is_margin_info(): + return False + if self.margin_id != other.margin_id: + return False + if self.token_id != other.token_id: + return False + if self.ratio != other.ratio: + return False + return True + class FUNDING_INFOS: + infos: "typing.List[FundingInfo]"; + + @typing.no_type_check + def __init__(self,infos: "typing.List[FundingInfo]"): + + self.infos = infos + + + def __str__(self): + return "Parameter.FUNDING_INFOS(infos={})".format(self.infos) + + def __eq__(self, other): + if not other.is_funding_infos(): + return False + if self.infos != other.infos: + return False + return True + class CONTRACT_INFO: + pair_id: "PairId";symbol: str;initial_margin_rate: "int";maintenance_margin_rate: "int"; + + @typing.no_type_check + def __init__(self,pair_id: "PairId", symbol: str, initial_margin_rate: "int", maintenance_margin_rate: "int"): + + self.pair_id = pair_id + self.symbol = symbol + self.initial_margin_rate = initial_margin_rate + self.maintenance_margin_rate = maintenance_margin_rate + + + def __str__(self): + return "Parameter.CONTRACT_INFO(pair_id={}, symbol={}, initial_margin_rate={}, maintenance_margin_rate={})".format(self.pair_id, self.symbol, self.initial_margin_rate, self.maintenance_margin_rate) + + def __eq__(self, other): + if not other.is_contract_info(): + return False + if self.pair_id != other.pair_id: + return False + if self.symbol != other.symbol: + return False + if self.initial_margin_rate != other.initial_margin_rate: + return False + if self.maintenance_margin_rate != other.maintenance_margin_rate: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_fee_account(self) -> bool: + return isinstance(self, Parameter.FEE_ACCOUNT) + def is_insurance_fund_account(self) -> bool: + return isinstance(self, Parameter.INSURANCE_FUND_ACCOUNT) + def is_margin_info(self) -> bool: + return isinstance(self, Parameter.MARGIN_INFO) + def is_funding_infos(self) -> bool: + return isinstance(self, Parameter.FUNDING_INFOS) + def is_contract_info(self) -> bool: + return isinstance(self, Parameter.CONTRACT_INFO) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +Parameter.FEE_ACCOUNT = type("Parameter.FEE_ACCOUNT", (Parameter.FEE_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.INSURANCE_FUND_ACCOUNT = type("Parameter.INSURANCE_FUND_ACCOUNT", (Parameter.INSURANCE_FUND_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.MARGIN_INFO = type("Parameter.MARGIN_INFO", (Parameter.MARGIN_INFO, Parameter,), {}) # type: ignore +Parameter.FUNDING_INFOS = type("Parameter.FUNDING_INFOS", (Parameter.FUNDING_INFOS, Parameter,), {}) # type: ignore +Parameter.CONTRACT_INFO = type("Parameter.CONTRACT_INFO", (Parameter.CONTRACT_INFO, Parameter,), {}) # type: ignore + + + + +class _UniffiConverterTypeParameter(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return Parameter.FEE_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 2: + return Parameter.INSURANCE_FUND_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 3: + return Parameter.MARGIN_INFO( + _UniffiConverterTypeMarginId.read(buf), + _UniffiConverterTypeTokenId.read(buf), + _UniffiConverterUInt8.read(buf), + ) + if variant == 4: + return Parameter.FUNDING_INFOS( + _UniffiConverterSequenceTypeFundingInfo.read(buf), + ) + if variant == 5: + return Parameter.CONTRACT_INFO( + _UniffiConverterTypePairId.read(buf), + _UniffiConverterString.read(buf), + _UniffiConverterUInt16.read(buf), + _UniffiConverterUInt16.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_fee_account(): + buf.write_i32(1) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_insurance_fund_account(): + buf.write_i32(2) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_margin_info(): + buf.write_i32(3) + _UniffiConverterTypeMarginId.write(value.margin_id, buf) + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterUInt8.write(value.ratio, buf) + if value.is_funding_infos(): + buf.write_i32(4) + _UniffiConverterSequenceTypeFundingInfo.write(value.infos, buf) + if value.is_contract_info(): + buf.write_i32(5) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterString.write(value.symbol, buf) + _UniffiConverterUInt16.write(value.initial_margin_rate, buf) + _UniffiConverterUInt16.write(value.maintenance_margin_rate, buf) + + + + +# SignError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class SignError(Exception): + pass + +_UniffiTempSignError = SignError + +class SignError: # type: ignore + class EthSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.EthSigningError({})".format(repr(str(self))) + _UniffiTempSignError.EthSigningError = EthSigningError # type: ignore + class ZkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.ZkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.ZkSigningError = ZkSigningError # type: ignore + class StarkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.StarkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.StarkSigningError = StarkSigningError # type: ignore + class IncorrectTx(_UniffiTempSignError): + def __repr__(self): + return "SignError.IncorrectTx({})".format(repr(str(self))) + _UniffiTempSignError.IncorrectTx = IncorrectTx # type: ignore + +SignError = _UniffiTempSignError # type: ignore +del _UniffiTempSignError + + +class _UniffiConverterTypeSignError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return SignError.EthSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return SignError.ZkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return SignError.StarkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return SignError.IncorrectTx( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, SignError.EthSigningError): + buf.write_i32(1) + if isinstance(value, SignError.ZkSigningError): + buf.write_i32(2) + if isinstance(value, SignError.StarkSigningError): + buf.write_i32(3) + if isinstance(value, SignError.IncorrectTx): + buf.write_i32(4) + + +# StarkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class StarkSignerError(Exception): + pass + +_UniffiTempStarkSignerError = StarkSignerError + +class StarkSignerError: # type: ignore + class InvalidStarknetSigner(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidStarknetSigner({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidStarknetSigner = InvalidStarknetSigner # type: ignore + class InvalidSignature(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class SignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.SignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.SignError = SignError # type: ignore + class RpcSignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.RpcSignError = RpcSignError # type: ignore + +StarkSignerError = _UniffiTempStarkSignerError # type: ignore +del _UniffiTempStarkSignerError + + +class _UniffiConverterTypeStarkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return StarkSignerError.InvalidStarknetSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return StarkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return StarkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return StarkSignerError.SignError( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return StarkSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, StarkSignerError.InvalidStarknetSigner): + buf.write_i32(1) + if isinstance(value, StarkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, StarkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, StarkSignerError.SignError): + buf.write_i32(4) + if isinstance(value, StarkSignerError.RpcSignError): + buf.write_i32(5) + + +# TypeError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class TypeError(Exception): + pass + +_UniffiTempTypeError = TypeError + +class TypeError: # type: ignore + class InvalidAddress(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidAddress({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidAddress = InvalidAddress # type: ignore + class InvalidTxHash(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidTxHash({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidTxHash = InvalidTxHash # type: ignore + class NotStartWithZerox(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.NotStartWithZerox({})".format(repr(str(self))) + _UniffiTempTypeError.NotStartWithZerox = NotStartWithZerox # type: ignore + class SizeMismatch(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.SizeMismatch({})".format(repr(str(self))) + _UniffiTempTypeError.SizeMismatch = SizeMismatch # type: ignore + class DecodeFromHexErr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.DecodeFromHexErr({})".format(repr(str(self))) + _UniffiTempTypeError.DecodeFromHexErr = DecodeFromHexErr # type: ignore + class TooBigInteger(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.TooBigInteger({})".format(repr(str(self))) + _UniffiTempTypeError.TooBigInteger = TooBigInteger # type: ignore + class InvalidBigIntStr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidBigIntStr({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidBigIntStr = InvalidBigIntStr # type: ignore + +TypeError = _UniffiTempTypeError # type: ignore +del _UniffiTempTypeError + + +class _UniffiConverterTypeTypeError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypeError.InvalidAddress( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return TypeError.InvalidTxHash( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return TypeError.NotStartWithZerox( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return TypeError.SizeMismatch( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return TypeError.DecodeFromHexErr( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return TypeError.TooBigInteger( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return TypeError.InvalidBigIntStr( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, TypeError.InvalidAddress): + buf.write_i32(1) + if isinstance(value, TypeError.InvalidTxHash): + buf.write_i32(2) + if isinstance(value, TypeError.NotStartWithZerox): + buf.write_i32(3) + if isinstance(value, TypeError.SizeMismatch): + buf.write_i32(4) + if isinstance(value, TypeError.DecodeFromHexErr): + buf.write_i32(5) + if isinstance(value, TypeError.TooBigInteger): + buf.write_i32(6) + if isinstance(value, TypeError.InvalidBigIntStr): + buf.write_i32(7) + + + + + +class TypedDataMessage: + def __init__(self): + raise RuntimeError("TypedDataMessage cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class CREATE_L2_KEY: + message: "Message"; + + @typing.no_type_check + def __init__(self,message: "Message"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.CREATE_L2_KEY(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_create_l2_key(): + return False + if self.message != other.message: + return False + return True + class TRANSACTION: + message: "TxMessage"; + + @typing.no_type_check + def __init__(self,message: "TxMessage"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.TRANSACTION(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_transaction(): + return False + if self.message != other.message: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_create_l2_key(self) -> bool: + return isinstance(self, TypedDataMessage.CREATE_L2_KEY) + def is_transaction(self) -> bool: + return isinstance(self, TypedDataMessage.TRANSACTION) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +TypedDataMessage.CREATE_L2_KEY = type("TypedDataMessage.CREATE_L2_KEY", (TypedDataMessage.CREATE_L2_KEY, TypedDataMessage,), {}) # type: ignore +TypedDataMessage.TRANSACTION = type("TypedDataMessage.TRANSACTION", (TypedDataMessage.TRANSACTION, TypedDataMessage,), {}) # type: ignore + + + + +class _UniffiConverterTypeTypedDataMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypedDataMessage.CREATE_L2_KEY( + _UniffiConverterTypeMessage.read(buf), + ) + if variant == 2: + return TypedDataMessage.TRANSACTION( + _UniffiConverterTypeTxMessage.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_create_l2_key(): + buf.write_i32(1) + _UniffiConverterTypeMessage.write(value.message, buf) + if value.is_transaction(): + buf.write_i32(2) + _UniffiConverterTypeTxMessage.write(value.message, buf) + + + + +# ZkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class ZkSignerError(Exception): + pass + +_UniffiTempZkSignerError = ZkSignerError + +class ZkSignerError: # type: ignore + class CustomError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempZkSignerError.CustomError = CustomError # type: ignore + class InvalidSignature(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class InvalidSeed(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSeed({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSeed = InvalidSeed # type: ignore + class InvalidPubkey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkey = InvalidPubkey # type: ignore + class InvalidPubkeyHash(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkeyHash({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkeyHash = InvalidPubkeyHash # type: ignore + class EthSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.EthSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.EthSignerError = EthSignerError # type: ignore + class StarkSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.StarkSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.StarkSignerError = StarkSignerError # type: ignore + +ZkSignerError = _UniffiTempZkSignerError # type: ignore +del _UniffiTempZkSignerError + + +class _UniffiConverterTypeZkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ZkSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return ZkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return ZkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return ZkSignerError.InvalidSeed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return ZkSignerError.InvalidPubkey( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return ZkSignerError.InvalidPubkeyHash( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return ZkSignerError.EthSignerError( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return ZkSignerError.StarkSignerError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, ZkSignerError.CustomError): + buf.write_i32(1) + if isinstance(value, ZkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, ZkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, ZkSignerError.InvalidSeed): + buf.write_i32(4) + if isinstance(value, ZkSignerError.InvalidPubkey): + buf.write_i32(5) + if isinstance(value, ZkSignerError.InvalidPubkeyHash): + buf.write_i32(6) + if isinstance(value, ZkSignerError.EthSignerError): + buf.write_i32(7) + if isinstance(value, ZkSignerError.StarkSignerError): + buf.write_i32(8) + + + +class _UniffiConverterOptionalString(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterString.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterString.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeZkLinkSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeZkLinkSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeZkLinkSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterSequenceUInt8.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterSequenceUInt8.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeH256(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeH256.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeH256.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypePackedEthSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypePackedEthSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypePackedEthSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeTxLayer1Signature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeTxLayer1Signature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeTxLayer1Signature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterUInt8.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterUInt8.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContract(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContract.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContract.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContractPrice(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContractPrice.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContractPrice.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeFundingInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeFundingInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeFundingInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeSpotPriceInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeSpotPriceInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeAccountId(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeAccountId.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeAccountId.read(buf) for i in range(count) + ] + + +# Type alias +AccountId = int + +class _UniffiConverterTypeAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +Address = str + +class _UniffiConverterTypeAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BigUint = str + +class _UniffiConverterTypeBigUint: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BlockNumber = int + +class _UniffiConverterTypeBlockNumber: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +ChainId = int + +class _UniffiConverterTypeChainId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +EthBlockId = int + +class _UniffiConverterTypeEthBlockId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +H256 = str + +class _UniffiConverterTypeH256: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +MarginId = int + +class _UniffiConverterTypeMarginId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +Nonce = int + +class _UniffiConverterTypeNonce: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +PackedEthSignature = str + +class _UniffiConverterTypePackedEthSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedPublicKey = str + +class _UniffiConverterTypePackedPublicKey: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedSignature = str + +class _UniffiConverterTypePackedSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PairId = int + +class _UniffiConverterTypePairId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt16.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt16.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt16.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt16.lower(value) + + +# Type alias +PriorityOpId = int + +class _UniffiConverterTypePriorityOpId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +PubKeyHash = str + +class _UniffiConverterTypePubKeyHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SlotId = int + +class _UniffiConverterTypeSlotId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +StarkEip712Signature = str + +class _UniffiConverterTypeStarkEip712Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SubAccountId = int + +class _UniffiConverterTypeSubAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +TimeStamp = int + +class _UniffiConverterTypeTimeStamp: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TokenId = int + +class _UniffiConverterTypeTokenId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TxHash = str + +class _UniffiConverterTypeTxHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +TxLayer1Signature = str + +class _UniffiConverterTypeTxLayer1Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkAddress = str + +class _UniffiConverterTypeZkLinkAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkTx = str + +class _UniffiConverterTypeZkLinkTx: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + +def create_signed_change_pubkey(zklink_signer: "ZkLinkSigner",tx: "ChangePubKey",eth_auth_data: "ChangePubKeyAuthData") -> "ChangePubKey": + + + + return _UniffiConverterTypeChangePubKey.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer), + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeChangePubKeyAuthData.lower(eth_auth_data))) + + +def eth_signature_of_change_pubkey(tx: "ChangePubKey",eth_signer: "EthSigner") -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeEthSigner.lower(eth_signer))) + + +def get_public_key_hash(public_key: "PackedPublicKey") -> "PubKeyHash": + + return _UniffiConverterTypePubKeyHash.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash, + _UniffiConverterTypePackedPublicKey.lower(public_key))) + + +def verify_musig(signature: "ZkLinkSignature",msg: "typing.List[int]"): + + + return _UniffiConverterBool.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig, + _UniffiConverterTypeZkLinkSignature.lower(signature), + _UniffiConverterSequenceUInt8.lower(msg))) + + +def zklink_main_net_url(): + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url,)) + + +def zklink_test_net_url(): + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url,)) + + +__all__ = [ + "InternalError", + "ChangePubKeyAuthData", + "ChangePubKeyAuthRequest", + "EthSignerError", + "L1SignerType", + "L1Type", + "Parameter", + "SignError", + "StarkSignerError", + "TypeError", + "TypedDataMessage", + "ZkSignerError", + "AutoDeleveragingBuilder", + "ChangePubKeyBuilder", + "ContractBuilder", + "ContractMatchingBuilder", + "ContractPrice", + "Create2Data", + "DepositBuilder", + "ForcedExitBuilder", + "FullExitBuilder", + "FundingBuilder", + "FundingInfo", + "LiquidationBuilder", + "Message", + "OraclePrices", + "OrderMatchingBuilder", + "SpotPriceInfo", + "TransferBuilder", + "TxMessage", + "TxSignature", + "UpdateGlobalVarBuilder", + "WithdrawBuilder", + "ZkLinkSignature", + "create_signed_change_pubkey", + "eth_signature_of_change_pubkey", + "get_public_key_hash", + "verify_musig", + "zklink_main_net_url", + "zklink_test_net_url", + "AutoDeleveraging", + "ChangePubKey", + "Contract", + "ContractMatching", + "Deposit", + "EthSigner", + "ForcedExit", + "FullExit", + "Funding", + "Liquidation", + "Order", + "OrderMatching", + "Signer", + "StarkSigner", + "Transfer", + "TypedData", + "UpdateGlobalVar", + "Withdraw", + "ZkLinkSigner", +] + diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-pc.py b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-pc.py new file mode 100644 index 000000000..a6981fa7e --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-pc.py @@ -0,0 +1,8056 @@ +# This file was autogenerated by some hot garbage in the `uniffi` crate. +# Trust me, you don't want to mess with it! + +# Common helper code. +# +# Ideally this would live in a separate .py file where it can be unittested etc +# in isolation, and perhaps even published as a re-useable package. +# +# However, it's important that the details of how this helper code works (e.g. the +# way that different builtin types are passed across the FFI) exactly match what's +# expected by the rust code on the other side of the interface. In practice right +# now that means coming from the exact some version of `uniffi` that was used to +# compile the rust component. The easiest way to ensure this is to bundle the Python +# helpers directly inline like we're doing here. + +import os +import sys +import ctypes +import enum +import struct +import contextlib +import datetime +import typing +import platform +import threading + +# Used for default argument values +_DEFAULT = object() + + +class _UniffiRustBuffer(ctypes.Structure): + _fields_ = [ + ("capacity", ctypes.c_int32), + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + @staticmethod + def alloc(size): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc, size) + + @staticmethod + def reserve(rbuf, additional): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve, rbuf, additional) + + def free(self): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_free, self) + + def __str__(self): + return "_UniffiRustBuffer(capacity={}, len={}, data={})".format( + self.capacity, + self.len, + self.data[0:self.len] + ) + + @contextlib.contextmanager + def alloc_with_builder(*args): + """Context-manger to allocate a buffer using a _UniffiRustBufferBuilder. + + The allocated buffer will be automatically freed if an error occurs, ensuring that + we don't accidentally leak it. + """ + builder = _UniffiRustBufferBuilder() + try: + yield builder + except: + builder.discard() + raise + + @contextlib.contextmanager + def consume_with_stream(self): + """Context-manager to consume a buffer using a _UniffiRustBufferStream. + + The _UniffiRustBuffer will be freed once the context-manager exits, ensuring that we don't + leak it even if an error occurs. + """ + try: + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of consume_with_stream") + finally: + self.free() + + @contextlib.contextmanager + def read_with_stream(self): + """Context-manager to read a buffer using a _UniffiRustBufferStream. + + This is like consume_with_stream, but doesn't free the buffer afterwards. + It should only be used with borrowed `_UniffiRustBuffer` data. + """ + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of read_with_stream") + +class _UniffiForeignBytes(ctypes.Structure): + _fields_ = [ + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + def __str__(self): + return "_UniffiForeignBytes(len={}, data={})".format(self.len, self.data[0:self.len]) + + +class _UniffiRustBufferStream: + """ + Helper for structured reading of bytes from a _UniffiRustBuffer + """ + + def __init__(self, data, len): + self.data = data + self.len = len + self.offset = 0 + + @classmethod + def from_rust_buffer(cls, buf): + return cls(buf.data, buf.len) + + def remaining(self): + return self.len - self.offset + + def _unpack_from(self, size, format): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + value = struct.unpack(format, self.data[self.offset:self.offset+size])[0] + self.offset += size + return value + + def read(self, size): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + data = self.data[self.offset:self.offset+size] + self.offset += size + return data + + def read_i8(self): + return self._unpack_from(1, ">b") + + def read_u8(self): + return self._unpack_from(1, ">B") + + def read_i16(self): + return self._unpack_from(2, ">h") + + def read_u16(self): + return self._unpack_from(2, ">H") + + def read_i32(self): + return self._unpack_from(4, ">i") + + def read_u32(self): + return self._unpack_from(4, ">I") + + def read_i64(self): + return self._unpack_from(8, ">q") + + def read_u64(self): + return self._unpack_from(8, ">Q") + + def read_float(self): + v = self._unpack_from(4, ">f") + return v + + def read_double(self): + return self._unpack_from(8, ">d") + + def read_c_size_t(self): + return self._unpack_from(ctypes.sizeof(ctypes.c_size_t) , "@N") + +class _UniffiRustBufferBuilder: + """ + Helper for structured writing of bytes into a _UniffiRustBuffer. + """ + + def __init__(self): + self.rbuf = _UniffiRustBuffer.alloc(16) + self.rbuf.len = 0 + + def finalize(self): + rbuf = self.rbuf + self.rbuf = None + return rbuf + + def discard(self): + if self.rbuf is not None: + rbuf = self.finalize() + rbuf.free() + + @contextlib.contextmanager + def _reserve(self, num_bytes): + if self.rbuf.len + num_bytes > self.rbuf.capacity: + self.rbuf = _UniffiRustBuffer.reserve(self.rbuf, num_bytes) + yield None + self.rbuf.len += num_bytes + + def _pack_into(self, size, format, value): + with self._reserve(size): + # XXX TODO: I feel like I should be able to use `struct.pack_into` here but can't figure it out. + for i, byte in enumerate(struct.pack(format, value)): + self.rbuf.data[self.rbuf.len + i] = byte + + def write(self, value): + with self._reserve(len(value)): + for i, byte in enumerate(value): + self.rbuf.data[self.rbuf.len + i] = byte + + def write_i8(self, v): + self._pack_into(1, ">b", v) + + def write_u8(self, v): + self._pack_into(1, ">B", v) + + def write_i16(self, v): + self._pack_into(2, ">h", v) + + def write_u16(self, v): + self._pack_into(2, ">H", v) + + def write_i32(self, v): + self._pack_into(4, ">i", v) + + def write_u32(self, v): + self._pack_into(4, ">I", v) + + def write_i64(self, v): + self._pack_into(8, ">q", v) + + def write_u64(self, v): + self._pack_into(8, ">Q", v) + + def write_float(self, v): + self._pack_into(4, ">f", v) + + def write_double(self, v): + self._pack_into(8, ">d", v) + + def write_c_size_t(self, v): + self._pack_into(ctypes.sizeof(ctypes.c_size_t) , "@N", v) +# A handful of classes and functions to support the generated data structures. +# This would be a good candidate for isolating in its own ffi-support lib. + +class InternalError(Exception): + pass + +class _UniffiRustCallStatus(ctypes.Structure): + """ + Error runtime. + """ + _fields_ = [ + ("code", ctypes.c_int8), + ("error_buf", _UniffiRustBuffer), + ] + + # These match the values from the uniffi::rustcalls module + CALL_SUCCESS = 0 + CALL_ERROR = 1 + CALL_PANIC = 2 + + def __str__(self): + if self.code == _UniffiRustCallStatus.CALL_SUCCESS: + return "_UniffiRustCallStatus(CALL_SUCCESS)" + elif self.code == _UniffiRustCallStatus.CALL_ERROR: + return "_UniffiRustCallStatus(CALL_ERROR)" + elif self.code == _UniffiRustCallStatus.CALL_PANIC: + return "_UniffiRustCallStatus(CALL_PANIC)" + else: + return "_UniffiRustCallStatus()" + +def _rust_call(fn, *args): + # Call a rust function + return _rust_call_with_error(None, fn, *args) + +def _rust_call_with_error(error_ffi_converter, fn, *args): + # Call a rust function and handle any errors + # + # This function is used for rust calls that return Result<> and therefore can set the CALL_ERROR status code. + # error_ffi_converter must be set to the _UniffiConverter for the error class that corresponds to the result. + call_status = _UniffiRustCallStatus(code=_UniffiRustCallStatus.CALL_SUCCESS, error_buf=_UniffiRustBuffer(0, 0, None)) + + args_with_error = args + (ctypes.byref(call_status),) + result = fn(*args_with_error) + _uniffi_check_call_status(error_ffi_converter, call_status) + return result + +def _uniffi_check_call_status(error_ffi_converter, call_status): + if call_status.code == _UniffiRustCallStatus.CALL_SUCCESS: + pass + elif call_status.code == _UniffiRustCallStatus.CALL_ERROR: + if error_ffi_converter is None: + call_status.error_buf.free() + raise InternalError("_rust_call_with_error: CALL_ERROR, but error_ffi_converter is None") + else: + raise error_ffi_converter.lift(call_status.error_buf) + elif call_status.code == _UniffiRustCallStatus.CALL_PANIC: + # When the rust code sees a panic, it tries to construct a _UniffiRustBuffer + # with the message. But if that code panics, then it just sends back + # an empty buffer. + if call_status.error_buf.len > 0: + msg = _UniffiConverterString.lift(call_status.error_buf) + else: + msg = "Unknown rust panic" + raise InternalError(msg) + else: + raise InternalError("Invalid _UniffiRustCallStatus code: {}".format( + call_status.code)) + +# A function pointer for a callback as defined by UniFFI. +# Rust definition `fn(handle: u64, method: u32, args: _UniffiRustBuffer, buf_ptr: *mut _UniffiRustBuffer) -> int` +_UNIFFI_FOREIGN_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_ulonglong, ctypes.c_ulong, ctypes.POINTER(ctypes.c_char), ctypes.c_int, ctypes.POINTER(_UniffiRustBuffer)) + +# UniFFI future continuation +_UNIFFI_FUTURE_CONTINUATION_T = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_int8) + +class _UniffiPointerManagerCPython: + """ + Manage giving out pointers to Python objects on CPython + + This class is used to generate opaque pointers that reference Python objects to pass to Rust. + It assumes a CPython platform. See _UniffiPointerManagerGeneral for the alternative. + """ + + def new_pointer(self, obj): + """ + Get a pointer for an object as a ctypes.c_size_t instance + + Each call to new_pointer() must be balanced with exactly one call to release_pointer() + + This returns a ctypes.c_size_t. This is always the same size as a pointer and can be + interchanged with pointers for FFI function arguments and return values. + """ + # IncRef the object since we're going to pass a pointer to Rust + ctypes.pythonapi.Py_IncRef(ctypes.py_object(obj)) + # id() is the object address on CPython + # (https://docs.python.org/3/library/functions.html#id) + return id(obj) + + def release_pointer(self, address): + py_obj = ctypes.cast(address, ctypes.py_object) + obj = py_obj.value + ctypes.pythonapi.Py_DecRef(py_obj) + return obj + + def lookup(self, address): + return ctypes.cast(address, ctypes.py_object).value + +class _UniffiPointerManagerGeneral: + """ + Manage giving out pointers to Python objects on non-CPython platforms + + This has the same API as _UniffiPointerManagerCPython, but doesn't assume we're running on + CPython and is slightly slower. + + Instead of using real pointers, it maps integer values to objects and returns the keys as + c_size_t values. + """ + + def __init__(self): + self._map = {} + self._lock = threading.Lock() + self._current_handle = 0 + + def new_pointer(self, obj): + with self._lock: + handle = self._current_handle + self._current_handle += 1 + self._map[handle] = obj + return handle + + def release_pointer(self, handle): + with self._lock: + return self._map.pop(handle) + + def lookup(self, handle): + with self._lock: + return self._map[handle] + +# Pick an pointer manager implementation based on the platform +if platform.python_implementation() == 'CPython': + _UniffiPointerManager = _UniffiPointerManagerCPython # type: ignore +else: + _UniffiPointerManager = _UniffiPointerManagerGeneral # type: ignore +# Types conforming to `_UniffiConverterPrimitive` pass themselves directly over the FFI. +class _UniffiConverterPrimitive: + @classmethod + def check(cls, value): + return value + + @classmethod + def lift(cls, value): + return value + + @classmethod + def lower(cls, value): + return cls.lowerUnchecked(cls.check(value)) + + @classmethod + def lowerUnchecked(cls, value): + return value + + @classmethod + def write(cls, value, buf): + cls.write_unchecked(cls.check(value), buf) + +class _UniffiConverterPrimitiveInt(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__index__() + except Exception: + raise TypeError("'{}' object cannot be interpreted as an integer".format(type(value).__name__)) + if not isinstance(value, int): + raise TypeError("__index__ returned non-int (type {})".format(type(value).__name__)) + if not cls.VALUE_MIN <= value < cls.VALUE_MAX: + raise ValueError("{} requires {} <= value < {}".format(cls.CLASS_NAME, cls.VALUE_MIN, cls.VALUE_MAX)) + return super().check(value) + +class _UniffiConverterPrimitiveFloat(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__float__() + except Exception: + raise TypeError("must be real number, not {}".format(type(value).__name__)) + if not isinstance(value, float): + raise TypeError("__float__ returned non-float (type {})".format(type(value).__name__)) + return super().check(value) + +# Helper class for wrapper types that will always go through a _UniffiRustBuffer. +# Classes should inherit from this and implement the `read` and `write` static methods. +class _UniffiConverterRustBuffer: + @classmethod + def lift(cls, rbuf): + with rbuf.consume_with_stream() as stream: + return cls.read(stream) + + @classmethod + def lower(cls, value): + with _UniffiRustBuffer.alloc_with_builder() as builder: + cls.write(value, builder) + return builder.finalize() + +# Contains loading, initialization code, and the FFI Function declarations. +# Define some ctypes FFI types that we use in the library + +""" +ctypes type for the foreign executor callback. This is a built-in interface for scheduling +tasks + +Args: + executor: opaque c_size_t value representing the eventloop + delay: delay in ms + task: function pointer to the task callback + task_data: void pointer to the task callback data + +Normally we should call task(task_data) after the detail. +However, when task is NULL this indicates that Rust has dropped the ForeignExecutor and we should +decrease the EventLoop refcount. +""" +_UNIFFI_FOREIGN_EXECUTOR_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int8, ctypes.c_size_t, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p) + +""" +Function pointer for a Rust task, which a callback function that takes a opaque pointer +""" +_UNIFFI_RUST_TASK = ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_int8) + +def _uniffi_future_callback_t(return_type): + """ + Factory function to create callback function types for async functions + """ + return ctypes.CFUNCTYPE(None, ctypes.c_size_t, return_type, _UniffiRustCallStatus) + +def _uniffi_load_indirect(): + """ + This is how we find and load the dynamic library provided by the component. + For now we just look it up by name. + """ + if sys.platform == "darwin": + libname = "lib{}.dylib" + elif sys.platform.startswith("win"): + # As of python3.8, ctypes does not seem to search $PATH when loading DLLs. + # We could use `os.add_dll_directory` to configure the search path, but + # it doesn't feel right to mess with application-wide settings. Let's + # assume that the `.dll` is next to the `.py` file and load by full path. + libname = os.path.join( + os.path.dirname(__file__), + "{}.dll", + ) + else: + # Anything else must be an ELF platform - Linux, *BSD, Solaris/illumos + libname = "lib{}.so" + + libname = libname.format("zklink_sdk") + path = os.path.join(os.path.dirname(__file__), libname) + lib = ctypes.cdll.LoadLibrary(path) + return lib + +def _uniffi_check_contract_api_version(lib): + # Get the bindings contract version from our ComponentInterface + bindings_contract_version = 24 + # Get the scaffolding contract version by calling the into the dylib + scaffolding_contract_version = lib.ffi_zklink_sdk_uniffi_contract_version() + if bindings_contract_version != scaffolding_contract_version: + raise InternalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") + +def _uniffi_check_api_checksums(lib): + if lib.uniffi_zklink_sdk_checksum_func_closest_packable_fee_amount() != 18129: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_closest_packable_token_amount() != 61679: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey() != 63374: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey() != 32759: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_get_public_key_hash() != 58294: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_is_fee_amount_packable() != 11137: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_is_token_amount_packable() != 50233: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_verify_musig() != 61749: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url() != 63488: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url() != 4933: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx() != 63490: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes() != 44684: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature() != 16515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid() != 2829: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid() != 32196: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str() != 3439: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx() != 64239: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash() != 35167: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes() != 1938: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature() != 51549: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain() != 10977: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid() != 25271: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid() != 31315: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str() != 43695: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx() != 42088: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash() != 26881: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract() != 3720: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_bytes() != 6953: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_signature() != 60348: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_long() != 52375: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_short() != 24664: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid() != 33071: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx() != 44741: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes() != 12250: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature() != 41128: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid() != 33576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid() != 55586: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str() != 42918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx() != 43065: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash() != 3288: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes() != 46958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_json_str() != 17811: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash() != 37358: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address() != 11362: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message() != 14536: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx() != 17267: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes() != 15553: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature() != 48117: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid() != 6534: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid() != 46100: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str() != 4050: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx() != 32455: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash() != 45462: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes() != 52461: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid() != 57198: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_json_str() != 24199: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx() != 51607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash() != 48511: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx() != 38824: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_bytes() != 63867: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_signature() != 29468: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid() != 50669: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_valid() != 4189: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_json_str() != 55097: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx() != 27295: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_tx_hash() != 26610: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx() != 18143: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes() != 1134: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature() != 31505: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid() != 8478: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid() != 2828: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_json_str() != 62587: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx() != 30414: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash() != 34918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_create_signed_order() != 18530: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_bytes() != 51161: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg() != 11725: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_signature() != 46876: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid() != 6764: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_valid() != 56951: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_json_str() != 20284: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx() != 27728: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes() != 13177: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature() != 35878: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid() != 54946: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid() != 51995: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str() != 33830: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx() != 23870: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash() != 3162: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging() != 3485: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth() != 39808: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth() != 63567: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data() != 26921: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching() != 27932: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit() != 37862: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_funding() != 31213: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation() != 56257: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching() != 19982: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer() != 51577: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw() != 56851: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message() != 27027: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx() != 17446: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature() != 18454: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes() != 56287: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg() != 46393: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_signature() != 55226: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid() != 31540: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_valid() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_json_str() != 28252: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx() != 64899: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash() != 16259: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes() != 40576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid() != 7961: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str() != 48653: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx() != 40091: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash() != 4261: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx() != 15886: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature() != 28825: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes() != 15999: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg() != 27813: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature() != 56920: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid() != 9636: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid() != 32004: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_json_str() != 3719: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx() != 26934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash() != 25800: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key() != 11211: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new() != 10122: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new() != 10607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contract_new() != 32968: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new() != 210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_deposit_new() != 2732: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new() != 58738: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new() != 30328: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_fullexit_new() != 27234: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_funding_new() != 62515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_liquidation_new() != 56634: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_order_new() != 13958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new() != 5934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_signer_new() != 24354: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new() != 61581: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str() != 57960: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_transfer_new() != 31981: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_typeddata_new() != 46773: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new() != 31819: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_withdraw_new() != 47491: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new() != 62411: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes() != 17619: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer() != 60210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer() != 21809: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed() != 47514: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + +# A ctypes library to expose the extern-C FFI definitions. +# This is an implementation detail which will be called internally by the public API. + +_UniffiLib = _uniffi_load_indirect() +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_order.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_order.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.argtypes = ( + ctypes.c_uint32, + ctypes.c_uint8, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_int8, + ctypes.c_int8, + ctypes.c_uint8, + ctypes.c_uint8, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_uint8, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_fee_amount.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_fee_amount.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_token_amount.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_token_amount.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_is_fee_amount_packable.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_is_fee_amount_packable.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_func_is_token_amount_packable.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_is_token_amount_packable.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.argtypes = ( + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.argtypes = ( + _UniffiForeignBytes, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.restype = None +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.argtypes = ( + _UniffiRustBuffer, + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.argtypes = ( + _UNIFFI_FUTURE_CONTINUATION_T, +) +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.restype = ctypes.c_uint8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.restype = ctypes.c_int8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.restype = ctypes.c_int16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.restype = ctypes.c_uint32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.restype = ctypes.c_int32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.restype = ctypes.c_uint64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.restype = ctypes.c_int64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.restype = ctypes.c_float +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.restype = ctypes.c_double +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.restype = ctypes.c_void_p +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.restype = None +_UniffiLib.uniffi_zklink_sdk_checksum_func_closest_packable_fee_amount.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_closest_packable_fee_amount.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_closest_packable_token_amount.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_closest_packable_token_amount.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_is_fee_amount_packable.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_is_fee_amount_packable.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_is_token_amount_packable.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_is_token_amount_packable.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.argtypes = ( +) +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.restype = ctypes.c_uint32 +_uniffi_check_contract_api_version(_UniffiLib) +_uniffi_check_api_checksums(_UniffiLib) + +# Async support + +# Public interface members begin here. + + +class _UniffiConverterUInt8(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u8" + VALUE_MIN = 0 + VALUE_MAX = 2**8 + + @staticmethod + def read(buf): + return buf.read_u8() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u8(value) + +class _UniffiConverterUInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u16" + VALUE_MIN = 0 + VALUE_MAX = 2**16 + + @staticmethod + def read(buf): + return buf.read_u16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u16(value) + +class _UniffiConverterInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "i16" + VALUE_MIN = -2**15 + VALUE_MAX = 2**15 + + @staticmethod + def read(buf): + return buf.read_i16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_i16(value) + +class _UniffiConverterUInt32(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u32" + VALUE_MIN = 0 + VALUE_MAX = 2**32 + + @staticmethod + def read(buf): + return buf.read_u32() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u32(value) + +class _UniffiConverterUInt64(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u64" + VALUE_MIN = 0 + VALUE_MAX = 2**64 + + @staticmethod + def read(buf): + return buf.read_u64() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u64(value) + +class _UniffiConverterBool(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + return not not value + + @classmethod + def read(cls, buf): + return cls.lift(buf.read_u8()) + + @classmethod + def write_unchecked(cls, value, buf): + buf.write_u8(value) + + @staticmethod + def lift(value): + return value != 0 + +class _UniffiConverterString: + @staticmethod + def check(value): + if not isinstance(value, str): + raise TypeError("argument must be str, not {}".format(type(value).__name__)) + return value + + @staticmethod + def read(buf): + size = buf.read_i32() + if size < 0: + raise InternalError("Unexpected negative string length") + utf8_bytes = buf.read(size) + return utf8_bytes.decode("utf-8") + + @staticmethod + def write(value, buf): + value = _UniffiConverterString.check(value) + utf8_bytes = value.encode("utf-8") + buf.write_i32(len(utf8_bytes)) + buf.write(utf8_bytes) + + @staticmethod + def lift(buf): + with buf.consume_with_stream() as stream: + return stream.read(stream.remaining()).decode("utf-8") + + @staticmethod + def lower(value): + value = _UniffiConverterString.check(value) + with _UniffiRustBuffer.alloc_with_builder() as builder: + builder.write(value.encode("utf-8")) + return builder.finalize() + + + +class AutoDeleveraging: + _pointer: ctypes.c_void_p + def __init__(self, builder: "AutoDeleveragingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new, + _UniffiConverterTypeAutoDeleveragingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "AutoDeleveraging": + + return _UniffiConverterTypeAutoDeleveraging.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeAutoDeleveraging: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, AutoDeleveraging): + raise TypeError("Expected AutoDeleveraging instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return AutoDeleveraging._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ChangePubKey: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ChangePubKeyBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new, + _UniffiConverterTypeChangePubKeyBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature,self._pointer,) + ) + + + + + + + def is_onchain(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeChangePubKey: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ChangePubKey): + raise TypeError("Expected ChangePubKey instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ChangePubKey._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Contract: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new, + _UniffiConverterTypeContractBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contract, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_contract(self, zklink_signer: "ZkLinkSigner") -> "Contract": + + return _UniffiConverterTypeContract.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature,self._pointer,) + ) + + + + + + + def is_long(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long,self._pointer,) + ) + + + + + + + def is_short(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContract: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Contract): + raise TypeError("Expected Contract instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Contract._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ContractMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new, + _UniffiConverterTypeContractMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ContractMatching": + + return _UniffiConverterTypeContractMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContractMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ContractMatching): + raise TypeError("Expected ContractMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ContractMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Deposit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "DepositBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new, + _UniffiConverterTypeDepositBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_deposit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeDeposit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Deposit): + raise TypeError("Expected Deposit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Deposit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class EthSigner: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str): + + self._pointer = _rust_call_with_error(_UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new, + _UniffiConverterString.lower(private_key)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_address(self, ) -> "Address": + return _UniffiConverterTypeAddress.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address,self._pointer,) + ) + + + + + + + def sign_message(self, message: "typing.List[int]") -> "PackedEthSignature": + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message,self._pointer, + _UniffiConverterSequenceUInt8.lower(message)) + ) + + + + + + +class _UniffiConverterTypeEthSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, EthSigner): + raise TypeError("Expected EthSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return EthSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ForcedExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ForcedExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new, + _UniffiConverterTypeForcedExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ForcedExit": + + return _UniffiConverterTypeForcedExit.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeForcedExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ForcedExit): + raise TypeError("Expected ForcedExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ForcedExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class FullExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FullExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new, + _UniffiConverterTypeFullExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFullExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, FullExit): + raise TypeError("Expected FullExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return FullExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Funding: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FundingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new, + _UniffiConverterTypeFundingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_funding, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Funding": + + return _UniffiConverterTypeFunding.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFunding: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Funding): + raise TypeError("Expected Funding instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Funding._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Liquidation: + _pointer: ctypes.c_void_p + def __init__(self, builder: "LiquidationBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new, + _UniffiConverterTypeLiquidationBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Liquidation": + + return _UniffiConverterTypeLiquidation.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeLiquidation: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Liquidation): + raise TypeError("Expected Liquidation instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Liquidation._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Order: + _pointer: ctypes.c_void_p + def __init__(self, account_id: "AccountId",sub_account_id: "SubAccountId",slot_id: "SlotId",nonce: "Nonce",base_token_id: "TokenId",quote_token_id: "TokenId",amount: "BigUint",price: "BigUint",is_sell: bool,has_subsidy: bool,maker_fee_rate: "int",taker_fee_rate: "int",signature: "typing.Optional[ZkLinkSignature]"): + + + + + + + + + + + + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new, + _UniffiConverterTypeAccountId.lower(account_id), + _UniffiConverterTypeSubAccountId.lower(sub_account_id), + _UniffiConverterTypeSlotId.lower(slot_id), + _UniffiConverterTypeNonce.lower(nonce), + _UniffiConverterTypeTokenId.lower(base_token_id), + _UniffiConverterTypeTokenId.lower(quote_token_id), + _UniffiConverterTypeBigUint.lower(amount), + _UniffiConverterTypeBigUint.lower(price), + _UniffiConverterBool.lower(is_sell), + _UniffiConverterBool.lower(has_subsidy), + _UniffiConverterUInt8.lower(maker_fee_rate), + _UniffiConverterUInt8.lower(taker_fee_rate), + _UniffiConverterOptionalTypeZkLinkSignature.lower(signature)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_order, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_order(self, zklink_signer: "ZkLinkSigner") -> "Order": + + return _UniffiConverterTypeOrder.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, quote_token: str,based_token: str,decimals: "int") -> str: + + + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(quote_token), + _UniffiConverterString.lower(based_token), + _UniffiConverterUInt8.lower(decimals)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrder: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Order): + raise TypeError("Expected Order instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Order._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class OrderMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "OrderMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new, + _UniffiConverterTypeOrderMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "OrderMatching": + + return _UniffiConverterTypeOrderMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrderMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, OrderMatching): + raise TypeError("Expected OrderMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return OrderMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Signer: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str,l1_type: "L1SignerType"): + + + self._pointer = _rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new, + _UniffiConverterString.lower(private_key), + _UniffiConverterTypeL1SignerType.lower(l1_type)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_signer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def sign_auto_deleveraging(self, tx: "AutoDeleveraging") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging,self._pointer, + _UniffiConverterTypeAutoDeleveraging.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_create2data_auth(self, tx: "ChangePubKey",crate2data: "Create2Data") -> "TxSignature": + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeCreate2Data.lower(crate2data)) + ) + + + + + + + def sign_change_pubkey_with_eth_ecdsa_auth(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_onchain_auth_data(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_contract_matching(self, tx: "ContractMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching,self._pointer, + _UniffiConverterTypeContractMatching.lower(tx)) + ) + + + + + + + def sign_forced_exit(self, tx: "ForcedExit") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit,self._pointer, + _UniffiConverterTypeForcedExit.lower(tx)) + ) + + + + + + + def sign_funding(self, tx: "Funding") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding,self._pointer, + _UniffiConverterTypeFunding.lower(tx)) + ) + + + + + + + def sign_liquidation(self, tx: "Liquidation") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation,self._pointer, + _UniffiConverterTypeLiquidation.lower(tx)) + ) + + + + + + + def sign_order_matching(self, tx: "OrderMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching,self._pointer, + _UniffiConverterTypeOrderMatching.lower(tx)) + ) + + + + + + + def sign_transfer(self, tx: "Transfer",token_sybmol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer,self._pointer, + _UniffiConverterTypeTransfer.lower(tx), + _UniffiConverterString.lower(token_sybmol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + + def sign_withdraw(self, tx: "Withdraw",l2_source_token_symbol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw,self._pointer, + _UniffiConverterTypeWithdraw.lower(tx), + _UniffiConverterString.lower(l2_source_token_symbol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Signer): + raise TypeError("Expected Signer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Signer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class StarkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_hex_str(cls, hex_str: str): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str, + _UniffiConverterString.lower(hex_str)) + return cls._make_instance_(pointer) + + + + def sign_message(self, typed_data: "TypedData",addr: str) -> "StarkEip712Signature": + + + return _UniffiConverterTypeStarkEip712Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message,self._pointer, + _UniffiConverterTypeTypedData.lower(typed_data), + _UniffiConverterString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeStarkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, StarkSigner): + raise TypeError("Expected StarkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return StarkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Transfer: + _pointer: ctypes.c_void_p + def __init__(self, builder: "TransferBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new, + _UniffiConverterTypeTransferBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_transfer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Transfer": + + return _UniffiConverterTypeTransfer.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",token_symbol: str) -> "TxLayer1Signature": + + + return _UniffiConverterTypeTxLayer1Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str) -> str: + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeTransfer: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Transfer): + raise TypeError("Expected Transfer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Transfer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class TypedData: + _pointer: ctypes.c_void_p + def __init__(self, message: "TypedDataMessage",chain_id: str): + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new, + _UniffiConverterTypeTypedDataMessage.lower(message), + _UniffiConverterString.lower(chain_id)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + +class _UniffiConverterTypeTypedData: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, TypedData): + raise TypeError("Expected TypedData instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return TypedData._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class UpdateGlobalVar: + _pointer: ctypes.c_void_p + def __init__(self, builder: "UpdateGlobalVarBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new, + _UniffiConverterTypeUpdateGlobalVarBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeUpdateGlobalVar: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, UpdateGlobalVar): + raise TypeError("Expected UpdateGlobalVar instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return UpdateGlobalVar._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Withdraw: + _pointer: ctypes.c_void_p + def __init__(self, builder: "WithdrawBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new, + _UniffiConverterTypeWithdrawBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Withdraw": + + return _UniffiConverterTypeWithdraw.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",l2_source_token_symbol: str) -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(l2_source_token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str) -> str: + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> bool: + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeWithdraw: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Withdraw): + raise TypeError("Expected Withdraw instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Withdraw._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ZkLinkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_bytes(cls, slice: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes, + _UniffiConverterSequenceUInt8.lower(slice)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_eth_signer(cls, eth_hex_private_key: str): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer, + _UniffiConverterString.lower(eth_hex_private_key)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_stark_signer(cls, hex_private_key: str,addr: str,chain_id: str): + + + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer, + _UniffiConverterString.lower(hex_private_key), + _UniffiConverterString.lower(addr), + _UniffiConverterString.lower(chain_id)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_seed(cls, seed: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed, + _UniffiConverterSequenceUInt8.lower(seed)) + return cls._make_instance_(pointer) + + + + def public_key(self, ) -> "PackedPublicKey": + return _UniffiConverterTypePackedPublicKey.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key,self._pointer,) + ) + + + + + + + def sign_musig(self, msg: "typing.List[int]") -> "ZkLinkSignature": + + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig,self._pointer, + _UniffiConverterSequenceUInt8.lower(msg)) + ) + + + + + + +class _UniffiConverterTypeZkLinkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ZkLinkSigner): + raise TypeError("Expected ZkLinkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ZkLinkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + +class AutoDeleveragingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";adl_account_id: "AccountId";pair_id: "PairId";adl_size: "BigUint";adl_price: "BigUint";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", adl_account_id: "AccountId", pair_id: "PairId", adl_size: "BigUint", adl_price: "BigUint", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.adl_account_id = adl_account_id + self.pair_id = pair_id + self.adl_size = adl_size + self.adl_price = adl_price + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "AutoDeleveragingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, adl_account_id={}, pair_id={}, adl_size={}, adl_price={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.adl_account_id, self.pair_id, self.adl_size, self.adl_price, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.adl_account_id != other.adl_account_id: + return False + if self.pair_id != other.pair_id: + return False + if self.adl_size != other.adl_size: + return False + if self.adl_price != other.adl_price: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeAutoDeleveragingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return AutoDeleveragingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + adl_account_id=_UniffiConverterTypeAccountId.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + adl_size=_UniffiConverterTypeBigUint.read(buf), + adl_price=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.adl_account_id, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.adl_size, buf) + _UniffiConverterTypeBigUint.write(value.adl_price, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class ChangePubKeyBuilder: + chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";new_pubkey_hash: "PubKeyHash";fee_token: "TokenId";fee: "BigUint";nonce: "Nonce";eth_signature: "typing.Optional[PackedEthSignature]";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", new_pubkey_hash: "PubKeyHash", fee_token: "TokenId", fee: "BigUint", nonce: "Nonce", eth_signature: "typing.Optional[PackedEthSignature]", timestamp: "TimeStamp"): + self.chain_id = chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.new_pubkey_hash = new_pubkey_hash + self.fee_token = fee_token + self.fee = fee + self.nonce = nonce + self.eth_signature = eth_signature + self.timestamp = timestamp + + def __str__(self): + return "ChangePubKeyBuilder(chain_id={}, account_id={}, sub_account_id={}, new_pubkey_hash={}, fee_token={}, fee={}, nonce={}, eth_signature={}, timestamp={})".format(self.chain_id, self.account_id, self.sub_account_id, self.new_pubkey_hash, self.fee_token, self.fee, self.nonce, self.eth_signature, self.timestamp) + + def __eq__(self, other): + if self.chain_id != other.chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.new_pubkey_hash != other.new_pubkey_hash: + return False + if self.fee_token != other.fee_token: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.eth_signature != other.eth_signature: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeChangePubKeyBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ChangePubKeyBuilder( + chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + new_pubkey_hash=_UniffiConverterTypePubKeyHash.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + eth_signature=_UniffiConverterOptionalTypePackedEthSignature.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypePubKeyHash.write(value.new_pubkey_hash, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterOptionalTypePackedEthSignature.write(value.eth_signature, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ContractBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";slot_id: "SlotId";nonce: "Nonce";pair_id: "PairId";size: "BigUint";price: "BigUint";direction: bool;taker_fee_rate: "int";maker_fee_rate: "int";has_subsidy: bool; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", slot_id: "SlotId", nonce: "Nonce", pair_id: "PairId", size: "BigUint", price: "BigUint", direction: bool, taker_fee_rate: "int", maker_fee_rate: "int", has_subsidy: bool): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.slot_id = slot_id + self.nonce = nonce + self.pair_id = pair_id + self.size = size + self.price = price + self.direction = direction + self.taker_fee_rate = taker_fee_rate + self.maker_fee_rate = maker_fee_rate + self.has_subsidy = has_subsidy + + def __str__(self): + return "ContractBuilder(account_id={}, sub_account_id={}, slot_id={}, nonce={}, pair_id={}, size={}, price={}, direction={}, taker_fee_rate={}, maker_fee_rate={}, has_subsidy={})".format(self.account_id, self.sub_account_id, self.slot_id, self.nonce, self.pair_id, self.size, self.price, self.direction, self.taker_fee_rate, self.maker_fee_rate, self.has_subsidy) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.slot_id != other.slot_id: + return False + if self.nonce != other.nonce: + return False + if self.pair_id != other.pair_id: + return False + if self.size != other.size: + return False + if self.price != other.price: + return False + if self.direction != other.direction: + return False + if self.taker_fee_rate != other.taker_fee_rate: + return False + if self.maker_fee_rate != other.maker_fee_rate: + return False + if self.has_subsidy != other.has_subsidy: + return False + return True + +class _UniffiConverterTypeContractBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + slot_id=_UniffiConverterTypeSlotId.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + size=_UniffiConverterTypeBigUint.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + direction=_UniffiConverterBool.read(buf), + taker_fee_rate=_UniffiConverterUInt8.read(buf), + maker_fee_rate=_UniffiConverterUInt8.read(buf), + has_subsidy=_UniffiConverterBool.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeSlotId.write(value.slot_id, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.size, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterBool.write(value.direction, buf) + _UniffiConverterUInt8.write(value.taker_fee_rate, buf) + _UniffiConverterUInt8.write(value.maker_fee_rate, buf) + _UniffiConverterBool.write(value.has_subsidy, buf) + + +class ContractMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Contract";maker: "typing.List[Contract]";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Contract", maker: "typing.List[Contract]", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "ContractMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeContractMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeContract.read(buf), + maker=_UniffiConverterSequenceTypeContract.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeContract.write(value.taker, buf) + _UniffiConverterSequenceTypeContract.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class ContractPrice: + pair_id: "PairId";market_price: "BigUint"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", market_price: "BigUint"): + self.pair_id = pair_id + self.market_price = market_price + + def __str__(self): + return "ContractPrice(pair_id={}, market_price={})".format(self.pair_id, self.market_price) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.market_price != other.market_price: + return False + return True + +class _UniffiConverterTypeContractPrice(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractPrice( + pair_id=_UniffiConverterTypePairId.read(buf), + market_price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.market_price, buf) + + +class Create2Data: + creator_address: "ZkLinkAddress";salt_arg: "H256";code_hash: "H256"; + + @typing.no_type_check + def __init__(self, creator_address: "ZkLinkAddress", salt_arg: "H256", code_hash: "H256"): + self.creator_address = creator_address + self.salt_arg = salt_arg + self.code_hash = code_hash + + def __str__(self): + return "Create2Data(creator_address={}, salt_arg={}, code_hash={})".format(self.creator_address, self.salt_arg, self.code_hash) + + def __eq__(self, other): + if self.creator_address != other.creator_address: + return False + if self.salt_arg != other.salt_arg: + return False + if self.code_hash != other.code_hash: + return False + return True + +class _UniffiConverterTypeCreate2Data(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Create2Data( + creator_address=_UniffiConverterTypeZkLinkAddress.read(buf), + salt_arg=_UniffiConverterTypeH256.read(buf), + code_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.creator_address, buf) + _UniffiConverterTypeH256.write(value.salt_arg, buf) + _UniffiConverterTypeH256.write(value.code_hash, buf) + + +class DepositBuilder: + from_address: "ZkLinkAddress";to_address: "ZkLinkAddress";from_chain_id: "ChainId";sub_account_id: "SubAccountId";l2_target_token: "TokenId";l1_source_token: "TokenId";amount: "BigUint";serial_id: "int";l2_hash: "H256";eth_hash: "typing.Optional[H256]"; + + @typing.no_type_check + def __init__(self, from_address: "ZkLinkAddress", to_address: "ZkLinkAddress", from_chain_id: "ChainId", sub_account_id: "SubAccountId", l2_target_token: "TokenId", l1_source_token: "TokenId", amount: "BigUint", serial_id: "int", l2_hash: "H256", eth_hash: "typing.Optional[H256]"): + self.from_address = from_address + self.to_address = to_address + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.l2_target_token = l2_target_token + self.l1_source_token = l1_source_token + self.amount = amount + self.serial_id = serial_id + self.l2_hash = l2_hash + self.eth_hash = eth_hash + + def __str__(self): + return "DepositBuilder(from_address={}, to_address={}, from_chain_id={}, sub_account_id={}, l2_target_token={}, l1_source_token={}, amount={}, serial_id={}, l2_hash={}, eth_hash={})".format(self.from_address, self.to_address, self.from_chain_id, self.sub_account_id, self.l2_target_token, self.l1_source_token, self.amount, self.serial_id, self.l2_hash, self.eth_hash) + + def __eq__(self, other): + if self.from_address != other.from_address: + return False + if self.to_address != other.to_address: + return False + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.l2_target_token != other.l2_target_token: + return False + if self.l1_source_token != other.l1_source_token: + return False + if self.amount != other.amount: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + if self.eth_hash != other.eth_hash: + return False + return True + +class _UniffiConverterTypeDepositBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return DepositBuilder( + from_address=_UniffiConverterTypeZkLinkAddress.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_target_token=_UniffiConverterTypeTokenId.read(buf), + l1_source_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + eth_hash=_UniffiConverterOptionalTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.from_address, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_target_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_source_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + _UniffiConverterOptionalTypeH256.write(value.eth_hash, buf) + + +class ForcedExitBuilder: + to_chain_id: "ChainId";initiator_account_id: "AccountId";initiator_sub_account_id: "SubAccountId";target: "ZkLinkAddress";target_sub_account_id: "SubAccountId";l2_source_token: "TokenId";l1_target_token: "TokenId";initiator_nonce: "Nonce";exit_amount: "BigUint";withdraw_to_l1: bool;timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", initiator_account_id: "AccountId", initiator_sub_account_id: "SubAccountId", target: "ZkLinkAddress", target_sub_account_id: "SubAccountId", l2_source_token: "TokenId", l1_target_token: "TokenId", initiator_nonce: "Nonce", exit_amount: "BigUint", withdraw_to_l1: bool, timestamp: "TimeStamp"): + self.to_chain_id = to_chain_id + self.initiator_account_id = initiator_account_id + self.initiator_sub_account_id = initiator_sub_account_id + self.target = target + self.target_sub_account_id = target_sub_account_id + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.initiator_nonce = initiator_nonce + self.exit_amount = exit_amount + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "ForcedExitBuilder(to_chain_id={}, initiator_account_id={}, initiator_sub_account_id={}, target={}, target_sub_account_id={}, l2_source_token={}, l1_target_token={}, initiator_nonce={}, exit_amount={}, withdraw_to_l1={}, timestamp={})".format(self.to_chain_id, self.initiator_account_id, self.initiator_sub_account_id, self.target, self.target_sub_account_id, self.l2_source_token, self.l1_target_token, self.initiator_nonce, self.exit_amount, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.initiator_account_id != other.initiator_account_id: + return False + if self.initiator_sub_account_id != other.initiator_sub_account_id: + return False + if self.target != other.target: + return False + if self.target_sub_account_id != other.target_sub_account_id: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.initiator_nonce != other.initiator_nonce: + return False + if self.exit_amount != other.exit_amount: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeForcedExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ForcedExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + initiator_account_id=_UniffiConverterTypeAccountId.read(buf), + initiator_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + target=_UniffiConverterTypeZkLinkAddress.read(buf), + target_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + initiator_nonce=_UniffiConverterTypeNonce.read(buf), + exit_amount=_UniffiConverterTypeBigUint.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.initiator_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.initiator_sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.target, buf) + _UniffiConverterTypeSubAccountId.write(value.target_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeNonce.write(value.initiator_nonce, buf) + _UniffiConverterTypeBigUint.write(value.exit_amount, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class FullExitBuilder: + to_chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";exit_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";serial_id: "int";l2_hash: "H256"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", exit_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", serial_id: "int", l2_hash: "H256"): + self.to_chain_id = to_chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.exit_address = exit_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.serial_id = serial_id + self.l2_hash = l2_hash + + def __str__(self): + return "FullExitBuilder(to_chain_id={}, account_id={}, sub_account_id={}, exit_address={}, l2_source_token={}, l1_target_token={}, contract_prices={}, margin_prices={}, serial_id={}, l2_hash={})".format(self.to_chain_id, self.account_id, self.sub_account_id, self.exit_address, self.l2_source_token, self.l1_target_token, self.contract_prices, self.margin_prices, self.serial_id, self.l2_hash) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.exit_address != other.exit_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + return True + +class _UniffiConverterTypeFullExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FullExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + exit_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.exit_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + + +class FundingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";funding_account_ids: "typing.List[AccountId]";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", funding_account_ids: "typing.List[AccountId]", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.funding_account_ids = funding_account_ids + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "FundingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, funding_account_ids={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.funding_account_ids, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.funding_account_ids != other.funding_account_ids: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeFundingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + funding_account_ids=_UniffiConverterSequenceTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeAccountId.write(value.funding_account_ids, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class FundingInfo: + pair_id: "PairId";price: "BigUint";funding_rate: "int"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", price: "BigUint", funding_rate: "int"): + self.pair_id = pair_id + self.price = price + self.funding_rate = funding_rate + + def __str__(self): + return "FundingInfo(pair_id={}, price={}, funding_rate={})".format(self.pair_id, self.price, self.funding_rate) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.price != other.price: + return False + if self.funding_rate != other.funding_rate: + return False + return True + +class _UniffiConverterTypeFundingInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingInfo( + pair_id=_UniffiConverterTypePairId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + funding_rate=_UniffiConverterInt16.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterInt16.write(value.funding_rate, buf) + + +class LiquidationBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";liquidation_account_id: "AccountId";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", liquidation_account_id: "AccountId", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.liquidation_account_id = liquidation_account_id + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "LiquidationBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, liquidation_account_id={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.liquidation_account_id, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.liquidation_account_id != other.liquidation_account_id: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeLiquidationBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return LiquidationBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + liquidation_account_id=_UniffiConverterTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.liquidation_account_id, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class Message: + data: str; + + @typing.no_type_check + def __init__(self, data: str): + self.data = data + + def __str__(self): + return "Message(data={})".format(self.data) + + def __eq__(self, other): + if self.data != other.data: + return False + return True + +class _UniffiConverterTypeMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Message( + data=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.data, buf) + + +class OraclePrices: + contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "OraclePrices(contract_prices={}, margin_prices={})".format(self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeOraclePrices(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OraclePrices( + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class OrderMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Order";maker: "Order";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";expect_base_amount: "BigUint";expect_quote_amount: "BigUint"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Order", maker: "Order", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", expect_base_amount: "BigUint", expect_quote_amount: "BigUint"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.expect_base_amount = expect_base_amount + self.expect_quote_amount = expect_quote_amount + + def __str__(self): + return "OrderMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={}, expect_base_amount={}, expect_quote_amount={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices, self.expect_base_amount, self.expect_quote_amount) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.expect_base_amount != other.expect_base_amount: + return False + if self.expect_quote_amount != other.expect_quote_amount: + return False + return True + +class _UniffiConverterTypeOrderMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OrderMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeOrder.read(buf), + maker=_UniffiConverterTypeOrder.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + expect_base_amount=_UniffiConverterTypeBigUint.read(buf), + expect_quote_amount=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeOrder.write(value.taker, buf) + _UniffiConverterTypeOrder.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeBigUint.write(value.expect_base_amount, buf) + _UniffiConverterTypeBigUint.write(value.expect_quote_amount, buf) + + +class SpotPriceInfo: + token_id: "TokenId";price: "BigUint"; + + @typing.no_type_check + def __init__(self, token_id: "TokenId", price: "BigUint"): + self.token_id = token_id + self.price = price + + def __str__(self): + return "SpotPriceInfo(token_id={}, price={})".format(self.token_id, self.price) + + def __eq__(self, other): + if self.token_id != other.token_id: + return False + if self.price != other.price: + return False + return True + +class _UniffiConverterTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return SpotPriceInfo( + token_id=_UniffiConverterTypeTokenId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + + +class TransferBuilder: + account_id: "AccountId";to_address: "ZkLinkAddress";from_sub_account_id: "SubAccountId";to_sub_account_id: "SubAccountId";token: "TokenId";amount: "BigUint";fee: "BigUint";nonce: "Nonce";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", to_address: "ZkLinkAddress", from_sub_account_id: "SubAccountId", to_sub_account_id: "SubAccountId", token: "TokenId", amount: "BigUint", fee: "BigUint", nonce: "Nonce", timestamp: "TimeStamp"): + self.account_id = account_id + self.to_address = to_address + self.from_sub_account_id = from_sub_account_id + self.to_sub_account_id = to_sub_account_id + self.token = token + self.amount = amount + self.fee = fee + self.nonce = nonce + self.timestamp = timestamp + + def __str__(self): + return "TransferBuilder(account_id={}, to_address={}, from_sub_account_id={}, to_sub_account_id={}, token={}, amount={}, fee={}, nonce={}, timestamp={})".format(self.account_id, self.to_address, self.from_sub_account_id, self.to_sub_account_id, self.token, self.amount, self.fee, self.nonce, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.to_address != other.to_address: + return False + if self.from_sub_account_id != other.from_sub_account_id: + return False + if self.to_sub_account_id != other.to_sub_account_id: + return False + if self.token != other.token: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeTransferBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TransferBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeSubAccountId.write(value.from_sub_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.to_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class TxMessage: + transaction: str;amount: str;fee: str;token: str;to: str;nonce: str; + + @typing.no_type_check + def __init__(self, transaction: str, amount: str, fee: str, token: str, to: str, nonce: str): + self.transaction = transaction + self.amount = amount + self.fee = fee + self.token = token + self.to = to + self.nonce = nonce + + def __str__(self): + return "TxMessage(transaction={}, amount={}, fee={}, token={}, to={}, nonce={})".format(self.transaction, self.amount, self.fee, self.token, self.to, self.nonce) + + def __eq__(self, other): + if self.transaction != other.transaction: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.token != other.token: + return False + if self.to != other.to: + return False + if self.nonce != other.nonce: + return False + return True + +class _UniffiConverterTypeTxMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxMessage( + transaction=_UniffiConverterString.read(buf), + amount=_UniffiConverterString.read(buf), + fee=_UniffiConverterString.read(buf), + token=_UniffiConverterString.read(buf), + to=_UniffiConverterString.read(buf), + nonce=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.transaction, buf) + _UniffiConverterString.write(value.amount, buf) + _UniffiConverterString.write(value.fee, buf) + _UniffiConverterString.write(value.token, buf) + _UniffiConverterString.write(value.to, buf) + _UniffiConverterString.write(value.nonce, buf) + + +class TxSignature: + tx: "ZkLinkTx";layer1_signature: "typing.Optional[TxLayer1Signature]"; + + @typing.no_type_check + def __init__(self, tx: "ZkLinkTx", layer1_signature: "typing.Optional[TxLayer1Signature]"): + self.tx = tx + self.layer1_signature = layer1_signature + + def __str__(self): + return "TxSignature(tx={}, layer1_signature={})".format(self.tx, self.layer1_signature) + + def __eq__(self, other): + if self.tx != other.tx: + return False + if self.layer1_signature != other.layer1_signature: + return False + return True + +class _UniffiConverterTypeTxSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxSignature( + tx=_UniffiConverterTypeZkLinkTx.read(buf), + layer1_signature=_UniffiConverterOptionalTypeTxLayer1Signature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkTx.write(value.tx, buf) + _UniffiConverterOptionalTypeTxLayer1Signature.write(value.layer1_signature, buf) + + +class UpdateGlobalVarBuilder: + from_chain_id: "ChainId";sub_account_id: "SubAccountId";parameter: "Parameter";serial_id: "int"; + + @typing.no_type_check + def __init__(self, from_chain_id: "ChainId", sub_account_id: "SubAccountId", parameter: "Parameter", serial_id: "int"): + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.parameter = parameter + self.serial_id = serial_id + + def __str__(self): + return "UpdateGlobalVarBuilder(from_chain_id={}, sub_account_id={}, parameter={}, serial_id={})".format(self.from_chain_id, self.sub_account_id, self.parameter, self.serial_id) + + def __eq__(self, other): + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.parameter != other.parameter: + return False + if self.serial_id != other.serial_id: + return False + return True + +class _UniffiConverterTypeUpdateGlobalVarBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return UpdateGlobalVarBuilder( + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + parameter=_UniffiConverterTypeParameter.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeParameter.write(value.parameter, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + + +class WithdrawBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";to_chain_id: "ChainId";to_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";amount: "BigUint";call_data: "typing.Optional[typing.List[int]]";fee: "BigUint";nonce: "Nonce";withdraw_fee_ratio: "int";withdraw_to_l1: bool;timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", to_chain_id: "ChainId", to_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", amount: "BigUint", call_data: "typing.Optional[typing.List[int]]", fee: "BigUint", nonce: "Nonce", withdraw_fee_ratio: "int", withdraw_to_l1: bool, timestamp: "TimeStamp"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.to_chain_id = to_chain_id + self.to_address = to_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.amount = amount + self.call_data = call_data + self.fee = fee + self.nonce = nonce + self.withdraw_fee_ratio = withdraw_fee_ratio + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "WithdrawBuilder(account_id={}, sub_account_id={}, to_chain_id={}, to_address={}, l2_source_token={}, l1_target_token={}, amount={}, call_data={}, fee={}, nonce={}, withdraw_fee_ratio={}, withdraw_to_l1={}, timestamp={})".format(self.account_id, self.sub_account_id, self.to_chain_id, self.to_address, self.l2_source_token, self.l1_target_token, self.amount, self.call_data, self.fee, self.nonce, self.withdraw_fee_ratio, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.to_chain_id != other.to_chain_id: + return False + if self.to_address != other.to_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.amount != other.amount: + return False + if self.call_data != other.call_data: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.withdraw_fee_ratio != other.withdraw_fee_ratio: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeWithdrawBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return WithdrawBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_chain_id=_UniffiConverterTypeChainId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + call_data=_UniffiConverterOptionalSequenceUInt8.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + withdraw_fee_ratio=_UniffiConverterUInt16.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterOptionalSequenceUInt8.write(value.call_data, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterUInt16.write(value.withdraw_fee_ratio, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ZkLinkSignature: + pub_key: "PackedPublicKey";signature: "PackedSignature"; + + @typing.no_type_check + def __init__(self, pub_key: "PackedPublicKey", signature: "PackedSignature"): + self.pub_key = pub_key + self.signature = signature + + def __str__(self): + return "ZkLinkSignature(pub_key={}, signature={})".format(self.pub_key, self.signature) + + def __eq__(self, other): + if self.pub_key != other.pub_key: + return False + if self.signature != other.signature: + return False + return True + +class _UniffiConverterTypeZkLinkSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ZkLinkSignature( + pub_key=_UniffiConverterTypePackedPublicKey.read(buf), + signature=_UniffiConverterTypePackedSignature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePackedPublicKey.write(value.pub_key, buf) + _UniffiConverterTypePackedSignature.write(value.signature, buf) + + + + + +class ChangePubKeyAuthData: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthData cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthData.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + eth_signature: "PackedEthSignature"; + + @typing.no_type_check + def __init__(self,eth_signature: "PackedEthSignature"): + + self.eth_signature = eth_signature + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_ECDSA(eth_signature={})".format(self.eth_signature) + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + if self.eth_signature != other.eth_signature: + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthData.ONCHAIN = type("ChangePubKeyAuthData.ONCHAIN", (ChangePubKeyAuthData.ONCHAIN, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_ECDSA = type("ChangePubKeyAuthData.ETH_ECDSA", (ChangePubKeyAuthData.ETH_ECDSA, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_CREATE2 = type("ChangePubKeyAuthData.ETH_CREATE2", (ChangePubKeyAuthData.ETH_CREATE2, ChangePubKeyAuthData,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthData(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthData.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthData.ETH_ECDSA( + _UniffiConverterTypePackedEthSignature.read(buf), + ) + if variant == 3: + return ChangePubKeyAuthData.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + _UniffiConverterTypePackedEthSignature.write(value.eth_signature, buf) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + + + + +class ChangePubKeyAuthRequest: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthRequest cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_ECDSA()".format() + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthRequest.ONCHAIN = type("ChangePubKeyAuthRequest.ONCHAIN", (ChangePubKeyAuthRequest.ONCHAIN, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_ECDSA = type("ChangePubKeyAuthRequest.ETH_ECDSA", (ChangePubKeyAuthRequest.ETH_ECDSA, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_CREATE2 = type("ChangePubKeyAuthRequest.ETH_CREATE2", (ChangePubKeyAuthRequest.ETH_CREATE2, ChangePubKeyAuthRequest,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthRequest(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthRequest.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthRequest.ETH_ECDSA( + ) + if variant == 3: + return ChangePubKeyAuthRequest.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + +# EthSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class EthSignerError(Exception): + pass + +_UniffiTempEthSignerError = EthSignerError + +class EthSignerError: # type: ignore + class InvalidEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidEthSigner = InvalidEthSigner # type: ignore + class MissingEthPrivateKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthPrivateKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthPrivateKey = MissingEthPrivateKey # type: ignore + class MissingEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthSigner = MissingEthSigner # type: ignore + class SigningFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.SigningFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.SigningFailed = SigningFailed # type: ignore + class UnlockingFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.UnlockingFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.UnlockingFailed = UnlockingFailed # type: ignore + class InvalidRawTx(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidRawTx({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidRawTx = InvalidRawTx # type: ignore + class Eip712Failed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.Eip712Failed({})".format(repr(str(self))) + _UniffiTempEthSignerError.Eip712Failed = Eip712Failed # type: ignore + class NoSigningKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.NoSigningKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.NoSigningKey = NoSigningKey # type: ignore + class DefineAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.DefineAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.DefineAddress = DefineAddress # type: ignore + class RecoverAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RecoverAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.RecoverAddress = RecoverAddress # type: ignore + class LengthMismatched(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.LengthMismatched({})".format(repr(str(self))) + _UniffiTempEthSignerError.LengthMismatched = LengthMismatched # type: ignore + class CryptoError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CryptoError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CryptoError = CryptoError # type: ignore + class InvalidSignatureStr(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidSignatureStr({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidSignatureStr = InvalidSignatureStr # type: ignore + class CustomError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CustomError = CustomError # type: ignore + class RpcSignError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempEthSignerError.RpcSignError = RpcSignError # type: ignore + +EthSignerError = _UniffiTempEthSignerError # type: ignore +del _UniffiTempEthSignerError + + +class _UniffiConverterTypeEthSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return EthSignerError.InvalidEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return EthSignerError.MissingEthPrivateKey( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return EthSignerError.MissingEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return EthSignerError.SigningFailed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return EthSignerError.UnlockingFailed( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return EthSignerError.InvalidRawTx( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return EthSignerError.Eip712Failed( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return EthSignerError.NoSigningKey( + _UniffiConverterString.read(buf), + ) + if variant == 9: + return EthSignerError.DefineAddress( + _UniffiConverterString.read(buf), + ) + if variant == 10: + return EthSignerError.RecoverAddress( + _UniffiConverterString.read(buf), + ) + if variant == 11: + return EthSignerError.LengthMismatched( + _UniffiConverterString.read(buf), + ) + if variant == 12: + return EthSignerError.CryptoError( + _UniffiConverterString.read(buf), + ) + if variant == 13: + return EthSignerError.InvalidSignatureStr( + _UniffiConverterString.read(buf), + ) + if variant == 14: + return EthSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 15: + return EthSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, EthSignerError.InvalidEthSigner): + buf.write_i32(1) + if isinstance(value, EthSignerError.MissingEthPrivateKey): + buf.write_i32(2) + if isinstance(value, EthSignerError.MissingEthSigner): + buf.write_i32(3) + if isinstance(value, EthSignerError.SigningFailed): + buf.write_i32(4) + if isinstance(value, EthSignerError.UnlockingFailed): + buf.write_i32(5) + if isinstance(value, EthSignerError.InvalidRawTx): + buf.write_i32(6) + if isinstance(value, EthSignerError.Eip712Failed): + buf.write_i32(7) + if isinstance(value, EthSignerError.NoSigningKey): + buf.write_i32(8) + if isinstance(value, EthSignerError.DefineAddress): + buf.write_i32(9) + if isinstance(value, EthSignerError.RecoverAddress): + buf.write_i32(10) + if isinstance(value, EthSignerError.LengthMismatched): + buf.write_i32(11) + if isinstance(value, EthSignerError.CryptoError): + buf.write_i32(12) + if isinstance(value, EthSignerError.InvalidSignatureStr): + buf.write_i32(13) + if isinstance(value, EthSignerError.CustomError): + buf.write_i32(14) + if isinstance(value, EthSignerError.RpcSignError): + buf.write_i32(15) + + + + + +class L1SignerType: + def __init__(self): + raise RuntimeError("L1SignerType cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ETH: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "L1SignerType.ETH()".format() + + def __eq__(self, other): + if not other.is_eth(): + return False + return True + class STARKNET: + chain_id: str;address: str; + + @typing.no_type_check + def __init__(self,chain_id: str, address: str): + + self.chain_id = chain_id + self.address = address + + + def __str__(self): + return "L1SignerType.STARKNET(chain_id={}, address={})".format(self.chain_id, self.address) + + def __eq__(self, other): + if not other.is_starknet(): + return False + if self.chain_id != other.chain_id: + return False + if self.address != other.address: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_eth(self) -> bool: + return isinstance(self, L1SignerType.ETH) + def is_starknet(self) -> bool: + return isinstance(self, L1SignerType.STARKNET) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +L1SignerType.ETH = type("L1SignerType.ETH", (L1SignerType.ETH, L1SignerType,), {}) # type: ignore +L1SignerType.STARKNET = type("L1SignerType.STARKNET", (L1SignerType.STARKNET, L1SignerType,), {}) # type: ignore + + + + +class _UniffiConverterTypeL1SignerType(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1SignerType.ETH( + ) + if variant == 2: + return L1SignerType.STARKNET( + _UniffiConverterString.read(buf), + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_eth(): + buf.write_i32(1) + if value.is_starknet(): + buf.write_i32(2) + _UniffiConverterString.write(value.chain_id, buf) + _UniffiConverterString.write(value.address, buf) + + + + + + + +class L1Type(enum.Enum): + ETH = 1 + STARKNET = 2 + + + +class _UniffiConverterTypeL1Type(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1Type.ETH + if variant == 2: + return L1Type.STARKNET + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value == L1Type.ETH: + buf.write_i32(1) + if value == L1Type.STARKNET: + buf.write_i32(2) + + + + + + + +class Parameter: + def __init__(self): + raise RuntimeError("Parameter cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class FEE_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.FEE_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_fee_account(): + return False + if self.account_id != other.account_id: + return False + return True + class INSURANCE_FUND_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.INSURANCE_FUND_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_insurance_fund_account(): + return False + if self.account_id != other.account_id: + return False + return True + class MARGIN_INFO: + margin_id: "MarginId";token_id: "TokenId";ratio: "int"; + + @typing.no_type_check + def __init__(self,margin_id: "MarginId", token_id: "TokenId", ratio: "int"): + + self.margin_id = margin_id + self.token_id = token_id + self.ratio = ratio + + + def __str__(self): + return "Parameter.MARGIN_INFO(margin_id={}, token_id={}, ratio={})".format(self.margin_id, self.token_id, self.ratio) + + def __eq__(self, other): + if not other.is_margin_info(): + return False + if self.margin_id != other.margin_id: + return False + if self.token_id != other.token_id: + return False + if self.ratio != other.ratio: + return False + return True + class FUNDING_INFOS: + infos: "typing.List[FundingInfo]"; + + @typing.no_type_check + def __init__(self,infos: "typing.List[FundingInfo]"): + + self.infos = infos + + + def __str__(self): + return "Parameter.FUNDING_INFOS(infos={})".format(self.infos) + + def __eq__(self, other): + if not other.is_funding_infos(): + return False + if self.infos != other.infos: + return False + return True + class CONTRACT_INFO: + pair_id: "PairId";symbol: str;initial_margin_rate: "int";maintenance_margin_rate: "int"; + + @typing.no_type_check + def __init__(self,pair_id: "PairId", symbol: str, initial_margin_rate: "int", maintenance_margin_rate: "int"): + + self.pair_id = pair_id + self.symbol = symbol + self.initial_margin_rate = initial_margin_rate + self.maintenance_margin_rate = maintenance_margin_rate + + + def __str__(self): + return "Parameter.CONTRACT_INFO(pair_id={}, symbol={}, initial_margin_rate={}, maintenance_margin_rate={})".format(self.pair_id, self.symbol, self.initial_margin_rate, self.maintenance_margin_rate) + + def __eq__(self, other): + if not other.is_contract_info(): + return False + if self.pair_id != other.pair_id: + return False + if self.symbol != other.symbol: + return False + if self.initial_margin_rate != other.initial_margin_rate: + return False + if self.maintenance_margin_rate != other.maintenance_margin_rate: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_fee_account(self) -> bool: + return isinstance(self, Parameter.FEE_ACCOUNT) + def is_insurance_fund_account(self) -> bool: + return isinstance(self, Parameter.INSURANCE_FUND_ACCOUNT) + def is_margin_info(self) -> bool: + return isinstance(self, Parameter.MARGIN_INFO) + def is_funding_infos(self) -> bool: + return isinstance(self, Parameter.FUNDING_INFOS) + def is_contract_info(self) -> bool: + return isinstance(self, Parameter.CONTRACT_INFO) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +Parameter.FEE_ACCOUNT = type("Parameter.FEE_ACCOUNT", (Parameter.FEE_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.INSURANCE_FUND_ACCOUNT = type("Parameter.INSURANCE_FUND_ACCOUNT", (Parameter.INSURANCE_FUND_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.MARGIN_INFO = type("Parameter.MARGIN_INFO", (Parameter.MARGIN_INFO, Parameter,), {}) # type: ignore +Parameter.FUNDING_INFOS = type("Parameter.FUNDING_INFOS", (Parameter.FUNDING_INFOS, Parameter,), {}) # type: ignore +Parameter.CONTRACT_INFO = type("Parameter.CONTRACT_INFO", (Parameter.CONTRACT_INFO, Parameter,), {}) # type: ignore + + + + +class _UniffiConverterTypeParameter(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return Parameter.FEE_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 2: + return Parameter.INSURANCE_FUND_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 3: + return Parameter.MARGIN_INFO( + _UniffiConverterTypeMarginId.read(buf), + _UniffiConverterTypeTokenId.read(buf), + _UniffiConverterUInt8.read(buf), + ) + if variant == 4: + return Parameter.FUNDING_INFOS( + _UniffiConverterSequenceTypeFundingInfo.read(buf), + ) + if variant == 5: + return Parameter.CONTRACT_INFO( + _UniffiConverterTypePairId.read(buf), + _UniffiConverterString.read(buf), + _UniffiConverterUInt16.read(buf), + _UniffiConverterUInt16.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_fee_account(): + buf.write_i32(1) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_insurance_fund_account(): + buf.write_i32(2) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_margin_info(): + buf.write_i32(3) + _UniffiConverterTypeMarginId.write(value.margin_id, buf) + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterUInt8.write(value.ratio, buf) + if value.is_funding_infos(): + buf.write_i32(4) + _UniffiConverterSequenceTypeFundingInfo.write(value.infos, buf) + if value.is_contract_info(): + buf.write_i32(5) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterString.write(value.symbol, buf) + _UniffiConverterUInt16.write(value.initial_margin_rate, buf) + _UniffiConverterUInt16.write(value.maintenance_margin_rate, buf) + + + + +# SignError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class SignError(Exception): + pass + +_UniffiTempSignError = SignError + +class SignError: # type: ignore + class EthSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.EthSigningError({})".format(repr(str(self))) + _UniffiTempSignError.EthSigningError = EthSigningError # type: ignore + class ZkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.ZkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.ZkSigningError = ZkSigningError # type: ignore + class StarkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.StarkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.StarkSigningError = StarkSigningError # type: ignore + class IncorrectTx(_UniffiTempSignError): + def __repr__(self): + return "SignError.IncorrectTx({})".format(repr(str(self))) + _UniffiTempSignError.IncorrectTx = IncorrectTx # type: ignore + +SignError = _UniffiTempSignError # type: ignore +del _UniffiTempSignError + + +class _UniffiConverterTypeSignError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return SignError.EthSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return SignError.ZkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return SignError.StarkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return SignError.IncorrectTx( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, SignError.EthSigningError): + buf.write_i32(1) + if isinstance(value, SignError.ZkSigningError): + buf.write_i32(2) + if isinstance(value, SignError.StarkSigningError): + buf.write_i32(3) + if isinstance(value, SignError.IncorrectTx): + buf.write_i32(4) + + +# StarkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class StarkSignerError(Exception): + pass + +_UniffiTempStarkSignerError = StarkSignerError + +class StarkSignerError: # type: ignore + class InvalidStarknetSigner(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidStarknetSigner({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidStarknetSigner = InvalidStarknetSigner # type: ignore + class InvalidSignature(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class SignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.SignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.SignError = SignError # type: ignore + class RpcSignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.RpcSignError = RpcSignError # type: ignore + +StarkSignerError = _UniffiTempStarkSignerError # type: ignore +del _UniffiTempStarkSignerError + + +class _UniffiConverterTypeStarkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return StarkSignerError.InvalidStarknetSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return StarkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return StarkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return StarkSignerError.SignError( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return StarkSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, StarkSignerError.InvalidStarknetSigner): + buf.write_i32(1) + if isinstance(value, StarkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, StarkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, StarkSignerError.SignError): + buf.write_i32(4) + if isinstance(value, StarkSignerError.RpcSignError): + buf.write_i32(5) + + +# TypeError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class TypeError(Exception): + pass + +_UniffiTempTypeError = TypeError + +class TypeError: # type: ignore + class InvalidAddress(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidAddress({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidAddress = InvalidAddress # type: ignore + class InvalidTxHash(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidTxHash({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidTxHash = InvalidTxHash # type: ignore + class NotStartWithZerox(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.NotStartWithZerox({})".format(repr(str(self))) + _UniffiTempTypeError.NotStartWithZerox = NotStartWithZerox # type: ignore + class SizeMismatch(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.SizeMismatch({})".format(repr(str(self))) + _UniffiTempTypeError.SizeMismatch = SizeMismatch # type: ignore + class DecodeFromHexErr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.DecodeFromHexErr({})".format(repr(str(self))) + _UniffiTempTypeError.DecodeFromHexErr = DecodeFromHexErr # type: ignore + class TooBigInteger(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.TooBigInteger({})".format(repr(str(self))) + _UniffiTempTypeError.TooBigInteger = TooBigInteger # type: ignore + class InvalidBigIntStr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidBigIntStr({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidBigIntStr = InvalidBigIntStr # type: ignore + +TypeError = _UniffiTempTypeError # type: ignore +del _UniffiTempTypeError + + +class _UniffiConverterTypeTypeError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypeError.InvalidAddress( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return TypeError.InvalidTxHash( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return TypeError.NotStartWithZerox( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return TypeError.SizeMismatch( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return TypeError.DecodeFromHexErr( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return TypeError.TooBigInteger( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return TypeError.InvalidBigIntStr( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, TypeError.InvalidAddress): + buf.write_i32(1) + if isinstance(value, TypeError.InvalidTxHash): + buf.write_i32(2) + if isinstance(value, TypeError.NotStartWithZerox): + buf.write_i32(3) + if isinstance(value, TypeError.SizeMismatch): + buf.write_i32(4) + if isinstance(value, TypeError.DecodeFromHexErr): + buf.write_i32(5) + if isinstance(value, TypeError.TooBigInteger): + buf.write_i32(6) + if isinstance(value, TypeError.InvalidBigIntStr): + buf.write_i32(7) + + + + + +class TypedDataMessage: + def __init__(self): + raise RuntimeError("TypedDataMessage cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class CREATE_L2_KEY: + message: "Message"; + + @typing.no_type_check + def __init__(self,message: "Message"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.CREATE_L2_KEY(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_create_l2_key(): + return False + if self.message != other.message: + return False + return True + class TRANSACTION: + message: "TxMessage"; + + @typing.no_type_check + def __init__(self,message: "TxMessage"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.TRANSACTION(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_transaction(): + return False + if self.message != other.message: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_create_l2_key(self) -> bool: + return isinstance(self, TypedDataMessage.CREATE_L2_KEY) + def is_transaction(self) -> bool: + return isinstance(self, TypedDataMessage.TRANSACTION) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +TypedDataMessage.CREATE_L2_KEY = type("TypedDataMessage.CREATE_L2_KEY", (TypedDataMessage.CREATE_L2_KEY, TypedDataMessage,), {}) # type: ignore +TypedDataMessage.TRANSACTION = type("TypedDataMessage.TRANSACTION", (TypedDataMessage.TRANSACTION, TypedDataMessage,), {}) # type: ignore + + + + +class _UniffiConverterTypeTypedDataMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypedDataMessage.CREATE_L2_KEY( + _UniffiConverterTypeMessage.read(buf), + ) + if variant == 2: + return TypedDataMessage.TRANSACTION( + _UniffiConverterTypeTxMessage.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_create_l2_key(): + buf.write_i32(1) + _UniffiConverterTypeMessage.write(value.message, buf) + if value.is_transaction(): + buf.write_i32(2) + _UniffiConverterTypeTxMessage.write(value.message, buf) + + + + +# ZkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class ZkSignerError(Exception): + pass + +_UniffiTempZkSignerError = ZkSignerError + +class ZkSignerError: # type: ignore + class CustomError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempZkSignerError.CustomError = CustomError # type: ignore + class InvalidSignature(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class InvalidSeed(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSeed({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSeed = InvalidSeed # type: ignore + class InvalidPubkey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkey = InvalidPubkey # type: ignore + class InvalidPubkeyHash(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkeyHash({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkeyHash = InvalidPubkeyHash # type: ignore + class EthSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.EthSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.EthSignerError = EthSignerError # type: ignore + class StarkSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.StarkSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.StarkSignerError = StarkSignerError # type: ignore + +ZkSignerError = _UniffiTempZkSignerError # type: ignore +del _UniffiTempZkSignerError + + +class _UniffiConverterTypeZkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ZkSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return ZkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return ZkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return ZkSignerError.InvalidSeed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return ZkSignerError.InvalidPubkey( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return ZkSignerError.InvalidPubkeyHash( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return ZkSignerError.EthSignerError( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return ZkSignerError.StarkSignerError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, ZkSignerError.CustomError): + buf.write_i32(1) + if isinstance(value, ZkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, ZkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, ZkSignerError.InvalidSeed): + buf.write_i32(4) + if isinstance(value, ZkSignerError.InvalidPubkey): + buf.write_i32(5) + if isinstance(value, ZkSignerError.InvalidPubkeyHash): + buf.write_i32(6) + if isinstance(value, ZkSignerError.EthSignerError): + buf.write_i32(7) + if isinstance(value, ZkSignerError.StarkSignerError): + buf.write_i32(8) + + + +class _UniffiConverterOptionalString(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterString.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterString.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeZkLinkSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeZkLinkSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeZkLinkSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterSequenceUInt8.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterSequenceUInt8.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeH256(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeH256.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeH256.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypePackedEthSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypePackedEthSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypePackedEthSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeTxLayer1Signature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeTxLayer1Signature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeTxLayer1Signature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterUInt8.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterUInt8.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContract(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContract.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContract.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContractPrice(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContractPrice.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContractPrice.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeFundingInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeFundingInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeFundingInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeSpotPriceInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeSpotPriceInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeAccountId(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeAccountId.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeAccountId.read(buf) for i in range(count) + ] + + +# Type alias +AccountId = int + +class _UniffiConverterTypeAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +Address = str + +class _UniffiConverterTypeAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BigUint = str + +class _UniffiConverterTypeBigUint: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BlockNumber = int + +class _UniffiConverterTypeBlockNumber: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +ChainId = int + +class _UniffiConverterTypeChainId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +EthBlockId = int + +class _UniffiConverterTypeEthBlockId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +H256 = str + +class _UniffiConverterTypeH256: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +MarginId = int + +class _UniffiConverterTypeMarginId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +Nonce = int + +class _UniffiConverterTypeNonce: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +PackedEthSignature = str + +class _UniffiConverterTypePackedEthSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedPublicKey = str + +class _UniffiConverterTypePackedPublicKey: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedSignature = str + +class _UniffiConverterTypePackedSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PairId = int + +class _UniffiConverterTypePairId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt16.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt16.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt16.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt16.lower(value) + + +# Type alias +PriorityOpId = int + +class _UniffiConverterTypePriorityOpId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +PubKeyHash = str + +class _UniffiConverterTypePubKeyHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SlotId = int + +class _UniffiConverterTypeSlotId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +StarkEip712Signature = str + +class _UniffiConverterTypeStarkEip712Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SubAccountId = int + +class _UniffiConverterTypeSubAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +TimeStamp = int + +class _UniffiConverterTypeTimeStamp: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TokenId = int + +class _UniffiConverterTypeTokenId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TxHash = str + +class _UniffiConverterTypeTxHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +TxLayer1Signature = str + +class _UniffiConverterTypeTxLayer1Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkAddress = str + +class _UniffiConverterTypeZkLinkAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkTx = str + +class _UniffiConverterTypeZkLinkTx: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + +def closest_packable_fee_amount(fee: "BigUint") -> "BigUint": + + return _UniffiConverterTypeBigUint.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_fee_amount, + _UniffiConverterTypeBigUint.lower(fee))) + + +def closest_packable_token_amount(amount: "BigUint") -> "BigUint": + + return _UniffiConverterTypeBigUint.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_closest_packable_token_amount, + _UniffiConverterTypeBigUint.lower(amount))) + + +def create_signed_change_pubkey(zklink_signer: "ZkLinkSigner",tx: "ChangePubKey",eth_auth_data: "ChangePubKeyAuthData") -> "ChangePubKey": + + + + return _UniffiConverterTypeChangePubKey.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer), + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeChangePubKeyAuthData.lower(eth_auth_data))) + + +def eth_signature_of_change_pubkey(tx: "ChangePubKey",eth_signer: "EthSigner") -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeEthSigner.lower(eth_signer))) + + +def get_public_key_hash(public_key: "PackedPublicKey") -> "PubKeyHash": + + return _UniffiConverterTypePubKeyHash.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash, + _UniffiConverterTypePackedPublicKey.lower(public_key))) + + +def is_fee_amount_packable(fee: "BigUint") -> bool: + + return _UniffiConverterBool.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_is_fee_amount_packable, + _UniffiConverterTypeBigUint.lower(fee))) + + +def is_token_amount_packable(amount: "BigUint") -> bool: + + return _UniffiConverterBool.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_is_token_amount_packable, + _UniffiConverterTypeBigUint.lower(amount))) + + +def verify_musig(signature: "ZkLinkSignature",msg: "typing.List[int]") -> bool: + + + return _UniffiConverterBool.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig, + _UniffiConverterTypeZkLinkSignature.lower(signature), + _UniffiConverterSequenceUInt8.lower(msg))) + + +def zklink_main_net_url() -> str: + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url,)) + + +def zklink_test_net_url() -> str: + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url,)) + + +__all__ = [ + "InternalError", + "ChangePubKeyAuthData", + "ChangePubKeyAuthRequest", + "EthSignerError", + "L1SignerType", + "L1Type", + "Parameter", + "SignError", + "StarkSignerError", + "TypeError", + "TypedDataMessage", + "ZkSignerError", + "AutoDeleveragingBuilder", + "ChangePubKeyBuilder", + "ContractBuilder", + "ContractMatchingBuilder", + "ContractPrice", + "Create2Data", + "DepositBuilder", + "ForcedExitBuilder", + "FullExitBuilder", + "FundingBuilder", + "FundingInfo", + "LiquidationBuilder", + "Message", + "OraclePrices", + "OrderMatchingBuilder", + "SpotPriceInfo", + "TransferBuilder", + "TxMessage", + "TxSignature", + "UpdateGlobalVarBuilder", + "WithdrawBuilder", + "ZkLinkSignature", + "closest_packable_fee_amount", + "closest_packable_token_amount", + "create_signed_change_pubkey", + "eth_signature_of_change_pubkey", + "get_public_key_hash", + "is_fee_amount_packable", + "is_token_amount_packable", + "verify_musig", + "zklink_main_net_url", + "zklink_test_net_url", + "AutoDeleveraging", + "ChangePubKey", + "Contract", + "ContractMatching", + "Deposit", + "EthSigner", + "ForcedExit", + "FullExit", + "Funding", + "Liquidation", + "Order", + "OrderMatching", + "Signer", + "StarkSigner", + "Transfer", + "TypedData", + "UpdateGlobalVar", + "Withdraw", + "ZkLinkSigner", +] + diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-x86.py b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-x86.py new file mode 100644 index 000000000..479711b13 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk-x86.py @@ -0,0 +1,6092 @@ +# This file was autogenerated by some hot garbage in the `uniffi` crate. +# Trust me, you don't want to mess with it! + +# Tell mypy (a type checker) to ignore all errors from this file. +# See https://mypy.readthedocs.io/en/stable/config_file.html?highlight=ignore-errors#confval-ignore_errors +# mypy: ignore-errors + +# Common helper code. +# +# Ideally this would live in a separate .py file where it can be unittested etc +# in isolation, and perhaps even published as a re-useable package. +# +# However, it's important that the details of how this helper code works (e.g. the +# way that different builtin types are passed across the FFI) exactly match what's +# expected by the rust code on the other side of the interface. In practice right +# now that means coming from the exact some version of `uniffi` that was used to +# compile the rust component. The easiest way to ensure this is to bundle the Python +# helpers directly inline like we're doing here. + +import os +import sys +import ctypes +import enum +import struct +import contextlib +import datetime +import threading + +# Used for default argument values +DEFAULT = object() + + +class RustBuffer(ctypes.Structure): + _fields_ = [ + ("capacity", ctypes.c_int32), + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + @staticmethod + def alloc(size): + return rust_call(_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_alloc, size) + + @staticmethod + def reserve(rbuf, additional): + return rust_call(_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_reserve, rbuf, additional) + + def free(self): + return rust_call(_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_free, self) + + def __str__(self): + return "RustBuffer(capacity={}, len={}, data={})".format( + self.capacity, + self.len, + self.data[0:self.len] + ) + + @contextlib.contextmanager + def allocWithBuilder(): + """Context-manger to allocate a buffer using a RustBufferBuilder. + + The allocated buffer will be automatically freed if an error occurs, ensuring that + we don't accidentally leak it. + """ + builder = RustBufferBuilder() + try: + yield builder + except: + builder.discard() + raise + + @contextlib.contextmanager + def consumeWithStream(self): + """Context-manager to consume a buffer using a RustBufferStream. + + The RustBuffer will be freed once the context-manager exits, ensuring that we don't + leak it even if an error occurs. + """ + try: + s = RustBufferStream(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer after consuming") + finally: + self.free() + + +class ForeignBytes(ctypes.Structure): + _fields_ = [ + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + def __str__(self): + return "ForeignBytes(len={}, data={})".format(self.len, self.data[0:self.len]) + + +class RustBufferStream(object): + """ + Helper for structured reading of bytes from a RustBuffer + """ + + def __init__(self, rbuf): + self.rbuf = rbuf + self.offset = 0 + + def remaining(self): + return self.rbuf.len - self.offset + + def _unpack_from(self, size, format): + if self.offset + size > self.rbuf.len: + raise InternalError("read past end of rust buffer") + value = struct.unpack(format, self.rbuf.data[self.offset:self.offset+size])[0] + self.offset += size + return value + + def read(self, size): + if self.offset + size > self.rbuf.len: + raise InternalError("read past end of rust buffer") + data = self.rbuf.data[self.offset:self.offset+size] + self.offset += size + return data + + def readI8(self): + return self._unpack_from(1, ">b") + + def readU8(self): + return self._unpack_from(1, ">B") + + def readI16(self): + return self._unpack_from(2, ">h") + + def readU16(self): + return self._unpack_from(2, ">H") + + def readI32(self): + return self._unpack_from(4, ">i") + + def readU32(self): + return self._unpack_from(4, ">I") + + def readI64(self): + return self._unpack_from(8, ">q") + + def readU64(self): + return self._unpack_from(8, ">Q") + + def readFloat(self): + v = self._unpack_from(4, ">f") + return v + + def readDouble(self): + return self._unpack_from(8, ">d") + + +class RustBufferBuilder(object): + """ + Helper for structured writing of bytes into a RustBuffer. + """ + + def __init__(self): + self.rbuf = RustBuffer.alloc(16) + self.rbuf.len = 0 + + def finalize(self): + rbuf = self.rbuf + self.rbuf = None + return rbuf + + def discard(self): + if self.rbuf is not None: + rbuf = self.finalize() + rbuf.free() + + @contextlib.contextmanager + def _reserve(self, numBytes): + if self.rbuf.len + numBytes > self.rbuf.capacity: + self.rbuf = RustBuffer.reserve(self.rbuf, numBytes) + yield None + self.rbuf.len += numBytes + + def _pack_into(self, size, format, value): + with self._reserve(size): + # XXX TODO: I feel like I should be able to use `struct.pack_into` here but can't figure it out. + for i, byte in enumerate(struct.pack(format, value)): + self.rbuf.data[self.rbuf.len + i] = byte + + def write(self, value): + with self._reserve(len(value)): + for i, byte in enumerate(value): + self.rbuf.data[self.rbuf.len + i] = byte + + def writeI8(self, v): + self._pack_into(1, ">b", v) + + def writeU8(self, v): + self._pack_into(1, ">B", v) + + def writeI16(self, v): + self._pack_into(2, ">h", v) + + def writeU16(self, v): + self._pack_into(2, ">H", v) + + def writeI32(self, v): + self._pack_into(4, ">i", v) + + def writeU32(self, v): + self._pack_into(4, ">I", v) + + def writeI64(self, v): + self._pack_into(8, ">q", v) + + def writeU64(self, v): + self._pack_into(8, ">Q", v) + + def writeFloat(self, v): + self._pack_into(4, ">f", v) + + def writeDouble(self, v): + self._pack_into(8, ">d", v) +# A handful of classes and functions to support the generated data structures. +# This would be a good candidate for isolating in its own ffi-support lib. + +class InternalError(Exception): + pass + +class RustCallStatus(ctypes.Structure): + """ + Error runtime. + """ + _fields_ = [ + ("code", ctypes.c_int8), + ("error_buf", RustBuffer), + ] + + # These match the values from the uniffi::rustcalls module + CALL_SUCCESS = 0 + CALL_ERROR = 1 + CALL_PANIC = 2 + + def __str__(self): + if self.code == RustCallStatus.CALL_SUCCESS: + return "RustCallStatus(CALL_SUCCESS)" + elif self.code == RustCallStatus.CALL_ERROR: + return "RustCallStatus(CALL_ERROR)" + elif self.code == RustCallStatus.CALL_PANIC: + return "RustCallStatus(CALL_PANIC)" + else: + return "RustCallStatus()" + +def rust_call(fn, *args): + # Call a rust function + return rust_call_with_error(None, fn, *args) + +def rust_call_with_error(error_ffi_converter, fn, *args): + # Call a rust function and handle any errors + # + # This function is used for rust calls that return Result<> and therefore can set the CALL_ERROR status code. + # error_ffi_converter must be set to the FfiConverter for the error class that corresponds to the result. + call_status = RustCallStatus(code=RustCallStatus.CALL_SUCCESS, error_buf=RustBuffer(0, 0, None)) + + args_with_error = args + (ctypes.byref(call_status),) + result = fn(*args_with_error) + if call_status.code == RustCallStatus.CALL_SUCCESS: + return result + elif call_status.code == RustCallStatus.CALL_ERROR: + if error_ffi_converter is None: + call_status.error_buf.free() + raise InternalError("rust_call_with_error: CALL_ERROR, but error_ffi_converter is None") + else: + raise error_ffi_converter.lift(call_status.error_buf) + elif call_status.code == RustCallStatus.CALL_PANIC: + # When the rust code sees a panic, it tries to construct a RustBuffer + # with the message. But if that code panics, then it just sends back + # an empty buffer. + if call_status.error_buf.len > 0: + msg = FfiConverterString.lift(call_status.error_buf) + else: + msg = "Unknown rust panic" + raise InternalError(msg) + else: + raise InternalError("Invalid RustCallStatus code: {}".format( + call_status.code)) + +# A function pointer for a callback as defined by UniFFI. +# Rust definition `fn(handle: u64, method: u32, args: RustBuffer, buf_ptr: *mut RustBuffer) -> int` +FOREIGN_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_ulonglong, ctypes.c_ulong, RustBuffer, ctypes.POINTER(RustBuffer)) +# Types conforming to `FfiConverterPrimitive` pass themselves directly over the FFI. +class FfiConverterPrimitive: + @classmethod + def lift(cls, value): + return value + + @classmethod + def lower(cls, value): + return value + +# Helper class for wrapper types that will always go through a RustBuffer. +# Classes should inherit from this and implement the `read` and `write` static methods. +class FfiConverterRustBuffer: + @classmethod + def lift(cls, rbuf): + with rbuf.consumeWithStream() as stream: + return cls.read(stream) + + @classmethod + def lower(cls, value): + with RustBuffer.allocWithBuilder() as builder: + cls.write(value, builder) + return builder.finalize() + +# Contains loading, initialization code, +# and the FFI Function declarations in a com.sun.jna.Library. +# This is how we find and load the dynamic library provided by the component. +# For now we just look it up by name. +# +# XXX TODO: This will probably grow some magic for resolving megazording in future. +# E.g. we might start by looking for the named component in `libuniffi.so` and if +# that fails, fall back to loading it separately from `lib${componentName}.so`. + +from pathlib import Path + +def loadIndirect(): + if sys.platform == "darwin": + libname = "lib{}.dylib" + elif sys.platform.startswith("win"): + # As of python3.8, ctypes does not seem to search $PATH when loading DLLs. + # We could use `os.add_dll_directory` to configure the search path, but + # it doesn't feel right to mess with application-wide settings. Let's + # assume that the `.dll` is next to the `.py` file and load by full path. + libname = os.path.join( + os.path.dirname(__file__), + "{}.dll", + ) + else: + # Anything else must be an ELF platform - Linux, *BSD, Solaris/illumos + libname = "lib{}.so" + + lib = libname.format("zklink_sdk") + path = str(Path(__file__).parent / lib) + return ctypes.cdll.LoadLibrary(path) + +# A ctypes library to expose the extern-C FFI definitions. +# This is an implementation detail which will be called internally by the public API. + +_UniFFILib = loadIndirect() +_UniFFILib.ffi_zklink_sdk_f180_Deposit_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Deposit_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Deposit_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Deposit_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Deposit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Deposit_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Deposit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Deposit_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Deposit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Deposit_json_str.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_Withdraw_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Withdraw_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Withdraw_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Withdraw_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Withdraw_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Withdraw_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_get_eth_sign_msg.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_eth_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Withdraw_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Withdraw_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Withdraw_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_ChangePubKey_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_ChangePubKey_object_free.restype = None +_UniFFILib.zklink_sdk_f180_ChangePubKey_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ChangePubKey_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ChangePubKey_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ChangePubKey_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ChangePubKey_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_onchain.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_onchain.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ChangePubKey_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ChangePubKey_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_ForcedExit_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_ForcedExit_object_free.restype = None +_UniFFILib.zklink_sdk_f180_ForcedExit_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ForcedExit_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ForcedExit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ForcedExit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ForcedExit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ForcedExit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ForcedExit_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ForcedExit_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ForcedExit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ForcedExit_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_FullExit_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_FullExit_object_free.restype = None +_UniFFILib.zklink_sdk_f180_FullExit_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_FullExit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_FullExit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_FullExit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_FullExit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_FullExit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_FullExit_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_Transfer_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Transfer_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Transfer_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Transfer_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Transfer_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Transfer_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_get_eth_sign_msg.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_eth_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Transfer_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Transfer_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Transfer_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_Order_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Order_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Order_new.argtypes = ( + ctypes.c_uint32, + ctypes.c_uint8, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + RustBuffer, + RustBuffer, + ctypes.c_int8, + ctypes.c_int8, + ctypes.c_uint8, + ctypes.c_uint8, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Order_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Order_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Order_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Order_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Order_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Order_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + RustBuffer, + RustBuffer, + ctypes.c_uint8, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_get_eth_sign_msg.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Order_create_signed_order.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Order_create_signed_order.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_OrderMatching_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_OrderMatching_object_free.restype = None +_UniFFILib.zklink_sdk_f180_OrderMatching_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_OrderMatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_OrderMatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_OrderMatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_OrderMatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_OrderMatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_OrderMatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_OrderMatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_OrderMatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_OrderMatching_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_Contract_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Contract_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Contract_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Contract_is_long.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_is_long.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Contract_is_short.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_is_short.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Contract_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Contract_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Contract_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Contract_create_signed_contract.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Contract_create_signed_contract.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_AutoDeleveraging_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_AutoDeleveraging_object_free.restype = None +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_to_zklink_tx.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_AutoDeleveraging_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_ContractMatching_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_ContractMatching_object_free.restype = None +_UniFFILib.zklink_sdk_f180_ContractMatching_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ContractMatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ContractMatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ContractMatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ContractMatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ContractMatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ContractMatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_ContractMatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_to_zklink_tx.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ContractMatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ContractMatching_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_Funding_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Funding_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Funding_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Funding_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Funding_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Funding_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Funding_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Funding_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Funding_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Funding_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_to_zklink_tx.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Funding_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Funding_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_Liquidation_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Liquidation_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Liquidation_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Liquidation_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Liquidation_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Liquidation_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Liquidation_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Liquidation_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_get_signature.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Liquidation_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_is_signature_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_Liquidation_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_to_zklink_tx.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Liquidation_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Liquidation_create_signed_tx.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_UpdateGlobalVar_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_UpdateGlobalVar_object_free.restype = None +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_get_bytes.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_tx_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_json_str.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_is_valid.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_to_zklink_tx.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_EthSigner_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_EthSigner_object_free.restype = None +_UniFFILib.zklink_sdk_f180_EthSigner_new.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_EthSigner_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_EthSigner_sign_message.argtypes = ( + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_EthSigner_sign_message.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_EthSigner_get_address.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_EthSigner_get_address.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_TypedData_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_TypedData_object_free.restype = None +_UniFFILib.zklink_sdk_f180_TypedData_new.argtypes = ( + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_TypedData_new.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_StarkSigner_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_StarkSigner_object_free.restype = None +_UniFFILib.zklink_sdk_f180_StarkSigner_new.argtypes = ( + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_StarkSigner_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_StarkSigner_new_from_hex_str.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_StarkSigner_new_from_hex_str.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_StarkSigner_sign_message.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_StarkSigner_sign_message.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_ZkLinkSigner_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_ZkLinkSigner_object_free.restype = None +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new.argtypes = ( + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_seed.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_seed.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_eth_signer.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_eth_signer.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_stark_signer.argtypes = ( + RustBuffer, + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_stark_signer.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_bytes.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_bytes.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_public_key.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_public_key.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_sign_musig.argtypes = ( + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_ZkLinkSigner_sign_musig.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_Signer_object_free.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_Signer_object_free.restype = None +_UniFFILib.zklink_sdk_f180_Signer_new.argtypes = ( + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_new.restype = ctypes.c_void_p +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_create2data_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_create2data_auth.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_onchain_auth_data.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_transfer.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_withdraw.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_forced_exit.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_forced_exit.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_order_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_order_matching.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_contract_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_contract_matching.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_funding.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_funding.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_liquidation.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_Signer_sign_auto_deleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_Signer_sign_auto_deleveraging.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_verify_musig.argtypes = ( + RustBuffer, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_verify_musig.restype = ctypes.c_int8 +_UniFFILib.zklink_sdk_f180_get_public_key_hash.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_get_public_key_hash.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_zklink_main_net_url.argtypes = ( + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_zklink_main_net_url.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_zklink_test_net_url.argtypes = ( + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_zklink_test_net_url.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_eth_signature_of_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_eth_signature_of_change_pubkey.restype = RustBuffer +_UniFFILib.zklink_sdk_f180_create_signed_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.zklink_sdk_f180_create_signed_change_pubkey.restype = ctypes.c_void_p +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_alloc.argtypes = ( + ctypes.c_int32, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_alloc.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_from_bytes.argtypes = ( + ForeignBytes, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_from_bytes.restype = RustBuffer +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_free.argtypes = ( + RustBuffer, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_free.restype = None +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_reserve.argtypes = ( + RustBuffer, + ctypes.c_int32, + ctypes.POINTER(RustCallStatus), +) +_UniFFILib.ffi_zklink_sdk_f180_rustbuffer_reserve.restype = RustBuffer + +# Public interface members begin here. + + +class FfiConverterUInt8(FfiConverterPrimitive): + @staticmethod + def read(buf): + return buf.readU8() + + @staticmethod + def write(value, buf): + buf.writeU8(value) + +class FfiConverterUInt16(FfiConverterPrimitive): + @staticmethod + def read(buf): + return buf.readU16() + + @staticmethod + def write(value, buf): + buf.writeU16(value) + +class FfiConverterInt16(FfiConverterPrimitive): + @staticmethod + def read(buf): + return buf.readI16() + + @staticmethod + def write(value, buf): + buf.writeI16(value) + +class FfiConverterUInt32(FfiConverterPrimitive): + @staticmethod + def read(buf): + return buf.readU32() + + @staticmethod + def write(value, buf): + buf.writeU32(value) + +class FfiConverterUInt64(FfiConverterPrimitive): + @staticmethod + def read(buf): + return buf.readU64() + + @staticmethod + def write(value, buf): + buf.writeU64(value) + +class FfiConverterBool: + @classmethod + def read(cls, buf): + return cls.lift(buf.readU8()) + + @classmethod + def write(cls, value, buf): + buf.writeU8(cls.lower(value)) + + @staticmethod + def lift(value): + return int(value) != 0 + + @staticmethod + def lower(value): + return 1 if value else 0 + +class FfiConverterString: + @staticmethod + def read(buf): + size = buf.readI32() + if size < 0: + raise InternalError("Unexpected negative string length") + utf8Bytes = buf.read(size) + return utf8Bytes.decode("utf-8") + + @staticmethod + def write(value, buf): + utf8Bytes = value.encode("utf-8") + buf.writeI32(len(utf8Bytes)) + buf.write(utf8Bytes) + + @staticmethod + def lift(buf): + with buf.consumeWithStream() as stream: + return stream.read(stream.remaining()).decode("utf-8") + + @staticmethod + def lower(value): + with RustBuffer.allocWithBuilder() as builder: + builder.write(value.encode("utf-8")) + return builder.finalize() + + + +class AutoDeleveraging(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_new, + FfiConverterTypeAutoDeleveragingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_AutoDeleveraging_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_valid,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_is_signature_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_AutoDeleveraging_to_zklink_tx,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeAutoDeleveraging.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_AutoDeleveraging_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + + + +class FfiConverterTypeAutoDeleveraging: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, AutoDeleveraging): + raise TypeError("Expected AutoDeleveraging instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return AutoDeleveraging._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ChangePubKey(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_new, + FfiConverterTypeChangePubKeyBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_ChangePubKey_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_get_signature,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_is_valid,self._pointer,) + ) + def is_onchain(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_is_onchain,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_is_signature_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ChangePubKey_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeChangePubKey: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ChangePubKey): + raise TypeError("Expected ChangePubKey instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return ChangePubKey._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Contract(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Contract_new, + FfiConverterTypeContractBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Contract_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def is_long(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Contract_is_long,self._pointer,) + ) + def is_short(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Contract_is_short,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Contract_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Contract_is_signature_valid,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Contract_get_bytes,self._pointer,) + ) + def create_signed_contract(self, zklink_signer): + zklink_signer = zklink_signer + + return FfiConverterTypeContract.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Contract_create_signed_contract,self._pointer, + FfiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + +class FfiConverterTypeContract: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Contract): + raise TypeError("Expected Contract instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Contract._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ContractMatching(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_new, + FfiConverterTypeContractMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_ContractMatching_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_is_valid,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_is_signature_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ContractMatching_to_zklink_tx,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeContractMatching.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ContractMatching_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + + + +class FfiConverterTypeContractMatching: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ContractMatching): + raise TypeError("Expected ContractMatching instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return ContractMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Deposit(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Deposit_new, + FfiConverterTypeDepositBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Deposit_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Deposit_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Deposit_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Deposit_json_str,self._pointer,) + ) + + + +class FfiConverterTypeDeposit: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Deposit): + raise TypeError("Expected Deposit instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Deposit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class EthSigner(object): + def __init__(self, private_key): + private_key = private_key + + self._pointer = rust_call_with_error(FfiConverterTypeEthSignerError,_UniFFILib.zklink_sdk_f180_EthSigner_new, + FfiConverterString.lower(private_key)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_EthSigner_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def sign_message(self, message): + message = list(int(x) for x in message) + + return FfiConverterTypePackedEthSignature.lift( + rust_call_with_error( + FfiConverterTypeEthSignerError,_UniFFILib.zklink_sdk_f180_EthSigner_sign_message,self._pointer, + FfiConverterSequenceUInt8.lower(message)) + ) + def get_address(self, ): + return FfiConverterTypeAddress.lift( + rust_call(_UniFFILib.zklink_sdk_f180_EthSigner_get_address,self._pointer,) + ) + + + +class FfiConverterTypeEthSigner: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, EthSigner): + raise TypeError("Expected EthSigner instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return EthSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ForcedExit(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_new, + FfiConverterTypeForcedExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_ForcedExit_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_get_signature,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_is_valid,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_is_signature_valid,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeForcedExit.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ForcedExit_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ForcedExit_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeForcedExit: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ForcedExit): + raise TypeError("Expected ForcedExit instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return ForcedExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class FullExit(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_FullExit_new, + FfiConverterTypeFullExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_FullExit_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_FullExit_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_FullExit_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_FullExit_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_FullExit_is_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_FullExit_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeFullExit: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, FullExit): + raise TypeError("Expected FullExit instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return FullExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Funding(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Funding_new, + FfiConverterTypeFundingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Funding_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_is_valid,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_is_signature_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Funding_to_zklink_tx,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeFunding.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Funding_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + + + +class FfiConverterTypeFunding: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Funding): + raise TypeError("Expected Funding instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Funding._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Liquidation(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_new, + FfiConverterTypeLiquidationBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Liquidation_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_is_valid,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_is_signature_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Liquidation_to_zklink_tx,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeLiquidation.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Liquidation_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + + + +class FfiConverterTypeLiquidation: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Liquidation): + raise TypeError("Expected Liquidation instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Liquidation._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Order(object): + def __init__(self, account_id,sub_account_id,slot_id,nonce,base_token_id,quote_token_id,amount,price,is_sell,has_subsidy,maker_fee_rate,taker_fee_rate,signature): + account_id = account_id + + sub_account_id = sub_account_id + + slot_id = slot_id + + nonce = nonce + + base_token_id = base_token_id + + quote_token_id = quote_token_id + + amount = amount + + price = price + + is_sell = bool(is_sell) + + has_subsidy = bool(has_subsidy) + + maker_fee_rate = int(maker_fee_rate) + + taker_fee_rate = int(taker_fee_rate) + + signature = (None if signature is None else signature) + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Order_new, + FfiConverterTypeAccountId.lower(account_id), + FfiConverterTypeSubAccountId.lower(sub_account_id), + FfiConverterTypeSlotId.lower(slot_id), + FfiConverterTypeNonce.lower(nonce), + FfiConverterTypeTokenId.lower(base_token_id), + FfiConverterTypeTokenId.lower(quote_token_id), + FfiConverterTypeBigUint.lower(amount), + FfiConverterTypeBigUint.lower(price), + FfiConverterBool.lower(is_sell), + FfiConverterBool.lower(has_subsidy), + FfiConverterUInt8.lower(maker_fee_rate), + FfiConverterUInt8.lower(taker_fee_rate), + FfiConverterOptionalTypeZkLinkSignature.lower(signature)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Order_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_get_signature,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_get_bytes,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_is_valid,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_is_signature_valid,self._pointer,) + ) + def get_eth_sign_msg(self, quote_token,based_token,decimals): + quote_token = quote_token + + based_token = based_token + + decimals = int(decimals) + + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Order_get_eth_sign_msg,self._pointer, + FfiConverterString.lower(quote_token), + FfiConverterString.lower(based_token), + FfiConverterUInt8.lower(decimals)) + ) + def create_signed_order(self, zklink_signer): + zklink_signer = zklink_signer + + return FfiConverterTypeOrder.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Order_create_signed_order,self._pointer, + FfiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + +class FfiConverterTypeOrder: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Order): + raise TypeError("Expected Order instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Order._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class OrderMatching(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_new, + FfiConverterTypeOrderMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_OrderMatching_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_is_valid,self._pointer,) + ) + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_get_signature,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_is_signature_valid,self._pointer,) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeOrderMatching.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_OrderMatching_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_OrderMatching_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeOrderMatching: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, OrderMatching): + raise TypeError("Expected OrderMatching instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return OrderMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Signer(object): + def __init__(self, private_key,l1_type): + private_key = private_key + + l1_type = l1_type + + self._pointer = rust_call_with_error(FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_new, + FfiConverterString.lower(private_key), + FfiConverterTypeL1SignerType.lower(l1_type)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Signer_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def sign_change_pubkey_with_create2data_auth(self, tx,crate2data): + tx = tx + + crate2data = crate2data + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_create2data_auth,self._pointer, + FfiConverterTypeChangePubKey.lower(tx), + FfiConverterTypeCreate2Data.lower(crate2data)) + ) + def sign_change_pubkey_with_onchain_auth_data(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_onchain_auth_data,self._pointer, + FfiConverterTypeChangePubKey.lower(tx)) + ) + def sign_change_pubkey_with_eth_ecdsa_auth(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_change_pubkey_with_eth_ecdsa_auth,self._pointer, + FfiConverterTypeChangePubKey.lower(tx)) + ) + def sign_transfer(self, tx,token_sybmol,chain_id,addr): + tx = tx + + token_sybmol = token_sybmol + + chain_id = (None if chain_id is None else chain_id) + + addr = (None if addr is None else addr) + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_transfer,self._pointer, + FfiConverterTypeTransfer.lower(tx), + FfiConverterString.lower(token_sybmol), + FfiConverterOptionalString.lower(chain_id), + FfiConverterOptionalString.lower(addr)) + ) + def sign_withdraw(self, tx,l2_source_token_symbol,chain_id,addr): + tx = tx + + l2_source_token_symbol = l2_source_token_symbol + + chain_id = (None if chain_id is None else chain_id) + + addr = (None if addr is None else addr) + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_withdraw,self._pointer, + FfiConverterTypeWithdraw.lower(tx), + FfiConverterString.lower(l2_source_token_symbol), + FfiConverterOptionalString.lower(chain_id), + FfiConverterOptionalString.lower(addr)) + ) + def sign_forced_exit(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_forced_exit,self._pointer, + FfiConverterTypeForcedExit.lower(tx)) + ) + def sign_order_matching(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_order_matching,self._pointer, + FfiConverterTypeOrderMatching.lower(tx)) + ) + def sign_contract_matching(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_contract_matching,self._pointer, + FfiConverterTypeContractMatching.lower(tx)) + ) + def sign_funding(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_funding,self._pointer, + FfiConverterTypeFunding.lower(tx)) + ) + def sign_liquidation(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_liquidation,self._pointer, + FfiConverterTypeLiquidation.lower(tx)) + ) + def sign_auto_deleveraging(self, tx): + tx = tx + + return FfiConverterTypeTxSignature.lift( + rust_call_with_error( + FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_Signer_sign_auto_deleveraging,self._pointer, + FfiConverterTypeAutoDeleveraging.lower(tx)) + ) + + + +class FfiConverterTypeSigner: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Signer): + raise TypeError("Expected Signer instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Signer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class StarkSigner(object): + def __init__(self, ): + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_StarkSigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_StarkSigner_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_hex_str(cls, hex_str): + hex_str = hex_str + + # Call the (fallible) function before creating any half-baked object instances. + pointer = rust_call_with_error(FfiConverterTypeStarkSignerError,_UniFFILib.zklink_sdk_f180_StarkSigner_new_from_hex_str, + FfiConverterString.lower(hex_str)) + return cls._make_instance_(pointer) + + + def sign_message(self, typed_data,addr): + typed_data = typed_data + + addr = addr + + return FfiConverterTypeStarkEip712Signature.lift( + rust_call_with_error( + FfiConverterTypeStarkSignerError,_UniFFILib.zklink_sdk_f180_StarkSigner_sign_message,self._pointer, + FfiConverterTypeTypedData.lower(typed_data), + FfiConverterString.lower(addr)) + ) + + + +class FfiConverterTypeStarkSigner: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, StarkSigner): + raise TypeError("Expected StarkSigner instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return StarkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Transfer(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Transfer_new, + FfiConverterTypeTransferBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Transfer_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_get_signature,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_is_valid,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_is_signature_valid,self._pointer,) + ) + def get_eth_sign_msg(self, token_symbol): + token_symbol = token_symbol + + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_get_eth_sign_msg,self._pointer, + FfiConverterString.lower(token_symbol)) + ) + def eth_signature(self, eth_signer,token_symbol): + eth_signer = eth_signer + + token_symbol = token_symbol + + return FfiConverterTypeTxLayer1Signature.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Transfer_eth_signature,self._pointer, + FfiConverterTypeEthSigner.lower(eth_signer), + FfiConverterString.lower(token_symbol)) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeTransfer.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Transfer_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Transfer_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeTransfer: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Transfer): + raise TypeError("Expected Transfer instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Transfer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class TypedData(object): + def __init__(self, message,chain_id): + message = message + + chain_id = chain_id + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_TypedData_new, + FfiConverterTypeTypedDataMessage.lower(message), + FfiConverterString.lower(chain_id)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_TypedData_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + + + +class FfiConverterTypeTypedData: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, TypedData): + raise TypeError("Expected TypedData instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return TypedData._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class UpdateGlobalVar(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_new, + FfiConverterTypeUpdateGlobalVarBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_UpdateGlobalVar_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_is_valid,self._pointer,) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_UpdateGlobalVar_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeUpdateGlobalVar: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, UpdateGlobalVar): + raise TypeError("Expected UpdateGlobalVar instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return UpdateGlobalVar._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Withdraw(object): + def __init__(self, builder): + builder = builder + + self._pointer = rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_new, + FfiConverterTypeWithdrawBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_Withdraw_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + + def get_signature(self, ): + return FfiConverterTypeZkLinkSignature.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_get_signature,self._pointer,) + ) + def get_bytes(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_get_bytes,self._pointer,) + ) + def tx_hash(self, ): + return FfiConverterSequenceUInt8.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_tx_hash,self._pointer,) + ) + def json_str(self, ): + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_json_str,self._pointer,) + ) + def is_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_is_valid,self._pointer,) + ) + def is_signature_valid(self, ): + return FfiConverterBool.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_is_signature_valid,self._pointer,) + ) + def get_eth_sign_msg(self, token_symbol): + token_symbol = token_symbol + + return FfiConverterString.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_get_eth_sign_msg,self._pointer, + FfiConverterString.lower(token_symbol)) + ) + def eth_signature(self, eth_signer,l2_source_token_symbol): + eth_signer = eth_signer + + l2_source_token_symbol = l2_source_token_symbol + + return FfiConverterTypePackedEthSignature.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Withdraw_eth_signature,self._pointer, + FfiConverterTypeEthSigner.lower(eth_signer), + FfiConverterString.lower(l2_source_token_symbol)) + ) + def create_signed_tx(self, signer): + signer = signer + + return FfiConverterTypeWithdraw.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_Withdraw_create_signed_tx,self._pointer, + FfiConverterTypeZkLinkSigner.lower(signer)) + ) + def to_zklink_tx(self, ): + return FfiConverterTypeZkLinkTx.lift( + rust_call(_UniFFILib.zklink_sdk_f180_Withdraw_to_zklink_tx,self._pointer,) + ) + + + +class FfiConverterTypeWithdraw: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Withdraw): + raise TypeError("Expected Withdraw instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return Withdraw._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ZkLinkSigner(object): + def __init__(self, ): + self._pointer = rust_call_with_error(FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + rust_call(_UniFFILib.ffi_zklink_sdk_f180_ZkLinkSigner_object_free, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_seed(cls, seed): + seed = list(int(x) for x in seed) + + # Call the (fallible) function before creating any half-baked object instances. + pointer = rust_call_with_error(FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_seed, + FfiConverterSequenceUInt8.lower(seed)) + return cls._make_instance_(pointer) + @classmethod + def new_from_hex_eth_signer(cls, eth_hex_private_key): + eth_hex_private_key = eth_hex_private_key + + # Call the (fallible) function before creating any half-baked object instances. + pointer = rust_call_with_error(FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_eth_signer, + FfiConverterString.lower(eth_hex_private_key)) + return cls._make_instance_(pointer) + @classmethod + def new_from_hex_stark_signer(cls, hex_private_key,addr,chain_id): + hex_private_key = hex_private_key + + addr = addr + + chain_id = chain_id + + # Call the (fallible) function before creating any half-baked object instances. + pointer = rust_call_with_error(FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_hex_stark_signer, + FfiConverterString.lower(hex_private_key), + FfiConverterString.lower(addr), + FfiConverterString.lower(chain_id)) + return cls._make_instance_(pointer) + @classmethod + def new_from_bytes(cls, slice): + slice = list(int(x) for x in slice) + + # Call the (fallible) function before creating any half-baked object instances. + pointer = rust_call_with_error(FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_new_from_bytes, + FfiConverterSequenceUInt8.lower(slice)) + return cls._make_instance_(pointer) + + + def public_key(self, ): + return FfiConverterTypePackedPublicKey.lift( + rust_call(_UniFFILib.zklink_sdk_f180_ZkLinkSigner_public_key,self._pointer,) + ) + def sign_musig(self, msg): + msg = list(int(x) for x in msg) + + return FfiConverterTypeZkLinkSignature.lift( + rust_call_with_error( + FfiConverterTypeZkSignerError,_UniFFILib.zklink_sdk_f180_ZkLinkSigner_sign_musig,self._pointer, + FfiConverterSequenceUInt8.lower(msg)) + ) + + + +class FfiConverterTypeZkLinkSigner: + @classmethod + def read(cls, buf): + ptr = buf.readU64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ZkLinkSigner): + raise TypeError("Expected ZkLinkSigner instance, {} found".format(value.__class__.__name__)) + buf.writeU64(cls.lower(value)) + + @staticmethod + def lift(value): + return ZkLinkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + +class AutoDeleveragingBuilder: + + def __init__(self, account_id, sub_account_id, sub_account_nonce, contract_prices, margin_prices, adl_account_id, pair_id, adl_size, adl_price, fee, fee_token): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.adl_account_id = adl_account_id + self.pair_id = pair_id + self.adl_size = adl_size + self.adl_price = adl_price + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "AutoDeleveragingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, adl_account_id={}, pair_id={}, adl_size={}, adl_price={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.adl_account_id, self.pair_id, self.adl_size, self.adl_price, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.adl_account_id != other.adl_account_id: + return False + if self.pair_id != other.pair_id: + return False + if self.adl_size != other.adl_size: + return False + if self.adl_price != other.adl_price: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class FfiConverterTypeAutoDeleveragingBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return AutoDeleveragingBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + sub_account_nonce=FfiConverterTypeNonce.read(buf), + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + adl_account_id=FfiConverterTypeAccountId.read(buf), + pair_id=FfiConverterTypePairId.read(buf), + adl_size=FfiConverterTypeBigUint.read(buf), + adl_price=FfiConverterTypeBigUint.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeNonce.write(value.sub_account_nonce, buf) + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + FfiConverterTypeAccountId.write(value.adl_account_id, buf) + FfiConverterTypePairId.write(value.pair_id, buf) + FfiConverterTypeBigUint.write(value.adl_size, buf) + FfiConverterTypeBigUint.write(value.adl_price, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + + +class ChangePubKeyBuilder: + + def __init__(self, chain_id, account_id, sub_account_id, new_pubkey_hash, fee_token, fee, nonce, eth_signature, timestamp): + self.chain_id = chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.new_pubkey_hash = new_pubkey_hash + self.fee_token = fee_token + self.fee = fee + self.nonce = nonce + self.eth_signature = eth_signature + self.timestamp = timestamp + + def __str__(self): + return "ChangePubKeyBuilder(chain_id={}, account_id={}, sub_account_id={}, new_pubkey_hash={}, fee_token={}, fee={}, nonce={}, eth_signature={}, timestamp={})".format(self.chain_id, self.account_id, self.sub_account_id, self.new_pubkey_hash, self.fee_token, self.fee, self.nonce, self.eth_signature, self.timestamp) + + def __eq__(self, other): + if self.chain_id != other.chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.new_pubkey_hash != other.new_pubkey_hash: + return False + if self.fee_token != other.fee_token: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.eth_signature != other.eth_signature: + return False + if self.timestamp != other.timestamp: + return False + return True + +class FfiConverterTypeChangePubKeyBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ChangePubKeyBuilder( + chain_id=FfiConverterTypeChainId.read(buf), + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + new_pubkey_hash=FfiConverterTypePubKeyHash.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + nonce=FfiConverterTypeNonce.read(buf), + eth_signature=FfiConverterOptionalTypePackedEthSignature.read(buf), + timestamp=FfiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeChainId.write(value.chain_id, buf) + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypePubKeyHash.write(value.new_pubkey_hash, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeNonce.write(value.nonce, buf) + FfiConverterOptionalTypePackedEthSignature.write(value.eth_signature, buf) + FfiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ContractBuilder: + + def __init__(self, account_id, sub_account_id, slot_id, nonce, pair_id, size, price, direction, taker_fee_rate, maker_fee_rate, has_subsidy): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.slot_id = slot_id + self.nonce = nonce + self.pair_id = pair_id + self.size = size + self.price = price + self.direction = direction + self.taker_fee_rate = taker_fee_rate + self.maker_fee_rate = maker_fee_rate + self.has_subsidy = has_subsidy + + def __str__(self): + return "ContractBuilder(account_id={}, sub_account_id={}, slot_id={}, nonce={}, pair_id={}, size={}, price={}, direction={}, taker_fee_rate={}, maker_fee_rate={}, has_subsidy={})".format(self.account_id, self.sub_account_id, self.slot_id, self.nonce, self.pair_id, self.size, self.price, self.direction, self.taker_fee_rate, self.maker_fee_rate, self.has_subsidy) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.slot_id != other.slot_id: + return False + if self.nonce != other.nonce: + return False + if self.pair_id != other.pair_id: + return False + if self.size != other.size: + return False + if self.price != other.price: + return False + if self.direction != other.direction: + return False + if self.taker_fee_rate != other.taker_fee_rate: + return False + if self.maker_fee_rate != other.maker_fee_rate: + return False + if self.has_subsidy != other.has_subsidy: + return False + return True + +class FfiConverterTypeContractBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + slot_id=FfiConverterTypeSlotId.read(buf), + nonce=FfiConverterTypeNonce.read(buf), + pair_id=FfiConverterTypePairId.read(buf), + size=FfiConverterTypeBigUint.read(buf), + price=FfiConverterTypeBigUint.read(buf), + direction=FfiConverterBool.read(buf), + taker_fee_rate=FfiConverterUInt8.read(buf), + maker_fee_rate=FfiConverterUInt8.read(buf), + has_subsidy=FfiConverterBool.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeSlotId.write(value.slot_id, buf) + FfiConverterTypeNonce.write(value.nonce, buf) + FfiConverterTypePairId.write(value.pair_id, buf) + FfiConverterTypeBigUint.write(value.size, buf) + FfiConverterTypeBigUint.write(value.price, buf) + FfiConverterBool.write(value.direction, buf) + FfiConverterUInt8.write(value.taker_fee_rate, buf) + FfiConverterUInt8.write(value.maker_fee_rate, buf) + FfiConverterBool.write(value.has_subsidy, buf) + + +class ContractMatchingBuilder: + + def __init__(self, account_id, sub_account_id, taker, maker, fee, fee_token, contract_prices, margin_prices): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "ContractMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class FfiConverterTypeContractMatchingBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractMatchingBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + taker=FfiConverterTypeContract.read(buf), + maker=FfiConverterSequenceTypeContract.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeContract.write(value.taker, buf) + FfiConverterSequenceTypeContract.write(value.maker, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class ContractPrice: + + def __init__(self, pair_id, market_price): + self.pair_id = pair_id + self.market_price = market_price + + def __str__(self): + return "ContractPrice(pair_id={}, market_price={})".format(self.pair_id, self.market_price) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.market_price != other.market_price: + return False + return True + +class FfiConverterTypeContractPrice(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractPrice( + pair_id=FfiConverterTypePairId.read(buf), + market_price=FfiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypePairId.write(value.pair_id, buf) + FfiConverterTypeBigUint.write(value.market_price, buf) + + +class Create2Data: + + def __init__(self, creator_address, salt_arg, code_hash): + self.creator_address = creator_address + self.salt_arg = salt_arg + self.code_hash = code_hash + + def __str__(self): + return "Create2Data(creator_address={}, salt_arg={}, code_hash={})".format(self.creator_address, self.salt_arg, self.code_hash) + + def __eq__(self, other): + if self.creator_address != other.creator_address: + return False + if self.salt_arg != other.salt_arg: + return False + if self.code_hash != other.code_hash: + return False + return True + +class FfiConverterTypeCreate2Data(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return Create2Data( + creator_address=FfiConverterTypeZkLinkAddress.read(buf), + salt_arg=FfiConverterTypeH256.read(buf), + code_hash=FfiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeZkLinkAddress.write(value.creator_address, buf) + FfiConverterTypeH256.write(value.salt_arg, buf) + FfiConverterTypeH256.write(value.code_hash, buf) + + +class DepositBuilder: + + def __init__(self, from_address, to_address, from_chain_id, sub_account_id, l2_target_token, l1_source_token, amount, serial_id, l2_hash, eth_hash): + self.from_address = from_address + self.to_address = to_address + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.l2_target_token = l2_target_token + self.l1_source_token = l1_source_token + self.amount = amount + self.serial_id = serial_id + self.l2_hash = l2_hash + self.eth_hash = eth_hash + + def __str__(self): + return "DepositBuilder(from_address={}, to_address={}, from_chain_id={}, sub_account_id={}, l2_target_token={}, l1_source_token={}, amount={}, serial_id={}, l2_hash={}, eth_hash={})".format(self.from_address, self.to_address, self.from_chain_id, self.sub_account_id, self.l2_target_token, self.l1_source_token, self.amount, self.serial_id, self.l2_hash, self.eth_hash) + + def __eq__(self, other): + if self.from_address != other.from_address: + return False + if self.to_address != other.to_address: + return False + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.l2_target_token != other.l2_target_token: + return False + if self.l1_source_token != other.l1_source_token: + return False + if self.amount != other.amount: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + if self.eth_hash != other.eth_hash: + return False + return True + +class FfiConverterTypeDepositBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return DepositBuilder( + from_address=FfiConverterTypeZkLinkAddress.read(buf), + to_address=FfiConverterTypeZkLinkAddress.read(buf), + from_chain_id=FfiConverterTypeChainId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + l2_target_token=FfiConverterTypeTokenId.read(buf), + l1_source_token=FfiConverterTypeTokenId.read(buf), + amount=FfiConverterTypeBigUint.read(buf), + serial_id=FfiConverterUInt64.read(buf), + l2_hash=FfiConverterTypeH256.read(buf), + eth_hash=FfiConverterOptionalTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeZkLinkAddress.write(value.from_address, buf) + FfiConverterTypeZkLinkAddress.write(value.to_address, buf) + FfiConverterTypeChainId.write(value.from_chain_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeTokenId.write(value.l2_target_token, buf) + FfiConverterTypeTokenId.write(value.l1_source_token, buf) + FfiConverterTypeBigUint.write(value.amount, buf) + FfiConverterUInt64.write(value.serial_id, buf) + FfiConverterTypeH256.write(value.l2_hash, buf) + FfiConverterOptionalTypeH256.write(value.eth_hash, buf) + + +class ForcedExitBuilder: + + def __init__(self, to_chain_id, initiator_account_id, initiator_sub_account_id, target, target_sub_account_id, l2_source_token, l1_target_token, initiator_nonce, exit_amount, withdraw_to_l1, timestamp): + self.to_chain_id = to_chain_id + self.initiator_account_id = initiator_account_id + self.initiator_sub_account_id = initiator_sub_account_id + self.target = target + self.target_sub_account_id = target_sub_account_id + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.initiator_nonce = initiator_nonce + self.exit_amount = exit_amount + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "ForcedExitBuilder(to_chain_id={}, initiator_account_id={}, initiator_sub_account_id={}, target={}, target_sub_account_id={}, l2_source_token={}, l1_target_token={}, initiator_nonce={}, exit_amount={}, withdraw_to_l1={}, timestamp={})".format(self.to_chain_id, self.initiator_account_id, self.initiator_sub_account_id, self.target, self.target_sub_account_id, self.l2_source_token, self.l1_target_token, self.initiator_nonce, self.exit_amount, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.initiator_account_id != other.initiator_account_id: + return False + if self.initiator_sub_account_id != other.initiator_sub_account_id: + return False + if self.target != other.target: + return False + if self.target_sub_account_id != other.target_sub_account_id: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.initiator_nonce != other.initiator_nonce: + return False + if self.exit_amount != other.exit_amount: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class FfiConverterTypeForcedExitBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ForcedExitBuilder( + to_chain_id=FfiConverterTypeChainId.read(buf), + initiator_account_id=FfiConverterTypeAccountId.read(buf), + initiator_sub_account_id=FfiConverterTypeSubAccountId.read(buf), + target=FfiConverterTypeZkLinkAddress.read(buf), + target_sub_account_id=FfiConverterTypeSubAccountId.read(buf), + l2_source_token=FfiConverterTypeTokenId.read(buf), + l1_target_token=FfiConverterTypeTokenId.read(buf), + initiator_nonce=FfiConverterTypeNonce.read(buf), + exit_amount=FfiConverterTypeBigUint.read(buf), + withdraw_to_l1=FfiConverterBool.read(buf), + timestamp=FfiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeChainId.write(value.to_chain_id, buf) + FfiConverterTypeAccountId.write(value.initiator_account_id, buf) + FfiConverterTypeSubAccountId.write(value.initiator_sub_account_id, buf) + FfiConverterTypeZkLinkAddress.write(value.target, buf) + FfiConverterTypeSubAccountId.write(value.target_sub_account_id, buf) + FfiConverterTypeTokenId.write(value.l2_source_token, buf) + FfiConverterTypeTokenId.write(value.l1_target_token, buf) + FfiConverterTypeNonce.write(value.initiator_nonce, buf) + FfiConverterTypeBigUint.write(value.exit_amount, buf) + FfiConverterBool.write(value.withdraw_to_l1, buf) + FfiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class FullExitBuilder: + + def __init__(self, to_chain_id, account_id, sub_account_id, exit_address, l2_source_token, l1_target_token, contract_prices, margin_prices, serial_id, l2_hash): + self.to_chain_id = to_chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.exit_address = exit_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.serial_id = serial_id + self.l2_hash = l2_hash + + def __str__(self): + return "FullExitBuilder(to_chain_id={}, account_id={}, sub_account_id={}, exit_address={}, l2_source_token={}, l1_target_token={}, contract_prices={}, margin_prices={}, serial_id={}, l2_hash={})".format(self.to_chain_id, self.account_id, self.sub_account_id, self.exit_address, self.l2_source_token, self.l1_target_token, self.contract_prices, self.margin_prices, self.serial_id, self.l2_hash) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.exit_address != other.exit_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + return True + +class FfiConverterTypeFullExitBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return FullExitBuilder( + to_chain_id=FfiConverterTypeChainId.read(buf), + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + exit_address=FfiConverterTypeZkLinkAddress.read(buf), + l2_source_token=FfiConverterTypeTokenId.read(buf), + l1_target_token=FfiConverterTypeTokenId.read(buf), + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + serial_id=FfiConverterUInt64.read(buf), + l2_hash=FfiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeChainId.write(value.to_chain_id, buf) + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeZkLinkAddress.write(value.exit_address, buf) + FfiConverterTypeTokenId.write(value.l2_source_token, buf) + FfiConverterTypeTokenId.write(value.l1_target_token, buf) + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + FfiConverterUInt64.write(value.serial_id, buf) + FfiConverterTypeH256.write(value.l2_hash, buf) + + +class FundingBuilder: + + def __init__(self, account_id, sub_account_id, sub_account_nonce, funding_account_ids, fee, fee_token): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.funding_account_ids = funding_account_ids + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "FundingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, funding_account_ids={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.funding_account_ids, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.funding_account_ids != other.funding_account_ids: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class FfiConverterTypeFundingBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + sub_account_nonce=FfiConverterTypeNonce.read(buf), + funding_account_ids=FfiConverterSequenceTypeAccountId.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeNonce.write(value.sub_account_nonce, buf) + FfiConverterSequenceTypeAccountId.write(value.funding_account_ids, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + + +class FundingInfo: + + def __init__(self, pair_id, price, funding_rate): + self.pair_id = pair_id + self.price = price + self.funding_rate = funding_rate + + def __str__(self): + return "FundingInfo(pair_id={}, price={}, funding_rate={})".format(self.pair_id, self.price, self.funding_rate) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.price != other.price: + return False + if self.funding_rate != other.funding_rate: + return False + return True + +class FfiConverterTypeFundingInfo(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingInfo( + pair_id=FfiConverterTypePairId.read(buf), + price=FfiConverterTypeBigUint.read(buf), + funding_rate=FfiConverterInt16.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypePairId.write(value.pair_id, buf) + FfiConverterTypeBigUint.write(value.price, buf) + FfiConverterInt16.write(value.funding_rate, buf) + + +class LiquidationBuilder: + + def __init__(self, account_id, sub_account_id, sub_account_nonce, contract_prices, margin_prices, liquidation_account_id, fee, fee_token): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.liquidation_account_id = liquidation_account_id + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "LiquidationBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, liquidation_account_id={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.liquidation_account_id, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.liquidation_account_id != other.liquidation_account_id: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class FfiConverterTypeLiquidationBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return LiquidationBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + sub_account_nonce=FfiConverterTypeNonce.read(buf), + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + liquidation_account_id=FfiConverterTypeAccountId.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeNonce.write(value.sub_account_nonce, buf) + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + FfiConverterTypeAccountId.write(value.liquidation_account_id, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + + +class Message: + + def __init__(self, data): + self.data = data + + def __str__(self): + return "Message(data={})".format(self.data) + + def __eq__(self, other): + if self.data != other.data: + return False + return True + +class FfiConverterTypeMessage(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return Message( + data=FfiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterString.write(value.data, buf) + + +class OraclePrices: + + def __init__(self, contract_prices, margin_prices): + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "OraclePrices(contract_prices={}, margin_prices={})".format(self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class FfiConverterTypeOraclePrices(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return OraclePrices( + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class OrderMatchingBuilder: + + def __init__(self, account_id, sub_account_id, taker, maker, fee, fee_token, contract_prices, margin_prices, expect_base_amount, expect_quote_amount): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.expect_base_amount = expect_base_amount + self.expect_quote_amount = expect_quote_amount + + def __str__(self): + return "OrderMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={}, expect_base_amount={}, expect_quote_amount={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices, self.expect_base_amount, self.expect_quote_amount) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.expect_base_amount != other.expect_base_amount: + return False + if self.expect_quote_amount != other.expect_quote_amount: + return False + return True + +class FfiConverterTypeOrderMatchingBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return OrderMatchingBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + taker=FfiConverterTypeOrder.read(buf), + maker=FfiConverterTypeOrder.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + fee_token=FfiConverterTypeTokenId.read(buf), + contract_prices=FfiConverterSequenceTypeContractPrice.read(buf), + margin_prices=FfiConverterSequenceTypeSpotPriceInfo.read(buf), + expect_base_amount=FfiConverterTypeBigUint.read(buf), + expect_quote_amount=FfiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeOrder.write(value.taker, buf) + FfiConverterTypeOrder.write(value.maker, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeTokenId.write(value.fee_token, buf) + FfiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + FfiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + FfiConverterTypeBigUint.write(value.expect_base_amount, buf) + FfiConverterTypeBigUint.write(value.expect_quote_amount, buf) + + +class SpotPriceInfo: + + def __init__(self, token_id, price): + self.token_id = token_id + self.price = price + + def __str__(self): + return "SpotPriceInfo(token_id={}, price={})".format(self.token_id, self.price) + + def __eq__(self, other): + if self.token_id != other.token_id: + return False + if self.price != other.price: + return False + return True + +class FfiConverterTypeSpotPriceInfo(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return SpotPriceInfo( + token_id=FfiConverterTypeTokenId.read(buf), + price=FfiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeTokenId.write(value.token_id, buf) + FfiConverterTypeBigUint.write(value.price, buf) + + +class TransferBuilder: + + def __init__(self, account_id, to_address, from_sub_account_id, to_sub_account_id, token, amount, fee, nonce, timestamp): + self.account_id = account_id + self.to_address = to_address + self.from_sub_account_id = from_sub_account_id + self.to_sub_account_id = to_sub_account_id + self.token = token + self.amount = amount + self.fee = fee + self.nonce = nonce + self.timestamp = timestamp + + def __str__(self): + return "TransferBuilder(account_id={}, to_address={}, from_sub_account_id={}, to_sub_account_id={}, token={}, amount={}, fee={}, nonce={}, timestamp={})".format(self.account_id, self.to_address, self.from_sub_account_id, self.to_sub_account_id, self.token, self.amount, self.fee, self.nonce, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.to_address != other.to_address: + return False + if self.from_sub_account_id != other.from_sub_account_id: + return False + if self.to_sub_account_id != other.to_sub_account_id: + return False + if self.token != other.token: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.timestamp != other.timestamp: + return False + return True + +class FfiConverterTypeTransferBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return TransferBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + to_address=FfiConverterTypeZkLinkAddress.read(buf), + from_sub_account_id=FfiConverterTypeSubAccountId.read(buf), + to_sub_account_id=FfiConverterTypeSubAccountId.read(buf), + token=FfiConverterTypeTokenId.read(buf), + amount=FfiConverterTypeBigUint.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + nonce=FfiConverterTypeNonce.read(buf), + timestamp=FfiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeZkLinkAddress.write(value.to_address, buf) + FfiConverterTypeSubAccountId.write(value.from_sub_account_id, buf) + FfiConverterTypeSubAccountId.write(value.to_sub_account_id, buf) + FfiConverterTypeTokenId.write(value.token, buf) + FfiConverterTypeBigUint.write(value.amount, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeNonce.write(value.nonce, buf) + FfiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class TxMessage: + + def __init__(self, transaction, amount, fee, token, to, nonce): + self.transaction = transaction + self.amount = amount + self.fee = fee + self.token = token + self.to = to + self.nonce = nonce + + def __str__(self): + return "TxMessage(transaction={}, amount={}, fee={}, token={}, to={}, nonce={})".format(self.transaction, self.amount, self.fee, self.token, self.to, self.nonce) + + def __eq__(self, other): + if self.transaction != other.transaction: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.token != other.token: + return False + if self.to != other.to: + return False + if self.nonce != other.nonce: + return False + return True + +class FfiConverterTypeTxMessage(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return TxMessage( + transaction=FfiConverterString.read(buf), + amount=FfiConverterString.read(buf), + fee=FfiConverterString.read(buf), + token=FfiConverterString.read(buf), + to=FfiConverterString.read(buf), + nonce=FfiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterString.write(value.transaction, buf) + FfiConverterString.write(value.amount, buf) + FfiConverterString.write(value.fee, buf) + FfiConverterString.write(value.token, buf) + FfiConverterString.write(value.to, buf) + FfiConverterString.write(value.nonce, buf) + + +class TxSignature: + + def __init__(self, tx, layer1_signature): + self.tx = tx + self.layer1_signature = layer1_signature + + def __str__(self): + return "TxSignature(tx={}, layer1_signature={})".format(self.tx, self.layer1_signature) + + def __eq__(self, other): + if self.tx != other.tx: + return False + if self.layer1_signature != other.layer1_signature: + return False + return True + +class FfiConverterTypeTxSignature(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return TxSignature( + tx=FfiConverterTypeZkLinkTx.read(buf), + layer1_signature=FfiConverterOptionalTypeTxLayer1Signature.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeZkLinkTx.write(value.tx, buf) + FfiConverterOptionalTypeTxLayer1Signature.write(value.layer1_signature, buf) + + +class UpdateGlobalVarBuilder: + + def __init__(self, from_chain_id, sub_account_id, parameter, serial_id): + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.parameter = parameter + self.serial_id = serial_id + + def __str__(self): + return "UpdateGlobalVarBuilder(from_chain_id={}, sub_account_id={}, parameter={}, serial_id={})".format(self.from_chain_id, self.sub_account_id, self.parameter, self.serial_id) + + def __eq__(self, other): + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.parameter != other.parameter: + return False + if self.serial_id != other.serial_id: + return False + return True + +class FfiConverterTypeUpdateGlobalVarBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return UpdateGlobalVarBuilder( + from_chain_id=FfiConverterTypeChainId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + parameter=FfiConverterTypeParameter.read(buf), + serial_id=FfiConverterUInt64.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeChainId.write(value.from_chain_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeParameter.write(value.parameter, buf) + FfiConverterUInt64.write(value.serial_id, buf) + + +class WithdrawBuilder: + + def __init__(self, account_id, sub_account_id, to_chain_id, to_address, l2_source_token, l1_target_token, amount, call_data, fee, nonce, withdraw_fee_ratio, withdraw_to_l1, timestamp): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.to_chain_id = to_chain_id + self.to_address = to_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.amount = amount + self.call_data = call_data + self.fee = fee + self.nonce = nonce + self.withdraw_fee_ratio = withdraw_fee_ratio + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "WithdrawBuilder(account_id={}, sub_account_id={}, to_chain_id={}, to_address={}, l2_source_token={}, l1_target_token={}, amount={}, call_data={}, fee={}, nonce={}, withdraw_fee_ratio={}, withdraw_to_l1={}, timestamp={})".format(self.account_id, self.sub_account_id, self.to_chain_id, self.to_address, self.l2_source_token, self.l1_target_token, self.amount, self.call_data, self.fee, self.nonce, self.withdraw_fee_ratio, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.to_chain_id != other.to_chain_id: + return False + if self.to_address != other.to_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.amount != other.amount: + return False + if self.call_data != other.call_data: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.withdraw_fee_ratio != other.withdraw_fee_ratio: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class FfiConverterTypeWithdrawBuilder(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return WithdrawBuilder( + account_id=FfiConverterTypeAccountId.read(buf), + sub_account_id=FfiConverterTypeSubAccountId.read(buf), + to_chain_id=FfiConverterTypeChainId.read(buf), + to_address=FfiConverterTypeZkLinkAddress.read(buf), + l2_source_token=FfiConverterTypeTokenId.read(buf), + l1_target_token=FfiConverterTypeTokenId.read(buf), + amount=FfiConverterTypeBigUint.read(buf), + call_data=FfiConverterOptionalSequenceUInt8.read(buf), + fee=FfiConverterTypeBigUint.read(buf), + nonce=FfiConverterTypeNonce.read(buf), + withdraw_fee_ratio=FfiConverterUInt16.read(buf), + withdraw_to_l1=FfiConverterBool.read(buf), + timestamp=FfiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypeAccountId.write(value.account_id, buf) + FfiConverterTypeSubAccountId.write(value.sub_account_id, buf) + FfiConverterTypeChainId.write(value.to_chain_id, buf) + FfiConverterTypeZkLinkAddress.write(value.to_address, buf) + FfiConverterTypeTokenId.write(value.l2_source_token, buf) + FfiConverterTypeTokenId.write(value.l1_target_token, buf) + FfiConverterTypeBigUint.write(value.amount, buf) + FfiConverterOptionalSequenceUInt8.write(value.call_data, buf) + FfiConverterTypeBigUint.write(value.fee, buf) + FfiConverterTypeNonce.write(value.nonce, buf) + FfiConverterUInt16.write(value.withdraw_fee_ratio, buf) + FfiConverterBool.write(value.withdraw_to_l1, buf) + FfiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ZkLinkSignature: + + def __init__(self, pub_key, signature): + self.pub_key = pub_key + self.signature = signature + + def __str__(self): + return "ZkLinkSignature(pub_key={}, signature={})".format(self.pub_key, self.signature) + + def __eq__(self, other): + if self.pub_key != other.pub_key: + return False + if self.signature != other.signature: + return False + return True + +class FfiConverterTypeZkLinkSignature(FfiConverterRustBuffer): + @staticmethod + def read(buf): + return ZkLinkSignature( + pub_key=FfiConverterTypePackedPublicKey.read(buf), + signature=FfiConverterTypePackedSignature.read(buf), + ) + + @staticmethod + def write(value, buf): + FfiConverterTypePackedPublicKey.write(value.pub_key, buf) + FfiConverterTypePackedSignature.write(value.signature, buf) + + + + +class ChangePubKeyAuthData: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthData cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN(object): + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthData.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA(object): + def __init__(self,eth_signature): + + self.eth_signature = eth_signature + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_ECDSA(eth_signature={})".format(self.eth_signature) + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + if self.eth_signature != other.eth_signature: + return False + return True + class ETH_CREATE2(object): + def __init__(self,data): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self): + return isinstance(self, ChangePubKeyAuthData.ONCHAIN) + def is_eth_ecdsa(self): + return isinstance(self, ChangePubKeyAuthData.ETH_ECDSA) + def is_eth_create2(self): + return isinstance(self, ChangePubKeyAuthData.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthData.ONCHAIN = type("ChangePubKeyAuthData.ONCHAIN", (ChangePubKeyAuthData.ONCHAIN, ChangePubKeyAuthData,), {}) +ChangePubKeyAuthData.ETH_ECDSA = type("ChangePubKeyAuthData.ETH_ECDSA", (ChangePubKeyAuthData.ETH_ECDSA, ChangePubKeyAuthData,), {}) +ChangePubKeyAuthData.ETH_CREATE2 = type("ChangePubKeyAuthData.ETH_CREATE2", (ChangePubKeyAuthData.ETH_CREATE2, ChangePubKeyAuthData,), {}) + + + + +class FfiConverterTypeChangePubKeyAuthData(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return ChangePubKeyAuthData.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthData.ETH_ECDSA( + FfiConverterTypePackedEthSignature.read(buf), + ) + if variant == 3: + return ChangePubKeyAuthData.ETH_CREATE2( + FfiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.writeI32(1) + if value.is_eth_ecdsa(): + buf.writeI32(2) + FfiConverterTypePackedEthSignature.write(value.eth_signature, buf) + if value.is_eth_create2(): + buf.writeI32(3) + FfiConverterTypeCreate2Data.write(value.data, buf) + + + + +class ChangePubKeyAuthRequest: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthRequest cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN(object): + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA(object): + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_ECDSA()".format() + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + return True + class ETH_CREATE2(object): + def __init__(self,data): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self): + return isinstance(self, ChangePubKeyAuthRequest.ONCHAIN) + def is_eth_ecdsa(self): + return isinstance(self, ChangePubKeyAuthRequest.ETH_ECDSA) + def is_eth_create2(self): + return isinstance(self, ChangePubKeyAuthRequest.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthRequest.ONCHAIN = type("ChangePubKeyAuthRequest.ONCHAIN", (ChangePubKeyAuthRequest.ONCHAIN, ChangePubKeyAuthRequest,), {}) +ChangePubKeyAuthRequest.ETH_ECDSA = type("ChangePubKeyAuthRequest.ETH_ECDSA", (ChangePubKeyAuthRequest.ETH_ECDSA, ChangePubKeyAuthRequest,), {}) +ChangePubKeyAuthRequest.ETH_CREATE2 = type("ChangePubKeyAuthRequest.ETH_CREATE2", (ChangePubKeyAuthRequest.ETH_CREATE2, ChangePubKeyAuthRequest,), {}) + + + + +class FfiConverterTypeChangePubKeyAuthRequest(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return ChangePubKeyAuthRequest.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthRequest.ETH_ECDSA( + ) + if variant == 3: + return ChangePubKeyAuthRequest.ETH_CREATE2( + FfiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.writeI32(1) + if value.is_eth_ecdsa(): + buf.writeI32(2) + if value.is_eth_create2(): + buf.writeI32(3) + FfiConverterTypeCreate2Data.write(value.data, buf) + + + + +class L1SignerType: + def __init__(self): + raise RuntimeError("L1SignerType cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ETH(object): + def __init__(self,): + + pass + + + def __str__(self): + return "L1SignerType.ETH()".format() + + def __eq__(self, other): + if not other.is_eth(): + return False + return True + class STARKNET(object): + def __init__(self,chain_id, address): + + self.chain_id = chain_id + self.address = address + + + def __str__(self): + return "L1SignerType.STARKNET(chain_id={}, address={})".format(self.chain_id, self.address) + + def __eq__(self, other): + if not other.is_starknet(): + return False + if self.chain_id != other.chain_id: + return False + if self.address != other.address: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_eth(self): + return isinstance(self, L1SignerType.ETH) + def is_starknet(self): + return isinstance(self, L1SignerType.STARKNET) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +L1SignerType.ETH = type("L1SignerType.ETH", (L1SignerType.ETH, L1SignerType,), {}) +L1SignerType.STARKNET = type("L1SignerType.STARKNET", (L1SignerType.STARKNET, L1SignerType,), {}) + + + + +class FfiConverterTypeL1SignerType(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return L1SignerType.ETH( + ) + if variant == 2: + return L1SignerType.STARKNET( + FfiConverterString.read(buf), + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_eth(): + buf.writeI32(1) + if value.is_starknet(): + buf.writeI32(2) + FfiConverterString.write(value.chain_id, buf) + FfiConverterString.write(value.address, buf) + + + + +class L1Type(enum.Enum): + ETH = 1 + STARKNET = 2 + + + +class FfiConverterTypeL1Type(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return L1Type.ETH + if variant == 2: + return L1Type.STARKNET + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value == L1Type.ETH: + buf.writeI32(1) + if value == L1Type.STARKNET: + buf.writeI32(2) + + + + +class Parameter: + def __init__(self): + raise RuntimeError("Parameter cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class FEE_ACCOUNT(object): + def __init__(self,account_id): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.FEE_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_fee_account(): + return False + if self.account_id != other.account_id: + return False + return True + class INSURANCE_FUND_ACCOUNT(object): + def __init__(self,account_id): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.INSURANCE_FUND_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_insurance_fund_account(): + return False + if self.account_id != other.account_id: + return False + return True + class MARGIN_INFO(object): + def __init__(self,margin_id, token_id, ratio): + + self.margin_id = margin_id + self.token_id = token_id + self.ratio = ratio + + + def __str__(self): + return "Parameter.MARGIN_INFO(margin_id={}, token_id={}, ratio={})".format(self.margin_id, self.token_id, self.ratio) + + def __eq__(self, other): + if not other.is_margin_info(): + return False + if self.margin_id != other.margin_id: + return False + if self.token_id != other.token_id: + return False + if self.ratio != other.ratio: + return False + return True + class FUNDING_INFOS(object): + def __init__(self,infos): + + self.infos = infos + + + def __str__(self): + return "Parameter.FUNDING_INFOS(infos={})".format(self.infos) + + def __eq__(self, other): + if not other.is_funding_infos(): + return False + if self.infos != other.infos: + return False + return True + class CONTRACT_INFO(object): + def __init__(self,pair_id, symbol, initial_margin_rate, maintenance_margin_rate): + + self.pair_id = pair_id + self.symbol = symbol + self.initial_margin_rate = initial_margin_rate + self.maintenance_margin_rate = maintenance_margin_rate + + + def __str__(self): + return "Parameter.CONTRACT_INFO(pair_id={}, symbol={}, initial_margin_rate={}, maintenance_margin_rate={})".format(self.pair_id, self.symbol, self.initial_margin_rate, self.maintenance_margin_rate) + + def __eq__(self, other): + if not other.is_contract_info(): + return False + if self.pair_id != other.pair_id: + return False + if self.symbol != other.symbol: + return False + if self.initial_margin_rate != other.initial_margin_rate: + return False + if self.maintenance_margin_rate != other.maintenance_margin_rate: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_fee_account(self): + return isinstance(self, Parameter.FEE_ACCOUNT) + def is_insurance_fund_account(self): + return isinstance(self, Parameter.INSURANCE_FUND_ACCOUNT) + def is_margin_info(self): + return isinstance(self, Parameter.MARGIN_INFO) + def is_funding_infos(self): + return isinstance(self, Parameter.FUNDING_INFOS) + def is_contract_info(self): + return isinstance(self, Parameter.CONTRACT_INFO) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +Parameter.FEE_ACCOUNT = type("Parameter.FEE_ACCOUNT", (Parameter.FEE_ACCOUNT, Parameter,), {}) +Parameter.INSURANCE_FUND_ACCOUNT = type("Parameter.INSURANCE_FUND_ACCOUNT", (Parameter.INSURANCE_FUND_ACCOUNT, Parameter,), {}) +Parameter.MARGIN_INFO = type("Parameter.MARGIN_INFO", (Parameter.MARGIN_INFO, Parameter,), {}) +Parameter.FUNDING_INFOS = type("Parameter.FUNDING_INFOS", (Parameter.FUNDING_INFOS, Parameter,), {}) +Parameter.CONTRACT_INFO = type("Parameter.CONTRACT_INFO", (Parameter.CONTRACT_INFO, Parameter,), {}) + + + + +class FfiConverterTypeParameter(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return Parameter.FEE_ACCOUNT( + FfiConverterTypeAccountId.read(buf), + ) + if variant == 2: + return Parameter.INSURANCE_FUND_ACCOUNT( + FfiConverterTypeAccountId.read(buf), + ) + if variant == 3: + return Parameter.MARGIN_INFO( + FfiConverterTypeMarginId.read(buf), + FfiConverterTypeTokenId.read(buf), + FfiConverterUInt8.read(buf), + ) + if variant == 4: + return Parameter.FUNDING_INFOS( + FfiConverterSequenceTypeFundingInfo.read(buf), + ) + if variant == 5: + return Parameter.CONTRACT_INFO( + FfiConverterTypePairId.read(buf), + FfiConverterString.read(buf), + FfiConverterUInt16.read(buf), + FfiConverterUInt16.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_fee_account(): + buf.writeI32(1) + FfiConverterTypeAccountId.write(value.account_id, buf) + if value.is_insurance_fund_account(): + buf.writeI32(2) + FfiConverterTypeAccountId.write(value.account_id, buf) + if value.is_margin_info(): + buf.writeI32(3) + FfiConverterTypeMarginId.write(value.margin_id, buf) + FfiConverterTypeTokenId.write(value.token_id, buf) + FfiConverterUInt8.write(value.ratio, buf) + if value.is_funding_infos(): + buf.writeI32(4) + FfiConverterSequenceTypeFundingInfo.write(value.infos, buf) + if value.is_contract_info(): + buf.writeI32(5) + FfiConverterTypePairId.write(value.pair_id, buf) + FfiConverterString.write(value.symbol, buf) + FfiConverterUInt16.write(value.initial_margin_rate, buf) + FfiConverterUInt16.write(value.maintenance_margin_rate, buf) + + + + +class TypedDataMessage: + def __init__(self): + raise RuntimeError("TypedDataMessage cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class CREATE_L2_KEY(object): + def __init__(self,message): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.CREATE_L2_KEY(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_create_l2_key(): + return False + if self.message != other.message: + return False + return True + class TRANSACTION(object): + def __init__(self,message): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.TRANSACTION(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_transaction(): + return False + if self.message != other.message: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_create_l2_key(self): + return isinstance(self, TypedDataMessage.CREATE_L2_KEY) + def is_transaction(self): + return isinstance(self, TypedDataMessage.TRANSACTION) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +TypedDataMessage.CREATE_L2_KEY = type("TypedDataMessage.CREATE_L2_KEY", (TypedDataMessage.CREATE_L2_KEY, TypedDataMessage,), {}) +TypedDataMessage.TRANSACTION = type("TypedDataMessage.TRANSACTION", (TypedDataMessage.TRANSACTION, TypedDataMessage,), {}) + + + + +class FfiConverterTypeTypedDataMessage(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return TypedDataMessage.CREATE_L2_KEY( + FfiConverterTypeMessage.read(buf), + ) + if variant == 2: + return TypedDataMessage.TRANSACTION( + FfiConverterTypeTxMessage.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_create_l2_key(): + buf.writeI32(1) + FfiConverterTypeMessage.write(value.message, buf) + if value.is_transaction(): + buf.writeI32(2) + FfiConverterTypeTxMessage.write(value.message, buf) + + + +# EthSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separated, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class UniFFIExceptionTmpNamespace: + class EthSignerError(Exception): + pass + + class InvalidEthSigner(EthSignerError): + def __str__(self): + return "EthSignerError.InvalidEthSigner({})".format(repr(super().__str__())) + + EthSignerError.InvalidEthSigner = InvalidEthSigner + class MissingEthPrivateKey(EthSignerError): + def __str__(self): + return "EthSignerError.MissingEthPrivateKey({})".format(repr(super().__str__())) + + EthSignerError.MissingEthPrivateKey = MissingEthPrivateKey + class MissingEthSigner(EthSignerError): + def __str__(self): + return "EthSignerError.MissingEthSigner({})".format(repr(super().__str__())) + + EthSignerError.MissingEthSigner = MissingEthSigner + class SigningFailed(EthSignerError): + def __str__(self): + return "EthSignerError.SigningFailed({})".format(repr(super().__str__())) + + EthSignerError.SigningFailed = SigningFailed + class UnlockingFailed(EthSignerError): + def __str__(self): + return "EthSignerError.UnlockingFailed({})".format(repr(super().__str__())) + + EthSignerError.UnlockingFailed = UnlockingFailed + class InvalidRawTx(EthSignerError): + def __str__(self): + return "EthSignerError.InvalidRawTx({})".format(repr(super().__str__())) + + EthSignerError.InvalidRawTx = InvalidRawTx + class Eip712Failed(EthSignerError): + def __str__(self): + return "EthSignerError.Eip712Failed({})".format(repr(super().__str__())) + + EthSignerError.Eip712Failed = Eip712Failed + class NoSigningKey(EthSignerError): + def __str__(self): + return "EthSignerError.NoSigningKey({})".format(repr(super().__str__())) + + EthSignerError.NoSigningKey = NoSigningKey + class DefineAddress(EthSignerError): + def __str__(self): + return "EthSignerError.DefineAddress({})".format(repr(super().__str__())) + + EthSignerError.DefineAddress = DefineAddress + class RecoverAddress(EthSignerError): + def __str__(self): + return "EthSignerError.RecoverAddress({})".format(repr(super().__str__())) + + EthSignerError.RecoverAddress = RecoverAddress + class LengthMismatched(EthSignerError): + def __str__(self): + return "EthSignerError.LengthMismatched({})".format(repr(super().__str__())) + + EthSignerError.LengthMismatched = LengthMismatched + class CryptoError(EthSignerError): + def __str__(self): + return "EthSignerError.CryptoError({})".format(repr(super().__str__())) + + EthSignerError.CryptoError = CryptoError + class InvalidSignatureStr(EthSignerError): + def __str__(self): + return "EthSignerError.InvalidSignatureStr({})".format(repr(super().__str__())) + + EthSignerError.InvalidSignatureStr = InvalidSignatureStr + class CustomError(EthSignerError): + def __str__(self): + return "EthSignerError.CustomError({})".format(repr(super().__str__())) + + EthSignerError.CustomError = CustomError + class RpcSignError(EthSignerError): + def __str__(self): + return "EthSignerError.RpcSignError({})".format(repr(super().__str__())) + + EthSignerError.RpcSignError = RpcSignError +EthSignerError = UniFFIExceptionTmpNamespace.EthSignerError +del UniFFIExceptionTmpNamespace + + +class FfiConverterTypeEthSignerError(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return EthSignerError.InvalidEthSigner( + FfiConverterString.read(buf), + ) + if variant == 2: + return EthSignerError.MissingEthPrivateKey( + FfiConverterString.read(buf), + ) + if variant == 3: + return EthSignerError.MissingEthSigner( + FfiConverterString.read(buf), + ) + if variant == 4: + return EthSignerError.SigningFailed( + FfiConverterString.read(buf), + ) + if variant == 5: + return EthSignerError.UnlockingFailed( + FfiConverterString.read(buf), + ) + if variant == 6: + return EthSignerError.InvalidRawTx( + FfiConverterString.read(buf), + ) + if variant == 7: + return EthSignerError.Eip712Failed( + FfiConverterString.read(buf), + ) + if variant == 8: + return EthSignerError.NoSigningKey( + FfiConverterString.read(buf), + ) + if variant == 9: + return EthSignerError.DefineAddress( + FfiConverterString.read(buf), + ) + if variant == 10: + return EthSignerError.RecoverAddress( + FfiConverterString.read(buf), + ) + if variant == 11: + return EthSignerError.LengthMismatched( + FfiConverterString.read(buf), + ) + if variant == 12: + return EthSignerError.CryptoError( + FfiConverterString.read(buf), + ) + if variant == 13: + return EthSignerError.InvalidSignatureStr( + FfiConverterString.read(buf), + ) + if variant == 14: + return EthSignerError.CustomError( + FfiConverterString.read(buf), + ) + if variant == 15: + return EthSignerError.RpcSignError( + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, EthSignerError.InvalidEthSigner): + buf.writeI32(1) + if isinstance(value, EthSignerError.MissingEthPrivateKey): + buf.writeI32(2) + if isinstance(value, EthSignerError.MissingEthSigner): + buf.writeI32(3) + if isinstance(value, EthSignerError.SigningFailed): + buf.writeI32(4) + if isinstance(value, EthSignerError.UnlockingFailed): + buf.writeI32(5) + if isinstance(value, EthSignerError.InvalidRawTx): + buf.writeI32(6) + if isinstance(value, EthSignerError.Eip712Failed): + buf.writeI32(7) + if isinstance(value, EthSignerError.NoSigningKey): + buf.writeI32(8) + if isinstance(value, EthSignerError.DefineAddress): + buf.writeI32(9) + if isinstance(value, EthSignerError.RecoverAddress): + buf.writeI32(10) + if isinstance(value, EthSignerError.LengthMismatched): + buf.writeI32(11) + if isinstance(value, EthSignerError.CryptoError): + buf.writeI32(12) + if isinstance(value, EthSignerError.InvalidSignatureStr): + buf.writeI32(13) + if isinstance(value, EthSignerError.CustomError): + buf.writeI32(14) + if isinstance(value, EthSignerError.RpcSignError): + buf.writeI32(15) + + + +# SignError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separated, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class UniFFIExceptionTmpNamespace: + class SignError(Exception): + pass + + class EthSigningError(SignError): + def __str__(self): + return "SignError.EthSigningError({})".format(repr(super().__str__())) + + SignError.EthSigningError = EthSigningError + class ZkSigningError(SignError): + def __str__(self): + return "SignError.ZkSigningError({})".format(repr(super().__str__())) + + SignError.ZkSigningError = ZkSigningError + class StarkSigningError(SignError): + def __str__(self): + return "SignError.StarkSigningError({})".format(repr(super().__str__())) + + SignError.StarkSigningError = StarkSigningError + class IncorrectTx(SignError): + def __str__(self): + return "SignError.IncorrectTx({})".format(repr(super().__str__())) + + SignError.IncorrectTx = IncorrectTx +SignError = UniFFIExceptionTmpNamespace.SignError +del UniFFIExceptionTmpNamespace + + +class FfiConverterTypeSignError(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return SignError.EthSigningError( + FfiConverterString.read(buf), + ) + if variant == 2: + return SignError.ZkSigningError( + FfiConverterString.read(buf), + ) + if variant == 3: + return SignError.StarkSigningError( + FfiConverterString.read(buf), + ) + if variant == 4: + return SignError.IncorrectTx( + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, SignError.EthSigningError): + buf.writeI32(1) + if isinstance(value, SignError.ZkSigningError): + buf.writeI32(2) + if isinstance(value, SignError.StarkSigningError): + buf.writeI32(3) + if isinstance(value, SignError.IncorrectTx): + buf.writeI32(4) + + + +# StarkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separated, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class UniFFIExceptionTmpNamespace: + class StarkSignerError(Exception): + pass + + class InvalidStarknetSigner(StarkSignerError): + def __str__(self): + return "StarkSignerError.InvalidStarknetSigner({})".format(repr(super().__str__())) + + StarkSignerError.InvalidStarknetSigner = InvalidStarknetSigner + class InvalidSignature(StarkSignerError): + def __str__(self): + return "StarkSignerError.InvalidSignature({})".format(repr(super().__str__())) + + StarkSignerError.InvalidSignature = InvalidSignature + class InvalidPrivKey(StarkSignerError): + def __str__(self): + return "StarkSignerError.InvalidPrivKey({})".format(repr(super().__str__())) + + StarkSignerError.InvalidPrivKey = InvalidPrivKey + class SignError(StarkSignerError): + def __str__(self): + return "StarkSignerError.SignError({})".format(repr(super().__str__())) + + StarkSignerError.SignError = SignError + class RpcSignError(StarkSignerError): + def __str__(self): + return "StarkSignerError.RpcSignError({})".format(repr(super().__str__())) + + StarkSignerError.RpcSignError = RpcSignError +StarkSignerError = UniFFIExceptionTmpNamespace.StarkSignerError +del UniFFIExceptionTmpNamespace + + +class FfiConverterTypeStarkSignerError(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return StarkSignerError.InvalidStarknetSigner( + FfiConverterString.read(buf), + ) + if variant == 2: + return StarkSignerError.InvalidSignature( + FfiConverterString.read(buf), + ) + if variant == 3: + return StarkSignerError.InvalidPrivKey( + FfiConverterString.read(buf), + ) + if variant == 4: + return StarkSignerError.SignError( + FfiConverterString.read(buf), + ) + if variant == 5: + return StarkSignerError.RpcSignError( + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, StarkSignerError.InvalidStarknetSigner): + buf.writeI32(1) + if isinstance(value, StarkSignerError.InvalidSignature): + buf.writeI32(2) + if isinstance(value, StarkSignerError.InvalidPrivKey): + buf.writeI32(3) + if isinstance(value, StarkSignerError.SignError): + buf.writeI32(4) + if isinstance(value, StarkSignerError.RpcSignError): + buf.writeI32(5) + + + +# TypeError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separated, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class UniFFIExceptionTmpNamespace: + class TypeError(Exception): + pass + + class InvalidAddress(TypeError): + def __str__(self): + return "TypeError.InvalidAddress({})".format(repr(super().__str__())) + + TypeError.InvalidAddress = InvalidAddress + class InvalidTxHash(TypeError): + def __str__(self): + return "TypeError.InvalidTxHash({})".format(repr(super().__str__())) + + TypeError.InvalidTxHash = InvalidTxHash + class NotStartWithZerox(TypeError): + def __str__(self): + return "TypeError.NotStartWithZerox({})".format(repr(super().__str__())) + + TypeError.NotStartWithZerox = NotStartWithZerox + class SizeMismatch(TypeError): + def __str__(self): + return "TypeError.SizeMismatch({})".format(repr(super().__str__())) + + TypeError.SizeMismatch = SizeMismatch + class DecodeFromHexErr(TypeError): + def __str__(self): + return "TypeError.DecodeFromHexErr({})".format(repr(super().__str__())) + + TypeError.DecodeFromHexErr = DecodeFromHexErr + class TooBigInteger(TypeError): + def __str__(self): + return "TypeError.TooBigInteger({})".format(repr(super().__str__())) + + TypeError.TooBigInteger = TooBigInteger + class InvalidBigIntStr(TypeError): + def __str__(self): + return "TypeError.InvalidBigIntStr({})".format(repr(super().__str__())) + + TypeError.InvalidBigIntStr = InvalidBigIntStr +TypeError = UniFFIExceptionTmpNamespace.TypeError +del UniFFIExceptionTmpNamespace + + +class FfiConverterTypeTypeError(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return TypeError.InvalidAddress( + FfiConverterString.read(buf), + ) + if variant == 2: + return TypeError.InvalidTxHash( + FfiConverterString.read(buf), + ) + if variant == 3: + return TypeError.NotStartWithZerox( + FfiConverterString.read(buf), + ) + if variant == 4: + return TypeError.SizeMismatch( + FfiConverterString.read(buf), + ) + if variant == 5: + return TypeError.DecodeFromHexErr( + FfiConverterString.read(buf), + ) + if variant == 6: + return TypeError.TooBigInteger( + FfiConverterString.read(buf), + ) + if variant == 7: + return TypeError.InvalidBigIntStr( + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, TypeError.InvalidAddress): + buf.writeI32(1) + if isinstance(value, TypeError.InvalidTxHash): + buf.writeI32(2) + if isinstance(value, TypeError.NotStartWithZerox): + buf.writeI32(3) + if isinstance(value, TypeError.SizeMismatch): + buf.writeI32(4) + if isinstance(value, TypeError.DecodeFromHexErr): + buf.writeI32(5) + if isinstance(value, TypeError.TooBigInteger): + buf.writeI32(6) + if isinstance(value, TypeError.InvalidBigIntStr): + buf.writeI32(7) + + + +# ZkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separated, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class UniFFIExceptionTmpNamespace: + class ZkSignerError(Exception): + pass + + class CustomError(ZkSignerError): + def __str__(self): + return "ZkSignerError.CustomError({})".format(repr(super().__str__())) + + ZkSignerError.CustomError = CustomError + class InvalidSignature(ZkSignerError): + def __str__(self): + return "ZkSignerError.InvalidSignature({})".format(repr(super().__str__())) + + ZkSignerError.InvalidSignature = InvalidSignature + class InvalidPrivKey(ZkSignerError): + def __str__(self): + return "ZkSignerError.InvalidPrivKey({})".format(repr(super().__str__())) + + ZkSignerError.InvalidPrivKey = InvalidPrivKey + class InvalidSeed(ZkSignerError): + def __str__(self): + return "ZkSignerError.InvalidSeed({})".format(repr(super().__str__())) + + ZkSignerError.InvalidSeed = InvalidSeed + class InvalidPubkey(ZkSignerError): + def __str__(self): + return "ZkSignerError.InvalidPubkey({})".format(repr(super().__str__())) + + ZkSignerError.InvalidPubkey = InvalidPubkey + class InvalidPubkeyHash(ZkSignerError): + def __str__(self): + return "ZkSignerError.InvalidPubkeyHash({})".format(repr(super().__str__())) + + ZkSignerError.InvalidPubkeyHash = InvalidPubkeyHash + class EthSignerError(ZkSignerError): + def __str__(self): + return "ZkSignerError.EthSignerError({})".format(repr(super().__str__())) + + ZkSignerError.EthSignerError = EthSignerError + class StarkSignerError(ZkSignerError): + def __str__(self): + return "ZkSignerError.StarkSignerError({})".format(repr(super().__str__())) + + ZkSignerError.StarkSignerError = StarkSignerError +ZkSignerError = UniFFIExceptionTmpNamespace.ZkSignerError +del UniFFIExceptionTmpNamespace + + +class FfiConverterTypeZkSignerError(FfiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.readI32() + if variant == 1: + return ZkSignerError.CustomError( + FfiConverterString.read(buf), + ) + if variant == 2: + return ZkSignerError.InvalidSignature( + FfiConverterString.read(buf), + ) + if variant == 3: + return ZkSignerError.InvalidPrivKey( + FfiConverterString.read(buf), + ) + if variant == 4: + return ZkSignerError.InvalidSeed( + FfiConverterString.read(buf), + ) + if variant == 5: + return ZkSignerError.InvalidPubkey( + FfiConverterString.read(buf), + ) + if variant == 6: + return ZkSignerError.InvalidPubkeyHash( + FfiConverterString.read(buf), + ) + if variant == 7: + return ZkSignerError.EthSignerError( + FfiConverterString.read(buf), + ) + if variant == 8: + return ZkSignerError.StarkSignerError( + FfiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, ZkSignerError.CustomError): + buf.writeI32(1) + if isinstance(value, ZkSignerError.InvalidSignature): + buf.writeI32(2) + if isinstance(value, ZkSignerError.InvalidPrivKey): + buf.writeI32(3) + if isinstance(value, ZkSignerError.InvalidSeed): + buf.writeI32(4) + if isinstance(value, ZkSignerError.InvalidPubkey): + buf.writeI32(5) + if isinstance(value, ZkSignerError.InvalidPubkeyHash): + buf.writeI32(6) + if isinstance(value, ZkSignerError.EthSignerError): + buf.writeI32(7) + if isinstance(value, ZkSignerError.StarkSignerError): + buf.writeI32(8) + + + +class FfiConverterOptionalString(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterString.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterString.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterOptionalTypeZkLinkSignature(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterTypeZkLinkSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterTypeZkLinkSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterOptionalSequenceUInt8(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterSequenceUInt8.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterSequenceUInt8.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterOptionalTypeH256(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterTypeH256.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterTypeH256.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterOptionalTypePackedEthSignature(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterTypePackedEthSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterTypePackedEthSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterOptionalTypeTxLayer1Signature(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.writeU8(0) + return + + buf.writeU8(1) + FfiConverterTypeTxLayer1Signature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.readU8() + if flag == 0: + return None + elif flag == 1: + return FfiConverterTypeTxLayer1Signature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class FfiConverterSequenceUInt8(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterUInt8.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterUInt8.read(buf) for i in range(count) + ] + + + +class FfiConverterSequenceTypeContract(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterTypeContract.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterTypeContract.read(buf) for i in range(count) + ] + + + +class FfiConverterSequenceTypeContractPrice(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterTypeContractPrice.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterTypeContractPrice.read(buf) for i in range(count) + ] + + + +class FfiConverterSequenceTypeFundingInfo(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterTypeFundingInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterTypeFundingInfo.read(buf) for i in range(count) + ] + + + +class FfiConverterSequenceTypeSpotPriceInfo(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterTypeSpotPriceInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterTypeSpotPriceInfo.read(buf) for i in range(count) + ] + + + +class FfiConverterSequenceTypeAccountId(FfiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.writeI32(items) + for item in value: + FfiConverterTypeAccountId.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.readI32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + FfiConverterTypeAccountId.read(buf) for i in range(count) + ] + + +class FfiConverterTypeAccountId: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypeAddress: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeBigUint: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeBlockNumber: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypeChainId: + @staticmethod + def write(value, buf): + FfiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt8.lower(value) + + +class FfiConverterTypeEthBlockId: + @staticmethod + def write(value, buf): + FfiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt64.lower(value) + + +class FfiConverterTypeH256: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeMarginId: + @staticmethod + def write(value, buf): + FfiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt8.lower(value) + + +class FfiConverterTypeNonce: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypePackedEthSignature: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypePackedPublicKey: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypePackedSignature: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypePairId: + @staticmethod + def write(value, buf): + FfiConverterUInt16.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt16.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt16.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt16.lower(value) + + +class FfiConverterTypePriorityOpId: + @staticmethod + def write(value, buf): + FfiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt64.lower(value) + + +class FfiConverterTypePubKeyHash: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeSlotId: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypeStarkEip712Signature: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeSubAccountId: + @staticmethod + def write(value, buf): + FfiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt8.lower(value) + + +class FfiConverterTypeTimeStamp: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypeTokenId: + @staticmethod + def write(value, buf): + FfiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return FfiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return FfiConverterUInt32.lower(value) + + +class FfiConverterTypeTxHash: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeTxLayer1Signature: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeZkLinkAddress: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + + +class FfiConverterTypeZkLinkTx: + @staticmethod + def write(value, buf): + FfiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return FfiConverterString.read(buf) + + @staticmethod + def lift(value): + return FfiConverterString.lift(value) + + @staticmethod + def lower(value): + return FfiConverterString.lower(value) + +def verify_musig(signature,msg): + signature = signature + + msg = list(int(x) for x in msg) + + return FfiConverterBool.lift(rust_call(_UniFFILib.zklink_sdk_f180_verify_musig, + FfiConverterTypeZkLinkSignature.lower(signature), + FfiConverterSequenceUInt8.lower(msg))) + + + +def get_public_key_hash(public_key): + public_key = public_key + + return FfiConverterTypePubKeyHash.lift(rust_call(_UniFFILib.zklink_sdk_f180_get_public_key_hash, + FfiConverterTypePackedPublicKey.lower(public_key))) + + + +def zklink_main_net_url(): + return FfiConverterString.lift(rust_call(_UniFFILib.zklink_sdk_f180_zklink_main_net_url,)) + + + +def zklink_test_net_url(): + return FfiConverterString.lift(rust_call(_UniFFILib.zklink_sdk_f180_zklink_test_net_url,)) + + + +def eth_signature_of_change_pubkey(tx,eth_signer): + tx = tx + + eth_signer = eth_signer + + return FfiConverterTypePackedEthSignature.lift(rust_call_with_error(FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_eth_signature_of_change_pubkey, + FfiConverterTypeChangePubKey.lower(tx), + FfiConverterTypeEthSigner.lower(eth_signer))) + + + +def create_signed_change_pubkey(zklink_signer,tx,eth_auth_data): + zklink_signer = zklink_signer + + tx = tx + + eth_auth_data = eth_auth_data + + return FfiConverterTypeChangePubKey.lift(rust_call_with_error(FfiConverterTypeSignError,_UniFFILib.zklink_sdk_f180_create_signed_change_pubkey, + FfiConverterTypeZkLinkSigner.lower(zklink_signer), + FfiConverterTypeChangePubKey.lower(tx), + FfiConverterTypeChangePubKeyAuthData.lower(eth_auth_data))) + + + +__all__ = [ + "InternalError", + "ChangePubKeyAuthData", + "ChangePubKeyAuthRequest", + "L1SignerType", + "L1Type", + "Parameter", + "TypedDataMessage", + "AutoDeleveragingBuilder", + "ChangePubKeyBuilder", + "ContractBuilder", + "ContractMatchingBuilder", + "ContractPrice", + "Create2Data", + "DepositBuilder", + "ForcedExitBuilder", + "FullExitBuilder", + "FundingBuilder", + "FundingInfo", + "LiquidationBuilder", + "Message", + "OraclePrices", + "OrderMatchingBuilder", + "SpotPriceInfo", + "TransferBuilder", + "TxMessage", + "TxSignature", + "UpdateGlobalVarBuilder", + "WithdrawBuilder", + "ZkLinkSignature", + "verify_musig", + "get_public_key_hash", + "zklink_main_net_url", + "zklink_test_net_url", + "eth_signature_of_change_pubkey", + "create_signed_change_pubkey", + "Deposit", + "Withdraw", + "ChangePubKey", + "ForcedExit", + "FullExit", + "Transfer", + "Order", + "OrderMatching", + "Contract", + "AutoDeleveraging", + "ContractMatching", + "Funding", + "Liquidation", + "UpdateGlobalVar", + "EthSigner", + "TypedData", + "StarkSigner", + "ZkLinkSigner", + "Signer", + "EthSignerError", + "SignError", + "StarkSignerError", + "TypeError", + "ZkSignerError", +] + diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.dll b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.dll new file mode 100644 index 000000000..246206dbc Binary files /dev/null and b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.dll differ diff --git a/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.py b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.py new file mode 100644 index 000000000..d5700c469 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Apex/omni_files/zklink_sdk.py @@ -0,0 +1,7987 @@ +# This file was autogenerated by some hot garbage in the `uniffi` crate. +# Trust me, you don't want to mess with it! + +# Common helper code. +# +# Ideally this would live in a separate .py file where it can be unittested etc +# in isolation, and perhaps even published as a re-useable package. +# +# However, it's important that the details of how this helper code works (e.g. the +# way that different builtin types are passed across the FFI) exactly match what's +# expected by the rust code on the other side of the interface. In practice right +# now that means coming from the exact some version of `uniffi` that was used to +# compile the rust component. The easiest way to ensure this is to bundle the Python +# helpers directly inline like we're doing here. + +import os +import sys +import ctypes +import enum +import struct +import contextlib +import threading +import typing +import platform + +# Used for default argument values +_DEFAULT = object() + + +class _UniffiRustBuffer(ctypes.Structure): + _fields_ = [ + ("capacity", ctypes.c_int32), + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + @staticmethod + def alloc(size): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc, size) + + @staticmethod + def reserve(rbuf, additional): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve, rbuf, additional) + + def free(self): + return _rust_call(_UniffiLib.ffi_zklink_sdk_rustbuffer_free, self) + + def __str__(self): + return "_UniffiRustBuffer(capacity={}, len={}, data={})".format( + self.capacity, + self.len, + self.data[0:self.len] + ) + + @contextlib.contextmanager + def alloc_with_builder(*args): + """Context-manger to allocate a buffer using a _UniffiRustBufferBuilder. + + The allocated buffer will be automatically freed if an error occurs, ensuring that + we don't accidentally leak it. + """ + builder = _UniffiRustBufferBuilder() + try: + yield builder + except: + builder.discard() + raise + + @contextlib.contextmanager + def consume_with_stream(self): + """Context-manager to consume a buffer using a _UniffiRustBufferStream. + + The _UniffiRustBuffer will be freed once the context-manager exits, ensuring that we don't + leak it even if an error occurs. + """ + try: + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of consume_with_stream") + finally: + self.free() + + @contextlib.contextmanager + def read_with_stream(self): + """Context-manager to read a buffer using a _UniffiRustBufferStream. + + This is like consume_with_stream, but doesn't free the buffer afterwards. + It should only be used with borrowed `_UniffiRustBuffer` data. + """ + s = _UniffiRustBufferStream.from_rust_buffer(self) + yield s + if s.remaining() != 0: + raise RuntimeError("junk data left in buffer at end of read_with_stream") + +class _UniffiForeignBytes(ctypes.Structure): + _fields_ = [ + ("len", ctypes.c_int32), + ("data", ctypes.POINTER(ctypes.c_char)), + ] + + def __str__(self): + return "_UniffiForeignBytes(len={}, data={})".format(self.len, self.data[0:self.len]) + + +class _UniffiRustBufferStream: + """ + Helper for structured reading of bytes from a _UniffiRustBuffer + """ + + def __init__(self, data, len): + self.data = data + self.len = len + self.offset = 0 + + @classmethod + def from_rust_buffer(cls, buf): + return cls(buf.data, buf.len) + + def remaining(self): + return self.len - self.offset + + def _unpack_from(self, size, format): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + value = struct.unpack(format, self.data[self.offset:self.offset+size])[0] + self.offset += size + return value + + def read(self, size): + if self.offset + size > self.len: + raise InternalError("read past end of rust buffer") + data = self.data[self.offset:self.offset+size] + self.offset += size + return data + + def read_i8(self): + return self._unpack_from(1, ">b") + + def read_u8(self): + return self._unpack_from(1, ">B") + + def read_i16(self): + return self._unpack_from(2, ">h") + + def read_u16(self): + return self._unpack_from(2, ">H") + + def read_i32(self): + return self._unpack_from(4, ">i") + + def read_u32(self): + return self._unpack_from(4, ">I") + + def read_i64(self): + return self._unpack_from(8, ">q") + + def read_u64(self): + return self._unpack_from(8, ">Q") + + def read_float(self): + v = self._unpack_from(4, ">f") + return v + + def read_double(self): + return self._unpack_from(8, ">d") + + def read_c_size_t(self): + return self._unpack_from(ctypes.sizeof(ctypes.c_size_t) , "@N") + +class _UniffiRustBufferBuilder: + """ + Helper for structured writing of bytes into a _UniffiRustBuffer. + """ + + def __init__(self): + self.rbuf = _UniffiRustBuffer.alloc(16) + self.rbuf.len = 0 + + def finalize(self): + rbuf = self.rbuf + self.rbuf = None + return rbuf + + def discard(self): + if self.rbuf is not None: + rbuf = self.finalize() + rbuf.free() + + @contextlib.contextmanager + def _reserve(self, num_bytes): + if self.rbuf.len + num_bytes > self.rbuf.capacity: + self.rbuf = _UniffiRustBuffer.reserve(self.rbuf, num_bytes) + yield None + self.rbuf.len += num_bytes + + def _pack_into(self, size, format, value): + with self._reserve(size): + # XXX TODO: I feel like I should be able to use `struct.pack_into` here but can't figure it out. + for i, byte in enumerate(struct.pack(format, value)): + self.rbuf.data[self.rbuf.len + i] = byte + + def write(self, value): + with self._reserve(len(value)): + for i, byte in enumerate(value): + self.rbuf.data[self.rbuf.len + i] = byte + + def write_i8(self, v): + self._pack_into(1, ">b", v) + + def write_u8(self, v): + self._pack_into(1, ">B", v) + + def write_i16(self, v): + self._pack_into(2, ">h", v) + + def write_u16(self, v): + self._pack_into(2, ">H", v) + + def write_i32(self, v): + self._pack_into(4, ">i", v) + + def write_u32(self, v): + self._pack_into(4, ">I", v) + + def write_i64(self, v): + self._pack_into(8, ">q", v) + + def write_u64(self, v): + self._pack_into(8, ">Q", v) + + def write_float(self, v): + self._pack_into(4, ">f", v) + + def write_double(self, v): + self._pack_into(8, ">d", v) + + def write_c_size_t(self, v): + self._pack_into(ctypes.sizeof(ctypes.c_size_t) , "@N", v) +# A handful of classes and functions to support the generated data structures. +# This would be a good candidate for isolating in its own ffi-support lib. + +class InternalError(Exception): + pass + +class _UniffiRustCallStatus(ctypes.Structure): + """ + Error runtime. + """ + _fields_ = [ + ("code", ctypes.c_int8), + ("error_buf", _UniffiRustBuffer), + ] + + # These match the values from the uniffi::rustcalls module + CALL_SUCCESS = 0 + CALL_ERROR = 1 + CALL_PANIC = 2 + + def __str__(self): + if self.code == _UniffiRustCallStatus.CALL_SUCCESS: + return "_UniffiRustCallStatus(CALL_SUCCESS)" + elif self.code == _UniffiRustCallStatus.CALL_ERROR: + return "_UniffiRustCallStatus(CALL_ERROR)" + elif self.code == _UniffiRustCallStatus.CALL_PANIC: + return "_UniffiRustCallStatus(CALL_PANIC)" + else: + return "_UniffiRustCallStatus()" + +def _rust_call(fn, *args): + # Call a rust function + return _rust_call_with_error(None, fn, *args) + +def _rust_call_with_error(error_ffi_converter, fn, *args): + # Call a rust function and handle any errors + # + # This function is used for rust calls that return Result<> and therefore can set the CALL_ERROR status code. + # error_ffi_converter must be set to the _UniffiConverter for the error class that corresponds to the result. + call_status = _UniffiRustCallStatus(code=_UniffiRustCallStatus.CALL_SUCCESS, error_buf=_UniffiRustBuffer(0, 0, None)) + + args_with_error = args + (ctypes.byref(call_status),) + result = fn(*args_with_error) + _uniffi_check_call_status(error_ffi_converter, call_status) + return result + +def _uniffi_check_call_status(error_ffi_converter, call_status): + if call_status.code == _UniffiRustCallStatus.CALL_SUCCESS: + pass + elif call_status.code == _UniffiRustCallStatus.CALL_ERROR: + if error_ffi_converter is None: + call_status.error_buf.free() + raise InternalError("_rust_call_with_error: CALL_ERROR, but error_ffi_converter is None") + else: + raise error_ffi_converter.lift(call_status.error_buf) + elif call_status.code == _UniffiRustCallStatus.CALL_PANIC: + # When the rust code sees a panic, it tries to construct a _UniffiRustBuffer + # with the message. But if that code panics, then it just sends back + # an empty buffer. + if call_status.error_buf.len > 0: + msg = _UniffiConverterString.lift(call_status.error_buf) + else: + msg = "Unknown rust panic" + raise InternalError(msg) + else: + raise InternalError("Invalid _UniffiRustCallStatus code: {}".format( + call_status.code)) + +# A function pointer for a callback as defined by UniFFI. +# Rust definition `fn(handle: u64, method: u32, args: _UniffiRustBuffer, buf_ptr: *mut _UniffiRustBuffer) -> int` +_UNIFFI_FOREIGN_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_ulonglong, ctypes.c_ulong, ctypes.POINTER(ctypes.c_char), ctypes.c_int, ctypes.POINTER(_UniffiRustBuffer)) + +# UniFFI future continuation +_UNIFFI_FUTURE_CONTINUATION_T = ctypes.CFUNCTYPE(None, ctypes.c_size_t, ctypes.c_int8) + +class _UniffiPointerManagerCPython: + """ + Manage giving out pointers to Python objects on CPython + + This class is used to generate opaque pointers that reference Python objects to pass to Rust. + It assumes a CPython platform. See _UniffiPointerManagerGeneral for the alternative. + """ + + def new_pointer(self, obj): + """ + Get a pointer for an object as a ctypes.c_size_t instance + + Each call to new_pointer() must be balanced with exactly one call to release_pointer() + + This returns a ctypes.c_size_t. This is always the same size as a pointer and can be + interchanged with pointers for FFI function arguments and return values. + """ + # IncRef the object since we're going to pass a pointer to Rust + ctypes.pythonapi.Py_IncRef(ctypes.py_object(obj)) + # id() is the object address on CPython + # (https://docs.python.org/3/library/functions.html#id) + return id(obj) + + def release_pointer(self, address): + py_obj = ctypes.cast(address, ctypes.py_object) + obj = py_obj.value + ctypes.pythonapi.Py_DecRef(py_obj) + return obj + + def lookup(self, address): + return ctypes.cast(address, ctypes.py_object).value + +class _UniffiPointerManagerGeneral: + """ + Manage giving out pointers to Python objects on non-CPython platforms + + This has the same API as _UniffiPointerManagerCPython, but doesn't assume we're running on + CPython and is slightly slower. + + Instead of using real pointers, it maps integer values to objects and returns the keys as + c_size_t values. + """ + + def __init__(self): + self._map = {} + self._lock = threading.Lock() + self._current_handle = 0 + + def new_pointer(self, obj): + with self._lock: + handle = self._current_handle + self._current_handle += 1 + self._map[handle] = obj + return handle + + def release_pointer(self, handle): + with self._lock: + return self._map.pop(handle) + + def lookup(self, handle): + with self._lock: + return self._map[handle] + +# Pick an pointer manager implementation based on the platform +if platform.python_implementation() == 'CPython': + _UniffiPointerManager = _UniffiPointerManagerCPython # type: ignore +else: + _UniffiPointerManager = _UniffiPointerManagerGeneral # type: ignore +# Types conforming to `_UniffiConverterPrimitive` pass themselves directly over the FFI. +class _UniffiConverterPrimitive: + @classmethod + def check(cls, value): + return value + + @classmethod + def lift(cls, value): + return value + + @classmethod + def lower(cls, value): + return cls.lowerUnchecked(cls.check(value)) + + @classmethod + def lowerUnchecked(cls, value): + return value + + @classmethod + def write(cls, value, buf): + cls.write_unchecked(cls.check(value), buf) + +class _UniffiConverterPrimitiveInt(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__index__() + except Exception: + raise TypeError("'{}' object cannot be interpreted as an integer".format(type(value).__name__)) + if not isinstance(value, int): + raise TypeError("__index__ returned non-int (type {})".format(type(value).__name__)) + if not cls.VALUE_MIN <= value < cls.VALUE_MAX: + raise ValueError("{} requires {} <= value < {}".format(cls.CLASS_NAME, cls.VALUE_MIN, cls.VALUE_MAX)) + return super().check(value) + +class _UniffiConverterPrimitiveFloat(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + try: + value = value.__float__() + except Exception: + raise TypeError("must be real number, not {}".format(type(value).__name__)) + if not isinstance(value, float): + raise TypeError("__float__ returned non-float (type {})".format(type(value).__name__)) + return super().check(value) + +# Helper class for wrapper types that will always go through a _UniffiRustBuffer. +# Classes should inherit from this and implement the `read` and `write` static methods. +class _UniffiConverterRustBuffer: + @classmethod + def lift(cls, rbuf): + with rbuf.consume_with_stream() as stream: + return cls.read(stream) + + @classmethod + def lower(cls, value): + with _UniffiRustBuffer.alloc_with_builder() as builder: + cls.write(value, builder) + return builder.finalize() + +# Contains loading, initialization code, and the FFI Function declarations. +# Define some ctypes FFI types that we use in the library + +""" +ctypes type for the foreign executor callback. This is a built-in interface for scheduling +tasks + +Args: + executor: opaque c_size_t value representing the eventloop + delay: delay in ms + task: function pointer to the task callback + task_data: void pointer to the task callback data + +Normally we should call task(task_data) after the detail. +However, when task is NULL this indicates that Rust has dropped the ForeignExecutor and we should +decrease the EventLoop refcount. +""" +_UNIFFI_FOREIGN_EXECUTOR_CALLBACK_T = ctypes.CFUNCTYPE(ctypes.c_int8, ctypes.c_size_t, ctypes.c_uint32, ctypes.c_void_p, ctypes.c_void_p) + +""" +Function pointer for a Rust task, which a callback function that takes a opaque pointer +""" +_UNIFFI_RUST_TASK = ctypes.CFUNCTYPE(None, ctypes.c_void_p, ctypes.c_int8) + +def _uniffi_future_callback_t(return_type): + """ + Factory function to create callback function types for async functions + """ + return ctypes.CFUNCTYPE(None, ctypes.c_size_t, return_type, _UniffiRustCallStatus) + +def _uniffi_load_indirect(): + """ + This is how we find and load the dynamic library provided by the component. + For now we just look it up by name. + """ + if sys.platform == "darwin": + libname = "lib{}.dylib" + elif sys.platform.startswith("win"): + # As of python3.8, ctypes does not seem to search $PATH when loading DLLs. + # We could use `os.add_dll_directory` to configure the search path, but + # it doesn't feel right to mess with application-wide settings. Let's + # assume that the `.dll` is next to the `.py` file and load by full path. + libname = os.path.join( + os.path.dirname(__file__), + "{}.dll", + ) + else: + # Anything else must be an ELF platform - Linux, *BSD, Solaris/illumos + libname = "lib{}.so" + + libname = libname.format("zklink_sdk") + path = os.path.join(os.path.dirname(__file__), libname) + lib = ctypes.cdll.LoadLibrary(path) + return lib + +def _uniffi_check_contract_api_version(lib): + # Get the bindings contract version from our ComponentInterface + bindings_contract_version = 24 + # Get the scaffolding contract version by calling the into the dylib + scaffolding_contract_version = lib.ffi_zklink_sdk_uniffi_contract_version() + if bindings_contract_version != scaffolding_contract_version: + raise InternalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") + +def _uniffi_check_api_checksums(lib): + if lib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey() != 63374: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey() != 32759: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_get_public_key_hash() != 58294: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_verify_musig() != 61749: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url() != 63488: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url() != 4933: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx() != 63490: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes() != 44684: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature() != 16515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid() != 2829: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid() != 32196: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str() != 3439: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx() != 64239: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash() != 35167: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes() != 1938: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature() != 51549: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain() != 10977: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid() != 25271: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid() != 31315: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str() != 43695: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx() != 42088: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash() != 26881: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract() != 3720: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_bytes() != 6953: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_get_signature() != 60348: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_long() != 52375: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_short() != 24664: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid() != 33071: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx() != 44741: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes() != 12250: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature() != 41128: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid() != 33576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid() != 55586: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str() != 42918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx() != 43065: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash() != 3288: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes() != 46958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_json_str() != 17811: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash() != 37358: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address() != 11362: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message() != 14536: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx() != 17267: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes() != 15553: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature() != 48117: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid() != 6534: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid() != 46100: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str() != 4050: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx() != 32455: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash() != 45462: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes() != 52461: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid() != 57198: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_json_str() != 24199: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx() != 51607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash() != 48511: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx() != 38824: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_bytes() != 63867: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_get_signature() != 29468: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid() != 50669: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_is_valid() != 4189: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_json_str() != 55097: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx() != 27295: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_funding_tx_hash() != 26610: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx() != 18143: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes() != 1134: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature() != 31505: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid() != 8478: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid() != 2828: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_json_str() != 62587: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx() != 30414: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash() != 34918: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_create_signed_order() != 18530: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_bytes() != 51161: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg() != 11725: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_get_signature() != 46876: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid() != 6764: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_is_valid() != 56951: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_order_json_str() != 20284: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx() != 27728: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes() != 13177: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature() != 35878: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid() != 54946: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid() != 51995: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str() != 33830: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx() != 23870: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash() != 3162: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging() != 3485: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth() != 39808: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth() != 63567: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data() != 26921: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching() != 27932: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit() != 37862: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_funding() != 31213: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation() != 56257: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching() != 19982: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer() != 51577: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw() != 56851: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message() != 27027: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx() != 17446: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature() != 18454: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes() != 56287: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg() != 46393: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_get_signature() != 55226: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid() != 31540: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_is_valid() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_json_str() != 28252: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx() != 64899: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash() != 16259: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes() != 40576: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid() != 7961: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str() != 48653: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx() != 40091: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash() != 4261: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx() != 15886: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature() != 28825: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes() != 15999: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg() != 27813: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature() != 56920: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid() != 9636: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid() != 32004: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_json_str() != 3719: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx() != 26934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash() != 25800: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key() != 11211: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig() != 46475: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new() != 10122: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new() != 10607: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contract_new() != 32968: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new() != 210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_deposit_new() != 2732: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new() != 58738: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new() != 30328: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_fullexit_new() != 27234: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_funding_new() != 62515: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_liquidation_new() != 56634: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_order_new() != 13958: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new() != 5934: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_signer_new() != 24354: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new() != 61581: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str() != 57960: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_transfer_new() != 31981: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_typeddata_new() != 46773: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new() != 31819: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_withdraw_new() != 47491: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new() != 62411: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes() != 17619: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer() != 60210: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer() != 21809: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed() != 47514: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + +# A ctypes library to expose the extern-C FFI definitions. +# This is an implementation detail which will be called internally by the public API. + +_UniffiLib = _uniffi_load_indirect() +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contract.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_deposit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_funding.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_order.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_order.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.argtypes = ( + ctypes.c_uint32, + ctypes.c_uint8, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + ctypes.c_uint32, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_int8, + ctypes.c_int8, + ctypes.c_uint8, + ctypes.c_uint8, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.c_uint8, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_signer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_transfer.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner.restype = None +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.argtypes = ( + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey.restype = ctypes.c_void_p +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.argtypes = ( + ctypes.c_void_p, + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig.restype = ctypes.c_int8 +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url.restype = _UniffiRustBuffer +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.argtypes = ( + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_alloc.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.argtypes = ( + _UniffiForeignBytes, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_from_bytes.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_free.restype = None +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.argtypes = ( + _UniffiRustBuffer, + ctypes.c_int32, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rustbuffer_reserve.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.argtypes = ( + _UNIFFI_FUTURE_CONTINUATION_T, +) +_UniffiLib.ffi_zklink_sdk_rust_future_continuation_callback_set.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u8.restype = ctypes.c_uint8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i8.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i8.restype = ctypes.c_int8 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u16.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i16.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i16.restype = ctypes.c_int16 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u32.restype = ctypes.c_uint32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i32.restype = ctypes.c_int32 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_u64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_u64.restype = ctypes.c_uint64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_i64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_i64.restype = ctypes.c_int64 +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f32.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f32.restype = ctypes.c_float +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_f64.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_f64.restype = ctypes.c_double +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_pointer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_pointer.restype = ctypes.c_void_p +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_rust_buffer.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_rust_buffer.restype = _UniffiRustBuffer +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.argtypes = ( + ctypes.c_void_p, + ctypes.c_size_t, +) +_UniffiLib.ffi_zklink_sdk_rust_future_poll_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_cancel_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.argtypes = ( + ctypes.c_void_p, +) +_UniffiLib.ffi_zklink_sdk_rust_future_free_void.restype = None +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.argtypes = ( + ctypes.c_void_p, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.ffi_zklink_sdk_rust_future_complete_void.restype = None +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_create_signed_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_eth_signature_of_change_pubkey.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_get_public_key_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_verify_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_main_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_func_zklink_test_net_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_autodeleveraging_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_onchain.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_changepubkey_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_create_signed_contract.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_long.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_short.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contract_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_contractmatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_deposit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_get_address.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ethsigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_forcedexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_fullexit_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_funding_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_liquidation_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_create_signed_order.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_order_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_ordermatching_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_auto_deleveraging.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_create2data_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_eth_ecdsa_auth.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_change_pubkey_with_onchain_auth_data.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_contract_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_forced_exit.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_funding.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_liquidation.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_order_matching.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_transfer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_signer_sign_withdraw.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_starksigner_sign_message.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_transfer_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_updateglobalvar_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_create_signed_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_eth_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_eth_sign_msg.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_get_signature.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_signature_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_is_valid.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_json_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_to_zklink_tx.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_withdraw_tx_hash.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_public_key.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_method_zklinksigner_sign_musig.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_autodeleveraging_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_changepubkey_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contract_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_contractmatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_deposit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ethsigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_forcedexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_fullexit_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_funding_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_liquidation_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_order_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_ordermatching_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_signer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_starksigner_new_from_hex_str.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_transfer_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_typeddata_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_updateglobalvar_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_withdraw_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_bytes.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_eth_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_hex_stark_signer.restype = ctypes.c_uint16 +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.argtypes = ( +) +_UniffiLib.uniffi_zklink_sdk_checksum_constructor_zklinksigner_new_from_seed.restype = ctypes.c_uint16 +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.argtypes = ( +) +_UniffiLib.ffi_zklink_sdk_uniffi_contract_version.restype = ctypes.c_uint32 +_uniffi_check_contract_api_version(_UniffiLib) +_uniffi_check_api_checksums(_UniffiLib) + +# Async support + +# Public interface members begin here. + + +class _UniffiConverterUInt8(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u8" + VALUE_MIN = 0 + VALUE_MAX = 2**8 + + @staticmethod + def read(buf): + return buf.read_u8() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u8(value) + +class _UniffiConverterUInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u16" + VALUE_MIN = 0 + VALUE_MAX = 2**16 + + @staticmethod + def read(buf): + return buf.read_u16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u16(value) + +class _UniffiConverterInt16(_UniffiConverterPrimitiveInt): + CLASS_NAME = "i16" + VALUE_MIN = -2**15 + VALUE_MAX = 2**15 + + @staticmethod + def read(buf): + return buf.read_i16() + + @staticmethod + def write_unchecked(value, buf): + buf.write_i16(value) + +class _UniffiConverterUInt32(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u32" + VALUE_MIN = 0 + VALUE_MAX = 2**32 + + @staticmethod + def read(buf): + return buf.read_u32() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u32(value) + +class _UniffiConverterUInt64(_UniffiConverterPrimitiveInt): + CLASS_NAME = "u64" + VALUE_MIN = 0 + VALUE_MAX = 2**64 + + @staticmethod + def read(buf): + return buf.read_u64() + + @staticmethod + def write_unchecked(value, buf): + buf.write_u64(value) + +class _UniffiConverterBool(_UniffiConverterPrimitive): + @classmethod + def check(cls, value): + return not not value + + @classmethod + def read(cls, buf): + return cls.lift(buf.read_u8()) + + @classmethod + def write_unchecked(cls, value, buf): + buf.write_u8(value) + + @staticmethod + def lift(value): + return value != 0 + +class _UniffiConverterString: + @staticmethod + def check(value): + if not isinstance(value, str): + raise TypeError("argument must be str, not {}".format(type(value).__name__)) + return value + + @staticmethod + def read(buf): + size = buf.read_i32() + if size < 0: + raise InternalError("Unexpected negative string length") + utf8_bytes = buf.read(size) + return utf8_bytes.decode("utf-8") + + @staticmethod + def write(value, buf): + value = _UniffiConverterString.check(value) + utf8_bytes = value.encode("utf-8") + buf.write_i32(len(utf8_bytes)) + buf.write(utf8_bytes) + + @staticmethod + def lift(buf): + with buf.consume_with_stream() as stream: + return stream.read(stream.remaining()).decode("utf-8") + + @staticmethod + def lower(value): + value = _UniffiConverterString.check(value) + with _UniffiRustBuffer.alloc_with_builder() as builder: + builder.write(value.encode("utf-8")) + return builder.finalize() + + + +class AutoDeleveraging: + _pointer: ctypes.c_void_p + def __init__(self, builder: "AutoDeleveragingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_autodeleveraging_new, + _UniffiConverterTypeAutoDeleveragingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_autodeleveraging, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "AutoDeleveraging": + + return _UniffiConverterTypeAutoDeleveraging.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_autodeleveraging_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeAutoDeleveraging: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, AutoDeleveraging): + raise TypeError("Expected AutoDeleveraging instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return AutoDeleveraging._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ChangePubKey: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ChangePubKeyBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_changepubkey_new, + _UniffiConverterTypeChangePubKeyBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_changepubkey, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_get_signature,self._pointer,) + ) + + + + + + + def is_onchain(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_onchain,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_changepubkey_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeChangePubKey: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ChangePubKey): + raise TypeError("Expected ChangePubKey instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ChangePubKey._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Contract: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contract_new, + _UniffiConverterTypeContractBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contract, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_contract(self, zklink_signer: "ZkLinkSigner") -> "Contract": + + return _UniffiConverterTypeContract.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contract_create_signed_contract,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_get_signature,self._pointer,) + ) + + + + + + + def is_long(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_long,self._pointer,) + ) + + + + + + + def is_short(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_short,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contract_is_signature_valid,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContract: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Contract): + raise TypeError("Expected Contract instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Contract._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ContractMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ContractMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_contractmatching_new, + _UniffiConverterTypeContractMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_contractmatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ContractMatching": + + return _UniffiConverterTypeContractMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_contractmatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeContractMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ContractMatching): + raise TypeError("Expected ContractMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ContractMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Deposit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "DepositBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_deposit_new, + _UniffiConverterTypeDepositBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_deposit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_get_bytes,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_json_str,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_deposit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeDeposit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Deposit): + raise TypeError("Expected Deposit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Deposit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class EthSigner: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str): + + self._pointer = _rust_call_with_error(_UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_ethsigner_new, + _UniffiConverterString.lower(private_key)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ethsigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_address(self, ) -> "Address": + return _UniffiConverterTypeAddress.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_get_address,self._pointer,) + ) + + + + + + + def sign_message(self, message: "typing.List[int]") -> "PackedEthSignature": + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeEthSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ethsigner_sign_message,self._pointer, + _UniffiConverterSequenceUInt8.lower(message)) + ) + + + + + + +class _UniffiConverterTypeEthSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, EthSigner): + raise TypeError("Expected EthSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return EthSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ForcedExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "ForcedExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_forcedexit_new, + _UniffiConverterTypeForcedExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_forcedexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "ForcedExit": + + return _UniffiConverterTypeForcedExit.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_forcedexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeForcedExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ForcedExit): + raise TypeError("Expected ForcedExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ForcedExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class FullExit: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FullExitBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_fullexit_new, + _UniffiConverterTypeFullExitBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_fullexit, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_fullexit_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFullExit: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, FullExit): + raise TypeError("Expected FullExit instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return FullExit._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Funding: + _pointer: ctypes.c_void_p + def __init__(self, builder: "FundingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_funding_new, + _UniffiConverterTypeFundingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_funding, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Funding": + + return _UniffiConverterTypeFunding.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_funding_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_funding_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeFunding: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Funding): + raise TypeError("Expected Funding instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Funding._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Liquidation: + _pointer: ctypes.c_void_p + def __init__(self, builder: "LiquidationBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_liquidation_new, + _UniffiConverterTypeLiquidationBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_liquidation, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Liquidation": + + return _UniffiConverterTypeLiquidation.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_liquidation_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeLiquidation: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Liquidation): + raise TypeError("Expected Liquidation instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Liquidation._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Order: + _pointer: ctypes.c_void_p + def __init__(self, account_id: "AccountId",sub_account_id: "SubAccountId",slot_id: "SlotId",nonce: "Nonce",base_token_id: "TokenId",quote_token_id: "TokenId",amount: "BigUint",price: "BigUint",is_sell: "bool",has_subsidy: "bool",maker_fee_rate: "int",taker_fee_rate: "int",signature: "typing.Optional[ZkLinkSignature]"): + + + + + + + + + + + + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_order_new, + _UniffiConverterTypeAccountId.lower(account_id), + _UniffiConverterTypeSubAccountId.lower(sub_account_id), + _UniffiConverterTypeSlotId.lower(slot_id), + _UniffiConverterTypeNonce.lower(nonce), + _UniffiConverterTypeTokenId.lower(base_token_id), + _UniffiConverterTypeTokenId.lower(quote_token_id), + _UniffiConverterTypeBigUint.lower(amount), + _UniffiConverterTypeBigUint.lower(price), + _UniffiConverterBool.lower(is_sell), + _UniffiConverterBool.lower(has_subsidy), + _UniffiConverterUInt8.lower(maker_fee_rate), + _UniffiConverterUInt8.lower(taker_fee_rate), + _UniffiConverterOptionalTypeZkLinkSignature.lower(signature)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_order, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_order(self, zklink_signer: "ZkLinkSigner") -> "Order": + + return _UniffiConverterTypeOrder.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_order_create_signed_order,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, quote_token: str,based_token: str,decimals: "int") -> str: + + + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(quote_token), + _UniffiConverterString.lower(based_token), + _UniffiConverterUInt8.lower(decimals)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_order_json_str,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrder: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Order): + raise TypeError("Expected Order instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Order._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class OrderMatching: + _pointer: ctypes.c_void_p + def __init__(self, builder: "OrderMatchingBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_ordermatching_new, + _UniffiConverterTypeOrderMatchingBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_ordermatching, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "OrderMatching": + + return _UniffiConverterTypeOrderMatching.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_bytes,self._pointer,) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_ordermatching_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeOrderMatching: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, OrderMatching): + raise TypeError("Expected OrderMatching instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return OrderMatching._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Signer: + _pointer: ctypes.c_void_p + def __init__(self, private_key: str,l1_type: "L1SignerType"): + + + self._pointer = _rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_signer_new, + _UniffiConverterString.lower(private_key), + _UniffiConverterTypeL1SignerType.lower(l1_type)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_signer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def sign_auto_deleveraging(self, tx: "AutoDeleveraging") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_auto_deleveraging,self._pointer, + _UniffiConverterTypeAutoDeleveraging.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_create2data_auth(self, tx: "ChangePubKey",crate2data: "Create2Data") -> "TxSignature": + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_create2data_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeCreate2Data.lower(crate2data)) + ) + + + + + + + def sign_change_pubkey_with_eth_ecdsa_auth(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_eth_ecdsa_auth,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_change_pubkey_with_onchain_auth_data(self, tx: "ChangePubKey") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_change_pubkey_with_onchain_auth_data,self._pointer, + _UniffiConverterTypeChangePubKey.lower(tx)) + ) + + + + + + + def sign_contract_matching(self, tx: "ContractMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_contract_matching,self._pointer, + _UniffiConverterTypeContractMatching.lower(tx)) + ) + + + + + + + def sign_forced_exit(self, tx: "ForcedExit") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_forced_exit,self._pointer, + _UniffiConverterTypeForcedExit.lower(tx)) + ) + + + + + + + def sign_funding(self, tx: "Funding") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_funding,self._pointer, + _UniffiConverterTypeFunding.lower(tx)) + ) + + + + + + + def sign_liquidation(self, tx: "Liquidation") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_liquidation,self._pointer, + _UniffiConverterTypeLiquidation.lower(tx)) + ) + + + + + + + def sign_order_matching(self, tx: "OrderMatching") -> "TxSignature": + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_order_matching,self._pointer, + _UniffiConverterTypeOrderMatching.lower(tx)) + ) + + + + + + + def sign_transfer(self, tx: "Transfer",token_sybmol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_transfer,self._pointer, + _UniffiConverterTypeTransfer.lower(tx), + _UniffiConverterString.lower(token_sybmol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + + def sign_withdraw(self, tx: "Withdraw",l2_source_token_symbol: str,chain_id: "typing.Optional[str]",addr: "typing.Optional[str]") -> "TxSignature": + + + + + return _UniffiConverterTypeTxSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_method_signer_sign_withdraw,self._pointer, + _UniffiConverterTypeWithdraw.lower(tx), + _UniffiConverterString.lower(l2_source_token_symbol), + _UniffiConverterOptionalString.lower(chain_id), + _UniffiConverterOptionalString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Signer): + raise TypeError("Expected Signer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Signer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class StarkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_starksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_hex_str(cls, hex_str: str): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_starksigner_new_from_hex_str, + _UniffiConverterString.lower(hex_str)) + return cls._make_instance_(pointer) + + + + def sign_message(self, typed_data: "TypedData",addr: str) -> "StarkEip712Signature": + + + return _UniffiConverterTypeStarkEip712Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeStarkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_starksigner_sign_message,self._pointer, + _UniffiConverterTypeTypedData.lower(typed_data), + _UniffiConverterString.lower(addr)) + ) + + + + + + +class _UniffiConverterTypeStarkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, StarkSigner): + raise TypeError("Expected StarkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return StarkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Transfer: + _pointer: ctypes.c_void_p + def __init__(self, builder: "TransferBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_transfer_new, + _UniffiConverterTypeTransferBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_transfer, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Transfer": + + return _UniffiConverterTypeTransfer.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",token_symbol: str) -> "TxLayer1Signature": + + + return _UniffiConverterTypeTxLayer1Signature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str) -> str: + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_transfer_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeTransfer: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Transfer): + raise TypeError("Expected Transfer instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Transfer._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class TypedData: + _pointer: ctypes.c_void_p + def __init__(self, message: "TypedDataMessage",chain_id: str): + + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_typeddata_new, + _UniffiConverterTypeTypedDataMessage.lower(message), + _UniffiConverterString.lower(chain_id)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_typeddata, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + +class _UniffiConverterTypeTypedData: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, TypedData): + raise TypeError("Expected TypedData instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return TypedData._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class UpdateGlobalVar: + _pointer: ctypes.c_void_p + def __init__(self, builder: "UpdateGlobalVarBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_updateglobalvar_new, + _UniffiConverterTypeUpdateGlobalVarBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_updateglobalvar, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_get_bytes,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_updateglobalvar_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeUpdateGlobalVar: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, UpdateGlobalVar): + raise TypeError("Expected UpdateGlobalVar instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return UpdateGlobalVar._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class Withdraw: + _pointer: ctypes.c_void_p + def __init__(self, builder: "WithdrawBuilder"): + + self._pointer = _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_constructor_withdraw_new, + _UniffiConverterTypeWithdrawBuilder.lower(builder)) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_withdraw, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + + def create_signed_tx(self, signer: "ZkLinkSigner") -> "Withdraw": + + return _UniffiConverterTypeWithdraw.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_create_signed_tx,self._pointer, + _UniffiConverterTypeZkLinkSigner.lower(signer)) + ) + + + + + + + def eth_signature(self, eth_signer: "EthSigner",l2_source_token_symbol: str) -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_eth_signature,self._pointer, + _UniffiConverterTypeEthSigner.lower(eth_signer), + _UniffiConverterString.lower(l2_source_token_symbol)) + ) + + + + + + + def get_bytes(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_bytes,self._pointer,) + ) + + + + + + + def get_eth_sign_msg(self, token_symbol: str) -> str: + + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_eth_sign_msg,self._pointer, + _UniffiConverterString.lower(token_symbol)) + ) + + + + + + + def get_signature(self, ) -> "ZkLinkSignature": + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_get_signature,self._pointer,) + ) + + + + + + + def is_signature_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_signature_valid,self._pointer,) + ) + + + + + + + def is_valid(self, ) -> "bool": + return _UniffiConverterBool.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_is_valid,self._pointer,) + ) + + + + + + + def json_str(self, ) -> str: + return _UniffiConverterString.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_json_str,self._pointer,) + ) + + + + + + + def to_zklink_tx(self, ) -> "ZkLinkTx": + return _UniffiConverterTypeZkLinkTx.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_to_zklink_tx,self._pointer,) + ) + + + + + + + def tx_hash(self, ) -> "typing.List[int]": + return _UniffiConverterSequenceUInt8.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_withdraw_tx_hash,self._pointer,) + ) + + + + + + +class _UniffiConverterTypeWithdraw: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, Withdraw): + raise TypeError("Expected Withdraw instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return Withdraw._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + + +class ZkLinkSigner: + _pointer: ctypes.c_void_p + def __init__(self, ): + self._pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new,) + + def __del__(self): + # In case of partial initialization of instances. + pointer = getattr(self, "_pointer", None) + if pointer is not None: + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_free_zklinksigner, pointer) + + # Used by alternative constructors or any methods which return this type. + @classmethod + def _make_instance_(cls, pointer): + # Lightly yucky way to bypass the usual __init__ logic + # and just create a new instance with the required pointer. + inst = cls.__new__(cls) + inst._pointer = pointer + return inst + + @classmethod + def new_from_bytes(cls, slice: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_bytes, + _UniffiConverterSequenceUInt8.lower(slice)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_eth_signer(cls, eth_hex_private_key): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_eth_signer, + _UniffiConverterString.lower(eth_hex_private_key)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_hex_stark_signer(cls, hex_private_key: str,addr: str,chain_id: str): + + + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_hex_stark_signer, + _UniffiConverterString.lower(hex_private_key), + _UniffiConverterString.lower(addr), + _UniffiConverterString.lower(chain_id)) + return cls._make_instance_(pointer) + + + @classmethod + def new_from_seed(cls, seed: "typing.List[int]"): + + # Call the (fallible) function before creating any half-baked object instances. + pointer = _rust_call_with_error(_UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_constructor_zklinksigner_new_from_seed, + _UniffiConverterSequenceUInt8.lower(seed)) + return cls._make_instance_(pointer) + + + + def public_key(self, ) -> "PackedPublicKey": + return _UniffiConverterTypePackedPublicKey.lift( + _rust_call(_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_public_key,self._pointer,) + ) + + + + + + + def sign_musig(self, msg: "typing.List[int]") -> "ZkLinkSignature": + + return _UniffiConverterTypeZkLinkSignature.lift( + _rust_call_with_error( + _UniffiConverterTypeZkSignerError,_UniffiLib.uniffi_zklink_sdk_fn_method_zklinksigner_sign_musig,self._pointer, + _UniffiConverterSequenceUInt8.lower(msg)) + ) + + + + + + +class _UniffiConverterTypeZkLinkSigner: + @classmethod + def read(cls, buf): + ptr = buf.read_u64() + if ptr == 0: + raise InternalError("Raw pointer value was null") + return cls.lift(ptr) + + @classmethod + def write(cls, value, buf): + if not isinstance(value, ZkLinkSigner): + raise TypeError("Expected ZkLinkSigner instance, {} found".format(type(value).__name__)) + buf.write_u64(cls.lower(value)) + + @staticmethod + def lift(value): + return ZkLinkSigner._make_instance_(value) + + @staticmethod + def lower(value): + return value._pointer + + +class AutoDeleveragingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";adl_account_id: "AccountId";pair_id: "PairId";adl_size: "BigUint";adl_price: "BigUint";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", adl_account_id: "AccountId", pair_id: "PairId", adl_size: "BigUint", adl_price: "BigUint", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.adl_account_id = adl_account_id + self.pair_id = pair_id + self.adl_size = adl_size + self.adl_price = adl_price + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "AutoDeleveragingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, adl_account_id={}, pair_id={}, adl_size={}, adl_price={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.adl_account_id, self.pair_id, self.adl_size, self.adl_price, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.adl_account_id != other.adl_account_id: + return False + if self.pair_id != other.pair_id: + return False + if self.adl_size != other.adl_size: + return False + if self.adl_price != other.adl_price: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeAutoDeleveragingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return AutoDeleveragingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + adl_account_id=_UniffiConverterTypeAccountId.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + adl_size=_UniffiConverterTypeBigUint.read(buf), + adl_price=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.adl_account_id, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.adl_size, buf) + _UniffiConverterTypeBigUint.write(value.adl_price, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class ChangePubKeyBuilder: + chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";new_pubkey_hash: "PubKeyHash";fee_token: "TokenId";fee: "BigUint";nonce: "Nonce";eth_signature: "typing.Optional[PackedEthSignature]";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", new_pubkey_hash: "PubKeyHash", fee_token: "TokenId", fee: "BigUint", nonce: "Nonce", eth_signature: "typing.Optional[PackedEthSignature]", timestamp: "TimeStamp"): + self.chain_id = chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.new_pubkey_hash = new_pubkey_hash + self.fee_token = fee_token + self.fee = fee + self.nonce = nonce + self.eth_signature = eth_signature + self.timestamp = timestamp + + def __str__(self): + return "ChangePubKeyBuilder(chain_id={}, account_id={}, sub_account_id={}, new_pubkey_hash={}, fee_token={}, fee={}, nonce={}, eth_signature={}, timestamp={})".format(self.chain_id, self.account_id, self.sub_account_id, self.new_pubkey_hash, self.fee_token, self.fee, self.nonce, self.eth_signature, self.timestamp) + + def __eq__(self, other): + if self.chain_id != other.chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.new_pubkey_hash != other.new_pubkey_hash: + return False + if self.fee_token != other.fee_token: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.eth_signature != other.eth_signature: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeChangePubKeyBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ChangePubKeyBuilder( + chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + new_pubkey_hash=_UniffiConverterTypePubKeyHash.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + eth_signature=_UniffiConverterOptionalTypePackedEthSignature.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypePubKeyHash.write(value.new_pubkey_hash, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterOptionalTypePackedEthSignature.write(value.eth_signature, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ContractBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";slot_id: "SlotId";nonce: "Nonce";pair_id: "PairId";size: "BigUint";price: "BigUint";direction: "bool";taker_fee_rate: "int";maker_fee_rate: "int";has_subsidy: "bool"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", slot_id: "SlotId", nonce: "Nonce", pair_id: "PairId", size: "BigUint", price: "BigUint", direction: "bool", taker_fee_rate: "int", maker_fee_rate: "int", has_subsidy: "bool"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.slot_id = slot_id + self.nonce = nonce + self.pair_id = pair_id + self.size = size + self.price = price + self.direction = direction + self.taker_fee_rate = taker_fee_rate + self.maker_fee_rate = maker_fee_rate + self.has_subsidy = has_subsidy + + def __str__(self): + return "ContractBuilder(account_id={}, sub_account_id={}, slot_id={}, nonce={}, pair_id={}, size={}, price={}, direction={}, taker_fee_rate={}, maker_fee_rate={}, has_subsidy={})".format(self.account_id, self.sub_account_id, self.slot_id, self.nonce, self.pair_id, self.size, self.price, self.direction, self.taker_fee_rate, self.maker_fee_rate, self.has_subsidy) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.slot_id != other.slot_id: + return False + if self.nonce != other.nonce: + return False + if self.pair_id != other.pair_id: + return False + if self.size != other.size: + return False + if self.price != other.price: + return False + if self.direction != other.direction: + return False + if self.taker_fee_rate != other.taker_fee_rate: + return False + if self.maker_fee_rate != other.maker_fee_rate: + return False + if self.has_subsidy != other.has_subsidy: + return False + return True + +class _UniffiConverterTypeContractBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + slot_id=_UniffiConverterTypeSlotId.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + pair_id=_UniffiConverterTypePairId.read(buf), + size=_UniffiConverterTypeBigUint.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + direction=_UniffiConverterBool.read(buf), + taker_fee_rate=_UniffiConverterUInt8.read(buf), + maker_fee_rate=_UniffiConverterUInt8.read(buf), + has_subsidy=_UniffiConverterBool.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeSlotId.write(value.slot_id, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.size, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterBool.write(value.direction, buf) + _UniffiConverterUInt8.write(value.taker_fee_rate, buf) + _UniffiConverterUInt8.write(value.maker_fee_rate, buf) + _UniffiConverterBool.write(value.has_subsidy, buf) + + +class ContractMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Contract";maker: "typing.List[Contract]";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Contract", maker: "typing.List[Contract]", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "ContractMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeContractMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeContract.read(buf), + maker=_UniffiConverterSequenceTypeContract.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeContract.write(value.taker, buf) + _UniffiConverterSequenceTypeContract.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class ContractPrice: + pair_id: "PairId";market_price: "BigUint"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", market_price: "BigUint"): + self.pair_id = pair_id + self.market_price = market_price + + def __str__(self): + return "ContractPrice(pair_id={}, market_price={})".format(self.pair_id, self.market_price) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.market_price != other.market_price: + return False + return True + +class _UniffiConverterTypeContractPrice(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ContractPrice( + pair_id=_UniffiConverterTypePairId.read(buf), + market_price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.market_price, buf) + + +class Create2Data: + creator_address: "ZkLinkAddress";salt_arg: "H256";code_hash: "H256"; + + @typing.no_type_check + def __init__(self, creator_address: "ZkLinkAddress", salt_arg: "H256", code_hash: "H256"): + self.creator_address = creator_address + self.salt_arg = salt_arg + self.code_hash = code_hash + + def __str__(self): + return "Create2Data(creator_address={}, salt_arg={}, code_hash={})".format(self.creator_address, self.salt_arg, self.code_hash) + + def __eq__(self, other): + if self.creator_address != other.creator_address: + return False + if self.salt_arg != other.salt_arg: + return False + if self.code_hash != other.code_hash: + return False + return True + +class _UniffiConverterTypeCreate2Data(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Create2Data( + creator_address=_UniffiConverterTypeZkLinkAddress.read(buf), + salt_arg=_UniffiConverterTypeH256.read(buf), + code_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.creator_address, buf) + _UniffiConverterTypeH256.write(value.salt_arg, buf) + _UniffiConverterTypeH256.write(value.code_hash, buf) + + +class DepositBuilder: + from_address: "ZkLinkAddress";to_address: "ZkLinkAddress";from_chain_id: "ChainId";sub_account_id: "SubAccountId";l2_target_token: "TokenId";l1_source_token: "TokenId";amount: "BigUint";serial_id: "int";l2_hash: "H256";eth_hash: "typing.Optional[H256]"; + + @typing.no_type_check + def __init__(self, from_address: "ZkLinkAddress", to_address: "ZkLinkAddress", from_chain_id: "ChainId", sub_account_id: "SubAccountId", l2_target_token: "TokenId", l1_source_token: "TokenId", amount: "BigUint", serial_id: "int", l2_hash: "H256", eth_hash: "typing.Optional[H256]"): + self.from_address = from_address + self.to_address = to_address + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.l2_target_token = l2_target_token + self.l1_source_token = l1_source_token + self.amount = amount + self.serial_id = serial_id + self.l2_hash = l2_hash + self.eth_hash = eth_hash + + def __str__(self): + return "DepositBuilder(from_address={}, to_address={}, from_chain_id={}, sub_account_id={}, l2_target_token={}, l1_source_token={}, amount={}, serial_id={}, l2_hash={}, eth_hash={})".format(self.from_address, self.to_address, self.from_chain_id, self.sub_account_id, self.l2_target_token, self.l1_source_token, self.amount, self.serial_id, self.l2_hash, self.eth_hash) + + def __eq__(self, other): + if self.from_address != other.from_address: + return False + if self.to_address != other.to_address: + return False + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.l2_target_token != other.l2_target_token: + return False + if self.l1_source_token != other.l1_source_token: + return False + if self.amount != other.amount: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + if self.eth_hash != other.eth_hash: + return False + return True + +class _UniffiConverterTypeDepositBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return DepositBuilder( + from_address=_UniffiConverterTypeZkLinkAddress.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_target_token=_UniffiConverterTypeTokenId.read(buf), + l1_source_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + eth_hash=_UniffiConverterOptionalTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkAddress.write(value.from_address, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_target_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_source_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + _UniffiConverterOptionalTypeH256.write(value.eth_hash, buf) + + +class ForcedExitBuilder: + to_chain_id: "ChainId";initiator_account_id: "AccountId";initiator_sub_account_id: "SubAccountId";target: "ZkLinkAddress";target_sub_account_id: "SubAccountId";l2_source_token: "TokenId";l1_target_token: "TokenId";initiator_nonce: "Nonce";exit_amount: "BigUint";withdraw_to_l1: "bool";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", initiator_account_id: "AccountId", initiator_sub_account_id: "SubAccountId", target: "ZkLinkAddress", target_sub_account_id: "SubAccountId", l2_source_token: "TokenId", l1_target_token: "TokenId", initiator_nonce: "Nonce", exit_amount: "BigUint", withdraw_to_l1: "bool", timestamp: "TimeStamp"): + self.to_chain_id = to_chain_id + self.initiator_account_id = initiator_account_id + self.initiator_sub_account_id = initiator_sub_account_id + self.target = target + self.target_sub_account_id = target_sub_account_id + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.initiator_nonce = initiator_nonce + self.exit_amount = exit_amount + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "ForcedExitBuilder(to_chain_id={}, initiator_account_id={}, initiator_sub_account_id={}, target={}, target_sub_account_id={}, l2_source_token={}, l1_target_token={}, initiator_nonce={}, exit_amount={}, withdraw_to_l1={}, timestamp={})".format(self.to_chain_id, self.initiator_account_id, self.initiator_sub_account_id, self.target, self.target_sub_account_id, self.l2_source_token, self.l1_target_token, self.initiator_nonce, self.exit_amount, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.initiator_account_id != other.initiator_account_id: + return False + if self.initiator_sub_account_id != other.initiator_sub_account_id: + return False + if self.target != other.target: + return False + if self.target_sub_account_id != other.target_sub_account_id: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.initiator_nonce != other.initiator_nonce: + return False + if self.exit_amount != other.exit_amount: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeForcedExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ForcedExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + initiator_account_id=_UniffiConverterTypeAccountId.read(buf), + initiator_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + target=_UniffiConverterTypeZkLinkAddress.read(buf), + target_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + initiator_nonce=_UniffiConverterTypeNonce.read(buf), + exit_amount=_UniffiConverterTypeBigUint.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.initiator_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.initiator_sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.target, buf) + _UniffiConverterTypeSubAccountId.write(value.target_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeNonce.write(value.initiator_nonce, buf) + _UniffiConverterTypeBigUint.write(value.exit_amount, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class FullExitBuilder: + to_chain_id: "ChainId";account_id: "AccountId";sub_account_id: "SubAccountId";exit_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";serial_id: "int";l2_hash: "H256"; + + @typing.no_type_check + def __init__(self, to_chain_id: "ChainId", account_id: "AccountId", sub_account_id: "SubAccountId", exit_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", serial_id: "int", l2_hash: "H256"): + self.to_chain_id = to_chain_id + self.account_id = account_id + self.sub_account_id = sub_account_id + self.exit_address = exit_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.serial_id = serial_id + self.l2_hash = l2_hash + + def __str__(self): + return "FullExitBuilder(to_chain_id={}, account_id={}, sub_account_id={}, exit_address={}, l2_source_token={}, l1_target_token={}, contract_prices={}, margin_prices={}, serial_id={}, l2_hash={})".format(self.to_chain_id, self.account_id, self.sub_account_id, self.exit_address, self.l2_source_token, self.l1_target_token, self.contract_prices, self.margin_prices, self.serial_id, self.l2_hash) + + def __eq__(self, other): + if self.to_chain_id != other.to_chain_id: + return False + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.exit_address != other.exit_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.serial_id != other.serial_id: + return False + if self.l2_hash != other.l2_hash: + return False + return True + +class _UniffiConverterTypeFullExitBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FullExitBuilder( + to_chain_id=_UniffiConverterTypeChainId.read(buf), + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + exit_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + l2_hash=_UniffiConverterTypeH256.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.exit_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + _UniffiConverterTypeH256.write(value.l2_hash, buf) + + +class FundingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";funding_account_ids: "typing.List[AccountId]";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", funding_account_ids: "typing.List[AccountId]", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.funding_account_ids = funding_account_ids + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "FundingBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, funding_account_ids={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.funding_account_ids, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.funding_account_ids != other.funding_account_ids: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeFundingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + funding_account_ids=_UniffiConverterSequenceTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeAccountId.write(value.funding_account_ids, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class FundingInfo: + pair_id: "PairId";price: "BigUint";funding_rate: "int"; + + @typing.no_type_check + def __init__(self, pair_id: "PairId", price: "BigUint", funding_rate: "int"): + self.pair_id = pair_id + self.price = price + self.funding_rate = funding_rate + + def __str__(self): + return "FundingInfo(pair_id={}, price={}, funding_rate={})".format(self.pair_id, self.price, self.funding_rate) + + def __eq__(self, other): + if self.pair_id != other.pair_id: + return False + if self.price != other.price: + return False + if self.funding_rate != other.funding_rate: + return False + return True + +class _UniffiConverterTypeFundingInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return FundingInfo( + pair_id=_UniffiConverterTypePairId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + funding_rate=_UniffiConverterInt16.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + _UniffiConverterInt16.write(value.funding_rate, buf) + + +class LiquidationBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";sub_account_nonce: "Nonce";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";liquidation_account_id: "AccountId";fee: "BigUint";fee_token: "TokenId"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", sub_account_nonce: "Nonce", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", liquidation_account_id: "AccountId", fee: "BigUint", fee_token: "TokenId"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.sub_account_nonce = sub_account_nonce + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.liquidation_account_id = liquidation_account_id + self.fee = fee + self.fee_token = fee_token + + def __str__(self): + return "LiquidationBuilder(account_id={}, sub_account_id={}, sub_account_nonce={}, contract_prices={}, margin_prices={}, liquidation_account_id={}, fee={}, fee_token={})".format(self.account_id, self.sub_account_id, self.sub_account_nonce, self.contract_prices, self.margin_prices, self.liquidation_account_id, self.fee, self.fee_token) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.sub_account_nonce != other.sub_account_nonce: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.liquidation_account_id != other.liquidation_account_id: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + return True + +class _UniffiConverterTypeLiquidationBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return LiquidationBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + sub_account_nonce=_UniffiConverterTypeNonce.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + liquidation_account_id=_UniffiConverterTypeAccountId.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeNonce.write(value.sub_account_nonce, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeAccountId.write(value.liquidation_account_id, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + + +class Message: + data: str; + + @typing.no_type_check + def __init__(self, data: str): + self.data = data + + def __str__(self): + return "Message(data={})".format(self.data) + + def __eq__(self, other): + if self.data != other.data: + return False + return True + +class _UniffiConverterTypeMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return Message( + data=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.data, buf) + + +class OraclePrices: + contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]"; + + @typing.no_type_check + def __init__(self, contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]"): + self.contract_prices = contract_prices + self.margin_prices = margin_prices + + def __str__(self): + return "OraclePrices(contract_prices={}, margin_prices={})".format(self.contract_prices, self.margin_prices) + + def __eq__(self, other): + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + return True + +class _UniffiConverterTypeOraclePrices(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OraclePrices( + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + + +class OrderMatchingBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";taker: "Order";maker: "Order";fee: "BigUint";fee_token: "TokenId";contract_prices: "typing.List[ContractPrice]";margin_prices: "typing.List[SpotPriceInfo]";expect_base_amount: "BigUint";expect_quote_amount: "BigUint"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", taker: "Order", maker: "Order", fee: "BigUint", fee_token: "TokenId", contract_prices: "typing.List[ContractPrice]", margin_prices: "typing.List[SpotPriceInfo]", expect_base_amount: "BigUint", expect_quote_amount: "BigUint"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.taker = taker + self.maker = maker + self.fee = fee + self.fee_token = fee_token + self.contract_prices = contract_prices + self.margin_prices = margin_prices + self.expect_base_amount = expect_base_amount + self.expect_quote_amount = expect_quote_amount + + def __str__(self): + return "OrderMatchingBuilder(account_id={}, sub_account_id={}, taker={}, maker={}, fee={}, fee_token={}, contract_prices={}, margin_prices={}, expect_base_amount={}, expect_quote_amount={})".format(self.account_id, self.sub_account_id, self.taker, self.maker, self.fee, self.fee_token, self.contract_prices, self.margin_prices, self.expect_base_amount, self.expect_quote_amount) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.taker != other.taker: + return False + if self.maker != other.maker: + return False + if self.fee != other.fee: + return False + if self.fee_token != other.fee_token: + return False + if self.contract_prices != other.contract_prices: + return False + if self.margin_prices != other.margin_prices: + return False + if self.expect_base_amount != other.expect_base_amount: + return False + if self.expect_quote_amount != other.expect_quote_amount: + return False + return True + +class _UniffiConverterTypeOrderMatchingBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return OrderMatchingBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + taker=_UniffiConverterTypeOrder.read(buf), + maker=_UniffiConverterTypeOrder.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + fee_token=_UniffiConverterTypeTokenId.read(buf), + contract_prices=_UniffiConverterSequenceTypeContractPrice.read(buf), + margin_prices=_UniffiConverterSequenceTypeSpotPriceInfo.read(buf), + expect_base_amount=_UniffiConverterTypeBigUint.read(buf), + expect_quote_amount=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeOrder.write(value.taker, buf) + _UniffiConverterTypeOrder.write(value.maker, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeTokenId.write(value.fee_token, buf) + _UniffiConverterSequenceTypeContractPrice.write(value.contract_prices, buf) + _UniffiConverterSequenceTypeSpotPriceInfo.write(value.margin_prices, buf) + _UniffiConverterTypeBigUint.write(value.expect_base_amount, buf) + _UniffiConverterTypeBigUint.write(value.expect_quote_amount, buf) + + +class SpotPriceInfo: + token_id: "TokenId";price: "BigUint"; + + @typing.no_type_check + def __init__(self, token_id: "TokenId", price: "BigUint"): + self.token_id = token_id + self.price = price + + def __str__(self): + return "SpotPriceInfo(token_id={}, price={})".format(self.token_id, self.price) + + def __eq__(self, other): + if self.token_id != other.token_id: + return False + if self.price != other.price: + return False + return True + +class _UniffiConverterTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return SpotPriceInfo( + token_id=_UniffiConverterTypeTokenId.read(buf), + price=_UniffiConverterTypeBigUint.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterTypeBigUint.write(value.price, buf) + + +class TransferBuilder: + account_id: "AccountId";to_address: "ZkLinkAddress";from_sub_account_id: "SubAccountId";to_sub_account_id: "SubAccountId";token: "TokenId";amount: "BigUint";fee: "BigUint";nonce: "Nonce";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", to_address: "ZkLinkAddress", from_sub_account_id: "SubAccountId", to_sub_account_id: "SubAccountId", token: "TokenId", amount: "BigUint", fee: "BigUint", nonce: "Nonce", timestamp: "TimeStamp"): + self.account_id = account_id + self.to_address = to_address + self.from_sub_account_id = from_sub_account_id + self.to_sub_account_id = to_sub_account_id + self.token = token + self.amount = amount + self.fee = fee + self.nonce = nonce + self.timestamp = timestamp + + def __str__(self): + return "TransferBuilder(account_id={}, to_address={}, from_sub_account_id={}, to_sub_account_id={}, token={}, amount={}, fee={}, nonce={}, timestamp={})".format(self.account_id, self.to_address, self.from_sub_account_id, self.to_sub_account_id, self.token, self.amount, self.fee, self.nonce, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.to_address != other.to_address: + return False + if self.from_sub_account_id != other.from_sub_account_id: + return False + if self.to_sub_account_id != other.to_sub_account_id: + return False + if self.token != other.token: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeTransferBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TransferBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + from_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeSubAccountId.write(value.from_sub_account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.to_sub_account_id, buf) + _UniffiConverterTypeTokenId.write(value.token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class TxMessage: + transaction: str;amount: str;fee: str;token: str;to: str;nonce: str; + + @typing.no_type_check + def __init__(self, transaction: str, amount: str, fee: str, token: str, to: str, nonce: str): + self.transaction = transaction + self.amount = amount + self.fee = fee + self.token = token + self.to = to + self.nonce = nonce + + def __str__(self): + return "TxMessage(transaction={}, amount={}, fee={}, token={}, to={}, nonce={})".format(self.transaction, self.amount, self.fee, self.token, self.to, self.nonce) + + def __eq__(self, other): + if self.transaction != other.transaction: + return False + if self.amount != other.amount: + return False + if self.fee != other.fee: + return False + if self.token != other.token: + return False + if self.to != other.to: + return False + if self.nonce != other.nonce: + return False + return True + +class _UniffiConverterTypeTxMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxMessage( + transaction=_UniffiConverterString.read(buf), + amount=_UniffiConverterString.read(buf), + fee=_UniffiConverterString.read(buf), + token=_UniffiConverterString.read(buf), + to=_UniffiConverterString.read(buf), + nonce=_UniffiConverterString.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value.transaction, buf) + _UniffiConverterString.write(value.amount, buf) + _UniffiConverterString.write(value.fee, buf) + _UniffiConverterString.write(value.token, buf) + _UniffiConverterString.write(value.to, buf) + _UniffiConverterString.write(value.nonce, buf) + + +class TxSignature: + tx: "ZkLinkTx";layer1_signature: "typing.Optional[TxLayer1Signature]"; + + @typing.no_type_check + def __init__(self, tx: "ZkLinkTx", layer1_signature: "typing.Optional[TxLayer1Signature]"): + self.tx = tx + self.layer1_signature = layer1_signature + + def __str__(self): + return "TxSignature(tx={}, layer1_signature={})".format(self.tx, self.layer1_signature) + + def __eq__(self, other): + if self.tx != other.tx: + return False + if self.layer1_signature != other.layer1_signature: + return False + return True + +class _UniffiConverterTypeTxSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return TxSignature( + tx=_UniffiConverterTypeZkLinkTx.read(buf), + layer1_signature=_UniffiConverterOptionalTypeTxLayer1Signature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeZkLinkTx.write(value.tx, buf) + _UniffiConverterOptionalTypeTxLayer1Signature.write(value.layer1_signature, buf) + + +class UpdateGlobalVarBuilder: + from_chain_id: "ChainId";sub_account_id: "SubAccountId";parameter: "Parameter";serial_id: "int"; + + @typing.no_type_check + def __init__(self, from_chain_id: "ChainId", sub_account_id: "SubAccountId", parameter: "Parameter", serial_id: "int"): + self.from_chain_id = from_chain_id + self.sub_account_id = sub_account_id + self.parameter = parameter + self.serial_id = serial_id + + def __str__(self): + return "UpdateGlobalVarBuilder(from_chain_id={}, sub_account_id={}, parameter={}, serial_id={})".format(self.from_chain_id, self.sub_account_id, self.parameter, self.serial_id) + + def __eq__(self, other): + if self.from_chain_id != other.from_chain_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.parameter != other.parameter: + return False + if self.serial_id != other.serial_id: + return False + return True + +class _UniffiConverterTypeUpdateGlobalVarBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return UpdateGlobalVarBuilder( + from_chain_id=_UniffiConverterTypeChainId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + parameter=_UniffiConverterTypeParameter.read(buf), + serial_id=_UniffiConverterUInt64.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeChainId.write(value.from_chain_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeParameter.write(value.parameter, buf) + _UniffiConverterUInt64.write(value.serial_id, buf) + + +class WithdrawBuilder: + account_id: "AccountId";sub_account_id: "SubAccountId";to_chain_id: "ChainId";to_address: "ZkLinkAddress";l2_source_token: "TokenId";l1_target_token: "TokenId";amount: "BigUint";call_data: "typing.Optional[typing.List[int]]";fee: "BigUint";nonce: "Nonce";withdraw_fee_ratio: "int";withdraw_to_l1: "bool";timestamp: "TimeStamp"; + + @typing.no_type_check + def __init__(self, account_id: "AccountId", sub_account_id: "SubAccountId", to_chain_id: "ChainId", to_address: "ZkLinkAddress", l2_source_token: "TokenId", l1_target_token: "TokenId", amount: "BigUint", call_data: "typing.Optional[typing.List[int]]", fee: "BigUint", nonce: "Nonce", withdraw_fee_ratio: "int", withdraw_to_l1: "bool", timestamp: "TimeStamp"): + self.account_id = account_id + self.sub_account_id = sub_account_id + self.to_chain_id = to_chain_id + self.to_address = to_address + self.l2_source_token = l2_source_token + self.l1_target_token = l1_target_token + self.amount = amount + self.call_data = call_data + self.fee = fee + self.nonce = nonce + self.withdraw_fee_ratio = withdraw_fee_ratio + self.withdraw_to_l1 = withdraw_to_l1 + self.timestamp = timestamp + + def __str__(self): + return "WithdrawBuilder(account_id={}, sub_account_id={}, to_chain_id={}, to_address={}, l2_source_token={}, l1_target_token={}, amount={}, call_data={}, fee={}, nonce={}, withdraw_fee_ratio={}, withdraw_to_l1={}, timestamp={})".format(self.account_id, self.sub_account_id, self.to_chain_id, self.to_address, self.l2_source_token, self.l1_target_token, self.amount, self.call_data, self.fee, self.nonce, self.withdraw_fee_ratio, self.withdraw_to_l1, self.timestamp) + + def __eq__(self, other): + if self.account_id != other.account_id: + return False + if self.sub_account_id != other.sub_account_id: + return False + if self.to_chain_id != other.to_chain_id: + return False + if self.to_address != other.to_address: + return False + if self.l2_source_token != other.l2_source_token: + return False + if self.l1_target_token != other.l1_target_token: + return False + if self.amount != other.amount: + return False + if self.call_data != other.call_data: + return False + if self.fee != other.fee: + return False + if self.nonce != other.nonce: + return False + if self.withdraw_fee_ratio != other.withdraw_fee_ratio: + return False + if self.withdraw_to_l1 != other.withdraw_to_l1: + return False + if self.timestamp != other.timestamp: + return False + return True + +class _UniffiConverterTypeWithdrawBuilder(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return WithdrawBuilder( + account_id=_UniffiConverterTypeAccountId.read(buf), + sub_account_id=_UniffiConverterTypeSubAccountId.read(buf), + to_chain_id=_UniffiConverterTypeChainId.read(buf), + to_address=_UniffiConverterTypeZkLinkAddress.read(buf), + l2_source_token=_UniffiConverterTypeTokenId.read(buf), + l1_target_token=_UniffiConverterTypeTokenId.read(buf), + amount=_UniffiConverterTypeBigUint.read(buf), + call_data=_UniffiConverterOptionalSequenceUInt8.read(buf), + fee=_UniffiConverterTypeBigUint.read(buf), + nonce=_UniffiConverterTypeNonce.read(buf), + withdraw_fee_ratio=_UniffiConverterUInt16.read(buf), + withdraw_to_l1=_UniffiConverterBool.read(buf), + timestamp=_UniffiConverterTypeTimeStamp.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypeAccountId.write(value.account_id, buf) + _UniffiConverterTypeSubAccountId.write(value.sub_account_id, buf) + _UniffiConverterTypeChainId.write(value.to_chain_id, buf) + _UniffiConverterTypeZkLinkAddress.write(value.to_address, buf) + _UniffiConverterTypeTokenId.write(value.l2_source_token, buf) + _UniffiConverterTypeTokenId.write(value.l1_target_token, buf) + _UniffiConverterTypeBigUint.write(value.amount, buf) + _UniffiConverterOptionalSequenceUInt8.write(value.call_data, buf) + _UniffiConverterTypeBigUint.write(value.fee, buf) + _UniffiConverterTypeNonce.write(value.nonce, buf) + _UniffiConverterUInt16.write(value.withdraw_fee_ratio, buf) + _UniffiConverterBool.write(value.withdraw_to_l1, buf) + _UniffiConverterTypeTimeStamp.write(value.timestamp, buf) + + +class ZkLinkSignature: + pub_key: "PackedPublicKey";signature: "PackedSignature"; + + @typing.no_type_check + def __init__(self, pub_key: "PackedPublicKey", signature: "PackedSignature"): + self.pub_key = pub_key + self.signature = signature + + def __str__(self): + return "ZkLinkSignature(pub_key={}, signature={})".format(self.pub_key, self.signature) + + def __eq__(self, other): + if self.pub_key != other.pub_key: + return False + if self.signature != other.signature: + return False + return True + +class _UniffiConverterTypeZkLinkSignature(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + return ZkLinkSignature( + pub_key=_UniffiConverterTypePackedPublicKey.read(buf), + signature=_UniffiConverterTypePackedSignature.read(buf), + ) + + @staticmethod + def write(value, buf): + _UniffiConverterTypePackedPublicKey.write(value.pub_key, buf) + _UniffiConverterTypePackedSignature.write(value.signature, buf) + + + + + +class ChangePubKeyAuthData: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthData cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthData.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + eth_signature: "PackedEthSignature"; + + @typing.no_type_check + def __init__(self,eth_signature: "PackedEthSignature"): + + self.eth_signature = eth_signature + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_ECDSA(eth_signature={})".format(self.eth_signature) + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + if self.eth_signature != other.eth_signature: + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthData.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthData.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthData.ONCHAIN = type("ChangePubKeyAuthData.ONCHAIN", (ChangePubKeyAuthData.ONCHAIN, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_ECDSA = type("ChangePubKeyAuthData.ETH_ECDSA", (ChangePubKeyAuthData.ETH_ECDSA, ChangePubKeyAuthData,), {}) # type: ignore +ChangePubKeyAuthData.ETH_CREATE2 = type("ChangePubKeyAuthData.ETH_CREATE2", (ChangePubKeyAuthData.ETH_CREATE2, ChangePubKeyAuthData,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthData(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthData.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthData.ETH_ECDSA( + _UniffiConverterTypePackedEthSignature.read(buf), + ) + if variant == 3: + return ChangePubKeyAuthData.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + _UniffiConverterTypePackedEthSignature.write(value.eth_signature, buf) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + + + + +class ChangePubKeyAuthRequest: + def __init__(self): + raise RuntimeError("ChangePubKeyAuthRequest cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ONCHAIN: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ONCHAIN()".format() + + def __eq__(self, other): + if not other.is_onchain(): + return False + return True + class ETH_ECDSA: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_ECDSA()".format() + + def __eq__(self, other): + if not other.is_eth_ecdsa(): + return False + return True + class ETH_CREATE2: + data: "Create2Data"; + + @typing.no_type_check + def __init__(self,data: "Create2Data"): + + self.data = data + + + def __str__(self): + return "ChangePubKeyAuthRequest.ETH_CREATE2(data={})".format(self.data) + + def __eq__(self, other): + if not other.is_eth_create2(): + return False + if self.data != other.data: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_onchain(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ONCHAIN) + def is_eth_ecdsa(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_ECDSA) + def is_eth_create2(self) -> bool: + return isinstance(self, ChangePubKeyAuthRequest.ETH_CREATE2) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +ChangePubKeyAuthRequest.ONCHAIN = type("ChangePubKeyAuthRequest.ONCHAIN", (ChangePubKeyAuthRequest.ONCHAIN, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_ECDSA = type("ChangePubKeyAuthRequest.ETH_ECDSA", (ChangePubKeyAuthRequest.ETH_ECDSA, ChangePubKeyAuthRequest,), {}) # type: ignore +ChangePubKeyAuthRequest.ETH_CREATE2 = type("ChangePubKeyAuthRequest.ETH_CREATE2", (ChangePubKeyAuthRequest.ETH_CREATE2, ChangePubKeyAuthRequest,), {}) # type: ignore + + + + +class _UniffiConverterTypeChangePubKeyAuthRequest(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ChangePubKeyAuthRequest.ONCHAIN( + ) + if variant == 2: + return ChangePubKeyAuthRequest.ETH_ECDSA( + ) + if variant == 3: + return ChangePubKeyAuthRequest.ETH_CREATE2( + _UniffiConverterTypeCreate2Data.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_onchain(): + buf.write_i32(1) + if value.is_eth_ecdsa(): + buf.write_i32(2) + if value.is_eth_create2(): + buf.write_i32(3) + _UniffiConverterTypeCreate2Data.write(value.data, buf) + + + + +# EthSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class EthSignerError(Exception): + pass + +_UniffiTempEthSignerError = EthSignerError + +class EthSignerError: # type: ignore + class InvalidEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidEthSigner = InvalidEthSigner # type: ignore + class MissingEthPrivateKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthPrivateKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthPrivateKey = MissingEthPrivateKey # type: ignore + class MissingEthSigner(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.MissingEthSigner({})".format(repr(str(self))) + _UniffiTempEthSignerError.MissingEthSigner = MissingEthSigner # type: ignore + class SigningFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.SigningFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.SigningFailed = SigningFailed # type: ignore + class UnlockingFailed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.UnlockingFailed({})".format(repr(str(self))) + _UniffiTempEthSignerError.UnlockingFailed = UnlockingFailed # type: ignore + class InvalidRawTx(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidRawTx({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidRawTx = InvalidRawTx # type: ignore + class Eip712Failed(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.Eip712Failed({})".format(repr(str(self))) + _UniffiTempEthSignerError.Eip712Failed = Eip712Failed # type: ignore + class NoSigningKey(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.NoSigningKey({})".format(repr(str(self))) + _UniffiTempEthSignerError.NoSigningKey = NoSigningKey # type: ignore + class DefineAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.DefineAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.DefineAddress = DefineAddress # type: ignore + class RecoverAddress(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RecoverAddress({})".format(repr(str(self))) + _UniffiTempEthSignerError.RecoverAddress = RecoverAddress # type: ignore + class LengthMismatched(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.LengthMismatched({})".format(repr(str(self))) + _UniffiTempEthSignerError.LengthMismatched = LengthMismatched # type: ignore + class CryptoError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CryptoError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CryptoError = CryptoError # type: ignore + class InvalidSignatureStr(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.InvalidSignatureStr({})".format(repr(str(self))) + _UniffiTempEthSignerError.InvalidSignatureStr = InvalidSignatureStr # type: ignore + class CustomError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempEthSignerError.CustomError = CustomError # type: ignore + class RpcSignError(_UniffiTempEthSignerError): + def __repr__(self): + return "EthSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempEthSignerError.RpcSignError = RpcSignError # type: ignore + +EthSignerError = _UniffiTempEthSignerError # type: ignore +del _UniffiTempEthSignerError + + +class _UniffiConverterTypeEthSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return EthSignerError.InvalidEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return EthSignerError.MissingEthPrivateKey( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return EthSignerError.MissingEthSigner( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return EthSignerError.SigningFailed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return EthSignerError.UnlockingFailed( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return EthSignerError.InvalidRawTx( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return EthSignerError.Eip712Failed( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return EthSignerError.NoSigningKey( + _UniffiConverterString.read(buf), + ) + if variant == 9: + return EthSignerError.DefineAddress( + _UniffiConverterString.read(buf), + ) + if variant == 10: + return EthSignerError.RecoverAddress( + _UniffiConverterString.read(buf), + ) + if variant == 11: + return EthSignerError.LengthMismatched( + _UniffiConverterString.read(buf), + ) + if variant == 12: + return EthSignerError.CryptoError( + _UniffiConverterString.read(buf), + ) + if variant == 13: + return EthSignerError.InvalidSignatureStr( + _UniffiConverterString.read(buf), + ) + if variant == 14: + return EthSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 15: + return EthSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, EthSignerError.InvalidEthSigner): + buf.write_i32(1) + if isinstance(value, EthSignerError.MissingEthPrivateKey): + buf.write_i32(2) + if isinstance(value, EthSignerError.MissingEthSigner): + buf.write_i32(3) + if isinstance(value, EthSignerError.SigningFailed): + buf.write_i32(4) + if isinstance(value, EthSignerError.UnlockingFailed): + buf.write_i32(5) + if isinstance(value, EthSignerError.InvalidRawTx): + buf.write_i32(6) + if isinstance(value, EthSignerError.Eip712Failed): + buf.write_i32(7) + if isinstance(value, EthSignerError.NoSigningKey): + buf.write_i32(8) + if isinstance(value, EthSignerError.DefineAddress): + buf.write_i32(9) + if isinstance(value, EthSignerError.RecoverAddress): + buf.write_i32(10) + if isinstance(value, EthSignerError.LengthMismatched): + buf.write_i32(11) + if isinstance(value, EthSignerError.CryptoError): + buf.write_i32(12) + if isinstance(value, EthSignerError.InvalidSignatureStr): + buf.write_i32(13) + if isinstance(value, EthSignerError.CustomError): + buf.write_i32(14) + if isinstance(value, EthSignerError.RpcSignError): + buf.write_i32(15) + + + + + +class L1SignerType: + def __init__(self): + raise RuntimeError("L1SignerType cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class ETH: + + + @typing.no_type_check + def __init__(self,): + + pass + + + def __str__(self): + return "L1SignerType.ETH()".format() + + def __eq__(self, other): + if not other.is_eth(): + return False + return True + class STARKNET: + chain_id: str;address: str; + + @typing.no_type_check + def __init__(self,chain_id: str, address: str): + + self.chain_id = chain_id + self.address = address + + + def __str__(self): + return "L1SignerType.STARKNET(chain_id={}, address={})".format(self.chain_id, self.address) + + def __eq__(self, other): + if not other.is_starknet(): + return False + if self.chain_id != other.chain_id: + return False + if self.address != other.address: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_eth(self) -> bool: + return isinstance(self, L1SignerType.ETH) + def is_starknet(self) -> bool: + return isinstance(self, L1SignerType.STARKNET) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +L1SignerType.ETH = type("L1SignerType.ETH", (L1SignerType.ETH, L1SignerType,), {}) # type: ignore +L1SignerType.STARKNET = type("L1SignerType.STARKNET", (L1SignerType.STARKNET, L1SignerType,), {}) # type: ignore + + + + +class _UniffiConverterTypeL1SignerType(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1SignerType.ETH( + ) + if variant == 2: + return L1SignerType.STARKNET( + _UniffiConverterString.read(buf), + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_eth(): + buf.write_i32(1) + if value.is_starknet(): + buf.write_i32(2) + _UniffiConverterString.write(value.chain_id, buf) + _UniffiConverterString.write(value.address, buf) + + + + + + + +class L1Type(enum.Enum): + ETH = 1 + STARKNET = 2 + + + +class _UniffiConverterTypeL1Type(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return L1Type.ETH + if variant == 2: + return L1Type.STARKNET + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value == L1Type.ETH: + buf.write_i32(1) + if value == L1Type.STARKNET: + buf.write_i32(2) + + + + + + + +class Parameter: + def __init__(self): + raise RuntimeError("Parameter cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class FEE_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.FEE_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_fee_account(): + return False + if self.account_id != other.account_id: + return False + return True + class INSURANCE_FUND_ACCOUNT: + account_id: "AccountId"; + + @typing.no_type_check + def __init__(self,account_id: "AccountId"): + + self.account_id = account_id + + + def __str__(self): + return "Parameter.INSURANCE_FUND_ACCOUNT(account_id={})".format(self.account_id) + + def __eq__(self, other): + if not other.is_insurance_fund_account(): + return False + if self.account_id != other.account_id: + return False + return True + class MARGIN_INFO: + margin_id: "MarginId";token_id: "TokenId";ratio: "int"; + + @typing.no_type_check + def __init__(self,margin_id: "MarginId", token_id: "TokenId", ratio: "int"): + + self.margin_id = margin_id + self.token_id = token_id + self.ratio = ratio + + + def __str__(self): + return "Parameter.MARGIN_INFO(margin_id={}, token_id={}, ratio={})".format(self.margin_id, self.token_id, self.ratio) + + def __eq__(self, other): + if not other.is_margin_info(): + return False + if self.margin_id != other.margin_id: + return False + if self.token_id != other.token_id: + return False + if self.ratio != other.ratio: + return False + return True + class FUNDING_INFOS: + infos: "typing.List[FundingInfo]"; + + @typing.no_type_check + def __init__(self,infos: "typing.List[FundingInfo]"): + + self.infos = infos + + + def __str__(self): + return "Parameter.FUNDING_INFOS(infos={})".format(self.infos) + + def __eq__(self, other): + if not other.is_funding_infos(): + return False + if self.infos != other.infos: + return False + return True + class CONTRACT_INFO: + pair_id: "PairId";symbol: str;initial_margin_rate: "int";maintenance_margin_rate: "int"; + + @typing.no_type_check + def __init__(self,pair_id: "PairId", symbol: str, initial_margin_rate: "int", maintenance_margin_rate: "int"): + + self.pair_id = pair_id + self.symbol = symbol + self.initial_margin_rate = initial_margin_rate + self.maintenance_margin_rate = maintenance_margin_rate + + + def __str__(self): + return "Parameter.CONTRACT_INFO(pair_id={}, symbol={}, initial_margin_rate={}, maintenance_margin_rate={})".format(self.pair_id, self.symbol, self.initial_margin_rate, self.maintenance_margin_rate) + + def __eq__(self, other): + if not other.is_contract_info(): + return False + if self.pair_id != other.pair_id: + return False + if self.symbol != other.symbol: + return False + if self.initial_margin_rate != other.initial_margin_rate: + return False + if self.maintenance_margin_rate != other.maintenance_margin_rate: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_fee_account(self) -> bool: + return isinstance(self, Parameter.FEE_ACCOUNT) + def is_insurance_fund_account(self) -> bool: + return isinstance(self, Parameter.INSURANCE_FUND_ACCOUNT) + def is_margin_info(self) -> bool: + return isinstance(self, Parameter.MARGIN_INFO) + def is_funding_infos(self) -> bool: + return isinstance(self, Parameter.FUNDING_INFOS) + def is_contract_info(self) -> bool: + return isinstance(self, Parameter.CONTRACT_INFO) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +Parameter.FEE_ACCOUNT = type("Parameter.FEE_ACCOUNT", (Parameter.FEE_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.INSURANCE_FUND_ACCOUNT = type("Parameter.INSURANCE_FUND_ACCOUNT", (Parameter.INSURANCE_FUND_ACCOUNT, Parameter,), {}) # type: ignore +Parameter.MARGIN_INFO = type("Parameter.MARGIN_INFO", (Parameter.MARGIN_INFO, Parameter,), {}) # type: ignore +Parameter.FUNDING_INFOS = type("Parameter.FUNDING_INFOS", (Parameter.FUNDING_INFOS, Parameter,), {}) # type: ignore +Parameter.CONTRACT_INFO = type("Parameter.CONTRACT_INFO", (Parameter.CONTRACT_INFO, Parameter,), {}) # type: ignore + + + + +class _UniffiConverterTypeParameter(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return Parameter.FEE_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 2: + return Parameter.INSURANCE_FUND_ACCOUNT( + _UniffiConverterTypeAccountId.read(buf), + ) + if variant == 3: + return Parameter.MARGIN_INFO( + _UniffiConverterTypeMarginId.read(buf), + _UniffiConverterTypeTokenId.read(buf), + _UniffiConverterUInt8.read(buf), + ) + if variant == 4: + return Parameter.FUNDING_INFOS( + _UniffiConverterSequenceTypeFundingInfo.read(buf), + ) + if variant == 5: + return Parameter.CONTRACT_INFO( + _UniffiConverterTypePairId.read(buf), + _UniffiConverterString.read(buf), + _UniffiConverterUInt16.read(buf), + _UniffiConverterUInt16.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_fee_account(): + buf.write_i32(1) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_insurance_fund_account(): + buf.write_i32(2) + _UniffiConverterTypeAccountId.write(value.account_id, buf) + if value.is_margin_info(): + buf.write_i32(3) + _UniffiConverterTypeMarginId.write(value.margin_id, buf) + _UniffiConverterTypeTokenId.write(value.token_id, buf) + _UniffiConverterUInt8.write(value.ratio, buf) + if value.is_funding_infos(): + buf.write_i32(4) + _UniffiConverterSequenceTypeFundingInfo.write(value.infos, buf) + if value.is_contract_info(): + buf.write_i32(5) + _UniffiConverterTypePairId.write(value.pair_id, buf) + _UniffiConverterString.write(value.symbol, buf) + _UniffiConverterUInt16.write(value.initial_margin_rate, buf) + _UniffiConverterUInt16.write(value.maintenance_margin_rate, buf) + + + + +# SignError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class SignError(Exception): + pass + +_UniffiTempSignError = SignError + +class SignError: # type: ignore + class EthSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.EthSigningError({})".format(repr(str(self))) + _UniffiTempSignError.EthSigningError = EthSigningError # type: ignore + class ZkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.ZkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.ZkSigningError = ZkSigningError # type: ignore + class StarkSigningError(_UniffiTempSignError): + def __repr__(self): + return "SignError.StarkSigningError({})".format(repr(str(self))) + _UniffiTempSignError.StarkSigningError = StarkSigningError # type: ignore + class IncorrectTx(_UniffiTempSignError): + def __repr__(self): + return "SignError.IncorrectTx({})".format(repr(str(self))) + _UniffiTempSignError.IncorrectTx = IncorrectTx # type: ignore + +SignError = _UniffiTempSignError # type: ignore +del _UniffiTempSignError + + +class _UniffiConverterTypeSignError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return SignError.EthSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return SignError.ZkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return SignError.StarkSigningError( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return SignError.IncorrectTx( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, SignError.EthSigningError): + buf.write_i32(1) + if isinstance(value, SignError.ZkSigningError): + buf.write_i32(2) + if isinstance(value, SignError.StarkSigningError): + buf.write_i32(3) + if isinstance(value, SignError.IncorrectTx): + buf.write_i32(4) + + +# StarkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class StarkSignerError(Exception): + pass + +_UniffiTempStarkSignerError = StarkSignerError + +class StarkSignerError: # type: ignore + class InvalidStarknetSigner(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidStarknetSigner({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidStarknetSigner = InvalidStarknetSigner # type: ignore + class InvalidSignature(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempStarkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class SignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.SignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.SignError = SignError # type: ignore + class RpcSignError(_UniffiTempStarkSignerError): + def __repr__(self): + return "StarkSignerError.RpcSignError({})".format(repr(str(self))) + _UniffiTempStarkSignerError.RpcSignError = RpcSignError # type: ignore + +StarkSignerError = _UniffiTempStarkSignerError # type: ignore +del _UniffiTempStarkSignerError + + +class _UniffiConverterTypeStarkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return StarkSignerError.InvalidStarknetSigner( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return StarkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return StarkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return StarkSignerError.SignError( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return StarkSignerError.RpcSignError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, StarkSignerError.InvalidStarknetSigner): + buf.write_i32(1) + if isinstance(value, StarkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, StarkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, StarkSignerError.SignError): + buf.write_i32(4) + if isinstance(value, StarkSignerError.RpcSignError): + buf.write_i32(5) + + +# TypeError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class TypeError(Exception): + pass + +_UniffiTempTypeError = TypeError + +class TypeError: # type: ignore + class InvalidAddress(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidAddress({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidAddress = InvalidAddress # type: ignore + class InvalidTxHash(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidTxHash({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidTxHash = InvalidTxHash # type: ignore + class NotStartWithZerox(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.NotStartWithZerox({})".format(repr(str(self))) + _UniffiTempTypeError.NotStartWithZerox = NotStartWithZerox # type: ignore + class SizeMismatch(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.SizeMismatch({})".format(repr(str(self))) + _UniffiTempTypeError.SizeMismatch = SizeMismatch # type: ignore + class DecodeFromHexErr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.DecodeFromHexErr({})".format(repr(str(self))) + _UniffiTempTypeError.DecodeFromHexErr = DecodeFromHexErr # type: ignore + class TooBigInteger(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.TooBigInteger({})".format(repr(str(self))) + _UniffiTempTypeError.TooBigInteger = TooBigInteger # type: ignore + class InvalidBigIntStr(_UniffiTempTypeError): + def __repr__(self): + return "TypeError.InvalidBigIntStr({})".format(repr(str(self))) + _UniffiTempTypeError.InvalidBigIntStr = InvalidBigIntStr # type: ignore + +TypeError = _UniffiTempTypeError # type: ignore +del _UniffiTempTypeError + + +class _UniffiConverterTypeTypeError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypeError.InvalidAddress( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return TypeError.InvalidTxHash( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return TypeError.NotStartWithZerox( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return TypeError.SizeMismatch( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return TypeError.DecodeFromHexErr( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return TypeError.TooBigInteger( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return TypeError.InvalidBigIntStr( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, TypeError.InvalidAddress): + buf.write_i32(1) + if isinstance(value, TypeError.InvalidTxHash): + buf.write_i32(2) + if isinstance(value, TypeError.NotStartWithZerox): + buf.write_i32(3) + if isinstance(value, TypeError.SizeMismatch): + buf.write_i32(4) + if isinstance(value, TypeError.DecodeFromHexErr): + buf.write_i32(5) + if isinstance(value, TypeError.TooBigInteger): + buf.write_i32(6) + if isinstance(value, TypeError.InvalidBigIntStr): + buf.write_i32(7) + + + + + +class TypedDataMessage: + def __init__(self): + raise RuntimeError("TypedDataMessage cannot be instantiated directly") + + # Each enum variant is a nested class of the enum itself. + class CREATE_L2_KEY: + message: "Message"; + + @typing.no_type_check + def __init__(self,message: "Message"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.CREATE_L2_KEY(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_create_l2_key(): + return False + if self.message != other.message: + return False + return True + class TRANSACTION: + message: "TxMessage"; + + @typing.no_type_check + def __init__(self,message: "TxMessage"): + + self.message = message + + + def __str__(self): + return "TypedDataMessage.TRANSACTION(message={})".format(self.message) + + def __eq__(self, other): + if not other.is_transaction(): + return False + if self.message != other.message: + return False + return True + + + # For each variant, we have an `is_NAME` method for easily checking + # whether an instance is that variant. + def is_create_l2_key(self) -> bool: + return isinstance(self, TypedDataMessage.CREATE_L2_KEY) + def is_transaction(self) -> bool: + return isinstance(self, TypedDataMessage.TRANSACTION) + + +# Now, a little trick - we make each nested variant class be a subclass of the main +# enum class, so that method calls and instance checks etc will work intuitively. +# We might be able to do this a little more neatly with a metaclass, but this'll do. +TypedDataMessage.CREATE_L2_KEY = type("TypedDataMessage.CREATE_L2_KEY", (TypedDataMessage.CREATE_L2_KEY, TypedDataMessage,), {}) # type: ignore +TypedDataMessage.TRANSACTION = type("TypedDataMessage.TRANSACTION", (TypedDataMessage.TRANSACTION, TypedDataMessage,), {}) # type: ignore + + + + +class _UniffiConverterTypeTypedDataMessage(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return TypedDataMessage.CREATE_L2_KEY( + _UniffiConverterTypeMessage.read(buf), + ) + if variant == 2: + return TypedDataMessage.TRANSACTION( + _UniffiConverterTypeTxMessage.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + def write(value, buf): + if value.is_create_l2_key(): + buf.write_i32(1) + _UniffiConverterTypeMessage.write(value.message, buf) + if value.is_transaction(): + buf.write_i32(2) + _UniffiConverterTypeTxMessage.write(value.message, buf) + + + + +# ZkSignerError +# We want to define each variant as a nested class that's also a subclass, +# which is tricky in Python. To accomplish this we're going to create each +# class separately, then manually add the child classes to the base class's +# __dict__. All of this happens in dummy class to avoid polluting the module +# namespace. +class ZkSignerError(Exception): + pass + +_UniffiTempZkSignerError = ZkSignerError + +class ZkSignerError: # type: ignore + class CustomError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.CustomError({})".format(repr(str(self))) + _UniffiTempZkSignerError.CustomError = CustomError # type: ignore + class InvalidSignature(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSignature({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSignature = InvalidSignature # type: ignore + class InvalidPrivKey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPrivKey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPrivKey = InvalidPrivKey # type: ignore + class InvalidSeed(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidSeed({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidSeed = InvalidSeed # type: ignore + class InvalidPubkey(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkey({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkey = InvalidPubkey # type: ignore + class InvalidPubkeyHash(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.InvalidPubkeyHash({})".format(repr(str(self))) + _UniffiTempZkSignerError.InvalidPubkeyHash = InvalidPubkeyHash # type: ignore + class EthSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.EthSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.EthSignerError = EthSignerError # type: ignore + class StarkSignerError(_UniffiTempZkSignerError): + def __repr__(self): + return "ZkSignerError.StarkSignerError({})".format(repr(str(self))) + _UniffiTempZkSignerError.StarkSignerError = StarkSignerError # type: ignore + +ZkSignerError = _UniffiTempZkSignerError # type: ignore +del _UniffiTempZkSignerError + + +class _UniffiConverterTypeZkSignerError(_UniffiConverterRustBuffer): + @staticmethod + def read(buf): + variant = buf.read_i32() + if variant == 1: + return ZkSignerError.CustomError( + _UniffiConverterString.read(buf), + ) + if variant == 2: + return ZkSignerError.InvalidSignature( + _UniffiConverterString.read(buf), + ) + if variant == 3: + return ZkSignerError.InvalidPrivKey( + _UniffiConverterString.read(buf), + ) + if variant == 4: + return ZkSignerError.InvalidSeed( + _UniffiConverterString.read(buf), + ) + if variant == 5: + return ZkSignerError.InvalidPubkey( + _UniffiConverterString.read(buf), + ) + if variant == 6: + return ZkSignerError.InvalidPubkeyHash( + _UniffiConverterString.read(buf), + ) + if variant == 7: + return ZkSignerError.EthSignerError( + _UniffiConverterString.read(buf), + ) + if variant == 8: + return ZkSignerError.StarkSignerError( + _UniffiConverterString.read(buf), + ) + raise InternalError("Raw enum value doesn't match any cases") + + @staticmethod + def write(value, buf): + if isinstance(value, ZkSignerError.CustomError): + buf.write_i32(1) + if isinstance(value, ZkSignerError.InvalidSignature): + buf.write_i32(2) + if isinstance(value, ZkSignerError.InvalidPrivKey): + buf.write_i32(3) + if isinstance(value, ZkSignerError.InvalidSeed): + buf.write_i32(4) + if isinstance(value, ZkSignerError.InvalidPubkey): + buf.write_i32(5) + if isinstance(value, ZkSignerError.InvalidPubkeyHash): + buf.write_i32(6) + if isinstance(value, ZkSignerError.EthSignerError): + buf.write_i32(7) + if isinstance(value, ZkSignerError.StarkSignerError): + buf.write_i32(8) + + + +class _UniffiConverterOptionalString(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterString.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterString.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeZkLinkSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeZkLinkSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeZkLinkSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterSequenceUInt8.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterSequenceUInt8.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeH256(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeH256.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeH256.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypePackedEthSignature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypePackedEthSignature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypePackedEthSignature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterOptionalTypeTxLayer1Signature(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + if value is None: + buf.write_u8(0) + return + + buf.write_u8(1) + _UniffiConverterTypeTxLayer1Signature.write(value, buf) + + @classmethod + def read(cls, buf): + flag = buf.read_u8() + if flag == 0: + return None + elif flag == 1: + return _UniffiConverterTypeTxLayer1Signature.read(buf) + else: + raise InternalError("Unexpected flag byte for optional type") + + + +class _UniffiConverterSequenceUInt8(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterUInt8.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterUInt8.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContract(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContract.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContract.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeContractPrice(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeContractPrice.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeContractPrice.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeFundingInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeFundingInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeFundingInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeSpotPriceInfo(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeSpotPriceInfo.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeSpotPriceInfo.read(buf) for i in range(count) + ] + + + +class _UniffiConverterSequenceTypeAccountId(_UniffiConverterRustBuffer): + @classmethod + def write(cls, value, buf): + items = len(value) + buf.write_i32(items) + for item in value: + _UniffiConverterTypeAccountId.write(item, buf) + + @classmethod + def read(cls, buf): + count = buf.read_i32() + if count < 0: + raise InternalError("Unexpected negative sequence length") + + return [ + _UniffiConverterTypeAccountId.read(buf) for i in range(count) + ] + + +# Type alias +AccountId = int + +class _UniffiConverterTypeAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +Address = str + +class _UniffiConverterTypeAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BigUint = str + +class _UniffiConverterTypeBigUint: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +BlockNumber = int + +class _UniffiConverterTypeBlockNumber: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +ChainId = int + +class _UniffiConverterTypeChainId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +EthBlockId = int + +class _UniffiConverterTypeEthBlockId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +H256 = str + +class _UniffiConverterTypeH256: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +MarginId = int + +class _UniffiConverterTypeMarginId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +Nonce = int + +class _UniffiConverterTypeNonce: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +PackedEthSignature = str + +class _UniffiConverterTypePackedEthSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedPublicKey = str + +class _UniffiConverterTypePackedPublicKey: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PackedSignature = str + +class _UniffiConverterTypePackedSignature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +PairId = int + +class _UniffiConverterTypePairId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt16.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt16.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt16.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt16.lower(value) + + +# Type alias +PriorityOpId = int + +class _UniffiConverterTypePriorityOpId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt64.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt64.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt64.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt64.lower(value) + + +# Type alias +PubKeyHash = str + +class _UniffiConverterTypePubKeyHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SlotId = int + +class _UniffiConverterTypeSlotId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +StarkEip712Signature = str + +class _UniffiConverterTypeStarkEip712Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +SubAccountId = int + +class _UniffiConverterTypeSubAccountId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt8.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt8.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt8.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt8.lower(value) + + +# Type alias +TimeStamp = int + +class _UniffiConverterTypeTimeStamp: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TokenId = int + +class _UniffiConverterTypeTokenId: + @staticmethod + def write(value, buf): + _UniffiConverterUInt32.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterUInt32.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterUInt32.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterUInt32.lower(value) + + +# Type alias +TxHash = str + +class _UniffiConverterTypeTxHash: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +TxLayer1Signature = str + +class _UniffiConverterTypeTxLayer1Signature: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkAddress = str + +class _UniffiConverterTypeZkLinkAddress: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + + +# Type alias +ZkLinkTx = str + +class _UniffiConverterTypeZkLinkTx: + @staticmethod + def write(value, buf): + _UniffiConverterString.write(value, buf) + + @staticmethod + def read(buf): + return _UniffiConverterString.read(buf) + + @staticmethod + def lift(value): + return _UniffiConverterString.lift(value) + + @staticmethod + def lower(value): + return _UniffiConverterString.lower(value) + +def create_signed_change_pubkey(zklink_signer: "ZkLinkSigner",tx: "ChangePubKey",eth_auth_data: "ChangePubKeyAuthData") -> "ChangePubKey": + + + + return _UniffiConverterTypeChangePubKey.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_create_signed_change_pubkey, + _UniffiConverterTypeZkLinkSigner.lower(zklink_signer), + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeChangePubKeyAuthData.lower(eth_auth_data))) + + +def eth_signature_of_change_pubkey(tx: "ChangePubKey",eth_signer: "EthSigner") -> "PackedEthSignature": + + + return _UniffiConverterTypePackedEthSignature.lift(_rust_call_with_error(_UniffiConverterTypeSignError,_UniffiLib.uniffi_zklink_sdk_fn_func_eth_signature_of_change_pubkey, + _UniffiConverterTypeChangePubKey.lower(tx), + _UniffiConverterTypeEthSigner.lower(eth_signer))) + + +def get_public_key_hash(public_key: "PackedPublicKey") -> "PubKeyHash": + + return _UniffiConverterTypePubKeyHash.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_get_public_key_hash, + _UniffiConverterTypePackedPublicKey.lower(public_key))) + + +def verify_musig(signature: "ZkLinkSignature",msg: "typing.List[int]") -> "bool": + + + return _UniffiConverterBool.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_verify_musig, + _UniffiConverterTypeZkLinkSignature.lower(signature), + _UniffiConverterSequenceUInt8.lower(msg))) + + +def zklink_main_net_url() -> str: + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_main_net_url,)) + + +def zklink_test_net_url() -> str: + return _UniffiConverterString.lift(_rust_call(_UniffiLib.uniffi_zklink_sdk_fn_func_zklink_test_net_url,)) + + +__all__ = [ + "InternalError", + "ChangePubKeyAuthData", + "ChangePubKeyAuthRequest", + "EthSignerError", + "L1SignerType", + "L1Type", + "Parameter", + "SignError", + "StarkSignerError", + "TypeError", + "TypedDataMessage", + "ZkSignerError", + "AutoDeleveragingBuilder", + "ChangePubKeyBuilder", + "ContractBuilder", + "ContractMatchingBuilder", + "ContractPrice", + "Create2Data", + "DepositBuilder", + "ForcedExitBuilder", + "FullExitBuilder", + "FundingBuilder", + "FundingInfo", + "LiquidationBuilder", + "Message", + "OraclePrices", + "OrderMatchingBuilder", + "SpotPriceInfo", + "TransferBuilder", + "TxMessage", + "TxSignature", + "UpdateGlobalVarBuilder", + "WithdrawBuilder", + "ZkLinkSignature", + "create_signed_change_pubkey", + "eth_signature_of_change_pubkey", + "get_public_key_hash", + "verify_musig", + "zklink_main_net_url", + "zklink_test_net_url", + "AutoDeleveraging", + "ChangePubKey", + "Contract", + "ContractMatching", + "Deposit", + "EthSigner", + "ForcedExit", + "FullExit", + "Funding", + "Liquidation", + "Order", + "OrderMatching", + "Signer", + "StarkSigner", + "Transfer", + "TypedData", + "UpdateGlobalVar", + "Withdraw", + "ZkLinkSigner", +] + diff --git a/jesse/modes/import_candles_mode/drivers/Binance/BinanceMain.py b/jesse/modes/import_candles_mode/drivers/Binance/BinanceMain.py index 77dffb656..7907725e8 100644 --- a/jesse/modes/import_candles_mode/drivers/Binance/BinanceMain.py +++ b/jesse/modes/import_candles_mode/drivers/Binance/BinanceMain.py @@ -3,6 +3,9 @@ from jesse.modes.import_candles_mode.drivers.interface import CandleExchange from typing import Union from .binance_utils import timeframe_to_interval +import time +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry class BinanceMain(CandleExchange): @@ -20,6 +23,34 @@ def __init__( ) self.endpoint = rest_endpoint + # Setup session with retry strategy + self.session = requests.Session() + retries = Retry( + total=5, + backoff_factor=1, + status_forcelist=[500, 502, 503, 504], + ) + self.session.mount('http://', HTTPAdapter(max_retries=retries)) + self.session.mount('https://', HTTPAdapter(max_retries=retries)) + + def _make_request(self, url: str, params: dict = None) -> requests.Response: + max_retries = 3 + retry_delay = 5 + + for attempt in range(max_retries): + try: + response = self.session.get(url, params=params, timeout=30) + return response + except (requests.exceptions.ConnectionError, OSError) as e: + if "Cannot allocate memory" in str(e): + # Force garbage collection and wait + import gc + gc.collect() + time.sleep(retry_delay * (attempt + 1)) + continue + raise e + + raise Exception(f"Failed to make request after {max_retries} attempts") def get_starting_time(self, symbol: str) -> int: dashless_symbol = jh.dashless_symbol(symbol) @@ -30,7 +61,10 @@ def get_starting_time(self, symbol: str) -> int: 'limit': 1500, } - response = requests.get(self.endpoint + '/v1/klines', params=payload) + response = self._make_request( + self.endpoint + self._prefix_address + 'klines', + params=payload + ) self.validate_response(response) @@ -54,7 +88,10 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni 'limit': self.count, } - response = requests.get(self.endpoint + '/v1/klines', params=payload) + response = self._make_request( + self.endpoint + self._prefix_address + 'klines', + params=payload + ) self.validate_response(response) @@ -73,10 +110,21 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni } for d in data] def get_available_symbols(self) -> list: - response = requests.get(self.endpoint + '/v1/exchangeInfo') + response = self._make_request(self.endpoint + self._prefix_address + 'exchangeInfo') self.validate_response(response) data = response.json() return [jh.dashy_symbol(d['symbol']) for d in data['symbols']] + + @property + def _prefix_address(self): + if self.name.startswith('Binance Perpetual Futures'): + return '/v1/' + return '/v3/' + + def __del__(self): + """Cleanup method to ensure proper session closure""" + if hasattr(self, 'session'): + self.session.close() diff --git a/jesse/modes/import_candles_mode/drivers/Binance/BinanceSpot.py b/jesse/modes/import_candles_mode/drivers/Binance/BinanceSpot.py index a8781bfc4..a03579db1 100644 --- a/jesse/modes/import_candles_mode/drivers/Binance/BinanceSpot.py +++ b/jesse/modes/import_candles_mode/drivers/Binance/BinanceSpot.py @@ -6,6 +6,6 @@ class BinanceSpot(BinanceMain): def __init__(self) -> None: super().__init__( name=exchanges.BINANCE_SPOT, - rest_endpoint='https://www.binance.com/api', + rest_endpoint='https://api.binance.com/api', backup_exchange_class=None ) diff --git a/jesse/modes/import_candles_mode/drivers/Binance/BinanceUSSpot.py b/jesse/modes/import_candles_mode/drivers/Binance/BinanceUSSpot.py index ae2686ce5..c8abcd4ba 100644 --- a/jesse/modes/import_candles_mode/drivers/Binance/BinanceUSSpot.py +++ b/jesse/modes/import_candles_mode/drivers/Binance/BinanceUSSpot.py @@ -8,6 +8,6 @@ def __init__(self) -> None: super().__init__( name=exchanges.BINANCE_US_SPOT, - rest_endpoint='https://www.binance.us/api', + rest_endpoint='https://api.binance.us/api', backup_exchange_class=BinanceSpot ) diff --git a/jesse/modes/import_candles_mode/drivers/Bitfinex/BitfinexSpot.py b/jesse/modes/import_candles_mode/drivers/Bitfinex/BitfinexSpot.py index 131443d92..184152009 100644 --- a/jesse/modes/import_candles_mode/drivers/Bitfinex/BitfinexSpot.py +++ b/jesse/modes/import_candles_mode/drivers/Bitfinex/BitfinexSpot.py @@ -1,4 +1,6 @@ import requests +import time +from requests.exceptions import ConnectionError, RequestException import jesse.helpers as jh from jesse import exceptions @@ -17,6 +19,21 @@ def __init__(self) -> None: ) self.endpoint = 'https://api-pub.bitfinex.com/v2/candles' + self.max_retries = 5 + self.base_delay = 3 # Base delay in seconds + + def _make_request(self, url: str, params: dict = None) -> requests.Response: + for attempt in range(self.max_retries): + try: + response = requests.get(url, params=params) + return response + except (ConnectionError, RequestException) as e: + if attempt == self.max_retries - 1: # Last attempt + raise e + + # Exponential backoff with jitter + delay = (self.base_delay * 2 ** attempt) + (jh.random_uniform(0, 1)) + time.sleep(delay) def get_starting_time(self, symbol: str) -> int: dashless_symbol = jh.dashless_symbol(symbol) @@ -32,7 +49,7 @@ def get_starting_time(self, symbol: str) -> int: 'limit': 5000, } - response = requests.get(f"{self.endpoint}/trade:1D:t{dashless_symbol}/hist", params=payload) + response = self._make_request(f"{self.endpoint}/trade:1D:t{dashless_symbol}/hist", params=payload) self.validate_response(response) @@ -41,7 +58,7 @@ def get_starting_time(self, symbol: str) -> int: # wrong symbol entered if not len(data): raise exceptions.SymbolNotFound( - f"No candle exists for {symbol} in Bitfinex. You're probably misspelling the symbol name." + f"No candle exists for {symbol} in Bitfinex." ) # since the first timestamp doesn't include all the 1m @@ -64,7 +81,7 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str) -> list: dashless_symbol = jh.dashless_symbol(symbol) - response = requests.get( + response = self._make_request( f"{self.endpoint}/trade:{interval}:t{dashless_symbol}/hist", params=payload ) @@ -86,7 +103,7 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str) -> list: } for d in data] def get_available_symbols(self) -> list: - response = requests.get('https://api-pub.bitfinex.com/v2/conf/pub:list:pair:exchange') + response = self._make_request('https://api-pub.bitfinex.com/v2/conf/pub:list:pair:exchange') self.validate_response(response) data = response.json()[0] arr = [] diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetSpot.py b/jesse/modes/import_candles_mode/drivers/Bitget/BitgetSpot.py deleted file mode 100644 index 167763095..000000000 --- a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetSpot.py +++ /dev/null @@ -1,83 +0,0 @@ -from typing import Union -import requests -from jesse.modes.import_candles_mode.drivers.interface import CandleExchange -from .bitget_spot_utils import timeframe_to_interval -import jesse.helpers as jh -from jesse.enums import exchanges -from jesse import exceptions - - -class BitgetSpot(CandleExchange): - def __init__(self) -> None: - super().__init__( - name=exchanges.BITGET_SPOT, - count=100, - rate_limit_per_second=18, - backup_exchange_class=None - ) - - self.endpoint = 'https://api.bitget.com/api/spot/v1/market/candles' - - def get_starting_time(self, symbol: str) -> int: - payload = { - 'after': 1359291660000, - 'before': jh.now(force_fresh=True), - 'period': '1week', - 'symbol': self._jesse_symbol_to_bitget_usdt_contracts_symbol(symbol), - } - - response = requests.get(self.endpoint, params=payload) - - self.validate_bitget_response(response) - - data = response.json() - - # since the first timestamp doesn't include all the 1m - # candles, let's start since the second day then - return int(data[1][0]) - - def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: - end_timestamp = start_timestamp + (self.count - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) - - payload = { - 'period': timeframe_to_interval(timeframe), - 'symbol': self._jesse_symbol_to_bitget_usdt_contracts_symbol(symbol), - 'after': int(start_timestamp), - 'before': int(end_timestamp) - } - - response = requests.get(self.endpoint, params=payload) - - self.validate_bitget_response(response) - - data = response.json() - - return [ - { - 'id': jh.generate_unique_id(), - 'exchange': self.name, - 'symbol': symbol, - 'timeframe': timeframe, - 'timestamp': int(d['ts']), - 'open': float(d['open']), - 'high': float(d['high']), - 'low': float(d['low']), - 'close': float(d['close']), - 'volume': float(d['baseVol']) - } for d in data - ] - - @staticmethod - def _jesse_symbol_to_bitget_usdt_contracts_symbol(symbol: str) -> str: - return f'{jh.dashless_symbol(symbol)}_SPBL' - - def validate_bitget_response(self, response): - data = response.json() - - # 40019: wrong symbol - if response.status_code == 400 and data['code'] == "40019": - msg = 'Symbol not found. Check the symbol and try again.' - msg += f' Example of a valid symbol for "{self.name}": "BTC-USDT"' - raise exceptions.SymbolNotFound(msg) - - self.validate_response(response) diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetual.py b/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetual.py deleted file mode 100644 index a068f729b..000000000 --- a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetual.py +++ /dev/null @@ -1,10 +0,0 @@ -from .BitgetUSDTPerpetualMain import BitgetUSDTPerpetualMain -from jesse.enums import exchanges - - -class BitgetUSDTPerpetual(BitgetUSDTPerpetualMain): - def __init__(self) -> None: - super().__init__( - name=exchanges.BITGET_USDT_PERPETUAL, - endpoint='https://api.bitget.com' - ) diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualMain.py b/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualMain.py deleted file mode 100644 index 51f44e3d5..000000000 --- a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualMain.py +++ /dev/null @@ -1,105 +0,0 @@ -from typing import Union -import requests -from jesse.modes.import_candles_mode.drivers.interface import CandleExchange -from .bitget_utils import timeframe_to_interval -import jesse.helpers as jh -from jesse.enums import exchanges -from jesse import exceptions - - -class BitgetUSDTPerpetualMain(CandleExchange): - def __init__( - self, - name: str, - endpoint: str, - ) -> None: - super().__init__( - name=name, - count=100, - rate_limit_per_second=18, - backup_exchange_class=None - ) - - self.endpoint = endpoint - - def get_starting_time(self, symbol: str) -> int: - payload = { - 'granularity': '1W', - 'symbol': self.jesse_symbol_to_bitget_usdt_contracts_symbol(symbol), - 'startTime': 1359291660000, - 'endTime': jh.now(force_fresh=True) - } - - response = requests.get(self.endpoint + '/api/mix/v1/market/candles', params=payload) - - self.validate_bitget_response(response) - - data = response.json() - - # since the first timestamp doesn't include all the 1m - # candles, let's start since the second day then - return int(data[1][0]) - - def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: - end_timestamp = start_timestamp + (self.count - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) - - payload = { - 'granularity': timeframe_to_interval(timeframe), - 'symbol': self.jesse_symbol_to_bitget_usdt_contracts_symbol(symbol), - 'startTime': int(start_timestamp), - 'endTime': int(end_timestamp) - } - - response = requests.get(self.endpoint + '/api/mix/v1/market/candles', params=payload) - - self.validate_bitget_response(response) - - data = response.json() - - return [ - { - 'id': jh.generate_unique_id(), - 'exchange': self.name, - 'symbol': symbol, - 'timeframe': timeframe, - 'timestamp': int(d[0]), - 'open': float(d[1]), - 'high': float(d[2]), - 'low': float(d[3]), - 'close': float(d[4]), - 'volume': float(d[5]) - } for d in data - ] - - def jesse_symbol_to_bitget_usdt_contracts_symbol(self, symbol: str) -> str: - if self.name == exchanges.BITGET_USDT_PERPETUAL: - return f'{jh.dashless_symbol(symbol)}_UMCBL' - elif self.name == exchanges.BITGET_USDT_PERPETUAL_TESTNET: - return f'{jh.dashless_symbol(symbol)}_SUMCBL' - else: - raise NotImplemented('Invalid exchange: {}'.format(self.name)) - - def validate_bitget_response(self, response): - data = response.json() - - # 40019: wrong symbol - if response.status_code == 400 and data['code'] == "40019": - msg = 'Symbol not found. Check the symbol and try again.' - if self.name == exchanges.BITGET_USDT_PERPETUAL_TESTNET: - msg += f' Example of a valid symbol for "{self.name}": "SBTC-SUSDT"' - raise exceptions.SymbolNotFound(msg) - - self.validate_response(response) - - def get_available_symbols(self) -> list: - if self.name == exchanges.BITGET_USDT_PERPETUAL: - product = 'umcbl' - elif self.name == exchanges.BITGET_USDT_PERPETUAL_TESTNET: - product = 'sumcbl' - else: - raise NotImplemented('Invalid exchange: {}'.format(self.name)) - - response = requests.get(self.endpoint + '/api/mix/v1/market/contracts?productType=' + product) - self.validate_bitget_response(response) - data = response.json()['data'] - return [jh.dashy_symbol(s['symbolName']) for s in data] diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualTestnet.py b/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualTestnet.py deleted file mode 100644 index 43fee2210..000000000 --- a/jesse/modes/import_candles_mode/drivers/Bitget/BitgetUSDTPerpetualTestnet.py +++ /dev/null @@ -1,10 +0,0 @@ -from .BitgetUSDTPerpetualMain import BitgetUSDTPerpetualMain -from jesse.enums import exchanges - - -class BitgetUSDTPerpetualTestnet(BitgetUSDTPerpetualMain): - def __init__(self) -> None: - super().__init__( - name=exchanges.BITGET_USDT_PERPETUAL_TESTNET, - endpoint='https://api.bitget.com/api/mix/v1/market/candles' - ) diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/bitget_utils.py b/jesse/modes/import_candles_mode/drivers/Bitget/bitget_utils.py deleted file mode 100644 index f12573c59..000000000 --- a/jesse/modes/import_candles_mode/drivers/Bitget/bitget_utils.py +++ /dev/null @@ -1,44 +0,0 @@ -from jesse.enums import timeframes -import jesse.helpers as jh - - -def timeframe_to_interval(timeframe: str) -> str: - if timeframe == timeframes.MINUTE_1: - return '1m' - elif timeframe == timeframes.MINUTE_5: - return '5m' - elif timeframe == timeframes.MINUTE_15: - return '15m' - elif timeframe == timeframes.MINUTE_30: - return '30m' - elif timeframe == timeframes.HOUR_1: - return '1H' - elif timeframe == timeframes.HOUR_4: - return '4H' - elif timeframe == timeframes.HOUR_12: - return '12H' - elif timeframe == timeframes.DAY_1: - return '1D' - else: - raise NotImplemented('Invalid timeframe: {}'.format(timeframe)) - - -def interval_to_timeframe(interval: str) -> str: - if interval == '1m': - return timeframes.MINUTE_1 - elif interval == '5m': - return timeframes.MINUTE_5 - elif interval == '15m': - return timeframes.MINUTE_15 - elif interval == '30m': - return timeframes.MINUTE_30 - elif interval == '1H': - return timeframes.HOUR_1 - elif interval == '4H': - return timeframes.HOUR_4 - elif interval == '12H': - return timeframes.HOUR_12 - elif interval == '1D': - return timeframes.DAY_1 - else: - raise NotImplemented('Invalid interval: {}'.format(interval)) diff --git a/jesse/modes/import_candles_mode/drivers/Bybit/BybitMain.py b/jesse/modes/import_candles_mode/drivers/Bybit/BybitMain.py index 318f3bba3..520a2047c 100644 --- a/jesse/modes/import_candles_mode/drivers/Bybit/BybitMain.py +++ b/jesse/modes/import_candles_mode/drivers/Bybit/BybitMain.py @@ -1,4 +1,6 @@ import requests +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry import jesse.helpers as jh from jesse.modes.import_candles_mode.drivers.interface import CandleExchange from typing import Union @@ -15,6 +17,16 @@ def __init__(self, name: str, rest_endpoint: str, category: str) -> None: self.endpoint = rest_endpoint self.category = category + # Setup session with retry strategy + self.session = requests.Session() + retries = Retry( + total=3, + backoff_factor=1, + status_forcelist=[408, 429, 500, 502, 503, 504], + allowed_methods=["HEAD", "GET", "POST"] + ) + self.session.mount('https://', HTTPAdapter(max_retries=retries, pool_maxsize=100)) + def get_starting_time(self, symbol: str) -> int: dashless_symbol = jh.dashless_symbol(symbol) payload = { @@ -25,12 +37,11 @@ def get_starting_time(self, symbol: str) -> int: 'start': 1514811660000 } - response = requests.get(self.endpoint + '/v5/market/kline', params=payload) + response = self.session.get(self.endpoint + '/v5/market/kline', params=payload, timeout=10) self.validate_response(response) data = response.json()['result']['list'] # Reverse the data list data = data[::-1] - return int(data[1][0]) def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: @@ -44,8 +55,8 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni 'limit': self.count } - response = requests.get(self.endpoint + '/v5/market/kline', params=payload) - + response = self.session.get(self.endpoint + '/v5/market/kline', params=payload, timeout=10) + if response.json()['retMsg'] != 'OK': raise exceptions.SymbolNotFound(response.json()['retMsg']) data = response.json()['result']['list'] @@ -68,8 +79,7 @@ def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Uni ] def get_available_symbols(self) -> list: - response = requests.get(self.endpoint + '/v5/market/instruments-info?category=' + self.category) + response = self.session.get(self.endpoint + '/v5/market/instruments-info?limit=1000&category=' + self.category, timeout=10) self.validate_response(response) data = response.json()['result']['list'] - return [jh.dashy_symbol(d['symbol']) for d in data] diff --git a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetual.py b/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetual.py deleted file mode 100644 index b5f9bae89..000000000 --- a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetual.py +++ /dev/null @@ -1,12 +0,0 @@ -from .DydxPerpetualMain import DydxPerpetualMain -from jesse.enums import exchanges - - -class DydxPerpetual(DydxPerpetualMain): - def __init__(self) -> None: - from jesse.modes.import_candles_mode.drivers.Bitfinex.BitfinexSpot import BitfinexSpot - super().__init__( - name=exchanges.DYDX_PERPETUAL, - rest_endpoint='https://api.dydx.exchange', - backup_exchange_class=BitfinexSpot - ) diff --git a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualMain.py b/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualMain.py deleted file mode 100644 index f5b2f9173..000000000 --- a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualMain.py +++ /dev/null @@ -1,83 +0,0 @@ -import requests -import jesse.helpers as jh -from jesse.modes.import_candles_mode.drivers.interface import CandleExchange -from typing import Union -from .dydx_utils import timeframe_to_interval - - -class DydxPerpetualMain(CandleExchange): - def __init__( - self, - name: str, - rest_endpoint: str, - backup_exchange_class - ) -> None: - super().__init__( - name=name, - count=100, - rate_limit_per_second=10, - backup_exchange_class=backup_exchange_class - ) - - self.endpoint = rest_endpoint - - def get_starting_time(self, symbol: str) -> int: - payload = { - 'resolution': '1DAY', - 'limit': self.count, - 'fromISO': jh.timestamp_to_iso8601(1359291660000), - 'toISO': jh.timestamp_to_iso8601(jh.now_to_timestamp(force_fresh=True)) - } - - response = requests.get(self.endpoint + '/v3/candles/' + symbol, params=payload) - - self.validate_response(response) - - data = response.json()['candles'] - - # reverse items of the list - data.reverse() - - # since the first timestamp doesn't include all the 1m - # candles, let's start since the second day then - return jh.iso8601_to_timestamp(data[1]['startedAt']) - - def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: - end_timestamp = start_timestamp + (self.count - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) - start_timestamp = start_timestamp - 60000 - payload = { - 'resolution': timeframe_to_interval(timeframe), - 'fromISO': jh.timestamp_to_iso8601(start_timestamp), - 'limit': self.count, - 'toISO': jh.timestamp_to_iso8601(end_timestamp) - } - - response = requests.get(self.endpoint + '/v3/candles/' + symbol, params=payload) - - self.validate_response(response) - data = response.json()['candles'] - - # reverse items of the list - data.reverse() - - return [ - { - 'id': jh.generate_unique_id(), - 'exchange': self.name, - 'symbol': symbol, - 'timeframe': timeframe, - 'timestamp': jh.iso8601_to_timestamp(d['startedAt']), - 'open': float(d['open']), - 'close': float(d['close']), - 'high': float(d['high']), - 'low': float(d['low']), - 'volume': float(d['baseTokenVolume']) - } for d in data - ] - - def get_available_symbols(self) -> list: - response = requests.get(self.endpoint + '/v3/markets') - self.validate_response(response) - data = response.json()['markets'] - - return [k for k, s in data.items()] diff --git a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualTestnet.py b/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualTestnet.py deleted file mode 100644 index 0f7eabe4a..000000000 --- a/jesse/modes/import_candles_mode/drivers/DyDx/DydxPerpetualTestnet.py +++ /dev/null @@ -1,12 +0,0 @@ -from .DydxPerpetualMain import DydxPerpetualMain -from jesse.enums import exchanges - - -class DydxPerpetualTestnet(DydxPerpetualMain): - def __init__(self) -> None: - from jesse.modes.import_candles_mode.drivers.DyDx.DydxPerpetual import DydxPerpetual - super().__init__( - name=exchanges.DYDX_PERPETUAL_TESTNET, - rest_endpoint='https://api.stage.dydx.exchange', - backup_exchange_class=DydxPerpetual - ) diff --git a/jesse/modes/import_candles_mode/drivers/DyDx/dydx_utils.py b/jesse/modes/import_candles_mode/drivers/DyDx/dydx_utils.py deleted file mode 100644 index 3fd006b4a..000000000 --- a/jesse/modes/import_candles_mode/drivers/DyDx/dydx_utils.py +++ /dev/null @@ -1,21 +0,0 @@ -from jesse.enums import timeframes - - -def timeframe_to_interval(timeframe: str) -> str: - # 1DAY, 4HOURS, 1HOUR, 30MINS, 15MINS, 5MINS, 1MIN - if timeframe == timeframes.MINUTE_1: - return '1MIN' - elif timeframe == timeframes.MINUTE_5: - return '5MINS' - elif timeframe == timeframes.MINUTE_15: - return '15MINS' - elif timeframe == timeframes.MINUTE_30: - return '30MINS' - elif timeframe == timeframes.HOUR_1: - return '1HOUR' - elif timeframe == timeframes.HOUR_4: - return '4HOURS' - elif timeframe == timeframes.DAY_1: - return '1DAY' - else: - raise ValueError('Invalid timeframe: {}'.format(timeframe)) diff --git a/jesse/modes/import_candles_mode/drivers/FTX/FTXMain.py b/jesse/modes/import_candles_mode/drivers/FTX/FTXMain.py deleted file mode 100644 index 38b9a7b71..000000000 --- a/jesse/modes/import_candles_mode/drivers/FTX/FTXMain.py +++ /dev/null @@ -1,100 +0,0 @@ -import requests -import jesse.helpers as jh -from jesse.modes.import_candles_mode.drivers.interface import CandleExchange -from jesse.enums import exchanges -from .ftx_utils import timeframe_to_interval -from jesse import exceptions - - -class FTXMain(CandleExchange): - def __init__( - self, - name: str, - rest_endpoint: str, - backup_exchange_class, - ) -> None: - super().__init__( - name=name, - count=1440, - rate_limit_per_second=6, - backup_exchange_class=backup_exchange_class - ) - - self.endpoint = rest_endpoint - - def _formatted_symbol(self, symbol: str) -> str: - if self.name in [exchanges.FTX_SPOT, exchanges.FTX_US_SPOT]: - return symbol.replace('-', '/') - elif self.name == exchanges.FTX_PERPETUAL_FUTURES: - # validation: make sure the symbol doesn't end in "PERP" - if symbol.endswith('PERP'): - raise exceptions.InvalidSymbol( - f'Invalid symbol "{symbol}". Please enter symbols as "BTC-USD" format instead of "BTC-PERP" (which still corresponds to "BTC-USD" perpetual contract on FTX.com). This is to keep the API consistent with other exchanges.' - ) - # make sure the symbol doesn't end in a number - if symbol[-1].isdigit(): - raise exceptions.InvalidSymbol( - f'Invalid symbol "{symbol}". Only Perpetual contracts are supported.' - ) - - return symbol.replace('USD', 'PERP') - else: - raise NotImplemented(f'Unknown exchange {self.name}') - - def get_starting_time(self, symbol: str) -> int: - end_timestamp = jh.now() - start_timestamp = end_timestamp - (86400_000 * 365 * 8) - - payload = { - 'resolution': 86400, - 'start_time': start_timestamp / 1000, - 'end_time': end_timestamp / 1000, - } - - response = requests.get( - f'{self.endpoint}/api/markets/{self._formatted_symbol(symbol)}/candles', - params=payload - ) - - self.validate_response(response) - - data = response.json()['result'] - - # since the first timestamp doesn't include all the 1m - # candles, let's start since the second day then - first_timestamp = int(data[0]['time']) - # second_timestamp: - return first_timestamp + 60_000 * 1440 - - def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> list: - end_timestamp = start_timestamp + (self.count - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) - if end_timestamp > jh.now(): - end_timestamp = jh.now() - interval = timeframe_to_interval(timeframe) - - payload = { - 'resolution': interval, - 'start_time': start_timestamp / 1000, - 'end_time': end_timestamp / 1000, - } - - response = requests.get( - f'{self.endpoint}/api/markets/{self._formatted_symbol(symbol)}/candles', - params=payload - ) - - self.validate_response(response) - - data = response.json()['result'] - return [{ - 'id': jh.generate_unique_id(), - 'exchange': self.name, - 'symbol': symbol, - 'timeframe': timeframe, - 'timestamp': int(d['time']), - 'open': float(d['open']), - 'close': float(d['close']), - 'high': float(d['high']), - 'low': float(d['low']), - 'volume': float(d['volume']) - } for d in data] diff --git a/jesse/modes/import_candles_mode/drivers/FTX/FTXPerpetualFutures.py b/jesse/modes/import_candles_mode/drivers/FTX/FTXPerpetualFutures.py deleted file mode 100644 index c158a620d..000000000 --- a/jesse/modes/import_candles_mode/drivers/FTX/FTXPerpetualFutures.py +++ /dev/null @@ -1,14 +0,0 @@ -from .FTXMain import FTXMain -from jesse.enums import exchanges - - -class FTXPerpetualFutures(FTXMain): - def __init__(self) -> None: - # import here instead of the top of the file to prevent the possible circular imports issue - from jesse.modes.import_candles_mode.drivers.FTX.FTXSpot import FTXSpot - - super().__init__( - name=exchanges.FTX_PERPETUAL_FUTURES, - rest_endpoint='https://ftx.com', - backup_exchange_class=FTXSpot - ) diff --git a/jesse/modes/import_candles_mode/drivers/FTX/FTXSpot.py b/jesse/modes/import_candles_mode/drivers/FTX/FTXSpot.py deleted file mode 100644 index 5ebd9d7e0..000000000 --- a/jesse/modes/import_candles_mode/drivers/FTX/FTXSpot.py +++ /dev/null @@ -1,14 +0,0 @@ -from .FTXMain import FTXMain -from jesse.enums import exchanges - - -class FTXSpot(FTXMain): - def __init__(self) -> None: - # import here instead of the top of the file to prevent the possible circular imports issue - from jesse.modes.import_candles_mode.drivers.Bitfinex.BitfinexSpot import BitfinexSpot - - super().__init__( - name=exchanges.FTX_SPOT, - rest_endpoint='https://ftx.com', - backup_exchange_class=BitfinexSpot - ) diff --git a/jesse/modes/import_candles_mode/drivers/FTX/FTXUSSpot.py b/jesse/modes/import_candles_mode/drivers/FTX/FTXUSSpot.py deleted file mode 100644 index ac6a59183..000000000 --- a/jesse/modes/import_candles_mode/drivers/FTX/FTXUSSpot.py +++ /dev/null @@ -1,14 +0,0 @@ -from .FTXMain import FTXMain -from jesse.enums import exchanges - - -class FTXUSSpot(FTXMain): - def __init__(self) -> None: - # import here instead of the top of the file to prevent the possible circular imports issue - from jesse.modes.import_candles_mode.drivers.FTX.FTXSpot import FTXSpot - - super().__init__( - name=exchanges.FTX_US_SPOT, - rest_endpoint='https://ftx.us', - backup_exchange_class=FTXSpot - ) diff --git a/jesse/modes/import_candles_mode/drivers/FTX/__init__.py b/jesse/modes/import_candles_mode/drivers/FTX/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/jesse/modes/import_candles_mode/drivers/FTX/ftx_utils.py b/jesse/modes/import_candles_mode/drivers/FTX/ftx_utils.py deleted file mode 100644 index ae4be11e7..000000000 --- a/jesse/modes/import_candles_mode/drivers/FTX/ftx_utils.py +++ /dev/null @@ -1,40 +0,0 @@ -from jesse.enums import timeframes - - -def timeframe_to_interval(timeframe: str) -> int: - # 15, 60, 300, 900, 3600, 14400, 86400, or any multiple of 86400 up to 30*86400 - if timeframe == timeframes.MINUTE_1: - return 60 - elif timeframe == timeframes.MINUTE_5: - return 300 - elif timeframe == timeframes.MINUTE_15: - return 900 - elif timeframe == timeframes.HOUR_1: - return 3600 - elif timeframe == timeframes.HOUR_4: - return 14400 - elif timeframe == timeframes.DAY_1: - return 86400 - # elif timeframe == timeframes.WEEK_1: - # return 604800 - else: - raise ValueError('Invalid timeframe: {}'.format(timeframe)) - - -def interval_to_timeframe(interval: int) -> str: - if interval == 60: - return timeframes.MINUTE_1 - elif interval == 300: - return timeframes.MINUTE_5 - elif interval == 900: - return timeframes.MINUTE_15 - elif interval == 3600: - return timeframes.HOUR_1 - elif interval == 14400: - return timeframes.HOUR_4 - elif interval == 86400: - return timeframes.DAY_1 - elif interval == 604800: - return timeframes.WEEK_1 - else: - raise ValueError('Invalid interval: {}'.format(interval)) diff --git a/jesse/modes/import_candles_mode/drivers/Gate/GateSpot.py b/jesse/modes/import_candles_mode/drivers/Gate/GateSpot.py new file mode 100644 index 000000000..815634282 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Gate/GateSpot.py @@ -0,0 +1,10 @@ +from .GateSpotMain import GateSpotMain +from jesse.enums import exchanges + + +class GateSpot(GateSpotMain): + def __init__(self) -> None: + super().__init__( + name=exchanges.GATE_SPOT, + rest_endpoint='https://api.gateio.ws/api/v4/spot' + ) diff --git a/jesse/modes/import_candles_mode/drivers/Gate/GateSpotMain.py b/jesse/modes/import_candles_mode/drivers/Gate/GateSpotMain.py new file mode 100644 index 000000000..b61383339 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Gate/GateSpotMain.py @@ -0,0 +1,79 @@ +import requests +import jesse.helpers as jh +from jesse.modes.import_candles_mode.drivers.interface import CandleExchange +from typing import Union +from jesse import exceptions +from .gate_utils import timeframe_to_interval + + +class GateSpotMain(CandleExchange): + def __init__(self, name: str, rest_endpoint: str) -> None: + super().__init__(name=name, count=200, rate_limit_per_second=10, backup_exchange_class=None) + self.name = name + self.limit = 1000 + self.endpoint = rest_endpoint + + def get_starting_time(self, symbol: str) -> int: + symbol = jh.dashy_to_underline(symbol) + payload = { + 'contract': symbol, + 'interval': '1w', + 'limit': 1000, + 'from': 1514811660 + } + + response = requests.get(f"{self.endpoint}/candlesticks", params=payload) + self.validate_response(response) + + if response.json() == []: + raise exceptions.InvalidSymbol('Exchange does not support the entered symbol. Please enter a valid symbol.') + + data = response.json() + # Reverse the data list + + return int(data[0]['t']) + + def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: + symbol = jh.dashy_to_underline(symbol) + end_timestamp = start_timestamp + (self.limit - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) + interval = timeframe_to_interval(timeframe) + + payload = { + 'currency_pair': symbol, + 'interval': interval, + 'from': int(start_timestamp / 1000), + 'to': int(end_timestamp / 1000), + } + + response = requests.get(f"{self.endpoint}/candlesticks", params=payload) + self.validate_response(response) + + if response.json() == []: + raise exceptions.InvalidSymbol('Exchange does not support the entered symbol. Please enter a valid symbol.') + + data = [] + for d in response.json(): + data.append({ + 'id': jh.generate_unique_id(), + 'exchange': self.name, + 'symbol': jh.underline_to_dashy_symbol(symbol), + 'timeframe': timeframe, + 'timestamp': int(d[0]) * 1000, + 'open': float(d[5]), + 'close': float(d[2]), + 'high': float(d[3]), + 'low': float(d[4]), + 'volume': float(d[1]) + }) + return data + + def get_available_symbols(self) -> list: + pairs = [] + response = requests.get(f"{self.endpoint}/currency_pairs") + self.validate_response(response) + data = response.json() + + for p in data: + pairs.append(jh.underline_to_dashy_symbol(p['id'])) + + return pairs diff --git a/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTMain.py b/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTMain.py new file mode 100644 index 000000000..9589b9305 --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTMain.py @@ -0,0 +1,105 @@ +import requests +import jesse.helpers as jh +from jesse.modes.import_candles_mode.drivers.interface import CandleExchange +from typing import Union +from jesse import exceptions +from .gate_utils import timeframe_to_interval +import time +from requests.adapters import HTTPAdapter +from urllib3.util.retry import Retry + + +class GateUSDTMain(CandleExchange): + def __init__(self, name: str, rest_endpoint: str) -> None: + super().__init__(name=name, count=200, rate_limit_per_second=10, backup_exchange_class=None) + self.name = name + self.limit = 2000 + self.endpoint = rest_endpoint + + # Setup session with retries + self.session = requests.Session() + retries = Retry( + total=3, + backoff_factor=1, + status_forcelist=[500, 502, 503, 504] + ) + self.session.mount('https://', HTTPAdapter(max_retries=retries)) + + def get_starting_time(self, symbol: str) -> int: + symbol = jh.dashy_to_underline(symbol) + payload = { + 'contract': symbol, + 'interval': '1w', + 'limit': 1000, + 'from': 1514811660 + } + + response = requests.get(f"{self.endpoint}/usdt/candlesticks", params=payload) + self.validate_response(response) + + if response.json() == []: + raise exceptions.InvalidSymbol('Exchange does not support the entered symbol. Please enter a valid symbol.') + + data = response.json() + # Reverse the data list + + return int(data[0]['t']) + + def fetch(self, symbol: str, start_timestamp: int, timeframe: str = '1m') -> Union[list, None]: + symbol = jh.dashy_to_underline(symbol) + end_timestamp = start_timestamp + (self.limit - 1) * 60000 * jh.timeframe_to_one_minutes(timeframe) + interval = timeframe_to_interval(timeframe) + + payload = { + 'contract': symbol, + 'interval': interval, + 'from': int(start_timestamp / 1000), + 'to': int(end_timestamp / 1000), + } + + max_retries = 3 + retry_delay = 5 # seconds + + for attempt in range(max_retries): + try: + response = self.session.get( + f"{self.endpoint}/usdt/candlesticks", + params=payload, + timeout=30 + ) + self.validate_response(response) + break + except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e: + if attempt == max_retries - 1: + raise + time.sleep(retry_delay) + retry_delay *= 2 # Exponential backoff + + if response.json() == []: + raise exceptions.InvalidSymbol('Exchange does not support the entered symbol. Please enter a valid symbol.') + + data = [] + for d in response.json(): + data.append({ + 'id': jh.generate_unique_id(), + 'exchange': self.name, + 'symbol': jh.underline_to_dashy_symbol(symbol), + 'timeframe': timeframe, + 'timestamp': int(d['t']) * 1000, + 'open': float(d['o']), + 'close': float(d['c']), + 'high': float(d['h']), + 'low': float(d['l']), + 'volume': float(d['v']) + }) + return data + + def get_available_symbols(self) -> list: + pairs = [] + response = requests.get(f"{self.endpoint}/usdt/contracts") + self.validate_response(response) + data = response.json() + for p in data: + pairs.append(jh.underline_to_dashy_symbol(p['name'])) + + return pairs diff --git a/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTPerpetual.py b/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTPerpetual.py new file mode 100644 index 000000000..cd9ef43af --- /dev/null +++ b/jesse/modes/import_candles_mode/drivers/Gate/GateUSDTPerpetual.py @@ -0,0 +1,10 @@ +from .GateUSDTMain import GateUSDTMain +from jesse.enums import exchanges + + +class GateUSDTPerpetual(GateUSDTMain): + def __init__(self) -> None: + super().__init__( + name=exchanges.GATE_USDT_PERPETUAL, + rest_endpoint='https://api.gateio.ws/api/v4/futures' + ) diff --git a/jesse/modes/import_candles_mode/drivers/DyDx/__init__.py b/jesse/modes/import_candles_mode/drivers/Gate/__init__.py similarity index 100% rename from jesse/modes/import_candles_mode/drivers/DyDx/__init__.py rename to jesse/modes/import_candles_mode/drivers/Gate/__init__.py diff --git a/jesse/modes/import_candles_mode/drivers/Bitget/bitget_spot_utils.py b/jesse/modes/import_candles_mode/drivers/Gate/gate_utils.py similarity index 52% rename from jesse/modes/import_candles_mode/drivers/Bitget/bitget_spot_utils.py rename to jesse/modes/import_candles_mode/drivers/Gate/gate_utils.py index 275515346..51f98fe6a 100644 --- a/jesse/modes/import_candles_mode/drivers/Bitget/bitget_spot_utils.py +++ b/jesse/modes/import_candles_mode/drivers/Gate/gate_utils.py @@ -2,42 +2,64 @@ def timeframe_to_interval(timeframe: str) -> str: + """ + Convert a timeframe string to an interval in seconds. + """ if timeframe == timeframes.MINUTE_1: - return '1min' + return '1m' elif timeframe == timeframes.MINUTE_5: - return '5min' + return '5m' elif timeframe == timeframes.MINUTE_15: - return '15min' + return '15m' elif timeframe == timeframes.MINUTE_30: - return '30min' + return '30m' elif timeframe == timeframes.HOUR_1: return '1h' + elif timeframe == timeframes.HOUR_2: + return '2h' elif timeframe == timeframes.HOUR_4: return '4h' elif timeframe == timeframes.HOUR_6: return '6h' + elif timeframe == timeframes.HOUR_8: + return '8h' elif timeframe == timeframes.HOUR_12: return '12h' elif timeframe == timeframes.DAY_1: - return '1day' + return '1d' + elif timeframe == timeframes.WEEK_1: + return '1w' + else: + raise ValueError('Invalid timeframe: {}'.format(timeframe)) def interval_to_timeframe(interval: str) -> str: - if interval == '1min': + """ + Convert an interval in seconds to a timeframe string. + """ + if interval == '1m': return timeframes.MINUTE_1 - elif interval == '5min': + elif interval == '5m': return timeframes.MINUTE_5 - elif interval == '15min': + elif interval == '15m': return timeframes.MINUTE_15 - elif interval == '30min': + elif interval == '30m': return timeframes.MINUTE_30 elif interval == '1h': return timeframes.HOUR_1 + elif interval == '2h': + return timeframes.HOUR_2 elif interval == '4h': return timeframes.HOUR_4 elif interval == '6h': return timeframes.HOUR_6 + elif interval == '8h': + return timeframes.HOUR_8 elif interval == '12h': return timeframes.HOUR_12 - elif interval == '1day': + elif interval == '1d': return timeframes.DAY_1 + elif interval == '1w': + return timeframes.WEEK_1 + else: + raise ValueError('Invalid interval: {}'.format(interval)) diff --git a/jesse/modes/import_candles_mode/drivers/__init__.py b/jesse/modes/import_candles_mode/drivers/__init__.py index 37a0b5107..e44cc1b58 100644 --- a/jesse/modes/import_candles_mode/drivers/__init__.py +++ b/jesse/modes/import_candles_mode/drivers/__init__.py @@ -1,4 +1,3 @@ -from pydoc import locate from jesse.enums import exchanges from jesse.modes.import_candles_mode.drivers.Binance.BinanceSpot import BinanceSpot from jesse.modes.import_candles_mode.drivers.Binance.BinanceUSSpot import BinanceUSSpot @@ -10,17 +9,14 @@ from jesse.modes.import_candles_mode.drivers.Bybit.BybitUSDTPerpetualTestnet import BybitUSDTPerpetualTestnet from jesse.modes.import_candles_mode.drivers.Bybit.BybitUSDCPerpetual import BybitUSDCPerpetual from jesse.modes.import_candles_mode.drivers.Bybit.BybitUSDCPerpetualTestnet import BybitUSDCPerpetualTestnet -from jesse.modes.import_candles_mode.drivers.FTX.FTXPerpetualFutures import FTXPerpetualFutures -from jesse.modes.import_candles_mode.drivers.FTX.FTXSpot import FTXSpot -from jesse.modes.import_candles_mode.drivers.FTX.FTXUSSpot import FTXUSSpot -from jesse.modes.import_candles_mode.drivers.Bitget.BitgetUSDTPerpetual import BitgetUSDTPerpetual -from jesse.modes.import_candles_mode.drivers.Bitget.BitgetUSDTPerpetualTestnet import BitgetUSDTPerpetualTestnet -from jesse.modes.import_candles_mode.drivers.DyDx.DydxPerpetual import DydxPerpetual -from jesse.modes.import_candles_mode.drivers.DyDx.DydxPerpetualTestnet import DydxPerpetualTestnet from jesse.modes.import_candles_mode.drivers.Bybit.BybitSpotTestnet import BybitSpotTestnet from jesse.modes.import_candles_mode.drivers.Bybit.BybitSpot import BybitSpot from jesse.modes.import_candles_mode.drivers.Apex.ApexProPerpetualTestnet import ApexProPerpetualTestnet from jesse.modes.import_candles_mode.drivers.Apex.ApexProPerpetual import ApexProPerpetual +from jesse.modes.import_candles_mode.drivers.Apex.ApexOmniPerpetualTestnet import ApexOmniPerpetualTestnet +from jesse.modes.import_candles_mode.drivers.Apex.ApexOmniPerpetual import ApexOmniPerpetual +from jesse.modes.import_candles_mode.drivers.Gate.GateUSDTPerpetual import GateUSDTPerpetual +from jesse.modes.import_candles_mode.drivers.Gate.GateSpot import GateSpot drivers = { @@ -33,23 +29,18 @@ exchanges.BYBIT_USDT_PERPETUAL_TESTNET: BybitUSDTPerpetualTestnet, exchanges.BYBIT_USDC_PERPETUAL: BybitUSDCPerpetual, exchanges.BYBIT_USDC_PERPETUAL_TESTNET: BybitUSDCPerpetualTestnet, - exchanges.FTX_PERPETUAL_FUTURES: FTXPerpetualFutures, - exchanges.BITGET_USDT_PERPETUAL: BitgetUSDTPerpetual, - exchanges.BITGET_USDT_PERPETUAL_TESTNET: BitgetUSDTPerpetualTestnet, exchanges.APEX_PRO_PERPETUAL_TESTNET: ApexProPerpetualTestnet, exchanges.APEX_PRO_PERPETUAL: ApexProPerpetual, + exchanges.APEX_OMNI_PERPETUAL_TESTNET: ApexOmniPerpetualTestnet, + exchanges.APEX_OMNI_PERPETUAL: ApexOmniPerpetual, + exchanges.GATE_USDT_PERPETUAL: GateUSDTPerpetual, + exchanges.GATE_SPOT: GateSpot, # Spot - exchanges.FTX_SPOT: FTXSpot, - exchanges.FTX_US_SPOT: FTXUSSpot, exchanges.BINANCE_SPOT: BinanceSpot, exchanges.BINANCE_US_SPOT: BinanceUSSpot, exchanges.BYBIT_SPOT_TESTNET: BybitSpotTestnet, exchanges.BYBIT_SPOT: BybitSpot, - - # DEX - exchanges.DYDX_PERPETUAL: DydxPerpetual, - exchanges.DYDX_PERPETUAL_TESTNET: DydxPerpetualTestnet } diff --git a/jesse/modes/optimize_mode/fitness.py b/jesse/modes/optimize_mode/fitness.py index bf29ddd2d..b6014ccfc 100644 --- a/jesse/modes/optimize_mode/fitness.py +++ b/jesse/modes/optimize_mode/fitness.py @@ -20,7 +20,7 @@ def _formatted_inputs_for_isolated_backtest(user_config, routes): 'futures_leverage': user_config['exchange']['futures_leverage'], 'futures_leverage_mode': user_config['exchange']['futures_leverage_mode'], 'exchange': routes[0]['exchange'], - 'warm_up_candles': user_config['warmup_candles_num'] + 'warm_up_candles': jh.get_config('env.data.warmup_candles_num') } diff --git a/jesse/modes/utils.py b/jesse/modes/utils.py index 152fa3d14..9c87c4772 100644 --- a/jesse/modes/utils.py +++ b/jesse/modes/utils.py @@ -26,18 +26,22 @@ def save_daily_portfolio_balance(is_initial=False) -> None: e, = store.exchanges.storage.values() except ValueError: raise ValueError('Multiple exchange support is not supported at the moment') + if e.type == 'futures': - total_balances += e.assets[jh.app_currency()] - - for key, pos in store.positions.storage.items(): - if pos.exchange_type == 'futures' and pos.is_open: - total_balances += pos.pnl - elif pos.exchange_type == 'spot': - total_balances += pos.strategy.portfolio_value + # For futures, add wallet balance and sum of all PNLs + total_balances = e.assets[jh.app_currency()] + for key, pos in store.positions.storage.items(): + if pos.is_open: + total_balances += pos.pnl + else: + # For spot, just get portfolio_value from any strategy (they all share the same wallet) + # Get the first strategy we can find + for key, pos in store.positions.storage.items(): + total_balances = pos.strategy.portfolio_value + break store.app.daily_balance.append(total_balances) - # TEMP: disable storing in database for now if not jh.is_livetrading(): logger.info(f'Saved daily portfolio balance: {round(total_balances, 2)}') diff --git a/jesse/research/__init__.py b/jesse/research/__init__.py index 427c821fe..037019dd0 100644 --- a/jesse/research/__init__.py +++ b/jesse/research/__init__.py @@ -1,3 +1,3 @@ -from .candles import get_candles, store_candles, fake_candle, fake_range_candles, candles_from_close_prices, candlestick_chart +from .candles import get_candles, store_candles, fake_candle, fake_range_candles, candles_from_close_prices from .backtest import backtest from .import_candles import import_candles diff --git a/jesse/research/backtest.py b/jesse/research/backtest.py index b0738578f..6993b91e8 100644 --- a/jesse/research/backtest.py +++ b/jesse/research/backtest.py @@ -61,9 +61,7 @@ def backtest( warmup_candles, run_silently=True, hyperparameters=hyperparameters, - generate_charts=generate_charts, generate_tradingview=generate_tradingview, - generate_quantstats=generate_quantstats, generate_csv=generate_csv, generate_json=generate_json, generate_equity_curve=generate_equity_curve, @@ -150,9 +148,7 @@ def _isolated_backtest( trading_candles_dict, run_silently, hyperparameters=hyperparameters, - generate_charts=generate_charts, generate_tradingview=generate_tradingview, - generate_quantstats=generate_quantstats, generate_csv=generate_csv, generate_json=generate_json, generate_equity_curve=generate_equity_curve, @@ -173,12 +169,8 @@ def _isolated_backtest( else: result['metrics'] = backtest_result['metrics'] - if generate_charts: - result['charts'] = backtest_result['charts'] if generate_tradingview: result['tradingview'] = backtest_result['tradingview'] - if generate_quantstats: - result['quantstats'] = backtest_result['quantstats'] if generate_csv: result['csv'] = backtest_result['csv'] if generate_json: diff --git a/jesse/research/candles.py b/jesse/research/candles.py index 44801efe7..4e04da198 100644 --- a/jesse/research/candles.py +++ b/jesse/research/candles.py @@ -66,15 +66,6 @@ def store_candles(candles: np.ndarray, exchange: str, symbol: str) -> None: store_candles_from_list(arr) -def candlestick_chart(candles: np.ndarray): - """ - Displays a candlestick chart from the numpy array - """ - import mplfinance as mpf - df = utils.numpy_candles_to_dataframe(candles) - mpf.plot(df, type='candle') - - def fake_candle(attributes: dict = None, reset: bool = False) -> np.ndarray: """ Generates a fake candle. diff --git a/jesse/rl/Agent.py b/jesse/rl/Agent.py new file mode 100644 index 000000000..606a5d2c0 --- /dev/null +++ b/jesse/rl/Agent.py @@ -0,0 +1,358 @@ +import torch +import torch.optim as optim +import torch.nn.functional as F +from jesse.rl.models import ConvDQN, ConvDuelingDQN +from jesse.rl.utils import ReplayMemory +from jesse.rl.utils import Transition +import random +from tqdm import tqdm +import re +import os + + +class Agent: + """Definition of the Agent that will interact with the environment. + + Attributes: + REPLAY_MEM_SIZE (:obj:`int`): max capacity of Replay Memory + + BATCH_SIZE (:obj:`int`): Batch size. Default is 40 as specified in the paper. + + GAMMA (:obj:`float`): The discount, should be a constant between 0 and 1 + that ensures the sum converges. It also controls the importance of future + expected reward. + + EPS_START(:obj:`float`): initial value for epsilon of the e-greedy action + selection + + EPS_END(:obj:`float`): final value for epsilon of the e-greedy action + selection + + LEARNING_RATE(:obj:`float`): learning rate of the optimizer + (Adam) + + INPUT_DIM (:obj:`int`): input dimentionality withut considering batch size. + + HIDDEN_DIM (:obj:`int`): hidden layer dimentionality (for Linear models only) + + ACTION_NUMBER (:obj:`int`): dimentionality of output layer of the Q network + + TARGET_UPDATE (:obj:`int`): period of Q target network updates + + MODEL (:obj:`string`): type of the model. + + DOUBLE (:obj:`bool`): Type of Q function computation. + """ + + def __init__(self, + REPLAY_MEM_SIZE=10000, + BATCH_SIZE=40, + GAMMA=0.98, + EPS_START=1, + EPS_END=0.12, + EPS_STEPS=300, + LEARNING_RATE=0.001, + INPUT_DIM=24, + HIDDEN_DIM=120, + ACTION_NUMBER=3, + TARGET_UPDATE=10, + MODEL='ddqn', + DOUBLE=True): + + self.REPLAY_MEM_SIZE = REPLAY_MEM_SIZE + self.BATCH_SIZE = BATCH_SIZE + self.GAMMA = GAMMA + self.EPS_START = EPS_START + self.EPS_END = EPS_END + self.EPS_STEPS = EPS_STEPS + self.LEARNING_RATE = LEARNING_RATE + self.INPUT_DIM = INPUT_DIM + self.HIDDEN_DIM = HIDDEN_DIM + self.ACTION_NUMBER = ACTION_NUMBER + self.TARGET_UPDATE = TARGET_UPDATE + self.MODEL = MODEL # deep q network (dqn) or Dueling deep q network (ddqn) + self.DOUBLE = DOUBLE # to understand if use or do not use a 'Double' model (regularization) + self.TRAINING = True # to do not pick random actions during testing + if torch.backends.mps.is_available(): + # self.device = torch.device("mps") + self.device = torch.device("cpu") + else: + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + print("Agent is using device:\t" + str(self.device)) + + '''elif self.MODEL == 'lin_ddqn': + self.policy_net = DuelingDQN(self.INPUT_DIM, self.HIDDEN_DIM, self.ACTION_NUMBER).to(self.device) + self.target_net = DuelingDQN(self.INPUT_DIM, self.HIDDEN_DIM, self.ACTION_NUMBER).to(self.device) + elif self.MODEL == 'lin_dqn': + self.policy_net = DQN(self.INPUT_DIM, self.HIDDEN_DIM, self.ACTION_NUMBER).to(self.device) + self.target_net = DQN(self.INPUT_DIM, self.HIDDEN_DIM, self.ACTION_NUMBER).to(self.device) + ''' + + if self.MODEL == 'ddqn': + self.policy_net = ConvDuelingDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + self.target_net = ConvDuelingDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + elif self.MODEL == 'dqn': + self.policy_net = ConvDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + self.target_net = ConvDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + + self.target_net.load_state_dict(self.policy_net.state_dict()) + self.target_net.eval() + + self.optimizer = optim.Adam(self.policy_net.parameters(), lr=self.LEARNING_RATE) + self.memory = ReplayMemory(self.REPLAY_MEM_SIZE) + self.steps_done = 0 + self.training_cumulative_reward = [] + + def select_action(self, state): + """ the epsilon-greedy action selection""" + state = state.unsqueeze(0).unsqueeze(1) + sample = random.random() + if self.TRAINING: + if self.steps_done > self.EPS_STEPS: + eps_threshold = self.EPS_END + else: + eps_threshold = self.EPS_START + else: + eps_threshold = self.EPS_END + + self.steps_done += 1 + # [Exploitation] pick the best action according to current Q approx. + if sample > eps_threshold: + with torch.no_grad(): + # Return the number of the action with highest non normalized probability + # TODO: decide if diverge from paper and normalize probabilities with + # softmax or at least compare the architectures + return torch.tensor([self.policy_net(state).argmax()], device=self.device, dtype=torch.long) + + # [Exploration] pick a random action from the action space + else: + return torch.tensor([random.randrange(self.ACTION_NUMBER)], device=self.device, dtype=torch.long) + + def optimize_model(self): + if len(self.memory) < self.BATCH_SIZE: + # it will return without doing nothing if we have not enough data to sample + return + transitions = self.memory.sample(self.BATCH_SIZE) + # Transpose the batch (see https://stackoverflow.com/a/19343/3343043 for + # detailed explanation). This converts batch-array of Transitions + # to Transition of batch-arrays. + # Transition is the named tuple defined above. + batch = Transition(*zip(*transitions)) + + # Compute a mask of non-final states and concatenate the batch elements + # (a final state would've been the one after which simulation ended) + # + # non_final_mask is a column vector telling wich state of the sampled is final + # non_final_next_states contains all the non-final states sampled + non_final_mask = torch.tensor(tuple(map(lambda s: s is not None, batch.next_state)), device=self.device, + dtype=torch.bool) + nfns = [s for s in batch.next_state if s is not None] + non_final_next_states = torch.cat(nfns).view(len(nfns), -1) + non_final_next_states = non_final_next_states.unsqueeze(1) + + state_batch = torch.cat(batch.state).view(self.BATCH_SIZE, -1) + state_batch = state_batch.unsqueeze(1) + action_batch = torch.cat(batch.action).view(self.BATCH_SIZE, -1) + reward_batch = torch.cat(batch.reward).view(self.BATCH_SIZE, -1) + + # Compute Q(s_t, a) - the model computes Q(s_t), then we select the + # columns of actions taken. These are the actions which would've been taken + # for each batch state according to policy_net + state_action_values = self.policy_net(state_batch).gather(1, action_batch) + + # Compute V(s_{t+1}) for all next states. + # Expected values of actions for non_final_next_states are computed based + # on the "older" target_net; selecting their best reward with max(1)[0]. + # This is merged based on the mask, such that we'll have either the expected + # state value or 0 in case the state was final. + # detach removes the tensor from the graph -> no gradient computation is + # required + next_state_values = torch.zeros(self.BATCH_SIZE, device=self.device) + next_state_values[non_final_mask] = self.target_net(non_final_next_states).max(1)[0].detach() + next_state_values = next_state_values.view(self.BATCH_SIZE, -1) + + # Compute the expected Q values + expected_state_action_values = (next_state_values * self.GAMMA) + reward_batch + # print("expected_state_action_values.shape:\t%s"%str(expected_state_action_values.shape)) + + # Compute MSE loss + loss = F.mse_loss(state_action_values, + expected_state_action_values) # expected_state_action_values.unsqueeze(1) + + # Optimize the model + self.optimizer.zero_grad() + loss.backward() + for param in self.policy_net.parameters(): + param.grad.data.clamp_(-1, 1) + self.optimizer.step() + + def optimize_double_dqn_model(self): + if len(self.memory) < self.BATCH_SIZE: + # it will return without doing nothing if we have not enough data to sample + return + transitions = self.memory.sample(self.BATCH_SIZE) + # Transpose the batch (see https://stackoverflow.com/a/19343/3343043 for + # detailed explanation). This converts batch-array of Transitions + # to Transition of batch-arrays. + # Transition is the named tuple defined above. + batch = Transition(*zip(*transitions)) + + # Compute a mask of non-final states and concatenate the batch elements + # (a final state would've been the one after which simulation ended) + # + # non_final_mask is a column vector telling wich state of the sampled is final + # non_final_next_states contains all the non-final states sampled + non_final_mask = torch.tensor(tuple(map(lambda s: s is not None, batch.next_state)), device=self.device, + dtype=torch.bool) + nfns = [s for s in batch.next_state if s is not None] + non_final_next_states = torch.cat(nfns).view(len(nfns), -1) + non_final_next_states = non_final_next_states.unsqueeze(1) + + state_batch = torch.cat(batch.state).view(self.BATCH_SIZE, -1) + state_batch = state_batch.unsqueeze(1) + action_batch = torch.cat(batch.action).view(self.BATCH_SIZE, -1) + reward_batch = torch.cat(batch.reward).view(self.BATCH_SIZE, -1) + # print("state_batch shape: %s\nstate_batch[0]:%s\nactionbatch shape: %s\nreward_batch shape: %s"%(str(state_batch.view(40,-1).shape),str(state_batch.view(40,-1)[0]),str(action_batch.shape),str(reward_batch.shape))) + + # Compute Q(s_t, a) - the model computes Q(s_t), then we select the + # columns of actions taken. These are the actions which would've been taken + # for each batch state according to policy_net + state_action_values = self.policy_net(state_batch).gather(1, action_batch) + + # ---------- D-DQN Extra Line--------------- + _, next_state_action = self.policy_net(state_batch).max(1, keepdim=True) + + # Compute V(s_{t+1}) for all next states. + # Expected values of actions for non_final_next_states are computed based + # on the actions given by policynet. + # This is merged based on the mask, such that we'll have either the expected + # state value or 0 in case the state was final. + # detach removes the tensor from the graph -> no gradient computation is + # required + next_state_values = torch.zeros(self.BATCH_SIZE, device=self.device).view(self.BATCH_SIZE, -1) + + out = self.target_net(non_final_next_states) + next_state_values[non_final_mask] = out.gather(1, next_state_action[non_final_mask]) + # next_state_values = next_state_values.view(self.BATCH_SIZE, -1) + # Compute the expected Q values + expected_state_action_values = (next_state_values * self.GAMMA) + reward_batch + + # Compute MSE loss + loss = F.mse_loss(state_action_values, expected_state_action_values) + + # Optimize the model + self.optimizer.zero_grad() + loss.backward() + for param in self.policy_net.parameters(): + param.grad.data.clamp_(-1, 1) + self.optimizer.step() + + def train(self, env, path, num_episodes=40): + self.TRAINING = True + cumulative_reward = [0 for t in range(num_episodes)] + print("Training:") + for i_episode in tqdm(range(num_episodes)): + # Initialize the environment and state + env.reset() # reset the env st it is set at the beginning of the time serie + self.steps_done = 0 + state = env.get_state() + for t in range(len(env.data)): # while not env.done + + # Select and perform an action + action = self.select_action(state) + reward, done, _ = env.step(action) + + cumulative_reward[i_episode] += reward.item() + + # Observe new state: it will be None if env.done = True. It is the next + # state since env.step() has been called two rows above. + next_state = env.get_state() + + # Store the transition in memory + self.memory.push(state, action, next_state, reward) + + # Move to the next state + state = next_state + + # Perform one step of the optimization (on the policy network): note that + # it will return without doing nothing if we have not enough data to sample + + if self.DOUBLE: + self.optimize_double_dqn_model() + else: + self.optimize_model() + + if done: + break + + # Update the target network, copying all weights and biases of policy_net + if i_episode % self.TARGET_UPDATE == 0: + self.target_net.load_state_dict(self.policy_net.state_dict()) + + # save the model + if self.DOUBLE: + model_name = env.reward_f + '_reward_double_' + self.MODEL + '_model' + count = 0 + while os.path.exists(path + model_name): # avoid overrinding models + count += 1 + model_name = model_name + "_" + str(count) + + else: + model_name = env.reward_f + '_reward_' + self.MODEL + '_model' + count = 0 + while os.path.exists(path + model_name): # avoid overrinding models + count += 1 + model_name = model_name + "_" + str(count) + + torch.save(self.policy_net.state_dict(), path + model_name) + + return cumulative_reward + + def test(self, env_test, model_name=None, path=None): + self.TRAINING = False + cumulative_reward = [0 for t in range(len(env_test.data))] + reward_list = [0 for t in range(len(env_test.data))] + + if model_name is None: + pass + elif path is not None: + if re.match(".*_dqn_.*", model_name): + self.policy_net = ConvDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + if str(self.device) == "cuda": + self.policy_net.load_state_dict(torch.load(path + model_name)) + else: + self.policy_net.load_state_dict(torch.load(path + model_name, map_location=torch.device('cpu'))) + elif re.match(".*_ddqn_.*", model_name): + self.policy_net = ConvDuelingDQN(self.INPUT_DIM, self.ACTION_NUMBER).to(self.device) + if str(self.device) == "cuda": + self.policy_net.load_state_dict(torch.load(path + model_name)) + else: + self.policy_net.load_state_dict(torch.load(path + model_name, map_location=torch.device('cpu'))) + else: + raise RuntimeError("Please Provide a valid model name or valid path.") + else: + raise RuntimeError('Path can not be None if model Name is not None.') + + env_test.reset() # reset the env st it is set at the beginning of the time serie + state = env_test.get_state() + for t in tqdm(range(len(env_test.data))): # while not env.done + + # Select and perform an action + action = self.select_action(state) + + reward, done, _ = env_test.step(action) + + cumulative_reward[t] += reward.item() + cumulative_reward[t - 1 if t - 1 > 0 else 0] + reward_list[t] = reward + + # Observe new state: it will be None if env.done = True. It is the next + # state since env.step() has been called two rows above. + next_state = env_test.get_state() + + # Move to the next state + state = next_state + + if done: + break + + return cumulative_reward, reward_list \ No newline at end of file diff --git a/jesse/rl/Environment.py b/jesse/rl/Environment.py new file mode 100644 index 000000000..fa69d0a11 --- /dev/null +++ b/jesse/rl/Environment.py @@ -0,0 +1,161 @@ +import torch +import numpy as np + + +# TODO: modify the reward st. we can choose between sharpe ratio reward or profit +# reward as shown in the paper. +class Environment: + """Definition of the trading environment for the DQN-Agent. + + Attributes: + data (pandas.DataFrame): Time serie to be considered within the environment. + + t (:obj:`int`): Current time instant we are considering. + + profits (:obj:`float`): profit of the agent at time self.t + + agent_positions(:obj:`list` :obj:`float`): list of the positions + currently owned by the agent. + + agent_position_value(:obj:`float`): current value of open positions + (positions in self.agent_positions) + + cumulative_return(:obj:`list` :obj:`float`): econometric measure of profit + during time + + init_price(:obj:`float`): the price of stocks at the beginning of trading + period. + """ + + def __init__(self, data, reward): + """ + Creates the environment. Note: Before using the environment you must call + the Environment.reset() method. + + Args: + data (:obj:`pd.DataFrane`): Time serie to be initialize the environment. + reward (:obj:`str`): Type of reward function to use, either sharpe ratio + "sr" or profit function "profit" + """ + self.data = data + self.reward_f = reward if reward == "sr" else "profit" + self.reset() + + def reset(self): + """ + Reset the environment or makes a further step of initialization if called + on an environment never used before. It must always be called before .step() + method to avoid errors. + """ + self.t = 23 + self.done = False + self.profits = [0 for e in range(len(self.data))] + self.agent_positions = [] + self.agent_open_position_value = 0 + + self.cumulative_return = [0 for e in range(len(self.data))] + self.init_price = self.data.iloc[0, :]['Close'] + + def get_state(self): + """ + Return the current state of the environment. NOTE: if called after + Environment.step() it will return the next state. + """ + + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + if not self.done: + return torch.tensor([el for el in self.data.iloc[self.t - 23:self.t + 1, :]['Close']], device=device, + dtype=torch.float) + else: + return None + + def step(self, act): + """ + Perform the action of the Agent on the environment, computes the reward + and update some datastructures to keep track of some econometric indexes + during time. + + Args: + act (:obj:`int`): Action to be performed on the environment. + + Returns: + reward (:obj:`torch.tensor` :dtype:`torch.float`): the reward of + performing the action on the current env state. + self.done (:obj:`bool`): A boolean flag telling if we are in a final + state + current_state (:obj:`torch.tensor` :dtype:`torch.float`): + the state of the environment after the action execution. + """ + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + reward = 0 + # GET CURRENT STATE + state = self.data.iloc[self.t, :]['Close'] + + # EXECUTE THE ACTION (act = 0: stay, 1: buy, 2: sell) + if act == 0: # Do Nothing + pass + + if act == 1: # Buy + self.agent_positions.append(self.data.iloc[self.t, :]['Close']) + + sell_nothing = False + if act == 2: # Sell + profits = 0 + if len(self.agent_positions) < 1: + sell_nothing = True + for position in self.agent_positions: + profits += (self.data.iloc[self.t, :][ + 'Close'] - position) # profit = close - my_position for each my_position "p" + + self.profits[self.t] = profits + self.agent_positions = [] + # reward += profits + + self.agent_open_position_value = 0 + for position in self.agent_positions: + self.agent_open_position_value += (self.data.iloc[self.t, :]['Close'] - position) + # TO CHECK if the calculus is correct according to the definition + self.cumulative_return[self.t] += (position - self.init_price) / self.init_price + + # COLLECT THE REWARD + reward = 0 + if self.reward_f == "sr": + sr = self.agent_open_position_value / np.std(np.array(self.data.iloc[0:self.t]['Close'])) if np.std( + np.array(self.data.iloc[0:self.t]['Close'])) != 0 else 0 + # sr = self.profits[self.t] / np.std(np.array(self.profits)) + if sr <= -4: + reward = -10 + elif sr < -1: + reward = -4 + elif sr < 0: + reward = -1 + elif sr == 0: + reward = 0 + elif sr <= 1: + reward = 1 + elif sr < 4: + reward = 4 + else: + reward = 10 + + if self.reward_f == "profit": + p = self.profits[self.t] + if p > 0: + reward = 1 + elif p < 0: + reward = -1 + elif p == 0: + reward = 0 + + if sell_nothing and (reward > -5): + reward = -5 + + # UPDATE THE STATE + self.t += 1 + + if (self.t == len(self.data) - 1): + self.done = True + + return torch.tensor([reward], device=device, dtype=torch.float), self.done, torch.tensor([state], + dtype=torch.float) # reward, done, current_state \ No newline at end of file diff --git a/jesse/rl/hourly_aggregated_dataset.csv b/jesse/rl/hourly_aggregated_dataset.csv new file mode 100644 index 000000000..13295b7e2 --- /dev/null +++ b/jesse/rl/hourly_aggregated_dataset.csv @@ -0,0 +1,34996 @@ +Open,High,Low,Close +300.0,370.0,300.0,378.0 +300.2123188405797,370.0,370.0,378.0 +300.4246376811594,370.3181818181818,370.3181818181818,378.0 +300.63695652173914,370.6363636363636,370.6363636363636,378.0 +300.84927536231885,370.95454545454544,370.95454545454544,378.0 +301.06159420289856,371.27272727272725,371.27272727272725,378.0 +301.2739130434783,371.59090909090907,371.59090909090907,378.0 +301.486231884058,371.90909090909093,371.90909090909093,378.0 +301.6985507246377,372.22727272727275,372.22727272727275,378.0 +301.9108695652174,372.54545454545456,372.54545454545456,378.0 +302.1231884057971,372.8636363636364,372.8636363636364,378.0 +302.33550724637684,373.1818181818182,373.1818181818182,378.0 +302.5478260869565,373.5,373.5,378.0 +302.7601449275362,373.8181818181818,373.8181818181818,378.0 +302.9724637681159,374.1363636363636,374.1363636363636,378.0 +303.1847826086956,374.45454545454544,374.45454545454544,378.0 +303.39710144927534,374.77272727272725,374.77272727272725,378.0 +303.60942028985505,375.09090909090907,375.09090909090907,378.0 +303.82173913043476,375.40909090909093,375.40909090909093,378.0 +304.0340579710145,375.72727272727275,375.72727272727275,378.0 +304.2463768115942,376.04545454545456,376.04545454545456,378.0 +304.4586956521739,376.3636363636364,376.3636363636364,378.0 +304.6710144927536,376.6818181818182,376.6818181818182,378.0 +304.8833333333333,377.0,377.0,378.0 +305.09565217391304,377.1666666666667,377.125,378.0 +305.30797101449275,377.3333333333333,377.25,378.0 +305.52028985507246,377.5,377.375,378.0 +305.7326086956522,377.6666666666667,377.5,378.0 +305.9449275362319,377.8333333333333,377.625,378.0 +306.1572463768116,378.0,377.75,378.0 +306.3695652173913,378.0,377.78125,378.0 +306.581884057971,378.0,377.8125,378.0 +306.79420289855074,378.0,377.84375,378.0 +307.00652173913045,378.0,377.875,378.0 +307.21884057971016,378.0,377.90625,378.0 +307.4311594202898,378.0,377.9375,378.0 +307.64347826086953,378.0,377.96875,378.0 +307.85579710144924,378.0,378.0,378.0 +308.06811594202895,378.0,378.0,378.0 +308.28043478260867,378.0,377.99,378.0 +308.4927536231884,378.0,377.98,378.0 +308.7050724637681,378.0,377.96999999999997,378.0 +308.9173913043478,378.0,377.96,378.0 +309.1297101449275,378.0,377.95,378.0 +309.3420289855072,378.0,377.94,378.0 +309.55434782608694,378.0,377.93,378.0 +309.76666666666665,378.0,377.91999999999996,378.0 +309.97898550724636,378.0,377.90999999999997,378.0 +310.1913043478261,378.0,377.9,378.0 +310.4036231884058,378.0,377.9083333333333,378.0 +310.6159420289855,378.0,377.91666666666663,378.0 +310.8282608695652,378.0,377.92499999999995,378.0 +311.0405797101449,378.0,377.93333333333334,378.0 +311.25289855072464,378.0,377.94166666666666,378.0 +311.46521739130435,378.0,377.95,378.0 +311.67753623188406,378.0,377.9583333333333,378.0 +311.8898550724638,378.0,377.96666666666664,378.0 +312.1021739130435,378.0,377.975,378.0 +312.31449275362314,378.0,377.98333333333335,378.0 +312.52681159420285,378.0,377.9916666666667,378.0 +312.73913043478257,378.0,378.0,378.0 +312.9514492753623,377.505,377.505,371.8375 +313.163768115942,377.01,377.01,365.675 +313.3760869565217,377.34,377.34,359.5125 +313.5884057971014,377.67,377.67,353.35 +313.8007246376811,378.0,378.0,347.1875 +314.01304347826084,384.6666666666667,342.1166666666667,341.025 +314.22536231884055,391.3333333333333,306.23333333333335,334.8625 +314.43768115942026,398.0,270.35,328.7 +314.65,359.39,269.06,294.47 +297.48,344.76,268.26,286.36 +290.78,314.85,264.81,299.39 +294.02,314.96,265.51,290.14 +290.71,314.62,265.5,293.82 +293.9,314.91,265.68,271.26 +269.81,314.6,265.54,268.01209302325583 +267.43976744186045,314.61,265.0783333333334,264.7641860465116 +265.0695348837209,314.62,264.6166666666667,261.51627906976745 +262.6993023255814,314.63,264.15500000000003,258.26837209302323 +260.32906976744187,314.64000000000004,263.6933333333333,255.02046511627907 +257.9588372093023,314.65000000000003,263.2316666666667,251.77255813953488 +255.5886046511628,314.66,262.77,248.5246511627907 +253.21837209302325,314.67,262.30833333333334,245.2767441860465 +250.84813953488373,314.68,261.8466666666667,242.0288372093023 +248.47790697674418,314.69000000000005,261.385,238.78093023255815 +246.10767441860466,314.70000000000005,260.92333333333335,235.53302325581393 +243.7374418604651,314.71000000000004,260.46166666666664,232.28511627906977 +241.3672093023256,314.72,260.0,229.03720930232558 +238.99697674418604,308.98400000000004,257.0,225.7893023255814 +236.6267441860465,303.24800000000005,254.0,222.5413953488372 +234.25651162790697,297.512,251.0,219.293488372093 +231.88627906976745,291.776,248.0,216.04558139534885 +229.5160465116279,286.04,245.0,212.79767441860463 +227.14581395348836,280.30400000000003,242.0,209.54976744186047 +224.77558139534884,274.56800000000004,239.0,206.30186046511628 +222.40534883720932,268.832,236.0,203.0539534883721 +220.03511627906977,263.096,233.0,199.8060465116279 +217.66488372093022,257.36,230.0,196.5581395348837 +215.2946511627907,251.62400000000002,227.0,193.31023255813955 +212.92441860465115,245.888,224.0,190.06232558139533 +210.55418604651163,240.152,221.0,186.81441860465117 +208.18395348837208,234.416,218.0,183.56651162790698 +205.81372093023256,228.68,215.0,180.3186046511628 +203.44348837209301,222.94400000000002,212.0,177.0706976744186 +201.0732558139535,217.208,209.0,173.8227906976744 +198.70302325581395,211.47199999999998,206.0,170.57488372093025 +196.3327906976744,205.736,203.0,167.32697674418603 +193.96255813953488,200.0,200.0,164.07906976744187 +191.59232558139536,205.25,204.9075,160.83116279069768 +189.2220930232558,210.5,209.815,157.58325581395349 +186.85186046511626,215.75,214.7225,154.3353488372093 +184.48162790697674,221.0,219.63,151.0874418604651 +182.11139534883722,220.66666666666666,218.96333333333334,147.83953488372094 +179.74116279069767,220.33333333333334,218.29666666666665,144.59162790697673 +177.37093023255812,220.0,217.63,141.34372093023256 +175.0006976744186,204.0,199.0,138.09581395348837 +172.63046511627905,194.94,109.94,134.84790697674418 +170.26023255813953,197.27,111.53,131.6 +167.89,199.0,110.13,116.66 +117.52,198.0,110.66,169.05 +134.02,197.15,110.82,185.29 +183.88,196.21,113.5,115.07 +164.34,197.07,109.87,152.71 +162.67,196.6,110.0,157.63 +142.78,197.97,110.2,159.32838709677418 +144.82387096774193,191.985,148.1,161.0267741935484 +146.86774193548388,186.0,186.0,162.72516129032257 +148.9116129032258,188.0,120.0,164.42354838709676 +150.95548387096775,188.66666666666666,131.99833333333333,166.12193548387097 +152.99935483870968,189.33333333333334,143.99666666666667,167.82032258064515 +155.0432258064516,190.0,155.995,169.51870967741934 +157.08709677419355,190.66666666666666,167.99333333333334,171.21709677419355 +159.13096774193548,191.33333333333334,179.99166666666667,172.91548387096773 +161.17483870967743,192.0,191.99,174.61387096774195 +163.21870967741935,178.0,177.99333333333334,176.31225806451613 +165.26258064516128,164.0,163.99666666666667,178.0106451612903 +167.30645161290323,150.0,150.0,179.70903225806452 +169.35032258064516,154.625,153.0625,181.4074193548387 +171.39419354838708,159.25,156.125,183.1058064516129 +173.43806451612903,163.875,159.1875,184.8041935483871 +175.48193548387096,168.5,162.25,186.5025806451613 +177.5258064516129,173.125,165.3125,188.20096774193547 +179.56967741935483,177.75,168.375,189.89935483870968 +181.61354838709678,182.375,171.4375,191.59774193548387 +183.6574193548387,187.0,174.5,193.29612903225808 +185.70129032258063,191.625,177.5625,194.99451612903226 +187.74516129032259,196.25,180.625,196.69290322580645 +189.7890322580645,200.875,183.6875,198.39129032258063 +191.83290322580643,205.5,186.75,200.08967741935484 +193.87677419354839,210.125,189.8125,201.78806451612903 +195.9206451612903,214.75,192.875,203.48645161290324 +197.96451612903223,219.375,195.9375,205.18483870967742 +200.0083870967742,224.0,199.0,206.8832258064516 +202.0522580645161,217.89499999999998,201.215,208.5816129032258 +204.09612903225806,211.79,203.43,210.28 +206.14,211.91,203.97,206.22 +207.92,211.8,203.95,204.96 +210.72,211.89,203.0,204.85476190476192 +207.86,225.5,190.0,204.74952380952382 +205.0,205.0,189.0,204.64428571428573 +204.75263157894736,205.26611111111112,189.41722222222222,204.53904761904764 +204.50526315789475,205.53222222222223,189.83444444444444,204.43380952380954 +204.2578947368421,205.79833333333335,190.25166666666667,204.32857142857142 +204.01052631578946,206.06444444444443,190.6688888888889,204.22333333333333 +203.76315789473685,206.33055555555555,191.0861111111111,204.11809523809524 +203.5157894736842,206.59666666666666,191.50333333333333,204.01285714285714 +203.2684210526316,206.86277777777778,191.92055555555555,203.90761904761905 +203.02105263157895,207.1288888888889,192.33777777777777,203.80238095238096 +202.7736842105263,207.39499999999998,192.755,203.69714285714286 +202.5263157894737,207.6611111111111,193.17222222222222,203.59190476190477 +202.27894736842106,207.9272222222222,193.58944444444444,203.48666666666668 +202.03157894736842,208.19333333333333,194.00666666666666,203.3814285714286 +201.7842105263158,208.45944444444444,194.42388888888888,203.27619047619046 +201.53684210526316,208.72555555555556,194.8411111111111,203.17095238095237 +201.28947368421055,208.99166666666667,195.25833333333333,203.06571428571428 +201.0421052631579,209.25777777777776,195.67555555555555,202.9604761904762 +200.79473684210527,209.52388888888888,196.09277777777777,202.8552380952381 +200.54736842105265,209.79,196.51,202.75 +200.3,209.82,196.68,199.41 +203.69,203.69,199.46,199.69096774193548 +203.98290322580644,206.845,204.73000000000002,199.97193548387096 +204.2758064516129,210.0,210.0,200.25290322580645 +204.56870967741935,210.0,209.0,200.53387096774193 +204.86161290322582,210.0,208.0,200.81483870967742 +205.15451612903226,210.0,207.0,201.0958064516129 +205.4474193548387,210.0,206.0,201.37677419354839 +205.74032258064517,210.0,205.0,201.65774193548387 +206.0332258064516,210.0,204.0,201.93870967741935 +206.32612903225805,210.0,203.0,202.21967741935484 +206.61903225806452,210.0,202.0,202.50064516129032 +206.91193548387096,210.0,201.0,202.7816129032258 +207.20483870967743,210.0,200.0,203.0625806451613 +207.49774193548387,210.0,199.0,203.34354838709677 +207.7906451612903,210.0,198.0,203.62451612903226 +208.08354838709678,210.0,197.0,203.90548387096774 +208.37645161290322,210.0,196.0,204.18645161290323 +208.66935483870967,210.0,195.0,204.4674193548387 +208.96225806451613,210.0,189.5,204.7483870967742 +209.25516129032258,210.0,184.0,205.02935483870968 +209.54806451612905,215.17,197.83666666666667,205.31032258064516 +209.8409677419355,220.34,211.67333333333332,205.59129032258065 +210.13387096774193,225.51,225.51,205.87225806451613 +210.4267741935484,225.2405128205128,225.2405128205128,206.15322580645162 +210.71967741935484,224.97102564102562,224.97102564102562,206.4341935483871 +211.01258064516128,224.70153846153846,224.70153846153846,206.71516129032258 +211.30548387096775,224.43205128205128,224.43205128205128,206.99612903225807 +211.5983870967742,224.1625641025641,224.1625641025641,207.27709677419355 +211.89129032258066,223.8930769230769,223.8930769230769,207.55806451612904 +212.1841935483871,223.62358974358975,223.62358974358975,207.83903225806452 +212.47709677419354,223.35410256410256,223.35410256410256,208.12 +212.77,223.08461538461538,223.08461538461538,208.4009677419355 +213.06290322580645,222.8151282051282,222.8151282051282,208.68193548387097 +213.3558064516129,222.54564102564103,222.54564102564103,208.96290322580646 +213.64870967741936,222.27615384615385,222.27615384615385,209.24387096774194 +213.9416129032258,222.00666666666666,222.00666666666666,209.52483870967743 +214.23451612903227,221.73717948717947,221.73717948717947,209.8058064516129 +214.5274193548387,221.4676923076923,221.4676923076923,210.0867741935484 +214.82032258064515,221.19820512820513,221.19820512820513,210.36774193548388 +215.11322580645162,220.92871794871795,220.92871794871795,210.64870967741933 +215.40612903225806,220.65923076923076,220.65923076923076,210.92967741935485 +215.6990322580645,220.38974358974357,220.38974358974357,211.2106451612903 +215.99193548387098,220.12025641025642,220.12025641025642,211.4916129032258 +216.28483870967742,219.85076923076923,219.85076923076923,211.77258064516127 +216.57774193548389,219.58128205128205,219.58128205128205,212.05354838709678 +216.87064516129033,219.31179487179486,219.31179487179486,212.33451612903224 +217.16354838709677,219.0423076923077,219.0423076923077,212.61548387096772 +217.45645161290324,218.77282051282052,218.77282051282052,212.8964516129032 +217.74935483870968,218.50333333333333,218.50333333333333,213.1774193548387 +218.04225806451615,218.23384615384614,218.23384615384614,213.45838709677417 +218.3351612903226,217.96435897435896,217.96435897435896,213.73935483870966 +218.62806451612903,217.6948717948718,217.6948717948718,214.02032258064514 +218.9209677419355,217.42538461538462,217.42538461538462,214.30129032258063 +219.21387096774194,217.15589743589743,217.15589743589743,214.5822580645161 +219.50677419354838,216.88641025641024,216.88641025641024,214.8632258064516 +219.79967741935485,216.6169230769231,216.6169230769231,215.14419354838708 +220.0925806451613,216.3474358974359,216.3474358974359,215.42516129032256 +220.38548387096773,216.07794871794871,216.07794871794871,215.70612903225805 +220.6783870967742,215.80846153846153,215.80846153846153,215.98709677419353 +220.97129032258064,215.53897435897437,215.53897435897437,216.26806451612902 +221.2641935483871,215.2694871794872,215.2694871794872,216.5490322580645 +221.55709677419355,215.0,215.0,216.82999999999998 +221.85,208.0,208.0,217.11096774193547 +222.14290322580646,210.5,210.25,217.39193548387095 +222.4358064516129,213.0,212.5,217.67290322580644 +222.72870967741937,215.5,214.75,217.95387096774192 +223.02161290322582,218.0,217.0,218.2348387096774 +223.31451612903226,224.0,219.0,218.5158064516129 +223.60741935483873,224.06863636363636,219.04545454545453,218.79677419354837 +223.90032258064517,224.13727272727272,219.0909090909091,219.07774193548386 +224.1932258064516,224.2059090909091,219.13636363636363,219.35870967741934 +224.48612903225808,224.27454545454546,219.1818181818182,219.63967741935483 +224.77903225806452,224.34318181818182,219.22727272727272,219.9206451612903 +225.07193548387096,224.41181818181818,219.27272727272728,220.2016129032258 +225.36483870967743,224.48045454545453,219.3181818181818,220.48258064516128 +225.65774193548387,224.5490909090909,219.36363636363637,220.76354838709676 +225.95064516129034,224.61772727272728,219.4090909090909,221.04451612903225 +226.24354838709678,224.68636363636364,219.45454545454547,221.32548387096773 +226.53645161290322,224.755,219.5,221.60645161290321 +226.8293548387097,224.82363636363635,219.54545454545453,221.8874193548387 +227.12225806451613,224.8922727272727,219.5909090909091,222.16838709677418 +227.4151612903226,224.9609090909091,219.63636363636363,222.44935483870967 +227.70806451612904,225.02954545454546,219.6818181818182,222.73032258064515 +228.00096774193548,225.0981818181818,219.72727272727272,223.01129032258063 +228.29387096774195,225.16681818181817,219.77272727272728,223.29225806451612 +228.5867741935484,225.23545454545453,219.8181818181818,223.5732258064516 +228.87967741935483,225.3040909090909,219.86363636363637,223.8541935483871 +229.1725806451613,225.37272727272727,219.9090909090909,224.13516129032257 +229.46548387096774,225.44136363636363,219.95454545454547,224.41612903225806 +229.7583870967742,225.51,220.0,224.69709677419354 +230.05129032258066,235.35999999999999,218.86333333333334,224.97806451612902 +230.3441935483871,245.21,217.72666666666666,225.2590322580645 +230.63709677419357,255.06,216.59,225.54 +230.93,257.73,217.26,225.8129411764706 +231.1289655172414,251.71,217.37,226.08588235294116 +231.32793103448276,245.69,217.48,226.35882352941175 +231.52689655172415,239.67,217.59,226.63176470588235 +231.7258620689655,239.40138888888887,217.51805555555555,226.90470588235294 +231.9248275862069,239.13277777777776,217.44611111111112,227.1776470588235 +232.1237931034483,238.86416666666665,217.37416666666667,227.4505882352941 +232.32275862068965,238.59555555555553,217.3022222222222,227.7235294117647 +232.52172413793105,238.32694444444442,217.2302777777778,227.9964705882353 +232.7206896551724,238.05833333333334,217.15833333333333,228.26941176470586 +232.9196551724138,237.78972222222222,217.0863888888889,228.54235294117646 +233.1186206896552,237.5211111111111,217.01444444444445,228.81529411764706 +233.31758620689655,237.2525,216.9425,229.08823529411765 +233.51655172413794,236.98388888888888,216.87055555555557,229.36117647058822 +233.71551724137933,236.71527777777777,216.79861111111111,229.63411764705882 +233.9144827586207,236.44666666666666,216.72666666666666,229.9070588235294 +234.11344827586208,236.17805555555555,216.65472222222223,230.18 +234.31241379310345,235.90944444444443,216.58277777777778,230.45294117647057 +234.51137931034484,235.64083333333332,216.51083333333332,230.72588235294117 +234.71034482758623,235.3722222222222,216.4388888888889,230.99882352941177 +234.9093103448276,235.1036111111111,216.36694444444444,231.27176470588236 +235.10827586206898,234.83499999999998,216.29500000000002,231.54470588235293 +235.30724137931034,234.5663888888889,216.22305555555556,231.81764705882352 +235.50620689655173,234.29777777777778,216.1511111111111,232.09058823529412 +235.70517241379312,234.02916666666667,216.07916666666668,232.36352941176472 +235.90413793103448,233.76055555555556,216.00722222222223,232.63647058823528 +236.10310344827587,233.49194444444444,215.93527777777777,232.90941176470588 +236.30206896551724,233.22333333333333,215.86333333333334,233.18235294117648 +236.50103448275863,232.95472222222222,215.7913888888889,233.45529411764704 +236.70000000000002,232.6861111111111,215.71944444444443,233.72823529411764 +236.89896551724138,232.4175,215.6475,234.00117647058823 +237.09793103448277,232.14888888888888,215.57555555555555,234.27411764705883 +237.29689655172416,231.88027777777776,215.5036111111111,234.5470588235294 +237.49586206896552,231.61166666666668,215.43166666666667,234.82 +237.6948275862069,231.34305555555557,215.35972222222222,235.0929411764706 +237.89379310344827,231.07444444444445,215.2877777777778,235.36588235294118 +238.09275862068966,230.80583333333334,215.21583333333334,235.63882352941175 +238.29172413793106,230.53722222222223,215.14388888888888,235.91176470588235 +238.49068965517242,230.2686111111111,215.07194444444445,236.18470588235294 +238.6896551724138,230.0,215.0,236.45764705882354 +238.88862068965517,215.0,215.0,236.7305882352941 +239.08758620689656,232.0,232.0,237.0035294117647 +239.28655172413795,235.0,235.0,237.2764705882353 +239.4855172413793,230.25,230.0,237.5494117647059 +239.6844827586207,225.5,225.0,237.82235294117646 +239.88344827586207,220.75,220.0,238.09529411764706 +240.08241379310346,216.0,215.0,238.36823529411765 +240.28137931034485,217.47058823529412,216.1764705882353,238.64117647058822 +240.4803448275862,218.94117647058823,217.35294117647058,238.91411764705882 +240.6793103448276,220.41176470588235,218.52941176470588,239.1870588235294 +240.87827586206896,221.88235294117646,219.7058823529412,239.46 +241.07724137931035,223.35294117647058,220.88235294117646,239.7329411764706 +241.27620689655174,224.8235294117647,222.05882352941177,240.00588235294117 +241.4751724137931,226.2941176470588,223.23529411764707,240.27882352941177 +241.6741379310345,227.76470588235293,224.41176470588235,240.55176470588236 +241.87310344827586,229.23529411764707,225.58823529411765,240.82470588235293 +242.07206896551725,230.7058823529412,226.76470588235293,241.09764705882353 +242.27103448275864,232.1764705882353,227.94117647058823,241.37058823529412 +242.47,233.64705882352942,229.11764705882354,241.64352941176472 +242.6689655172414,235.11764705882354,230.2941176470588,241.91647058823528 +242.86793103448278,236.58823529411765,231.47058823529412,242.18941176470588 +243.06689655172414,238.05882352941177,232.64705882352942,242.46235294117648 +243.26586206896553,239.52941176470588,233.8235294117647,242.73529411764707 +243.4648275862069,241.0,235.0,243.00823529411764 +243.66379310344828,244.19333333333333,240.19333333333333,243.28117647058824 +243.86275862068968,247.38666666666668,245.38666666666668,243.55411764705883 +244.06172413793104,250.58,250.58,243.82705882352943 +244.26068965517243,250.29000000000002,245.29000000000002,244.1 +244.4596551724138,250.0,240.0,244.3729411764706 +244.65862068965518,251.68333333333334,242.51666666666668,244.6458823529412 +244.85758620689657,253.36666666666667,245.03333333333333,244.91882352941178 +245.05655172413793,255.05,247.55,245.19176470588235 +245.25551724137932,253.81,253.71,245.46470588235294 +245.4544827586207,251.74,251.74,245.73764705882354 +245.65344827586208,250.91,250.91,246.0105882352941 +245.85241379310347,250.72,250.715,246.2835294117647 +246.05137931034483,250.53,250.52,246.5564705882353 +246.25034482758622,250.51,250.345,246.8294117647059 +246.4493103448276,250.49,250.17,247.1023529411765 +246.64827586206897,248.25,248.11,247.37529411764706 +246.84724137931036,247.08,247.08,247.64823529411765 +247.04620689655172,246.12,245.82,247.92117647058825 +247.2451724137931,248.25666666666666,245.65333333333334,248.19411764705882 +247.4441379310345,250.39333333333335,245.48666666666665,248.4670588235294 +247.64310344827587,252.53,245.32,248.74 +247.84206896551726,248.91,247.47,249.46571428571428 +248.04103448275862,249.28,247.08,250.1914285714286 +248.24,249.57,247.23,250.91714285714286 +249.344,248.68,247.97,251.64285714285714 +250.448,249.8,248.21,252.3685714285714 +251.552,251.85500000000002,249.255,253.09428571428572 +252.656,253.91,250.3,253.82 +253.76,256.26,253.76,257.25444444444446 +257.2011111111111,260.03999999999996,257.095,260.68888888888887 +260.64222222222224,263.82,260.43,264.12333333333333 +264.0833333333333,275.26,266.31,267.5577777777778 +267.52444444444444,280.0,269.05,270.9922222222222 +270.96555555555557,290.0,281.79,274.4266666666667 +274.4066666666667,283.28,277.7,277.86111111111114 +277.84777777777776,290.78,280.975,281.29555555555555 +281.2888888888889,298.28,284.25,284.73 +284.73,300.0,284.73,286.16857142857145 +289.08750000000003,300.2,292.565,287.6071428571429 +293.44500000000005,300.4,300.4,289.0457142857143 +297.8025,307.46,298.24,290.4842857142857 +302.16,302.16,300.0,291.92285714285714 +302.37,306.55,302.9,293.3614285714286 +302.58,302.58,294.8,294.8 +292.0,322.72,241.43,282.9 +281.435,282.63,261.95,271.0 +270.87,276.09,270.87,270.5 +268.26666666666665,277.74,267.5,270.0 +265.66333333333336,270.39,261.99,263.04 +263.06,267.0,262.04,265.52 +265.405,270.78,265.51,267.7 +267.75,271.97,267.0,271.97 +271.97,276.06,269.61,272.1 +272.15,274.73,269.6,274.0 +266.575,278.47,261.09,261.3 +261.0,262.4,254.99,258.05 +257.9,263.25,253.99,254.8 +254.8,260.0,254.05,258.92 +258.95,261.99,257.31,261.18 +261.18,261.95,258.46,258.79 +261.062,261.96,258.0,259.19500000000005 +260.944,261.0,258.07,259.6 +260.826,259.7,257.6,258.01 +260.708,261.98,257.99,258.655 +260.59000000000003,257.99,244.03,259.3 +260.472,256.72,248.85,259.945 +260.354,257.5,257.0,260.59 +260.236,267.5,257.5,261.235 +260.118,266.0,261.88,261.88 +260.0,263.0,259.0,262.28999999999996 +261.5833333333333,262.7,259.5,262.7 +263.1666666666667,266.49,262.7,264.75 +264.75,266.33,264.09,265.0 +264.74,265.43,262.0,263.505 +264.48,265.01,262.01,262.01 +262.01,262.56,257.55,262.61 +260.24,263.94,259.86,263.21 +263.22,264.0,262.0,263.945 +263.95000000000005,265.99,263.6,264.68 +264.68,265.52,259.99,259.99 +259.99,260.02,256.0,256.0 +259.26,259.01,256.42,258.61 +258.53000000000003,259.0,253.53,257.34 +257.8,259.35,256.28,256.66 +256.77,257.99,254.44,257.92333333333335 +258.0725,257.11,254.44,259.18666666666667 +259.375,260.8,257.4,260.45 +260.6775,262.0,260.32,262.0 +261.98,262.0,255.66,258.87 +259.49,260.1,258.08,255.74 +259.56,260.04,258.85,252.60999999999999 +259.63,259.64,247.81,249.48 +258.334,254.0,248.76,251.72 +257.038,255.87,252.75,253.96 +255.742,255.0,253.15,253.8 +254.446,255.0,252.67,253.64 +253.15,253.15,236.05,241.59 +241.63,250.03,234.33,239.94 +239.58,242.8,237.28,239.24 +239.14,239.16,233.68,235.33 +235.21,236.18,228.5,236.11 +236.1,239.64,234.78,235.0 +235.0,238.0,233.18,237.53 +237.54,238.0,235.0,238.925 +238.77499999999998,242.0,236.45,240.32 +240.01,242.0,235.8,236.92 +238.325,238.76,235.45,237.14 +236.64,238.43,229.81,229.81 +229.81,236.15,229.22,235.97 +230.405,236.33,230.01,230.61 +231.0,234.97,231.0,228.96 +229.25,234.05,230.13,227.31 +227.5,233.0,230.47,225.66 +225.75,233.52,222.98,224.01 +224.0,227.23,221.14,224.88666666666666 +226.25,227.84,223.18,225.76333333333332 +226.49,227.57,222.99,226.64 +226.73,233.02,226.06,228.82999999999998 +230.99,233.92,229.15,231.02 +231.33,232.56,230.01,233.26 +232.09,238.38,232.0,235.5 +235.69,239.87,234.98,238.21 +238.2,240.0,236.98,238.5 +238.17,238.18,232.58,236.65 +236.34,237.01,233.02,234.11 +234.11,236.72,233.33,234.67 +234.53,237.66,234.9,235.08499999999998 +234.95000000000002,236.97,235.08,235.5 +235.37,237.47,235.37,235.95 +236.0,236.0,233.33,235.49 +235.48,237.82,235.48,237.82 +238.92000000000002,243.54,237.9,243.54 +242.36,244.59,239.92,240.14 +239.53500000000003,241.81,236.74,236.74 +236.71,238.16,236.6,235.765 +236.145,236.89,234.25,234.79 +235.58,236.02,231.71,234.39499999999998 +235.015,234.93,231.0,234.0 +234.45,234.6,232.5,234.6 +233.885,235.75,232.47,233.32 +233.32,233.32,227.89,231.66 +231.08,233.91,229.0,233.89 +233.79,234.49,229.98,231.445 +232.95,232.95,229.0,229.0 +229.07,233.32,228.54,230.0 +231.62,233.33,230.4,231.0 +231.09,234.0,228.52,233.88 +232.19,232.8,229.9,232.58666666666667 +229.86,232.0,229.09,231.29333333333332 +231.82,233.0,228.88,230.0 +230.975,231.9,228.0,230.04000000000002 +230.13,231.11,229.01,230.08 +229.11,230.76,227.0,229.02 +228.09,228.23,227.02,227.96 +227.96,228.3,226.24,226.91 +226.97,228.5,226.81,228.02 +228.27,229.11,227.87,227.87 +227.74,232.25,227.01,231.5 +230.365,233.0,230.06,232.75 +232.99,234.02,232.5,231.82999999999998 +234.38,234.67,230.48,230.91 +232.92,231.1,230.0,230.70333333333332 +231.46,230.85,229.7,230.49666666666667 +230.0,233.12,229.06,230.29 +230.9,234.1,230.29,231.8 +231.81,234.06,231.0,231.48 +232.0,233.99,231.48,232.82 +231.275,233.51,230.55,231.59 +230.55,232.11,229.02,230.92 +229.60000000000002,231.12,228.65,228.8 +228.65,230.08,228.21,229.23 +227.06,229.53,225.0,225.98 +225.47,226.84,224.5,225.09 +224.74,224.74,217.11,218.52 +218.52,219.79,216.16,218.3 +218.3,220.4,218.3,219.31 +219.21,219.71,216.19,217.38 +219.32,220.73,216.49,219.36 +219.43,220.11,218.0,218.83 +218.83,219.19,217.17,218.95 +218.57,219.8,217.77,218.63333333333333 +218.38333333333333,219.7,218.99,218.31666666666666 +218.19666666666666,219.28,217.42,218.0 +218.01,218.11,213.0,217.98 +213.91,215.11,212.87,217.96 +215.0,215.0,210.0,217.94 +214.0,215.5,213.55,217.92000000000002 +214.17000000000002,214.75,212.87,217.9 +214.34,214.75,212.0,217.88000000000002 +213.57,218.52,213.57,217.86 +217.95,223.11,217.86,223.11 +222.33,223.11,218.96,220.48 +220.5,224.86,220.5,224.86 +224.94,229.11,224.01,228.91 +229.0,230.86,226.14,228.61 +228.63,233.79,228.02,232.0 +232.01,233.01,226.43,228.48 +227.7,229.98,227.0,227.29 +227.22,231.76,226.9,229.81 +227.47,229.81,225.89,227.73 +227.72,231.33,227.69,231.33 +231.34,231.4,226.15,229.43 +229.4,229.99,228.05,228.28 +228.19,228.35,226.04,227.2625 +226.98,227.0,222.33,226.245 +223.13,226.39,222.17,225.22750000000002 +224.2,226.97,223.89,224.21 +224.3,226.36,224.2,225.3325 +224.56,225.96,224.4,226.45499999999998 +225.04,227.1,222.01,227.5775 +224.62199999999999,228.7,227.1,228.7 +224.20399999999998,230.51,221.54,226.63 +223.786,229.72,225.95,227.11 +223.368,228.0,220.89,226.41666666666669 +222.95,225.1,222.85,225.72333333333333 +224.08749999999998,226.1,223.99,225.03 +225.225,227.55,223.6,225.99 +226.3625,228.0,225.0,227.5 +227.5,228.01,226.0,227.445 +226.99,227.99,225.18,227.39 +227.26,235.85,226.75,235.85 +235.84,240.1,235.01,236.94 +237.19,242.0,237.11,237.11 +237.77,238.59,236.88,236.88 +237.63,239.47,236.88,237.37 +237.49,239.52,237.05,237.92000000000002 +237.79,238.5,237.27,238.47 +238.0,239.51,237.22,239.02 +239.14,239.45,237.35,239.98000000000002 +237.53,239.4,237.03,240.94 +239.4,243.84,238.52,241.9 +241.93,243.58,237.48,238.36 +242.65,243.16,236.9,243.16 +243.37,243.9,236.81,237.84 +237.38,240.93,237.0,240.1 +239.95,240.61,239.16,239.91 +240.035,243.07,240.07,240.12 +240.12,240.12,236.01,238.44 +238.43,240.07,237.33,238.94 +238.87,242.22,237.98,238.05 +238.05,239.02,228.64,228.64 +228.59,230.53,227.45,229.4 +229.43,230.82,228.0,229.46 +228.255,229.81,225.32,227.1 +227.08,230.74,227.01,230.49 +230.47,230.5,227.05,229.02 +229.08,230.0,228.61,228.7 +229.13,230.06,228.0,228.85 +229.89,230.25,228.64,229.0 +229.0,229.01,226.8,226.86 +226.94,228.25,226.82,227.29 +227.27,229.04,225.87,226.39499999999998 +226.18,227.81,225.5,225.5 +225.5,225.86,222.06,223.25 +225.07999999999998,225.92,222.72,224.9 +224.66,225.13,221.85,222.74 +222.85,227.18,222.85,227.11 +227.1,228.8,225.26,228.08 +227.64999999999998,228.6,226.49,228.2 +228.2,229.2,222.05,222.13 +222.33,225.03,222.22,224.41 +224.41,227.62,223.49,225.67 +225.64,226.46,223.36,224.33499999999998 +224.43,225.42,221.5,223.0 +223.0,225.81,222.92,224.93 +224.94,230.99,224.9,227.97 +228.07,229.33,225.5,227.07 +227.45999999999998,227.01,224.39,226.77 +226.85,227.0,224.47,226.14 +226.17,227.82,225.84,227.82 +227.58,228.0,226.45,226.72 +226.99,228.88,226.21,228.66 +228.63,228.9,227.88,227.965 +228.06,228.9,227.01,227.27 +227.215,227.94,225.5,225.885 +226.37,226.83,224.09,224.5 +224.54,225.95,224.0,224.0 +224.0,226.6,223.41,224.66500000000002 +224.72,227.15,225.0,225.33 +225.44,226.49,224.57,226.14 +225.765,226.7,225.76,225.58499999999998 +226.09,226.14,223.5,225.03 +224.8,225.76,224.36,225.17 +224.72,224.95,223.63,224.885 +224.64000000000001,226.35,224.5,224.6 +224.56,225.5,215.0,218.3 +218.31,224.25,215.3,220.13 +222.11,223.97,216.78,217.76 +217.76,220.24,217.33,217.52 +218.08,220.68,217.53,219.03 +219.04,219.98,217.95,218.88 +218.365,219.5,217.55,217.67 +217.69,218.98,216.21,218.6 +218.66,219.07,216.0,216.61 +216.68,218.8,216.46,218.42 +218.15,219.95,217.87,219.74 +219.91,220.79,218.3,219.5 +219.43,221.42,218.92,221.02 +221.03,221.97,216.48,218.36 +218.36,219.34,217.41,217.78 +218.38,220.59,217.78,220.1 +218.035,220.61,217.15,217.8 +217.69,219.21,217.61,218.57 +218.95,219.91,218.2,219.34 +218.515,220.25,216.71,218.72 +218.08,220.08,216.03,216.48 +216.37,219.1,216.23,218.6 +218.76,223.5,218.41,222.75 +222.82,225.0,220.28,223.35 +223.33,225.01,221.9,224.19 +223.96,224.9,222.03,223.11 +222.68,224.98,222.57,223.86 +224.0,226.64,223.0,224.61 +224.61,225.45,222.9,223.41 +223.5,224.51,223.0,223.69 +223.485,224.42,223.3,223.97 +223.47,224.7,220.43,223.60500000000002 +223.85,223.85,221.91,223.24 +223.24,224.05,222.72,223.94 +223.59,224.88,223.02,224.86 +224.45499999999998,226.23,224.41,225.34 +225.32,226.35,224.0,226.22 +226.22,226.4,224.18,225.74666666666667 +224.51,225.43,224.25,225.27333333333334 +224.42666666666665,225.25,224.15,224.8 +224.34333333333333,224.61,224.01,224.48 +224.26,225.35,223.35,224.46 +224.63,226.25,224.38,225.99 +227.29500000000002,230.3,226.21,230.07 +229.96,230.07,228.7,229.535 +229.82,229.92,228.91,229.0 +229.58,230.5,228.13,228.13 +228.11,230.14,226.49,226.565 +226.83,227.7,225.0,225.0 +225.0,227.87,224.95,226.64 +226.75,227.44,224.99,226.0 +225.82,228.55,225.5,227.62 +227.6,228.61,226.68,228.41 +227.655,229.5,227.7,227.71 +227.71,229.1,227.55,228.91 +228.93,229.79,228.5,229.65 +229.58,229.64,228.38,228.81 +228.87,229.33,227.87,227.97 +227.9,228.7,227.01,227.995 +227.64,229.2,227.52,228.02 +228.2,228.69,228.0,227.34 +228.39,228.74,226.02,226.66 +226.86,226.86,225.92,225.98 +226.15,226.23,225.0,226.73 +225.44,227.48,225.33,227.48 +227.26,229.99,226.55,228.91 +228.9,229.0,227.62,228.33 +228.34,228.99,227.87,228.74 +228.74,231.6,227.62,228.16 +225.85000000000002,228.7,221.1,222.99 +222.96,226.56,222.96,225.77 +224.72,226.5,225.21,226.4 +226.48,226.78,221.0,222.98 +222.66,223.0,220.0,223.0 +222.8,223.37,221.89,223.01 +223.0,223.95,222.35,222.92 +223.20333333333335,223.71,222.73,223.255 +223.40666666666667,224.85,223.29,223.59 +223.61,224.13,222.92,222.92 +223.97000000000003,224.5,222.77,224.5 +224.33,224.72,223.65,223.65 +223.82,224.73,222.65,223.88 +223.32,224.41,222.66,224.11 +224.1,224.99,223.9,224.15 +224.2,225.0,223.78,223.575 +224.51,225.0,222.74,223.0 +223.0,224.0,221.51,222.27 +221.94,224.43,221.78,223.08 +222.96,224.19,222.5,222.98 +222.9,224.41,222.0,223.555 +223.495,224.13,222.97,224.13 +224.09,224.09,222.0,222.0 +222.04,222.71,218.55,218.55 +218.55,219.55,217.08,217.96 +218.52,220.01,216.81,217.37 +217.43,220.16,217.27,218.68 +218.7,220.35,218.5,219.76 +219.87,222.11,218.65,221.68 +221.7,221.74,219.5,220.775 +220.05,220.25,216.45,219.87 +219.995,220.0,219.33,220.31333333333333 +219.94,221.95,219.94,220.75666666666666 +220.82,222.04,220.0,221.2 +221.22,222.7,220.31,220.88 +220.54,222.64,220.26,221.48 +221.48,221.48,220.0,221.495 +221.45499999999998,221.81,220.67,221.51 +221.43,221.92,221.1,221.64 +221.61,221.81,221.15,221.27 +221.23,221.48,218.5,219.54 +219.46,220.1,218.29,217.995 +218.76,218.9,216.23,216.45 +216.46,218.0,215.5,217.0 +216.83,218.41,216.47,217.14 +217.14,217.7,216.13,216.95 +217.00199999999998,217.71,216.47,216.76 +216.86399999999998,217.1,215.1,216.57 +216.726,216.69,215.1,216.51 +216.588,216.81,215.0,216.45 +216.45,217.98,215.99,217.19 +216.68,217.93,215.81,217.93 +216.91,219.27,216.91,219.07 +218.97,220.82,215.99,219.6 +219.6,221.25,218.0,220.02 +220.11,220.49,220.0,220.1 +220.16,221.37,219.99,220.68 +220.7,222.0,219.99,220.22 +220.22,221.98,220.22,220.73666666666668 +221.42,221.68,220.52,221.25333333333333 +221.07,221.91,219.67,221.77 +221.73,223.5,221.03,223.21 +223.25,223.33,220.65,223.01 +223.01,223.61,222.55,223.51 +223.5,223.61,222.01,222.66 +222.39,222.66,220.69,221.28 +221.28,222.57,220.9,222.0 +222.09,222.35,220.67,221.47 +221.09,222.1,221.0,221.1 +221.58,222.07,221.09,221.09 +221.0,221.64,219.0,220.37 +220.37,221.27,218.0,219.77 +220.09,222.28,219.57,222.0 +221.54,222.29,220.89,222.2 +221.63,222.61,221.0,222.6 +222.6,222.76,220.59,222.0 +221.93,222.49,220.48,222.3 +222.12,223.11,220.65,222.37 +222.06,223.2,221.92,222.31 +222.39,222.98,219.0,219.0 +219.27,222.08,218.28,219.49 +219.59,221.79,218.03,220.0 +220.59,222.01,220.0,220.8 +220.8,220.93,217.46,219.48 +219.46,220.0,218.94,219.5 +219.5,220.25,219.35,219.89 +219.78,220.24,218.58,219.02 +219.02,219.3,218.46,218.81 +218.98,219.75,218.07,218.6 +218.6,219.11,218.13,218.77 +218.51,219.42,218.32,218.63 +218.66,219.27,218.0,218.57 +218.55,219.0,218.13,218.84 +218.99,219.59,218.33,219.59 +219.45,219.76,219.02,219.42 +219.42,219.87,218.33,219.06 +219.18,219.96,218.49,219.76 +219.69,220.51,219.01,220.51 +220.51,221.99,219.99,219.99 +220.57,221.64,220.19,220.9 +220.89,221.99,220.23,220.92 +221.18,223.1,220.89,222.46 +222.445,224.61,222.0,223.3 +223.71,224.61,222.22,223.9 +223.9,224.44,222.0,222.79 +222.63,223.14,222.13,222.4 +222.4,223.0,222.09,222.96 +222.85,223.21,222.2,223.19 +223.19,223.23,222.22,222.35 +222.34,223.25,221.74,222.69 +222.69,223.0,221.55,222.23 +222.02,224.96,221.99,224.6 +224.6,225.11,224.17,224.54 +224.33,226.76,224.31,226.41 +226.41,234.99,226.4,231.12 +231.1,232.95,229.5,230.52 +232.57,234.04,230.47,234.04 +234.04,237.99,234.0,235.33 +235.51,238.99,234.22,235.81 +235.68,237.0,234.44,237.0 +236.72,237.12,235.5,236.19 +236.0,239.0,235.94,237.48 +237.49,238.25,235.33,236.49 +236.5,242.12,236.41,242.12 +242.03,242.36,237.99,239.34 +239.25,240.0,238.18,239.76 +239.9,240.47,236.0,236.95 +236.95,238.44,236.0,237.01 +237.24,238.77,236.84,237.41 +237.41,237.45,234.99,235.57 +235.7,237.71,234.96,236.98 +236.97,237.21,236.08,236.79 +236.95,239.42,236.95,239.41 +239.44,239.62,237.72,239.32 +239.34,239.4,237.16,238.29 +238.1,240.0,237.22,239.75 +239.39,241.47,239.28,241.01 +241.01,245.12,239.92,244.99 +244.97,250.0,244.86,249.0 +249.0,251.58,247.97,250.18 +250.09,250.31,247.15,250.11 +250.12,251.71,248.08,249.365 +248.26,249.82,248.01,248.62 +248.81,248.95,246.49,246.49 +246.5,246.5,243.86,244.24 +246.875,247.98,243.79,245.12 +247.25,248.23,245.8,246.0 +245.99,249.76,245.0,249.12 +249.03,249.49,246.34,248.02 +247.88,248.06,244.81,246.14 +246.15,248.06,245.11,245.51 +245.47,248.14,245.43,247.99 +247.79,256.63,247.58,256.63 +256.63,257.99,253.56,255.57 +255.56,259.98,255.5,258.66 +258.83,259.13,255.95,256.91 +256.91,257.88,254.53,257.88 +257.74,263.13,256.76,259.11 +258.95,260.29,257.45,260.26 +260.19,261.22,247.65,253.1 +253.67,258.0,253.54,257.67 +257.67,257.99,243.0,256.29 +257.59000000000003,258.92,256.3,258.05 +257.51,259.9,256.18,256.18 +257.12,260.0,256.38,259.12 +259.11,267.86,259.09,265.18 +258.925,265.17,256.48,258.48 +258.74,259.4,252.5,253.94 +253.68,254.45,249.57,251.55 +251.53,253.13,248.39,250.14 +250.1,251.04,245.1,245.1 +245.15,246.69,240.12,246.45 +246.45,246.59,239.95,243.49 +243.49,246.46,242.75,244.96 +244.84,245.57,243.02,243.02 +243.02,243.03,229.11,229.89 +229.92,234.54,228.0,232.24 +232.37,234.9,231.22,232.5 +232.5,234.49,229.81,233.9 +234.13,235.86,233.88,235.53 +235.58,235.7,232.23,233.53 +233.5,233.73,229.6,230.8 +230.79,232.62,229.69,232.14 +232.09,232.23,230.25,230.71 +230.71,232.61,230.51,231.49 +231.49,233.37,231.49,233.14 +233.05,235.85,232.57,233.94 +232.495,234.91,231.99,231.99 +231.94,234.14,231.55,234.03 +234.09,241.0,233.8,238.89 +238.76,239.07,235.97,236.76 +236.14,237.07,231.69,232.5 +231.97,235.0,231.96,234.4 +233.16,234.92,232.1,234.34 +234.35,237.97,234.11,236.24 +236.0,236.4,234.9,235.99 +236.55,237.1,234.8,236.88 +237.1,237.44,231.95,236.5 +236.04,238.8,235.5,237.09 +237.1,238.42,236.53,238.14 +238.29,239.18,237.3,239.1 +238.85,240.05,235.0,235.11 +235.09,237.25,235.01,237.24 +236.85,237.32,233.21,233.21 +233.02,234.5,233.0,233.62 +233.61,235.63,233.0,235.2 +235.19,236.12,235.0,236.12 +236.0,236.78,235.31,236.57 +236.25,236.95,234.55,234.55 +235.0,236.41,234.71,236.11 +236.02,236.61,235.48,235.89 +235.86,238.12,235.46,237.505 +237.565,239.73,237.61,239.12 +239.27,240.79,238.6,239.55 +240.86,240.9,237.62,239.98 +239.54,240.17,237.01,238.81 +238.86,240.15,238.06,240.15 +239.72,240.68,236.38,236.77 +236.85,240.0,235.55,239.12 +239.14,241.2,238.56,240.6 +240.72,247.9,239.32,244.24 +244.25,248.0,243.5,244.41 +244.4,245.0,241.76,243.35 +243.63,244.6,240.09,240.12 +240.08,243.46,240.0,240.0 +240.0,242.21,235.11,242.1 +242.06,243.0,241.45,242.85 +242.85,245.12,242.0,244.65 +244.76,245.11,241.83,244.69 +244.5,244.9,242.7,244.36 +244.36,244.7,243.58,244.57 +244.57,244.87,243.63,244.67 +244.67,245.0,243.63,244.9 +244.9,246.0,244.6,244.9 +244.82,245.12,243.75,243.75 +244.11,244.12,240.44,242.76 +242.72,242.76,241.13,242.16 +242.16,242.6,240.23,242.24 +242.6,243.52,241.47,241.47 +241.48,243.31,241.33,242.42 +242.42,244.63,242.04,242.24 +242.24,242.94,240.74,242.05 +242.48,243.03,237.2,237.47 +237.47,239.97,236.26,237.75 +238.34,240.29,237.34,238.47 +239.1,239.9,234.16,234.47 +234.35,235.82,232.56,232.6 +232.62,236.9,232.56,234.3 +234.29,236.14,233.82,234.0 +234.05,235.0,231.93,234.66 +234.66,236.66,234.08,236.24 +236.11,238.77,235.6,238.77 +238.01,238.31,236.59,237.75 +237.75,238.46,236.61,237.38 +237.36,237.62,235.58,236.05 +236.04,237.93,235.87,237.46 +237.34,237.71,236.16,236.77 +237.22,238.38,236.63,237.76 +237.75,238.28,236.55,237.04 +237.04,237.71,236.0,236.61 +236.6,237.47,236.0,236.83 +237.08,238.1,236.63,237.05 +237.06,239.47,236.96,239.47 +237.305,239.46,236.88,237.39 +237.55,238.47,237.18,237.635 +237.41,238.83,237.13,237.88 +237.94,238.66,237.0,238.02 +238.4,239.39,237.31,238.8 +238.84,240.03,238.07,239.6 +239.53,242.0,239.3,241.44 +241.86,243.23,240.9,242.57 +242.8,245.0,241.2,241.25 +241.29,242.35,238.7,240.3 +240.24,242.21,240.0,242.15 +241.74,242.59,241.56,242.32 +242.32,243.73,240.55,241.12 +241.08,242.23,240.55,241.22 +241.22,241.99,239.99,240.34 +240.34,242.5,240.1,242.3 +242.31,242.9,241.54,242.86 +242.75,245.15,242.62,244.96 +244.95,245.84,243.13,244.8 +244.34,244.99,243.1,244.85 +244.84,245.8,244.25,244.88 +244.85,247.74,244.5,247.69 +247.71,248.24,244.36,246.39 +246.39,248.32,245.89,246.28 +245.43,247.36,243.77,243.77 +244.47,245.09,241.89,244.6 +244.6,246.42,244.11,245.64 +244.92,247.11,244.8,246.82 +246.41,247.5,245.25,245.91 +245.91,246.6,242.9,243.8 +243.48,245.47,243.35,243.44 +243.45,244.08,242.51,244.08 +244.08,244.12,241.9,243.2 +243.2,244.02,242.54,243.46 +243.45,246.26,241.76,245.75 +245.75,245.96,244.15,245.67 +245.64,246.8,244.06,244.49 +244.49,246.23,244.38,245.63 +245.64,245.87,244.5,245.43 +245.43,246.01,245.0,246.01 +246.01,248.12,245.71,247.61 +247.31,247.84,245.5,246.19 +246.11,248.43,245.0,246.53 +246.53,246.88,245.5,246.51 +246.45,246.99,245.55,245.66 +246.35,246.34,245.44,246.26 +246.25,246.91,245.1,245.3 +245.29,245.89,244.82,245.19 +244.82,246.25,244.68,245.51 +245.52,246.91,245.34,245.83 +245.83,246.11,244.5,245.21 +245.13,246.12,244.5,245.11 +245.09,245.64,244.0,245.49 +245.45,245.95,244.84,245.95 +245.94,245.98,245.0,245.92 +245.91,246.27,244.31,245.07 +244.63,245.14,244.35,244.75 +244.47,246.07,244.3,245.27 +245.27,245.97,244.6,245.12 +245.305,245.74,244.78,245.34 +245.34,246.1,245.33,246.1 +246.1,246.98,245.87,246.84 +246.94,246.99,246.15,246.23 +246.23,247.06,246.17,247.06 +247.05,247.48,245.75,246.16 +246.0,246.99,245.99,246.26 +246.32,246.92,246.07,246.51 +246.6,246.71,246.08,246.5 +246.37,246.72,246.13,246.5 +246.6,246.72,245.97,246.5 +246.52,246.72,245.87,246.5 +246.5,246.65,246.02,246.12 +245.93333333333334,246.12,244.3,245.27 +245.36666666666667,245.29,244.41,244.63 +244.8,245.86,240.96,241.52 +241.02,241.19,236.0,237.59 +237.18,246.24,236.66,243.5 +243.5,244.5,239.01,243.2 +243.94,245.0,235.0,236.26 +235.62,237.39,234.01,234.99 +234.98,237.4,234.82,237.4 +236.59,237.97,235.65,235.79 +235.76,236.81,235.46,236.5 +236.49,237.37,235.33,236.96 +236.92,237.37,236.63,237.33 +237.29,237.75,236.35,237.5 +237.53,239.0,237.25,238.99 +238.99,238.99,236.7,238.48 +238.23,240.0,236.32,237.46 +237.45,238.75,236.33,237.34 +237.5,238.2,236.6,237.4 +237.4,238.66,237.16,238.59 +238.57,238.92,236.14,236.25 +236.24,237.92,235.78,237.56 +235.73000000000002,237.92,234.52,235.4 +235.22,237.0,235.03,236.84 +234.32999999999998,236.97,232.0,233.43 +233.44,234.98,232.42,233.18 +233.18,237.26,232.88,236.13 +236.18,237.37,236.15,237.23 +237.23,237.37,236.0,236.84 +236.65,238.4,236.64,237.61 +237.61,238.9,236.46,237.7 +237.74,238.66,237.21,237.88 +237.88,238.08,236.58,237.86 +237.91,240.56,235.46,238.05 +238.36,240.3,237.93,239.52 +239.52,240.97,238.92,239.2 +239.2,239.97,238.01,239.88 +239.88,240.89,239.65,240.55 +240.55,240.84,238.92,239.98 +239.81,241.03,239.3,240.69 +240.69,240.88,239.23,240.01 +240.01,240.77,239.23,239.83 +239.72,239.99,239.02,239.07 +239.25,239.42,237.17,238.45 +238.45,238.5,235.51,237.75 +237.74,238.98,237.47,238.39 +238.35,238.78,237.05,237.68 +237.65,237.95,236.69,237.25 +237.63,238.83,236.92,238.51 +238.55,240.15,237.78,239.43 +239.62,241.08,237.78,240.5 +240.66,240.7,238.0,238.41 +238.65,238.99,236.0,238.65 +238.67,239.2,237.94,238.0 +238.2,239.0,237.63,239.0 +238.94,240.13,238.74,239.86 +239.83,240.08,239.27,239.8 +239.79,239.99,238.51,238.98 +239.23,241.91,239.02,240.92 +240.98,240.99,239.67,239.67 +240.02,240.59,239.1,240.17 +240.18,241.0,239.86,240.2 +240.19,240.52,239.45,239.71 +239.51,240.5,238.93,239.82 +239.82,240.1,239.0,239.69 +239.6,240.25,239.25,239.5 +239.51,240.01,238.91,239.62 +239.62,239.79,238.25,238.765 +238.765,238.7,237.26,237.91 +237.91,238.31,237.0,237.54 +237.27,237.7,236.0,236.01 +236.02,237.1,235.44,237.02 +236.87,238.14,236.68,237.72 +237.72,238.12,235.1,237.33 +237.49,238.74,236.89,238.21 +238.4,239.0,238.0,238.37 +238.54,239.77,237.49,238.6 +238.71,239.49,238.41,238.98 +238.98,239.42,238.55,238.74 +238.74,238.96,238.55,238.72 +238.72,239.22,238.43,239.05 +238.93,239.18,237.88,237.99 +237.97,238.5,237.5,238.35 +238.35,238.46,238.11,238.37 +238.16,238.47,238.11,238.21 +238.16,238.47,238.11,238.38 +238.38,238.46,238.08,238.08 +238.1,238.39,235.5,235.75 +235.82,238.0,234.33,237.43 +237.88,238.37,236.58,237.4 +237.69,237.77,237.11,237.6 +237.5,237.74,236.03,237.29 +237.2,237.61,235.35,236.3 +236.3,236.62,234.55,235.57 +235.56,236.47,234.49,235.03 +235.03,237.22,234.33,235.68333333333334 +237.22,237.67,236.42,236.33666666666667 +236.77,237.61,234.39,236.99 +236.99,236.99,235.57,236.7 +236.74,237.56,235.75,236.99 +236.99,237.5,236.56,237.45 +237.42,238.4,237.05,237.48 +237.48,238.0,237.13,237.73 +237.73,238.23,237.3,237.66 +237.85,238.07,237.16,236.86 +237.72,238.0,235.58,236.06 +236.05,237.5,236.0,236.71 +236.83,237.45,236.56,237.22 +237.23,237.5,236.58,237.25 +237.36,237.49,236.29,237.06 +237.06,237.48,236.5,237.27 +237.25,237.49,236.65,237.39 +237.39,255.0,237.32,254.9 +254.65,259.0,247.41,255.66 +255.47,255.87,251.3,251.99 +251.93,251.98,247.64,250.93 +253.035,254.14,250.93,254.14 +254.14,255.0,250.51,252.63 +252.7,252.9,249.31,249.88 +250.0,253.46,249.69,252.47 +252.62,252.92,250.87,252.35 +252.24,256.56,250.87,254.0 +253.99,254.44,251.0,252.86 +252.79,254.53,251.2,252.83 +252.83,253.97,252.0,252.46 +253.34,254.81,253.05,254.16 +254.16,254.98,253.86,254.98 +254.98,257.72,254.24,257.12 +257.11,258.99,255.79,255.79 +255.99,256.9,253.97,254.81 +254.84,256.94,253.76,256.58 +256.6,257.37,255.0,256.9 +257.07,257.37,253.75,254.31 +254.21,256.97,254.0,254.51 +254.51,255.0,253.0,253.11 +253.3,254.04,251.19,252.15 +252.3,253.87,251.14,252.89 +252.8,253.3,251.56,252.89 +252.78,254.02,251.65,253.32 +253.32,253.5,250.0,252.67 +252.78,253.02,251.52,252.66 +252.64,252.9,251.32,253.44 +252.75,255.29,252.27,254.22 +252.93666666666667,254.25,252.15,253.29 +253.12333333333333,253.65,252.52,253.28 +253.31,254.62,252.32,254.6 +254.6,254.65,252.0,253.68 +253.39,253.6,252.15,253.09 +253.24,253.82,252.52,253.39 +253.38,253.88,252.22,253.56 +253.75,254.5,252.82,254.5 +254.51,255.22,254.0,254.69 +254.7,254.98,253.25,254.56 +254.38,255.95,253.72,255.9 +255.89,256.29,254.52,255.76 +255.76,256.12,255.0,255.34 +255.33,255.9,255.0,255.76 +255.73,255.75,254.14,254.71 +254.58,255.0,254.0,254.19 +254.13,254.64,254.01,254.64 +254.64,255.35,254.18,254.87 +254.87,255.35,254.66,255.09 +255.19,255.5,254.34,254.84 +254.89,254.94,254.55,254.89 +254.89,254.95,254.34,254.58 +254.64999999999998,254.83,254.04,254.54000000000002 +254.41,254.59,254.0,254.5 +252.40666666666667,254.55,253.77,254.55 +250.40333333333334,254.6,247.3,248.39 +248.4,249.08,244.88,247.13 +247.4,248.52,247.0,248.49 +248.85,249.11,248.12,248.77 +248.83,250.92,247.72,248.92000000000002 +247.69,249.11,247.09,249.07 +249.07,249.94,248.64,249.27 +249.19,250.11,249.0,249.61 +249.55,249.68,248.31,248.5 +248.59,250.0,248.31,249.56 +249.62,261.01,249.56,257.0 +257.01,261.81,253.4,258.22 +258.77,262.0,257.75,260.41 +260.5,261.47,257.25,259.67 +259.82,259.99,258.47,259.1 +259.17,260.7,258.0,260.2 +260.2,263.13,259.01,262.83 +262.75,262.8,259.34,260.76 +260.76,262.46,260.51,260.91 +260.84,263.11,258.21,261.63 +261.63,262.15,260.73,261.72 +261.86,262.1,260.51,260.87 +260.92,261.5,260.5,260.685 +260.83,261.55,260.5,260.5 +260.51,261.94,258.71,260.45 +260.45,261.71,256.6,261.52 +261.35,261.59,260.51,260.59 +260.64,262.0,260.11,261.33 +261.39,263.07,261.21,263.07 +263.09,265.0,262.01,263.31 +263.51,265.0,263.0,264.15 +264.19,265.5,263.16,265.5 +265.5,273.15,265.49,270.78 +270.78,274.51,270.01,273.84 +273.84,275.92,271.99,272.89 +272.71,274.74,272.57,274.18 +274.09,279.8,273.91,276.45 +276.45,278.87,275.99,277.42 +277.31,277.63,271.0,274.72 +274.89,277.28,274.5,276.05 +276.07,276.5,274.78,276.43 +276.44,278.5,275.42,276.5 +276.48,277.25,276.0,276.5 +276.43,277.26,275.64,276.76 +276.76,277.0,274.15,276.75 +276.78,277.28,272.28,274.74 +274.96,275.77,274.11,275.1 +275.09,277.25,275.04,273.68 +276.85,280.0,269.71,272.26 +272.26,272.6,267.07,270.92 +270.7,273.2,269.79,272.82 +272.66,274.25,268.17,270.59 +270.29,271.07,267.73,268.5 +268.49,270.0,267.94,270.0 +269.99,277.03,269.41,275.99 +275.76,282.15,275.63,282.03 +282.0,285.0,281.0,283.51 +283.6,286.1,281.63,285.16 +285.16,289.5,284.5,285.0 +285.0,286.2,282.23,282.3 +282.47,283.49,281.5,283.15 +283.16,286.99,282.42,286.67 +286.67,287.0,283.48,284.36 +284.47,284.79,280.73,280.73 +280.73,281.5,277.26,279.23 +279.88,283.12,277.87,283.06 +282.83,282.99,279.74,280.7 +280.51,282.7,277.75,279.44 +279.54,280.0,278.47,278.85 +278.85,280.26,278.29,278.79 +278.77,279.52,277.0,277.39 +278.4,279.6,277.0,277.85 +278.03,279.62,277.56,279.16 +279.16,280.9,276.42,279.65 +279.66,280.9,278.15,280.63 +280.64,284.99,280.58,284.81 +284.76,284.99,280.99,282.93 +282.93,284.5,282.0,284.5 +284.5,285.0,283.55,284.67 +284.54,284.75,281.0,283.0 +283.0,283.97,279.01,280.41 +280.69,281.05,267.8,270.1 +270.02,272.86,267.39,271.14 +271.1,274.84,271.1,272.54 +272.54,274.97,272.22,273.44 +273.48,274.68,273.06,274.02 +274.02,274.24,272.88,273.28 +273.66,273.82,269.43,272.4 +272.33,273.37,269.92,271.55 +271.25,272.41,270.75,271.66 +271.66,271.87,269.28,270.37 +270.32,273.13,269.39,273.12 +272.64,272.76,268.99,271.5 +271.5,272.0,269.87,271.85 +271.8,271.85,268.84,271.26 +271.17,270.67,267.29,270.67 +270.54,270.72,267.0,270.24 +270.24,270.72,266.24,269.07 +268.98,270.48,267.3,270.29 +270.29,271.96,270.0,271.24 +271.67,271.87,269.29,269.29 +269.2,269.23,262.49,265.4 +265.57,268.25,265.15,268.06 +267.98,269.66,267.0,268.85 +268.63,268.68,265.45,268.4 +268.0,270.0,267.12,269.73 +269.27,281.09,269.02,277.7 +277.62,279.99,275.44,276.27 +276.48,277.31,274.79,275.54 +275.79,280.0,275.0,279.47 +279.26,279.53,275.88,277.38 +278.1,278.48,275.55,277.71 +277.55,278.47,276.18,276.91 +276.71,277.02,275.01,275.99 +276.03,276.21,272.55,273.0 +273.0,273.24,271.59,272.25 +272.46,272.83,270.2,271.98 +271.98,272.42,271.0,271.72 +271.78,274.04,271.46,272.0 +271.985,272.6,270.98,271.625 +272.19,272.19,271.25,271.25 +271.32,272.84,269.12,272.14 +272.24,273.19,269.99,272.56 +272.59,274.05,272.0,273.89 +273.73,274.97,272.5,274.94 +274.95,275.58,272.1,273.41 +273.41,274.34,272.01,272.33 +272.33,272.71,271.0,272.34 +272.34,274.13,272.34,273.12 +273.0,275.25,272.5,273.9 +273.73,274.9,271.93,273.7 +273.67,274.5,270.55,273.57 +273.6,273.95,271.94,272.61 +272.62,274.1,272.54,273.96 +274.08,274.09,272.0,272.68 +272.61,272.97,271.01,271.19 +271.06,273.32,270.85,272.68 +272.68,273.79,272.23,273.0 +272.69,273.76,272.23,272.9 +272.7,272.91,270.63,271.53 +271.52,272.9,270.55,271.77 +272.87,272.9,272.01,272.01 +272.21,272.9,270.97,271.93 +272.385,272.75,271.48,272.57 +272.56,272.9,272.39,272.51 +272.735,273.35,272.23,272.79 +272.91,273.48,272.16,273.46 +273.10333333333335,273.79,273.01,273.44 +273.2966666666667,273.49,273.09,273.995 +273.49,274.99,273.25,274.55 +274.5,277.5,274.4,276.15 +276.03,279.44,275.75,278.01 +278.0,278.85,277.15,277.63 +277.63,278.99,277.45,278.68 +278.67,278.96,276.41,277.3 +277.3,278.5,276.0,276.54 +276.92,277.07,275.84,276.91 +276.9,278.0,276.88,277.25 +277.14,277.7,276.62,277.16499999999996 +277.06,277.68,276.16,277.08 +277.08,277.87,276.49,277.59 +277.81,278.97,277.5,277.71 +277.82,278.1,277.2,277.57 +277.84,277.85,277.0,277.52 +277.52,278.2,277.44,278.05 +278.05,278.22,276.14,277.03 +276.71,276.81,275.8,276.01 +276.0,276.36,272.42,275.01 +274.71500000000003,274.74,272.85,274.01 +273.43,274.0,270.29,273.01 +273.09,274.89,272.89,274.51 +274.5,274.54,273.49,274.23 +274.23,274.8,273.11,274.8 +274.8,275.01,274.1,274.4 +274.39,275.1,273.44,274.8 +274.66,276.0,274.0,274.32 +274.55,275.45,273.75,275.29 +275.27,275.6,274.21,275.49 +275.27,277.47,274.0,274.16 +274.15,275.26,273.96,274.9 +274.88,275.96,274.3,275.24 +275.08,276.78,275.0,275.85 +275.86,276.84,275.1,276.04 +276.48,277.19,275.25,276.23 +276.08,279.39,275.81,278.29 +278.22,279.08,277.36,278.51 +278.5,279.89,278.0,279.54 +279.53,280.02,278.31,279.68 +279.08,281.0,278.3,279.82 +279.83,280.17,278.86,279.75 +280.94,283.0,279.24,281.94 +282.05,283.11,280.29,281.245 +281.3,281.71,279.85,280.55 +280.55,281.38,277.36,280.07 +279.29,280.97,279.0,279.48 +279.5,284.11,279.36,283.4 +283.4,286.64,283.0,284.86 +284.86,286.01,283.54,284.53 +284.6,289.93,284.5,287.61 +287.5,290.0,285.68,289.02 +288.98,291.8,288.09,291.8 +291.54,294.42,289.99,291.08 +291.69,291.98,289.96,290.94 +290.83,291.25,288.0,289.91 +289.9,291.99,286.48,290.21 +290.21,292.35,289.82,291.75 +291.76,293.27,291.72,292.24 +291.96,298.61,291.6,297.5 +297.52,298.87,296.5,296.69 +296.68,296.7,294.1,296.4 +296.36,298.25,295.86,297.75 +297.77,297.81,295.0,295.54 +295.54,295.91,293.2,293.6 +293.61,294.09,291.44,294.09 +294.09,294.2,293.0,295.01 +293.23,295.93,292.5,295.93 +295.94,297.15,294.43,295.55 +295.53,296.14,290.6,292.72 +292.48,293.81,290.89,293.8 +293.81,299.0,293.56,298.66 +298.98,298.99,293.45,295.1 +295.29,296.9,295.1,296.61 +296.72,299.0,296.68,298.2 +298.49,299.48,295.76,295.77 +295.8,299.0,295.77,297.63 +297.44,298.12,295.36,296.12 +296.14,296.19,292.1,294.66 +294.3,295.0,294.0,294.85 +294.74,294.85,291.32,292.93 +292.85,294.03,290.51,292.88 +292.87,294.45,291.89,293.15 +293.15,294.77,293.0,293.48 +293.37,294.6,291.43,292.39 +292.35,295.0,291.4,292.75 +292.98,293.15,291.2,292.7 +292.75,293.59,291.43,292.9 +292.89,293.54,291.89,292.3 +292.39,295.05,292.39,295.05 +295.01,296.18,294.53,295.35 +294.485,296.18,292.58,294.04 +293.96,294.23,292.5,292.86 +292.86,295.12,292.35,295.05 +295.02,295.1,292.81,293.91 +293.76,295.07,293.04,295.0 +295.0,296.99,294.19,296.99 +296.74,296.99,296.0,296.9 +296.89,297.8,296.02,297.8 +297.8,297.8,295.18,296.88 +296.72,297.2,294.54,296.99 +296.9,296.9,294.25,296.61 +296.68,297.8,296.26,296.5 +296.5,296.97,295.68,296.97 +296.97,296.99,296.58,296.82 +296.82,297.45,295.0,295.68 +295.45,296.37,294.55,294.73 +294.73,295.39,294.0,294.34 +294.49,294.51,291.87,293.15 +293.14,294.64,293.14,293.88 +293.87,294.85,292.76,294.4 +294.43,294.88,292.66,293.63 +293.63,294.38,292.83,293.19 +292.99,294.38,292.92,293.68 +293.44,294.5,293.4,293.6 +294.45,294.51,293.39,293.52 +294.49,295.0,292.99,293.44 +293.65,293.8,293.17,293.62 +293.62,295.21,292.15,295.13 +294.84,295.35,293.51,294.37 +294.37,296.53,294.03,295.77 +295.77,297.49,295.53,297.37 +297.33,298.74,296.7,298.23 +298.11,298.9,296.5,297.3 +297.0,297.99,296.51,297.59 +297.55,297.64,296.11,296.8 +296.8,297.19,294.09,295.45 +295.24,296.0,295.04,295.82 +295.81,296.52,295.19,295.81 +295.81,296.05,295.06,295.59 +295.58,296.43,295.13,295.13 +295.13,295.64,293.98,294.35 +294.54,295.1,294.25,294.94 +294.88,295.5,293.55,294.11 +294.0,294.29,290.65,291.13 +291.14,292.05,287.28,287.28 +287.38,291.8,286.67,291.72 +291.71,291.92,288.96,290.49 +290.49,293.15,289.97,290.65 +290.43,291.22,287.25,289.15 +289.15,293.2,288.91,290.85 +290.95,291.44,289.53,291.44 +291.41,293.73,290.85,293.14 +293.13,293.37,290.15,292.01 +291.84,292.88,290.08,292.76 +292.63,292.96,290.96,292.39 +291.66999999999996,292.9,290.41,290.8 +290.71,291.07,284.86,286.82 +286.79,289.48,286.0,288.99 +288.78,290.02,288.0,289.97 +289.81,290.1,286.51,288.85 +288.81,289.26,287.12,287.99 +287.99,288.0,283.63,284.48 +284.48,286.94,280.86,286.2 +286.28,286.29,282.61,282.73 +282.99,285.37,281.47,284.76 +284.76,285.59,282.71,285.55 +285.39,287.48,284.26,285.26 +285.68,286.17,284.11,286.17 +285.97,286.17,284.0,284.81 +285.0,285.74,284.15,284.75 +284.93,285.3,284.26,284.69 +284.86,285.2,284.11,285.12 +285.12,285.13,283.07,285.13 +285.23,286.13,283.61,284.62 +285.675,287.02,284.26,286.3 +286.12,286.76,285.59,286.33500000000004 +286.17,286.37,285.32,286.37 +286.22,288.0,286.0,287.99 +287.82,289.0,287.26,287.74 +287.74,288.0,285.92,286.96 +286.95,286.95,282.18,284.98 +284.63,288.0,284.27,286.05 +285.86,286.67,282.39,284.07 +284.08,285.19,283.74,284.63 +284.76,285.75,284.04,284.66 +284.43,284.67,283.0,283.57 +283.48,284.37,282.5,283.985 +284.09,284.95,283.68,284.4 +284.34,285.64,284.34,285.33 +285.35,285.94,285.01,285.94 +285.67,286.49,284.72,284.99 +284.96,286.6,284.71,285.5366666666667 +286.41,286.51,285.36,286.0833333333333 +286.15,286.63,286.1,286.63 +286.61,286.63,284.0,285.745 +285.73,286.05,284.57,284.86 +284.85,285.92,284.55,285.84 +285.94,286.63,285.59,286.62 +286.62,287.63,286.24,286.87 +287.07,287.7,286.39,287.57 +287.52,287.8,287.0,287.49 +287.48,287.62,286.18,287.18 +287.13666666666666,287.5,286.13,287.07 +286.79333333333335,287.49,286.0,286.56 +286.45,287.0,285.94,286.9 +286.59,287.68,286.58,287.6 +287.6,289.01,287.04,288.1 +288.1,289.24,287.04,287.07 +287.3,288.48,286.1,287.6 +287.61,288.1,287.01,287.95 +287.95,289.0,287.48,289.0 +289.05,292.37,288.24,290.99 +290.94,294.38,290.25,293.33 +293.33,294.28,292.07,293.67 +293.67,294.99,292.36,293.13 +293.08,294.29,292.32,293.56 +293.77,293.91,292.0,292.4 +292.57,294.24,291.99,293.21 +293.02,294.5,292.07,294.27 +294.27,294.27,293.24,293.36 +293.22,294.18,292.87,293.3 +293.3,293.9,291.63,293.54 +293.54,294.34,293.41,294.03 +293.81,294.99,293.62,294.92 +294.79,294.97,292.0,293.05 +294.11,294.26,292.01,293.19 +293.19,294.38,292.0,292.52 +292.26,292.87,290.19,291.87 +291.83,294.0,290.96,292.0 +291.65999999999997,292.29,290.53,291.47 +291.49,293.33,291.0,292.55 +292.6,293.0,291.87,292.75 +292.71,292.94,291.0,292.45 +292.5,292.76,291.5,292.45 +292.39,292.85,290.03,292.06 +291.88,292.09,290.39,292.02 +291.83,292.98,291.16,292.0 +292.0,292.7,291.85,292.68 +292.5,292.71,292.28,292.69 +292.71,293.05,292.26,292.95 +292.44,293.47,292.12,292.12 +292.17,293.69,292.01,292.885 +293.24,293.65,292.48,293.65 +293.64,293.68,292.0,292.22 +292.25,292.53,290.83,292.32 +292.17,292.38,291.03,291.84 +292.08,292.78,291.03,291.5 +291.98,293.23,290.65,290.77 +290.67,291.58,287.11,288.58 +288.7,290.0,287.8,289.15 +289.29,289.77,287.11,288.5 +288.37,288.96,287.1,288.46 +288.52,289.73,287.8,289.5 +289.25,289.98,288.47,289.44 +289.28,290.0,288.01,288.12 +288.12,288.47,284.01,285.96 +286.0,287.5,285.65,285.91 +285.98,287.06,285.3,285.84 +285.75,287.0,285.01,285.4 +285.3,285.48,283.56,284.36 +284.46,284.93,283.51,284.78 +284.77,285.49,284.4,285.49 +285.49,285.5,285.05,285.5 +285.5,285.9,284.88,285.25 +285.23,286.0,284.87,284.12 +285.77,285.99,282.63,282.99 +283.19,284.69,282.19,281.22333333333336 +283.66,283.7,280.0,279.45666666666665 +280.59,281.16,276.59,277.69 +277.56,278.14,270.0,270.46 +270.62,276.9,270.01,274.43 +274.52,274.87,273.0,274.4 +274.4,277.14,273.35,276.53 +276.44,277.47,273.95,274.36 +274.36,274.71,270.08,272.2 +272.11,272.29,264.97,268.49 +268.49,269.93,266.12,268.5 +268.53,269.3,265.0,266.1 +266.19,267.96,262.23,263.0 +263.05,264.34,250.0,254.92 +254.92,258.0,254.32,257.72 +257.65,262.73,256.0,258.78 +258.13,259.0,252.3,253.1 +252.77,258.98,249.2,255.01 +255.01,256.1,252.31,254.04 +254.04,257.52,253.81,256.21 +256.11,257.43,254.91,256.5 +256.45,257.92,253.0,254.72 +255.48,264.0,254.82,263.1 +262.44,263.42,258.43,263.02 +263.03,263.03,258.65,259.99 +260.14,261.92,260.1,260.22 +260.18,260.18,256.81,257.03 +257.13,261.82,257.13,261.82 +261.26,262.58,260.69,261.46 +261.46,264.66,260.08,261.85 +262.9,265.59,260.92,263.89 +264.34,265.12,263.51,264.75 +264.95,266.8,264.11,266.01 +266.01,266.06,261.12,261.54 +261.49,262.34,260.75,261.74 +261.73,262.04,253.0,254.2 +254.29,264.41,252.5,264.25 +264.15,264.69,261.24,263.84 +263.83,264.65,261.0,263.74 +263.57,264.0,262.0,263.05 +262.96,264.65,262.22,264.25 +264.19,265.08,263.72,264.96 +264.76,267.1,264.64,266.87 +266.77,267.42,265.2,265.2 +265.2,265.6,263.21,263.21 +263.21,264.11,261.99,263.99 +263.99,264.51,262.78,264.4 +264.17,264.8,261.99,261.99 +261.95,262.4,260.0,261.48 +261.04,262.1,260.14,261.48 +261.48,262.46,260.82,261.42 +260.8,262.6,260.71,261.36 +262.37,263.23,260.45,261.3 +262.485,262.99,261.26,262.62 +262.6,264.99,262.05,264.99 +264.98,264.99,263.02,262.89 +263.33,263.89,259.31,260.79 +260.78,263.39,260.0,262.18 +262.19,263.5,261.0,263.29 +263.14,264.61,262.42,263.94 +263.63,264.17,262.5,263.49 +263.21,264.45,262.71,264.22 +263.67,264.45,263.09,263.28 +263.28,264.04,262.65,262.76 +262.97,263.2,261.83,262.18 +262.19,263.21,261.62,261.87 +262.12,262.68,261.43,262.48 +262.46,263.62,261.32,263.22 +263.21,263.31,262.2,262.74 +262.94,263.02,262.23,260.525 +262.6,263.02,256.66,258.31 +258.46,259.49,257.01,258.46 +258.345,258.53,256.76,259.3066666666667 +258.23,259.82,257.33,260.1533333333333 +259.625,261.35,258.66,261.0 +261.02,261.86,260.01,261.42 +261.33,262.5,260.51,262.5 +262.45,263.02,261.54,261.73 +262.09,263.0,261.7,262.59 +262.32,263.36,261.92,263.36 +263.35,263.36,260.0,261.01 +261.02,261.5,260.1,260.86 +261.1,262.34,259.8,262.11 +262.1,262.33,260.85,261.81 +261.81,262.0,261.0,261.42 +261.11,261.5,259.2,261.24 +261.39,262.22,261.25,261.6 +261.88,262.01,261.41,262.0 +261.58,262.23,261.51,261.93 +261.94,261.97,261.0,261.65 +261.41,261.69,260.8,261.15 +261.15,261.71,260.2,261.315 +261.37,261.61,260.03,261.48 +261.48,261.67,260.0,260.45 +260.22,263.0,259.71,260.75 +260.57,261.63,260.46,260.942 +260.31,261.61,260.31,261.134 +260.98,262.07,260.69,261.32599999999996 +261.4,262.73,261.19,261.518 +261.92,262.1,261.49,261.71 +261.72,262.51,261.0,262.25 +262.25,262.99,261.49,262.75 +262.68,263.0,262.39,262.59 +262.5,263.0,261.3,262.01 +262.18,262.97,261.4,262.455 +262.24,262.9,262.0,262.9 +262.82,262.99,262.2,262.9 +262.9,269.64,262.74,268.1 +268.1,269.34,266.94,268.24 +267.79,269.0,265.8,268.92 +268.62,271.15,268.09,271.0 +271.0,271.27,268.01,269.9 +269.57,271.6,269.31,270.44 +270.2,270.63,269.32,270.2 +270.16,270.39,269.41,270.1 +270.33,270.35,269.01,269.48 +269.39,269.82,268.7,268.86 +269.635,270.27,268.5,270.01 +269.88,270.24,268.91,270.16 +269.9166666666667,270.4,268.96,270.14 +269.9533333333333,270.25,269.19,270.12 +269.99,270.6,269.41,270.6 +270.62,272.4,270.62,270.435 +271.29,271.5,268.89,270.27 +270.02,270.16,268.02,269.8 +269.69,270.21,268.68,269.37 +269.59,270.3,268.95,268.95 +268.97,269.45,266.27,267.55 +267.82,269.45,267.05,268.08 +267.92,268.3,266.03,267.2 +267.41,267.7,264.82,265.27 +265.26,265.29,262.28,264.36 +264.36,272.53,262.25,262.25 +262.25,273.99,262.25,267.07 +267.08,273.2,260.81,266.79 +266.83,267.85,265.31,267.18 +266.97,268.51,266.92,267.75 +267.75,268.03,266.06,267.0 +267.01,267.39,265.91,267.38 +267.38,268.0,266.51,267.47 +267.71,268.1,266.66,267.23 +267.14,267.73,266.51,267.18 +267.11,267.7,266.51,266.895 +267.38,267.73,266.07,266.61 +266.44,266.39,265.0,264.62 +265.5,265.54,260.0,262.63 +261.14,262.23,259.48,260.64 +260.62,261.79,255.0,255.13 +255.01,258.31,255.01,256.99 +256.99,257.8,247.34,250.07 +250.11,250.58,244.86,247.39 +247.48,249.0,245.01,248.04 +248.32,249.22,245.92,246.52 +246.52,249.08,245.41,248.3 +248.31,249.37,247.0,247.31 +247.28,249.59,247.21,248.57 +248.57,253.81,248.52,248.75 +248.74,250.96,248.0,249.88 +250.0,252.79,248.86,249.33 +249.91,250.07,245.41,248.55 +248.34,248.37,244.8,246.69 +246.61,248.93,246.58,248.23 +248.29,249.21,246.02,248.54 +248.96,249.7,247.42,248.48 +248.4,249.12,247.29,247.175 +247.67,248.1,244.8,245.87 +246.05,246.07,243.63,245.03 +242.97500000000002,245.73,237.37,239.35 +239.9,240.19,234.51,240.19 +240.08,246.09,239.37,243.87 +243.87,245.58,243.86,244.6 +244.53,247.64,244.19,245.71 +245.72,249.15,244.56,247.85 +248.02,249.99,245.42,247.0 +247.11,248.11,246.5,247.8 +247.8,249.0,247.77,248.37 +248.37,248.84,246.5,248.02 +248.02,248.7,243.0,246.37 +246.5,246.92,245.14,246.16 +246.15,246.87,241.59,244.32 +244.32,246.99,243.2,246.17 +246.18,246.99,244.75,246.89 +246.86,247.4,246.0,246.62 +246.63,247.1,246.42,247.0 +247.0,247.99,246.25,246.72 +246.3,246.83,245.48,246.44 +246.41,247.82,246.19,247.68 +247.6,247.95,246.61,246.98 +246.87,246.99,245.34,245.51 +245.5,247.54,244.92,246.69 +246.9,248.99,246.12,248.98 +248.3,251.19,247.81,250.56 +250.56,251.61,249.74,251.09 +251.13,252.13,250.03,250.33 +250.25,251.23,249.0,250.4 +250.4,252.13,250.4,251.08 +251.07,254.53,250.63,253.33 +253.25,253.99,251.08,252.7 +252.85,253.31,251.09,251.85 +251.97,253.0,250.93,252.83 +251.745,253.1,250.33,251.26 +251.52,253.0,251.27,252.78 +252.78,254.9,251.68,254.9 +253.83,254.89,252.0,252.69 +252.6,252.73,248.77,250.54 +250.51,251.98,248.88,249.59 +249.44,250.33,247.59,249.66 +249.64,250.63,249.25,250.0 +250.13,250.99,248.55,249.0 +248.83,249.54,246.71,247.44 +247.42,247.7,246.44,247.14 +247.15,249.56,246.6,249.49 +249.46,249.5,247.78,248.55 +248.32,249.84,248.0,249.38 +249.52,250.4,249.2,250.11 +250.05,250.4,247.42,248.0 +248.0,248.53,247.23,248.22 +248.22,249.54,248.2,249.31 +249.42,250.54,247.69,248.26 +247.75,249.03,247.52,248.7 +248.62,249.0,246.8,247.94 +247.94,248.66,246.93,247.95 +247.94,249.5,247.49,249.36 +249.35,249.4,247.49,248.9 +248.92,249.36,248.19,248.48 +248.63,249.5,248.19,249.3 +249.3,249.64,248.63,249.63 +249.5,249.61,249.03,249.5 +249.49,250.22,249.03,249.95 +249.98,250.0,249.35,249.35 +249.31,249.94,249.2,249.44 +249.47,249.47,247.63,247.95 +247.84,249.78,247.84,249.02 +249.03,249.8,248.77,249.62 +249.6,249.82,249.03,249.52 +249.63,250.0,249.36,249.6 +249.55,252.69,249.23,252.0 +251.98,254.22,251.8,254.04 +254.05,254.59,252.98,253.84333333333333 +253.6,254.3,252.5,253.64666666666665 +252.98,253.81,252.52,253.45 +253.47,254.52,253.11,253.14 +253.1,254.99,253.05,254.25 +254.24,254.25,252.02,253.37 +252.44,252.74,251.73,252.49 +252.7,253.2,251.64,252.94 +253.0,253.0,251.82,252.97 +252.57,253.0,251.5,253.0 +252.92,253.08,252.46,252.68 +252.69,252.89,252.24,252.45 +252.52,253.04,252.28,252.74 +252.88,253.0,252.1,252.88 +252.85,253.43,252.68,253.3 +253.28,254.37,252.82,253.31 +253.25,254.0,253.0,253.35 +253.32,254.0,253.04,254.0 +253.93,254.0,252.89,253.28 +253.28,253.76,249.06,250.48 +250.5,251.22,247.01,247.17 +247.35,248.69,247.29,248.17 +248.26,249.17,248.25,248.97 +248.73,251.64,247.01,248.59 +248.3,248.95,248.3,248.83 +248.78,249.12,248.52,249.03 +246.89499999999998,249.08,245.0,245.0 +245.01,246.22,241.0,243.22 +243.37,246.53,242.39,245.35 +245.37,247.37,245.26,246.07 +245.9,246.26,245.27,245.92 +245.15,246.82,243.92,244.59 +244.4,246.37,244.4,245.7 +245.68,245.85,242.24,244.7 +244.68,245.35,243.64,245.13 +245.12,246.37,243.5,244.0 +244.0,244.98,243.25,244.64 +244.82,245.99,244.6,244.8 +244.49,245.44,242.5,244.32 +244.16,244.48,241.28,241.62 +241.51,245.06,241.36,244.51 +244.43,244.5,243.14,244.5 +244.45,244.5,241.12,241.12 +241.13,242.36,237.94,240.73 +240.61,245.99,240.61,245.03 +245.03,245.76,243.68,245.67 +245.58,247.78,245.22,246.35 +246.44,247.62,245.92,245.95 +246.03,246.66,245.73,245.98 +245.98,246.39,245.67,246.0 +246.23,247.6,245.7,246.0 +246.0,246.47,245.82,245.54 +246.44,246.54,245.54,245.08 +245.57,245.84,243.86,244.62 +244.7,245.07,242.0,244.56 +244.42,245.14,244.0,244.86 +245.03,248.0,244.82,247.17 +247.17,249.01,247.0,248.13 +248.14,249.01,246.99,247.27 +247.35,248.17,247.2,247.54 +247.33,248.9,247.11,248.3 +248.27,250.06,248.27,249.67 +249.79,249.87,248.51,249.37 +249.36,249.59,247.97,248.72 +248.67,249.0,248.17,248.58 +248.57,249.11,248.3,248.81 +248.83,249.19,248.8,248.93 +249.04500000000002,249.49,248.76,249.3 +249.26,249.98,249.2,249.74 +249.74,249.8,248.64,248.91 +248.9,249.11,248.27,248.54 +248.55,248.98,247.69,248.7 +248.7,248.8,248.34,248.46 +248.46,248.82,248.4,248.6 +247.09333333333333,248.93,247.9,248.44 +245.7266666666667,249.0,244.35,244.37 +244.36,246.09,244.09,245.4 +245.35,245.48,244.22,244.81 +244.69,244.69,243.5,244.11 +243.47,245.37,243.06,245.36 +245.2,246.3,244.01,244.6 +244.6,245.2,243.85,245.09 +245.1,245.77,243.5,245.55 +245.56,246.0,244.31,244.63 +244.64,246.07,244.13,244.6 +244.62,245.75,244.27,244.91 +244.91,244.94,242.87,244.85 +244.66,247.03,243.43,246.5 +246.42,246.48,245.47,245.74 +245.73,245.8,244.76,245.56 +245.45,245.71,244.48,245.38 +245.38,245.97,244.9,245.95 +245.87,246.95,245.6,245.98 +245.96,246.58,244.09,245.17 +245.17,245.41,244.27,245.06 +245.05,245.74,244.76,245.12 +245.12,245.98,242.4,244.22 +244.22,245.43,243.62,244.56 +243.765,245.35,243.1,243.505 +243.31,243.52,241.07,242.45 +242.33,242.8,241.74,242.79 +242.77,244.18,242.61,243.78 +243.87,244.19,242.68,244.01 +244.01,244.7,243.5,244.34 +244.45,244.55,243.71,244.06 +244.05,244.62,243.6,244.48 +244.43,244.43,243.0,243.56 +243.79,244.8,243.15,243.78 +243.76,244.64,242.31,244.45 +244.61,247.46,244.18,246.3 +246.17,247.56,246.16,247.56 +247.17,248.22,246.56,246.72 +246.82,247.91,246.69,247.18 +247.08,248.21,246.7,246.92 +247.19,247.94,246.98,247.86 +247.9,249.0,247.68,249.0 +249.0,249.55,247.71,247.94 +247.87,248.99,247.87,248.59 +248.7,248.71,247.81,247.98 +247.95,247.98,246.14,247.58499999999998 +246.55,247.3,245.85,247.19 +246.97,247.17,246.41,246.43 +246.4,246.71,245.8,246.81333333333333 +246.59,247.0,246.06,247.1966666666667 +246.99,247.59,246.46,247.58 +247.59,247.72,246.46,246.6 +246.27,247.75,246.27,247.59 +247.57,249.0,247.57,248.65 +248.63,248.64,248.24,248.31 +248.64999999999998,248.86,248.25,248.69 +248.67,252.02,248.63,251.26 +251.37,253.0,251.1,252.99 +252.99,253.62,251.03,253.3 +253.29,255.24,253.28,254.6 +254.59,254.68,252.83,254.27 +253.92,254.27,252.12,252.72 +252.86,253.99,252.38,253.99 +253.59,254.86,253.43,254.39 +254.41,254.99,253.15,253.49 +253.49,254.54,253.49,253.845 +254.01,254.69,253.76,254.2 +254.2,254.88,253.61,254.03 +254.02,254.08,252.59,252.9 +252.87,253.28,252.6,253.23 +253.07,253.88,252.85,253.735 +253.64,254.26,252.85,254.24 +254.26,256.8,254.26,256.26 +256.28,256.74,256.09,255.58499999999998 +255.60999999999999,257.43,254.42,254.91 +254.94,255.29,254.02,254.58 +254.71,255.78,254.14,254.98 +254.99,256.81,254.99,255.55 +255.55,256.13,254.89,255.92 +255.94,256.84,255.3,256.16 +256.16,256.17,254.33,254.36 +254.8,256.01,254.14,255.32 +255.66,255.66,254.67,254.67 +254.85,255.8,254.48,255.12 +255.02,255.91,254.73,255.91 +255.91,255.91,254.1,255.42 +255.43,255.79,254.4,254.4 +254.43,255.68,254.38,254.78 +254.77,255.98,254.51,255.675 +255.62,256.6,255.5,256.57 +256.43,256.43,254.4,255.64 +255.65,255.7,254.41,255.52 +255.44,255.7,254.1,254.83 +254.9,255.16,253.65,253.96666666666667 +254.24,254.79,252.28,253.10333333333335 +252.67,252.7,251.55,252.24 +252.21,252.41,252.01,252.1 +252.01,252.63,251.56,251.96 +252.155,253.26,251.51,253.0 +252.3,253.3,252.7,252.76 +252.445,253.11,252.3,252.6 +252.59,252.81,251.26,252.81 +252.8,253.46,252.57,252.9 +252.96,253.13,252.16,252.74 +252.63,254.96,252.01,254.55 +254.5,254.97,254.31,254.67 +254.47,254.99,252.46,253.73 +253.71,254.36,253.2,253.65 +253.6,254.89,253.46,254.57 +254.5,254.81,253.71,254.5 +254.26,255.0,253.56,254.61 +254.6,254.98,253.71,254.72 +254.71,255.16,252.4,253.97 +253.96,254.41,253.26,253.94 +253.94,253.96,252.36,252.95 +253.11,253.35,252.53,253.04 +253.05,253.31,252.4,252.45 +252.42,253.32,252.11,252.54 +252.54,252.6,252.06,252.57 +252.57,252.7,252.4,252.6 +252.6,252.74,252.37,252.68 +252.74,253.0,252.54,252.76 +253.76,254.78,252.67,254.77 +254.78,257.41,254.77,257.41 +257.31,258.92,257.31,257.99 +258.0,258.22,257.25,257.77 +257.79,258.7,257.56,258.69 +258.69,259.0,258.0,258.41 +258.04,258.99,257.75,258.42 +258.42,258.74,258.21,258.20500000000004 +258.26,258.43,257.95,257.99 +257.99,258.25,257.51,258.1 +258.05,258.61,257.74,258.45 +258.48,258.8,258.15,258.54 +258.54,261.74,258.54,261.14 +261.13,262.3,261.01,262.2 +262.19,262.36,261.06,261.79 +261.79,262.98,261.69,262.85 +262.85,263.0,262.34,262.75 +262.61,262.9,262.08,262.15 +262.14,262.28,260.44,261.06 +261.06,261.69,260.28,260.34 +260.34,260.42,258.61,258.89 +259.77,259.24,258.57,259.21 +259.2,259.56,259.18,259.41 +259.0933333333333,259.68,257.76,258.2 +258.9866666666667,259.43,258.18,258.42499999999995 +258.88,259.14,258.16,258.65 +258.88,260.11,258.27,259.4 +259.27,261.13,259.25,261.13 +261.01,261.27,259.0,260.44 +260.07,260.45,258.7,259.49 +259.26,259.87,259.06,259.65 +259.47,259.72,255.06,255.18 +255.11,257.05,255.1,256.16 +256.16,257.01,255.0,256.25 +256.25,256.44,255.01,256.0 +256.18,258.73,255.01,256.5 +256.1,258.3,255.83,257.59 +258.29,258.45,255.94,257.4 +257.0,258.7,256.85,257.12 +257.04,257.29,254.8,254.87 +254.87,256.32,254.01,254.75 +254.82,254.82,253.45,254.25 +254.26,256.03,254.1,255.41 +255.39,255.43,255.0,255.01 +255.01,256.0,254.33,254.9 +254.55,256.03,254.51,255.52 +255.97,256.07,255.29,255.26 +255.59,255.85,254.77,255.0 +255.33333333333334,255.0,254.3,254.98 +255.07666666666665,256.08,253.87,255.12 +254.82,255.26,253.68,255.26 +255.1,256.87,254.12,256.03 +256.03,256.61,255.01,255.99 +256.0,256.99,255.75,256.6 +256.45,256.99,255.7,256.46 +256.28,256.91,255.47,256.1 +256.09,258.11,255.99,256.73 +257.0,257.48,255.8,256.23 +256.25,257.33,255.5,256.11 +255.96,256.58,254.73,255.25 +255.21,256.09,254.32,256.08 +255.78,256.2,253.87,254.16 +254.17,255.2,254.07,255.1 +255.2,255.75,255.03,255.75 +255.73,255.75,254.07,254.66 +254.69,255.59,253.96,253.96 +253.95,254.49,253.22,254.0 +254.04,254.8,253.57,254.48000000000002 +254.68,255.29,254.19,254.96 +254.94,255.4,254.06,255.11 +255.4,255.4,254.36,255.26 +255.26,255.47,253.76,253.77 +254.25,254.38,245.75,247.2 +250.36,247.4,245.0,246.25 +246.47,247.78,244.87,245.82 +246.75,247.87,244.29,246.99 +247.03,249.93,246.39,249.58 +249.52,249.58,246.5,246.94 +246.93,247.08,245.04,246.41 +246.59,249.32,246.59,247.6 +247.27,248.01,245.33,247.42 +247.42,248.19,245.0,245.64 +245.92,247.99,245.53,247.54 +247.56,248.0,246.63,247.2 +247.11,247.69,246.65,247.03 +246.655,247.36,246.06,246.48 +246.2,248.16,245.94,247.77 +247.45,248.05,245.86,246.63 +246.62,246.77,245.75,246.73 +246.64,246.9,245.79,246.03 +246.03,246.89,245.42,246.17 +246.18,246.34,245.21,246.02 +245.99,246.32,243.45,243.76 +243.53,244.32,239.36,239.36 +239.35,242.91,239.02,242.04 +241.20499999999998,243.37,242.36,243.1 +243.06,243.61,242.7,243.53 +243.39,243.61,242.03,243.05 +243.05,245.03,242.91,244.02 +244.02,246.21,243.8,245.96 +245.96,246.05,243.91,244.53 +244.52,245.93,244.17,245.78 +245.53,246.19,245.19,245.75 +245.78,245.99,245.44,245.75 +245.88,246.39,245.33,245.62 +245.61,245.81,243.63,243.64 +243.64,244.96,243.32,243.54 +243.56,244.31,242.76,244.31 +244.33,244.84,243.63,244.09 +244.03,244.95,243.61,244.42 +244.41,244.5,243.71,244.5 +244.33,244.66,243.3,243.39 +243.42,244.42,242.44,242.84 +242.8,243.16,241.8,242.1 +242.775,243.42,242.08,242.88 +242.75,243.15,242.38,242.64 +242.62,242.88,239.19,239.6 +239.59,241.74,239.59,240.61 +240.38,240.72,239.12,239.67 +239.66,240.33,238.45,238.69 +238.65,240.78,238.65,238.23000000000002 +240.73,240.91,237.62,237.77 +237.53,238.05,233.19,235.73 +235.85,237.04,235.15,236.12 +236.25,236.83,235.53,236.23 +236.23,236.74,232.35,232.97 +232.94,238.61,232.94,238.19 +238.09,239.57,237.0,237.43 +237.42,237.67,235.78,236.55 +236.54,237.66,236.4,236.61 +236.54,237.12,235.66,235.67 +235.88,236.3,235.1,235.47 +235.45,236.7,233.86,236.53 +236.51,236.79,235.32,236.74 +236.74,236.98,236.57,236.87 +236.87,238.29,236.26,237.71 +237.82999999999998,238.99,236.7,238.87 +238.79,239.99,236.49,236.53 +236.51,237.72,236.51,237.16 +237.28,237.29,234.77,235.62 +235.54,236.35,235.54,236.35 +236.29,236.48,235.67,236.14999999999998 +236.11,238.06,235.95,235.95 +235.86,235.86,235.11,235.435 +235.76250000000002,235.28,234.78,234.92 +235.66500000000002,235.23,234.84,234.98 +235.5675,236.09,234.92,235.49 +235.47,237.06,235.38,236.66 +236.73,238.97,236.73,237.97 +238.02,238.8,237.83,238.34 +238.27,238.27,237.76,238.19 +238.22,238.59,237.58,238.04 +238.1,238.45,237.94,238.04 +238.04,238.2,236.7,237.14 +237.08,238.34,237.05,237.01999999999998 +238.33,238.47,236.86,236.9 +236.86,238.32,236.46,237.64 +237.75,238.36,237.75,237.86 +237.89,238.61,237.46,238.04 +238.03,238.88,237.73,238.74 +238.72,239.16,238.01,238.315 +238.25,238.55,237.66,237.89 +237.78,238.53,237.34,237.46 +237.4,238.48,237.34,238.1 +238.0,238.43,237.63,237.75 +237.66,238.01,237.38,237.4 +237.32,237.6,234.02,236.04 +236.14,237.14,236.14,236.63 +236.345,237.27,236.98,237.22 +236.55,237.31,236.74,236.74 +236.755,237.44,236.66,236.96 +236.96,238.16,236.96,237.6 +237.59,237.88,237.29,237.6 +237.62,237.82,237.13,237.81 +237.71,238.11,237.27,237.33 +237.35,237.75,237.19,237.58 +237.58,238.0,237.26,237.4 +237.49,237.87,237.29,237.61 +237.6,237.98,237.02,237.88 +237.9,238.0,237.06,237.52 +237.51,238.0,237.5,237.78 +237.78,238.34,237.32,237.58 +237.6,237.82,236.9,236.9 +236.9,237.49,236.7,237.49 +237.49,237.5,237.02,237.43 +237.39,238.0,237.17,237.25 +237.25,237.79,236.77,237.62 +237.5,238.0,237.06,237.335 +237.27,237.61,236.92,237.05 +237.0,237.22,235.94,236.57 +236.57,236.67,236.11,236.5 +236.5,236.5,235.91,236.1 +235.98333333333332,236.27,235.19,235.575 +235.46666666666667,236.64,234.86,235.05 +234.95,236.42,234.88,235.71 +235.62,236.49,235.41,236.31 +235.615,236.34,235.01,235.95 +235.61,235.73,235.0,235.32 +235.32,235.95,234.76,235.66 +235.71,236.35,231.23,231.23 +231.24,231.28,225.0,226.96 +226.81,227.52,224.38,225.81 +225.81,226.31,224.72,224.74 +224.82,225.02,220.77,224.87 +224.84,227.94,224.22,225.96 +225.93,226.99,225.11,226.03 +226.1,226.9,225.03,226.15 +226.14,226.55,225.01,225.97 +225.98,226.37,225.23,225.37 +225.3,226.0,223.02,224.55 +224.21,225.23,223.2,224.2 +223.9,224.84,219.87,220.66 +220.63,221.88,218.04,219.1 +219.1,221.43,218.99,221.17000000000002 +220.24,223.49,220.24,223.24 +223.23,223.8,222.66,222.76 +222.495,222.65,220.92,221.87 +221.76,222.89,221.04,221.91500000000002 +222.72,223.22,221.91,221.96 +221.94,222.41,219.5,220.57 +220.57,221.5,218.85,218.9 +218.89,220.46,218.5,220.11 +220.3,222.16,218.15,218.93 +218.5,220.0,217.6,218.54 +218.93,218.96,216.92,218.36 +218.33,219.3,217.42,218.75 +218.92,220.0,218.6,218.67 +218.67,219.88,218.05,218.68 +218.64,220.92,218.54,220.92 +220.9,221.67,219.92,221.11 +221.02,223.64,220.0,222.15 +222.15,223.83,221.95,222.65 +222.78,223.7,222.3,223.56 +223.43,224.24,222.49,223.61 +223.35,224.05,222.3,222.3 +222.3,222.57,221.43,222.01 +222.01,222.37,221.35,221.93 +222.0,223.7,221.93,223.23 +223.23,223.44,222.52,222.99 +222.8,223.09,222.6,222.92 +223.04,223.94,223.0,222.98 +223.0,223.16,222.74,223.04 +222.96,223.59,221.96,222.79 +222.3,223.59,221.95,222.43 +222.43,222.99,221.04,222.12 +222.1,222.43,218.09,220.92 +220.92,221.99,220.07,221.66 +221.61,222.47,221.0,221.61 +221.61,221.72,221.0,221.15 +221.05,221.41,220.34,221.02 +221.01,221.67,220.16,221.14 +221.08,221.75,220.02,221.68 +221.68,223.69,221.32,223.16 +223.3,224.52,223.29,224.24 +224.24,227.94,223.66,226.5 +226.42,227.57,226.0,226.89 +226.87,227.99,226.34,227.97 +227.96,227.99,227.36,227.36 +227.36,227.49,226.13,226.55 +226.58,227.95,226.13,227.49 +227.48,227.61,226.96,227.23 +227.36,227.37,226.83,227.04666666666665 +227.06,227.1,226.93,226.86333333333334 +226.99,227.01,226.41,226.68 +226.90333333333334,227.01,226.52,226.94 +226.81666666666666,226.75,226.29,226.61 +226.73,227.36,226.54,227.01 +227.1,227.35,225.87,226.71 +226.72,227.73,226.22,227.59 +227.58,228.0,227.17,227.62 +227.87,230.47,227.62,230.3 +230.2,230.75,229.64,230.75 +230.105,230.74,229.34,230.04 +230.01,230.24,228.59,229.27 +229.27,229.98,228.82,229.71 +229.71,229.99,229.12,229.99 +229.99,230.74,229.28,229.94 +229.92,229.93,228.95,229.32 +229.36,230.08,229.01,229.37 +229.38,229.79,228.01,228.31 +228.23,229.12,228.04,229.06 +229.05,229.8,228.75,228.99 +229.11,229.29,228.49,228.79 +228.78,228.78,225.5,225.7 +225.6,227.6,225.58,226.6 +225.69,227.31,225.21,225.73 +225.78,225.78,223.3,223.73 +223.74,223.95,221.2,221.5 +221.23,224.96,220.46,223.36 +222.38,224.33,221.99,223.53 +223.53,224.52,222.8,223.68 +223.71,223.8,222.01,222.76 +222.77,223.0,222.06,222.08 +222.07,222.52,221.54,222.03 +222.14,223.13,221.5,222.85 +222.84,223.59,222.19,223.5 +223.34,225.09,223.26,225.09 +225.09,225.23,224.31,224.93 +224.7,224.7,223.25,223.45 +223.42,223.93,223.37,223.61 +223.62,224.04,223.55,223.56 +223.56,223.65,223.37,223.61 +223.66666666666666,223.7,223.48,223.69 +223.77333333333334,223.92,223.62,223.91 +223.88,223.91,223.41,223.41 +223.41,223.92,223.35,223.91 +223.9,223.92,223.61,223.9 +223.92,223.97,223.75,223.95 +223.67571428571426,223.97,223.91,223.96 +223.43142857142857,223.97,223.93,223.97 +223.18714285714285,223.97,223.85,223.85 +222.94285714285715,223.83,223.0,223.0 +222.69857142857143,223.01,222.2,222.73 +222.45428571428573,222.33,222.2,222.46 +222.21,222.32,222.18,222.19 +222.19,222.52,222.18,222.51 +222.52,223.07,222.51,222.96 +222.98,223.34,222.63,222.89 +222.87,223.37,222.75,223.1 +223.1,223.52,222.29,223.48 +223.36,223.54,222.96,223.49 +223.49,223.86,223.42,223.86 +223.86,224.03,223.82,224.03 +224.03,224.04,223.67,224.0 +223.91500000000002,223.99,223.41,223.68 +223.8,224.04,223.41,224.04 +224.03,224.04,223.88,224.04 +224.03,224.04,223.98,224.04 +224.04,224.04,224.0,224.04 +224.04,224.13,224.01,224.13 +224.12,224.28,224.11,224.165 +224.26,224.28,224.01,224.2 +224.25,224.25,224.0,224.24 +224.01,224.28,224.0,224.28 +224.28,224.83,224.28,224.83 +224.625,224.97,224.83,224.96 +224.97,224.97,224.94,225.02 +224.97,225.08,224.95,225.08 +225.14499999999998,225.32,225.08,225.215 +225.32,225.35,225.31,225.35 +225.35,225.88,225.31,225.72 +225.71,225.99,225.25,225.85 +225.85,226.07,225.71,225.98000000000002 +226.02,226.11,225.57,226.11 +226.1,226.72,226.1,226.36 +226.36,226.36,223.67,223.68 +224.92000000000002,224.09,223.44,223.48 +223.48,223.83,223.44,223.51 +223.56,224.72,223.51,224.25 +224.25,225.04,224.02,224.02 +224.02,224.02,223.45,223.59 +223.58,224.17,223.48,223.83 +224.075,224.58,223.77,224.57 +224.57,226.42,224.56,224.64 +225.39,225.86,224.65,224.71 +224.7,224.73,223.63,223.64 +223.63,224.19,223.47,224.19 +224.19,224.91,224.18,224.9 +224.91,225.91,224.91,225.69 +225.1,225.76,225.23,225.25 +225.29,225.75,225.12,225.46 +225.48,227.45,225.46,226.62 +226.7,226.81,225.96,226.1 +226.1,226.2,225.5,225.5 +225.5,226.2,224.34,224.99 +225.01,225.91,224.85,225.44 +225.44,225.94,225.25,225.76 +225.76,225.76,225.45,225.6 +225.59,226.17,225.11,225.11 +225.18,225.47,224.01,225.2 +225.18,225.77,224.66,224.77 +225.0,225.61,224.02,224.865 +225.055,225.89,224.32,224.96 +225.11,225.73,224.62,225.15 +225.48,227.43,225.21,226.24 +226.25,227.28,226.21,226.53 +226.52,226.52,225.04,225.97 +226.0,226.6,225.7,226.45 +226.4,226.49,225.44,226.0 +226.07,226.6,225.84,226.5 +226.49,226.75,226.22,226.44 +226.47,226.61,226.01,226.225 +226.14666666666668,226.11,225.96,226.01 +225.82333333333332,226.03,225.31,225.49 +225.5,226.27,225.49,225.55 +226.04,226.12,225.04,225.61 +225.51,225.77,224.92,225.56 +225.54,225.81,224.92,225.45 +225.58,226.1,224.92,225.37 +225.36,226.04,224.93,226.04 +225.73,226.07,224.01,225.24 +225.21,225.9,224.66,225.05 +224.8,226.07,224.7,225.66 +225.67,233.39,225.31,232.03 +232.57,235.81,231.81,232.94 +232.94,235.21,232.32,234.01 +234.0,234.85,233.05,235.0 +234.54,235.99,234.24,235.99 +235.98,235.99,232.78,234.58 +234.55,234.73,233.7,234.39 +234.39,236.0,234.39,235.99 +236.0,236.5,235.39,236.07 +235.9,236.09,233.71,235.21 +235.2,235.82,234.56,235.4 +234.88,236.0,234.8,235.59 +235.61,236.4,234.82,235.76999999999998 +236.4,236.92,235.83,235.95 +236.35,236.65,235.46,235.93 +236.64,236.65,235.64,235.91 +235.81,236.5,235.6,236.36 +236.35,236.53,235.24,235.66 +235.46,236.65,235.25,236.37 +236.2,237.99,236.11,237.98 +237.98,237.99,237.07,237.44 +237.49,238.6,237.35,237.76 +237.46,238.22,237.09,238.07 +238.03,238.32,237.23,237.53 +237.59,238.25,237.23,236.14 +238.01,238.42,234.14,234.75 +234.74,235.53,233.05,233.74 +233.1,235.18,233.1,234.13 +234.12,234.27,233.58,234.0 +233.99,234.0,233.05,233.44 +233.44,234.22,233.43,234.09 +234.1,234.7,233.05,234.24 +234.16,235.0,234.13,234.87 +234.92,235.01,233.0,233.19 +233.24,234.45,233.05,234.02 +234.06,234.38,232.79,233.92 +233.9,234.69,233.72,234.15 +234.1,235.31,233.92,234.79 +234.77,235.2,234.49,235.1 +235.18,235.69,235.17,235.41 +235.435,235.79,235.35,235.72 +235.69,235.94,233.58,235.78 +235.76,236.0,235.12,235.61 +235.845,235.98,235.14,235.98 +235.93,235.99,235.39,235.4 +235.41,235.94,233.39,235.42 +235.35,235.8,233.72,235.22 +235.2,235.78,233.01,235.04 +235.03,236.0,234.72,235.46 +235.5,235.66,235.1,235.34 +235.3,235.46,234.76,235.36 +235.35,235.5,235.01,235.5 +235.46,236.54,235.39,235.68 +235.59,236.93,235.47,236.08 +236.06,236.09,233.01,233.01 +233.0,233.29,232.11,233.29 +233.3,234.78,233.3,234.16 +234.17,234.34,233.32,233.73 +233.73,234.25,230.12,230.66 +230.68,231.99,230.12,231.8 +231.78,232.25,230.66,230.89 +230.83,232.13,230.31,232.13 +231.79,232.26,230.66,231.89 +231.12,232.26,231.0,231.65 +231.49,232.39,231.31,232.22 +232.16,232.58,231.32,232.41 +232.5,232.65,232.13,232.63 +232.56,232.75,232.13,232.2 +232.2,232.52,231.0,231.0 +230.91,231.86,230.53,231.05 +231.05,232.0,231.05,231.74 +231.74,232.65,231.68,232.65 +232.64,232.76,231.84,232.58 +232.57,232.8,231.98,232.5 +232.5,232.5,230.88,231.78 +231.77,232.5,231.48,232.22 +232.21,232.73,231.47,231.6 +231.78,232.73,231.6,232.53 +232.58,233.67,232.26,232.51 +232.36,232.9,231.24,231.24 +231.24,231.27,229.54,230.29 +230.27,231.13,230.05,230.69 +230.19,230.79,229.79,230.11 +230.11,231.14,230.08,230.39 +229.135,230.35,228.16,228.16 +228.16,229.61,228.16,228.97 +228.535,229.09,228.65,228.84 +228.91,229.33,228.65,229.23 +229.33,229.36,228.82,229.26 +228.715,229.6,228.11,228.11 +228.1,228.88,228.02,228.68 +228.76,229.35,228.64,229.26 +229.15,229.88,229.07,229.3 +229.43,229.78,228.38,229.69 +229.7,230.01,229.29,230.0 +229.78,230.03,229.04,229.74 +229.79,229.99,229.07,229.43 +229.33,229.6,228.45,228.63 +228.62,229.19,227.16,227.97 +227.94,228.12,226.83,227.17 +227.2,227.49,227.0,227.42 +227.43,227.91,226.0,226.4 +226.23,226.53,220.04,221.73 +221.35,221.6,220.0,221.05 +221.05,222.39,220.03,221.34 +221.71,222.02,220.41,220.42 +220.41,220.56,218.51,219.74 +219.75,220.0,218.75,220.085 +219.67,220.67,218.81,220.43 +219.99,221.19,219.89,220.01 +220.15,220.84,218.64,218.71 +220.245,220.35,218.65,219.96 +220.34,220.57,219.45,219.65 +220.07,220.3,219.24,218.025 +218.315,220.1,215.56,216.4 +216.56,219.26,216.52,217.58 +217.18,217.71,215.57,216.58 +216.55,220.0,216.17,219.09 +219.09,220.99,218.84,220.14 +220.17,220.59,218.81,219.64499999999998 +219.8,220.1,218.97,219.15 +219.05,223.05,219.0,220.82 +220.95,221.62,219.9,219.9 +219.83,221.3,219.63,220.97 +220.96,221.36,220.08,221.3 +221.3,221.3,219.38,220.17 +220.16,221.37,219.65,220.97 +220.95,221.86,220.53,221.06 +221.15,222.0,220.53,221.61 +221.61,221.71,220.11,220.7 +220.7,222.22,220.11,221.7 +221.36,222.8,220.95,222.16 +222.14,222.36,220.54,221.62 +221.6,221.77,220.13,220.13 +220.13,220.53,219.09,219.7 +219.68,221.27,219.1,220.34 +220.32,220.63,219.34,219.84 +219.83,222.08,218.78,220.45 +220.41,222.09,220.3,222.09 +222.09,224.72,221.89,224.61 +224.58,226.58,224.01,225.01 +225.04,225.24,222.73,223.36 +223.36,224.2,222.57,223.23 +223.38,223.67,219.89,221.38 +221.41,222.89,220.8,220.87 +220.87,221.98,220.54,221.34 +221.34,231.11,221.33,228.81 +228.82,230.15,222.1,228.36 +227.53,229.56,226.46,227.4 +227.3,228.84,227.01,227.11 +227.19,228.43,227.02,227.75 +227.75,228.99,227.39,228.98 +228.97,229.04,225.85,226.4 +226.3,226.91,225.0,225.77 +225.67,225.96,224.67,225.03 +225.78666666666666,225.93,224.16,224.29 +225.90333333333334,226.22,224.18,225.54 +226.02,227.55,225.71,226.79 +226.7,226.91,224.55,225.25 +225.48,225.48,223.86,225.09 +225.01,225.55,224.0,224.53 +224.49,225.0,220.46,223.97 +223.97,223.99,221.68,221.81 +222.64,224.25,221.8,223.41 +223.43,226.13,223.4,225.63 +225.65,226.56,224.05,225.92 +225.92,225.98,223.02,223.56 +223.5,225.1,222.59,224.99 +224.89,225.74,223.26,225.51 +225.51,225.63,224.31,224.72 +224.71,225.07,223.56,224.66 +224.54,225.56,224.22,225.56 +225.46,225.75,224.89,225.72 +225.38,226.59,224.92,225.88 +225.9,225.97,224.8,225.745 +225.26,226.15,224.57,225.61 +225.76,226.69,225.35,225.71 +225.7,226.21,220.69,222.08 +223.42,223.86,220.2,223.32 +223.29,223.47,222.22,223.16 +223.51,223.95,223.17,223.72 +223.73,223.93,222.68,223.91 +223.515,223.94,222.89,223.24 +223.3,224.93,222.75,224.54 +224.53,224.96,223.36,224.66 +224.62,224.75,222.4,224.72 +224.55,225.0,224.2,224.9 +224.88,225.46,224.38,225.18 +225.18,225.69,224.34,225.09 +225.09,227.3,224.5,225.73 +225.59,226.69,225.12,226.07 +226.18,226.65,225.43,225.97 +226.02,226.69,225.52,226.6 +226.55,227.05,226.26,226.57 +226.98,227.04,225.95,226.54 +226.53,226.75,225.31,225.74 +225.65,225.92,225.45,225.55 +225.5,225.99,225.5,225.91 +225.91,225.92,225.29,225.47 +225.47,225.83,225.1,225.4 +225.43,225.96,225.17,225.33 +225.49,227.05,225.43,227.4075 +226.49,226.83,225.69,229.485 +228.84333333333333,227.05,225.63,231.5625 +231.1966666666667,235.21,225.74,233.64 +233.55,235.76,232.31,233.605 +233.4,236.0,233.17,233.57 +233.59,233.99,232.59,232.66 +232.6,232.72,232.49,232.7 +232.7,232.72,232.03,232.82 +232.755,233.2,230.95,232.94 +232.81,235.8,232.58,234.29 +234.21,234.76,233.22,233.97 +233.98,234.9,233.66,234.11 +234.19,234.45,233.48,234.4 +234.09,236.78,234.0,236.45 +236.48,238.0,235.23,237.26 +237.97,240.0,235.82,236.1 +236.34,238.57,236.04,236.14 +236.62,238.29,236.01,237.68 +237.67,237.9,236.05,236.12 +236.08,238.28,235.66,236.99 +236.99,238.47,236.99,237.8 +237.72,238.02,237.23,237.3 +237.31,238.78,237.11,237.32 +237.67,237.67,236.46,236.48 +236.43,236.54,234.96,236.42 +236.41,238.19,235.88,238.08 +238.09,238.45,236.8,236.8 +236.8,236.8,235.62,235.64 +235.63,235.75,234.68,234.89 +234.88,235.76,234.61,234.72 +234.76999999999998,235.58,234.55,234.55 +234.66,235.97,234.53,235.49 +235.49,236.41,235.35,235.98 +236.07,236.2,234.64,234.78 +234.78,236.2,234.65,236.0 +235.245,237.36,235.42,235.7 +235.71,236.75,234.44,235.83499999999998 +234.52,236.44,234.51,235.97 +235.93,236.42,235.06,235.06 +235.06,236.63,234.99,235.7 +235.7,235.89,234.54,235.54 +235.36,236.79,234.5,234.51 +234.5,234.5,233.0,233.23 +233.23,233.68,233.01,233.48 +233.48,234.65,233.35,234.64 +234.54,234.72,233.71,233.93 +233.93,234.61,233.77,234.88 +234.61,237.15,234.55,235.83 +235.07,235.82,235.4,235.46 +235.53,235.62,234.88,235.27 +234.85,234.85,233.51,235.07999999999998 +233.62,234.47,233.62,234.89 +234.1,234.72,234.1,234.7 +234.63,235.3,234.57,234.915 +235.17,235.81,235.13,235.13 +235.47,236.0,234.54,235.79 +235.77,235.87,235.07,235.39 +235.37,235.54,235.11,235.15 +235.15,236.52,235.03,236.5 +236.51,237.0,235.81,236.34 +236.32,236.71,236.17,236.17 +236.17,236.17,235.74,235.8 +235.8,236.5,235.59,236.5 +236.52,236.68,235.94,235.96 +235.97,236.99,235.96,236.46 +236.46,236.59,236.3,236.31 +236.31,236.34,235.93,235.96 +235.96,235.96,234.42,234.62 +234.67,235.26,234.26,234.83 +234.91,236.99,234.91,236.99 +236.98,236.98,235.78,237.05666666666667 +236.96,237.51,236.53,237.12333333333333 +236.65,237.2,236.61,237.19 +237.19,238.95,237.11,238.84 +238.95,241.98,238.82,240.46 +240.34,241.39,239.96,240.48333333333335 +240.17000000000002,240.93,240.0,240.50666666666666 +240.0,240.56,239.79,240.53 +240.5,242.16,240.48,242.04 +242.04,242.42,241.82,241.87 +241.85,242.16,241.17,242.285 +242.01,242.97,241.99,242.7 +242.69,242.7,240.6,241.72 +241.69,241.71,240.56,241.66 +240.57,241.6,240.57,241.6 +241.6,241.87,240.6,241.45 +241.45,241.99,241.36,241.96 +241.9,241.97,241.36,241.41 +241.38,241.52,239.62,240.02 +239.9,240.88,239.72,240.88 +240.87,241.31,240.16,241.31 +241.21,241.3,239.1,239.25 +239.26,240.99,239.23,240.41 +240.36,240.44,239.79,240.04 +239.89,240.8,239.53,240.8 +240.8,242.0,240.68,241.66 +241.56,241.68,240.51,241.34 +241.36,242.0,241.07,241.91 +241.98,241.99,241.07,241.57 +241.37,241.37,240.61,241.02 +241.33333333333334,241.25,240.56,241.24666666666667 +241.29666666666665,241.26,240.84,241.47333333333333 +241.26,242.0,241.26,241.7 +241.78,243.05,241.69,242.73 +242.73,242.88,241.63,242.62 +241.345,243.99,239.76,239.9 +239.96,242.11,238.06,238.64 +238.67,242.24,238.67,240.61 +240.61,240.95,239.48,239.56 +239.46,239.87,239.0,239.7 +239.255,240.41,239.02,239.06 +239.05,239.79,238.99,239.07 +239.06,240.1,239.0,239.94 +239.94,240.02,238.8,238.85 +238.85,240.04,238.84,239.97 +239.76,240.0,239.32,239.32 +239.33,239.99,239.05,239.4 +239.37,239.99,239.3,239.72 +239.72,239.99,235.7,236.41 +236.41,236.83,235.51,235.57 +235.57,235.72,233.53,234.77 +234.95,235.57,234.5,234.66666666666669 +235.53,236.2,234.73,234.56333333333333 +234.93,235.34,233.38,234.46 +234.32999999999998,234.53,232.0,233.57 +233.73,234.75,232.91,233.94 +234.47,234.89,232.9,234.31 +234.39,235.71,232.95,235.55 +235.57,235.73,233.93,234.0 +234.55,235.41,234.01,234.805 +235.35,235.9,235.28,235.61 +235.64,235.78,235.28,235.64 +235.37,236.25,234.83,236.04 +236.07,236.07,235.38,235.52 +235.51,236.11,235.38,235.67 +235.57,236.24,235.39,235.39 +235.51,236.83,234.71,236.66 +236.85,236.93,236.18,236.53 +236.63,236.92,235.89,236.70499999999998 +236.74,237.87,236.54,236.88 +236.89,236.92,236.01,236.31 +236.31,236.36,235.46,235.73 +235.76,236.08,235.43,235.04500000000002 +235.06,236.77,234.34,234.36 +234.36,235.12,233.44,234.55 +234.52,235.53,234.31,235.22 +235.22,235.79,234.64,235.53 +235.32999999999998,235.78,234.95,235.27 +235.44,235.94,235.24,235.01 +235.095,236.0,234.6,234.75 +234.75,235.02,234.44,235.0 +235.0,235.52,234.48,234.89 +234.96,235.52,234.44,235.37 +235.28,235.69,234.42,235.6 +235.55,235.78,235.05,235.71 +235.59,235.77,235.28,235.49 +235.49,235.9,235.41,235.565 +235.87,235.95,235.36,235.64 +235.62,236.17,235.31,235.005 +235.71,235.71,234.1,234.37 +234.34,234.64,228.38,231.09 +231.1,231.77,229.12,230.94 +230.94,231.21,228.38,230.19 +230.17,231.8,230.1,230.385 +231.64,231.64,230.2,230.58 +230.58,231.01,230.0,230.11 +230.12,230.61,230.11,230.61 +230.53,230.72,230.29,230.36 +230.35,230.53,230.01,230.01 +229.61,230.14,228.73,229.83999999999997 +228.87,229.82,228.67,229.67 +229.62,229.62,228.89,229.54 +229.51,229.49,229.1,229.41 +229.4,231.13,229.15,230.99 +230.485,231.58,230.97,231.57 +231.57,231.97,231.32,231.755 +231.5,231.96,231.44,231.94 +231.97,232.99,231.73,232.43 +232.37,232.37,231.2,231.8 +232.51999999999998,233.0,231.79,232.67 +232.67,234.95,232.67,234.33 +234.34,239.0,234.33,235.91500000000002 +238.96,239.18,236.14,237.5 +237.49,239.0,236.97,237.92 +237.92,238.48,237.0,237.9 +238.07,238.63,237.32,238.15 +238.15,238.34,236.8,237.62 +237.59,237.7,237.43,237.59 +237.815,238.6,237.1,238.06 +238.04,238.06,236.68,237.49 +237.16,237.76,236.8,237.6 +237.58,237.58,237.3,237.31 +237.31,237.5,236.35,237.12 +237.4525,237.99,237.11,237.2 +237.595,238.43,237.2,237.71 +237.7375,238.42,237.56,237.81 +237.88,238.2,237.87,237.91 +238.035,238.25,237.75,238.12 +238.19,238.27,237.78,238.22 +238.115,238.27,237.86,238.1 +238.04,238.1,236.99,238.11 +237.44,238.25,237.44,238.12 +238.13,244.95,237.82,243.82 +244.07,247.06,242.92,245.76 +245.8,246.49,244.0,246.41 +246.38,246.39,244.35,245.87 +245.87,246.15,245.15,245.68 +245.73,246.55,245.17,245.57 +245.55,245.55,245.09,245.36 +245.37,245.53,244.92,244.94 +244.91,244.93,244.38,244.45 +245.435,246.44,244.38,245.95 +245.96,246.57,244.74,244.76 +244.77,245.18,244.75,245.04 +245.39,246.01,244.79,246.01 +246.01,246.87,245.82,246.1 +245.95,246.35,245.82,246.31 +246.28,246.42,246.13,246.905 +246.39,247.6,246.39,247.5 +247.5,247.5,241.0,241.25 +241.25,242.14,241.25,242.11 +242.12,242.12,240.0,240.79 +241.175,240.87,240.19,240.24 +240.23,241.48,240.23,241.27 +241.28,241.72,241.05,241.72 +241.72,242.5,241.71,242.02 +242.01,242.61,242.01,242.2 +242.21,242.88,241.91,242.59 +242.56,242.73,241.81,241.91 +241.9,242.49,241.87,242.31 +242.3,242.46,242.15,242.18 +242.16,242.45,242.01,242.25 +242.25,243.69,242.25,243.19 +243.18,244.78,243.18,244.61 +244.61,244.61,242.39,242.42 +242.46,242.54,242.2,242.2 +242.21,243.09,241.95,242.45 +242.45,243.44,242.04,242.81 +242.56,243.06,242.4,242.69 +242.69,242.73,242.39,242.63 +242.62,242.62,240.15,240.7 +240.7,240.83,240.21,240.31 +241.415,242.28,239.63,242.09 +242.13,244.89,242.13,242.64499999999998 +244.26,244.26,243.1,243.2 +243.2,243.62,243.13,243.50666666666666 +243.61,244.11,243.42,243.81333333333333 +243.99,244.48,243.98,244.12 +244.12,244.35,243.15,244.35 +243.865,244.31,243.61,243.62 +243.61,243.61,240.51,241.18 +241.19,241.28,241.01,241.27 +241.27,241.49,241.04,241.13 +241.1,241.3,241.04,241.28 +241.29,242.01,241.11,241.26 +241.26,241.34,241.02,241.02 +241.06,241.84,240.94,241.84 +241.83,242.97,241.48,241.48 +241.47,241.96,241.1,241.91 +241.91,242.78,241.59,242.27 +242.27,242.33,241.72,241.74 +241.78,242.56,241.54,242.1 +242.08,242.08,240.84,241.47666666666666 +240.87,241.48,240.6,240.85333333333332 +241.02,241.02,239.5,240.23 +240.2,240.5,239.99,240.40333333333334 +240.5,241.06,240.36,240.57666666666665 +240.92,241.0,240.07,240.75 +240.74,240.94,240.17,240.94 +241.02,241.34,240.76,241.29 +241.3,241.34,240.35,241.66 +241.65,242.03,241.17,242.03 +242.0,242.49,241.55,242.02 +242.18,242.67,241.81,242.66333333333333 +242.36,243.35,242.36,243.30666666666667 +243.3,244.29,243.29,243.95 +243.91,245.0,243.25,244.72 +244.73,245.49,243.61,243.63 +243.62,244.87,243.45,243.93 +244.0,244.51,243.9,244.0 +244.0,244.0,243.45,243.51 +243.54,243.9,242.37,242.41 +242.45,243.13,242.18,242.77 +242.77,243.4,242.77,243.23 +243.23,243.24,242.79,243.08 +243.07,243.08,241.0,242.145 +241.06,241.21,240.91,241.21 +241.18,241.58,240.91,240.94 +241.01,241.52,240.37,241.49 +241.49,241.7,241.0,241.54 +241.65,242.0,241.64,242.0 +241.99,242.68,241.99,242.25 +242.24,242.68,242.21,242.48 +242.48,242.65,240.57,241.5 +241.55,241.74,240.46,241.3 +241.35,242.0,240.7,241.9 +241.82,242.98,241.74,242.5 +242.44,243.0,242.23,242.76 +242.84,242.93,241.68,242.16 +242.13,242.99,242.05,242.06 +242.29,242.87,242.06,242.53 +242.58,242.99,242.05,242.87 +242.85,242.87,242.24,242.61 +242.69,242.91,242.38,242.46 +242.62,242.69,241.91,242.54 +242.53,242.89,241.87,242.76 +242.81,242.98,241.51,242.38 +242.27,242.89,242.18,242.35 +242.52,242.72,242.28,242.5 +242.635,242.98,242.26,242.98 +242.75,242.97,242.4,242.7 +242.64,242.97,242.6,242.78 +242.39,242.82,242.01,242.24 +242.14,243.55,242.08,243.45 +242.865,243.7,242.77,243.45 +243.59,243.99,243.04,243.45 +243.47,243.98,242.94,243.24 +243.35,243.69,242.4,243.47 +242.9,243.33,242.78,243.70000000000002 +243.42000000000002,243.99,243.15,243.93 +243.94,244.02,243.3,243.9 +243.9,244.05,243.5,243.5 +243.58,243.98,243.5,243.91 +243.60500000000002,244.04,243.5,243.66 +243.63,244.01,243.32,243.77 +243.85,244.08,243.38,243.64 +243.63,244.0,243.46,244.0 +243.99,244.13,243.5,243.8 +243.8,244.02,235.54,236.82 +236.76,238.47,235.69,237.55 +237.54,237.75,236.32,237.34 +237.3,237.61,236.52,237.59 +237.41,238.0,236.63,237.75 +237.53,237.92,236.81,236.81 +236.81,237.19,235.92,236.83 +237.185,237.97,236.52,237.56 +237.56,238.0,236.45,237.29 +237.28,237.83,236.9,237.04 +237.04,237.74,236.83,236.87 +237.165,237.56,236.54,237.11 +237.29,237.69,236.13,236.3 +236.3,237.37,236.3,237.18 +237.18,238.1,236.93,237.75 +237.395,237.8,237.18,237.61 +237.61,237.89,237.57,237.87 +237.87,238.75,237.87,238.67 +238.58,238.85,238.0,238.06 +238.38,240.0,236.18,236.86 +237.0,238.5,236.51,237.66 +237.66,238.68,236.51,237.38 +237.42,237.61,236.81,237.08 +237.14,237.39,236.61,236.75 +236.75,237.5,232.61,236.65 +236.67,237.19,236.18,237.11 +237.06,237.49,236.54,237.42 +237.47,237.72,237.44,237.72 +237.68,238.0,237.68,237.85 +237.84,238.0,237.68,237.99 +237.97,238.0,237.79,237.99 +237.91,238.0,237.75,237.97 +237.8575,237.96,237.35,237.57 +237.805,237.97,237.35,237.45 +237.7525,238.14,237.32,237.67 +237.7,238.41,237.49,237.96 +237.95,238.35,237.55,238.135 +238.01,238.42,237.54,238.31 +238.2,238.45,237.54,237.98 +237.905,238.5,237.25,237.98 +237.61,238.0,237.46,237.98 +237.98,239.0,237.89,238.45 +238.45,238.75,238.1,238.27 +238.6,238.69,237.75,238.18 +238.21,238.5,237.34,237.61 +237.47,238.74,237.46,237.525 +238.01,238.11,237.44,237.44 +237.5,237.75,236.89,237.5 +237.5,237.99,237.23,237.98 +237.91,237.99,237.35,237.76 +237.74,237.99,236.96,237.86 +237.73000000000002,237.98,237.21,237.82 +237.72,237.8,237.52,237.8 +237.71,237.81,237.3,237.31 +237.31,237.57,237.29,237.57 +237.57,237.68,237.3,237.43 +237.42,237.74,237.27,237.72 +237.7,237.97,237.31,237.57 +237.44,237.45,237.37,237.42 +237.385,237.42,237.27,237.375 +237.33,237.37,237.3,237.33 +237.35500000000002,237.38,237.31,237.38 +237.38,237.49,237.3,237.3 +237.32,237.49,237.26,237.31 +237.31,237.48,237.29,237.45 +237.65,237.99,237.46,237.99 +237.99,237.99,237.56,237.62833333333333 +237.8,237.88,237.8,237.26666666666668 +237.54500000000002,237.98,237.8,236.905 +237.29000000000002,237.9,236.85,236.54333333333332 +237.035,236.92,236.2,236.18166666666667 +236.78,236.78,235.48,235.82 +235.84,236.71,235.82,236.26 +236.13,236.71,236.7,236.7 +236.42000000000002,236.73,236.7,236.71 +236.71,236.72,236.7,236.8725 +236.8725,236.72,236.71,237.03500000000003 +237.03500000000003,236.72,236.71,237.19750000000002 +237.19750000000002,237.49,236.71,237.36 +237.36,237.49,237.0,237.37 +237.37,237.49,237.01,237.48 +237.45,237.49,237.17,237.25 +237.23,238.39,237.23,238.18 +237.295,238.07,237.58,237.94666666666666 +237.36,237.81,237.35,237.71333333333334 +237.425,237.81,237.34,237.48 +237.49,237.53,237.12,237.14 +237.14,238.45,237.08,237.51 +237.52,237.91,237.35,237.37 +237.37,237.51,237.13,237.35 +237.47,237.97,237.07,237.97 +237.97,237.98,237.55,237.75 +237.75,237.9,237.37,237.39 +237.37,237.49,237.13,237.48 +237.48,237.8,237.35,237.67 +237.68,237.8,237.1,237.49 +237.49,237.57,236.92,237.31 +237.33,237.86,237.21,237.31 +237.31,237.31,237.09,237.26 +237.24,237.26,236.62,236.69 +237.07999999999998,237.14,236.65,236.93 +236.92,237.44,236.67,236.88 +237.2,237.33,236.63,236.83 +236.83,237.04,236.67,236.93 +236.92,237.18,236.84,237.03 +236.84666666666666,237.05,236.6,236.77 +236.7733333333333,236.84,236.5,236.7 +236.7,236.98,236.51,236.76 +236.76,237.07,236.71,236.86 +236.915,237.22,236.48,237.07 +237.07,237.89,236.92,237.6 +237.59,237.79,237.23,237.415 +237.44,237.75,237.1,237.23 +237.2,237.29,236.75,237.01 +237.01,237.29,236.6,237.23 +237.22,237.39,236.85,237.3 +237.3,237.47,236.7,237.08 +237.08,237.39,236.92,237.05 +237.13,237.27,234.95,235.69 +235.69,235.84,231.66,233.25 +233.25,234.0,232.71,233.04 +233.06,234.41,233.02,233.82 +233.85,234.19,232.34,234.14 +234.09,234.35,233.78,234.1 +234.09,234.3,234.08,234.17 +234.185,234.29,234.1,234.29 +234.28,234.45,233.7,234.28 +234.33,234.48,234.15,234.28 +234.25,234.42,234.17,234.36 +234.36,234.5,233.06,233.73 +233.75,234.85,233.75,234.8 +234.8,234.92,234.01,233.98000000000002 +234.005,234.01,233.16,233.16 +233.21,233.21,231.53,232.0 +231.87,232.77,231.71,232.44 +232.34,233.0,232.16,232.88 +232.81,233.25,232.07,233.14 +233.13,233.5,232.61,233.4 +233.41,233.5,232.0,233.515 +233.19,233.74,233.1,233.63 +233.7,233.75,232.36,233.41 +232.93,233.49,232.5,233.19 +233.21,233.38,232.82,233.22 +233.2,233.5,232.01,232.6 +232.61,232.96,232.37,232.81 +232.75,232.99,232.33,232.52 +232.34,232.8,232.31,232.61 +232.61,232.99,232.59,232.92 +232.92,233.46,232.88,233.31 +233.31,233.57,233.3,233.57 +233.57,233.68,233.39,233.39 +233.38,233.49,232.62,233.07 +233.06,233.11,232.9,233.07 +233.11,233.33,233.03,233.20499999999998 +233.22000000000003,233.51,233.0,233.34 +233.33,233.99,233.13,233.99 +233.99,233.99,233.93,233.99 +233.97,234.39,233.89,234.38 +234.36,234.51,233.88,234.2 +234.21,234.5,234.06,234.42 +234.42,234.79,234.03,234.25 +234.25,234.5,233.3,234.5 +234.21,234.75,233.3,234.75 +234.75,234.99,234.3,234.74 +234.75,235.0,234.32,234.9 +234.9,234.99,234.0,234.42 +234.445,234.49,233.64,233.97 +233.99,234.0,233.1,233.61 +233.58,234.31,233.33,234.3 +234.24,234.37,233.7,233.86 +233.86,234.73,233.85,234.73 +234.73,234.77,234.23,234.55 +234.55,234.66,234.16,234.595 +234.55,234.74,234.25,234.64 +234.74,234.76,234.6,234.685 +234.68,234.76,234.47,234.73 +234.73,235.0,234.63,234.71 +234.7,235.83,234.6,234.88 +235.35,236.0,234.83,236.0 +236.0,236.0,235.9,235.93 +235.97,235.98,235.35,235.91 +235.45,235.99,235.39,235.89 +235.89,236.0,235.32,236.0 +235.86,236.0,235.3,235.91 +235.91,236.0,235.38,235.79 +235.84,236.0,235.29,235.92 +235.89,236.39,235.68,235.99 +235.97,236.48,235.75,236.43 +236.43,236.66,236.36,236.66 +236.62,236.74,236.04,236.43 +236.43,236.5,235.53,235.54 +235.59,236.47,235.51,236.06 +236.05,236.05,235.67,236.0 +236.0,236.08,235.5,236.02 +235.93,236.04,235.29,235.87 +235.88,236.25,235.55,236.24 +236.24,236.5,236.03,236.4 +236.44,236.47,236.15,236.35 +236.31,236.75,236.15,236.74 +236.7,237.0,236.04,236.98 +236.96,237.24,236.9,237.18 +237.16,237.23,236.67,236.77 +236.77,236.8,236.4,236.61 +237.075,237.49,236.76,236.45 +237.38,237.49,236.21,236.29 +236.2,236.2,235.64,235.78 +235.77,235.79,235.11,235.75 +235.765,235.81,235.73,235.76 +235.76,236.0,235.67,236.265 +235.96,237.0,235.91,236.77 +236.77,236.99,236.64,236.95 +236.97,237.5,236.82,237.2 +237.24,242.0,237.03,240.9 +240.9,241.72,240.01,240.23 +240.24,241.18,240.01,240.73 +240.47,241.71,240.46,240.67000000000002 +240.5,241.71,239.42,240.61 +240.53,241.35,239.51,240.59 +240.59,240.7,239.78,240.38 +240.3,240.45,239.42,239.5 +239.69,239.73,237.89,238.61 +238.63,239.9,238.63,239.83 +239.8,240.24,239.42,240.08 +240.05,240.24,239.79,240.03 +240.02,240.1,239.06,239.66 +239.7,240.0,239.37,239.91 +239.84,240.03,239.69,240.05333333333334 +240.01,240.22,239.89,240.19666666666666 +240.18,240.4,239.39,240.34 +240.18,240.39,240.01,240.38 +240.18,240.57,240.16,240.42 +240.145,240.64,240.01,240.365 +240.11,240.44,240.01,240.31 +240.31,240.36,239.13,240.11 +239.93,240.22,239.76,240.09 +240.01,240.21,239.67,239.74 +239.73,240.03,239.01,239.26 +239.22,239.57,239.0,239.44 +239.43,239.65,239.01,239.18 +239.07,239.59,238.49,238.92 +238.71,239.42,238.71,239.23 +239.33,239.39,238.97,239.0 +239.0,239.97,238.95,239.93 +239.495,240.0,239.63,239.99 +239.99,240.0,239.38,239.38 +239.6,239.99,239.01,239.01 +239.37,239.69,239.01,239.66 +239.4,239.7,239.01,239.68 +239.51,239.79,238.27,239.7 +239.51,239.72,238.95,239.72 +239.51,239.79,239.04,239.44 +239.51,239.51,238.41,238.92 +239.528,239.67,238.89,239.08999999999997 +239.546,239.67,238.78,239.26 +239.564,239.66,238.77,239.43 +239.582,239.66,239.4,239.6 +239.6,239.61,239.04,239.17 +239.17,239.5,239.0,239.49 +239.42,240.1,239.39,240.1 +240.09,242.0,240.09,241.95 +241.95,242.0,241.29,241.99 +241.98,242.0,241.83,241.935 +241.97,242.0,241.81,241.88 +241.97,241.98,240.91,241.22 +241.22,241.36,240.47,241.14 +241.2,241.41,240.83,241.19 +241.13,241.19,240.02,240.66 +240.77,240.88,240.0,240.67 +240.33,240.79,240.11,240.875 +240.73,241.17,240.66,241.08 +241.04,241.1,239.78,240.53 +241.00666666666666,241.01,240.19,240.82 +240.97333333333333,240.99,240.64,240.89999999999998 +240.94,241.18,240.29,240.98 +240.91,241.4,240.57,240.64 +240.64,240.64,239.2,239.485 +239.34,239.75,238.33,238.33 +238.33,238.33,237.0,237.43 +237.47,238.01,237.47,237.56666666666666 +237.81,238.0,237.39,237.70333333333335 +237.82999999999998,238.0,237.69,237.84 +237.85,238.0,237.77,237.92 +237.96,238.42,237.92,238.11 +237.485,238.36,237.0,237.01 +237.01,237.5,236.85,237.47 +237.46,237.93,236.94,237.67 +237.67,237.68,237.04,237.07 +237.07,237.63,236.71,237.36 +237.36,237.62,237.02,237.25 +237.25,237.55,237.17,237.48 +237.32999999999998,237.49,237.19,237.42 +237.41,237.87,237.35,237.73 +237.72,237.98,237.38,237.84 +237.84,237.97,237.41,237.86 +237.88,237.96,236.95,237.55 +237.54,237.77,236.72,237.24 +237.15,237.48,236.57,237.095 +237.19,237.36,236.77,236.95 +236.95,237.06,235.81,236.92 +236.92,237.21,236.88,237.02499999999998 +237.19,237.22,236.93,237.13 +237.22666666666666,238.0,236.98,237.215 +237.26333333333335,238.01,237.3,237.3 +237.3,238.33,237.3,238.23 +238.22,238.34,237.28,237.94 +237.88,238.22,237.32,237.6 +237.62,237.97,237.19,237.78 +237.74,238.0,237.09,237.32 +237.32,237.9,237.3,237.9 +237.86,238.05,237.63,237.88 +237.88,238.09,237.78,238.09 +238.03,238.14,237.37,237.37 +237.72,238.14,237.29,237.95 +237.9,237.96,236.05,236.81 +236.89,237.7,236.02,236.81 +236.79,237.46,236.61,237.4 +237.195,237.64,237.25,237.61 +237.6,237.7,237.05,237.56 +237.56,237.69,236.84,237.37 +237.38,238.33,237.37,238.31 +238.27,238.75,238.25,238.3 +238.62,238.68,238.12,238.29000000000002 +238.4,238.44,238.31,238.28 +238.42,238.53,238.01,238.27 +238.34,238.47,238.29,238.095 +238.125,238.53,237.88,237.92 +237.91,237.97,237.72,237.88 +237.92666666666668,237.92,237.01,237.86 +237.94333333333333,238.0,237.7,237.65 +237.96,238.0,237.09,237.44 +237.34,237.55,236.47,236.52 +236.75,237.36,236.48,237.15 +237.15,237.99,237.08,237.54 +237.54,237.6,236.75,237.41 +237.4,237.6,236.79,236.9 +236.91,237.45,236.9,237.05 +237.01,237.47,236.66,237.31 +237.37,237.73,236.8,237.73 +237.73,237.91,237.02,237.7 +237.68,237.71,236.84,236.94 +236.94,237.7,236.94,237.49 +237.49,237.99,237.38,237.99 +237.98,237.99,237.65,237.94 +237.93,237.99,237.82,237.93 +238.01,238.45,237.81,238.08 +238.09,238.48,238.09,238.13 +238.18,238.2,237.41,237.42 +237.4,237.4,236.6,236.69 +237.04000000000002,236.7,236.67,236.69 +236.68,238.37,236.66,237.14 +237.13,237.7,237.57,237.59 +237.58,237.59,236.87,237.04 +237.04,237.22,237.01,237.12 +237.11,237.76,236.93,237.59 +237.59,238.0,236.51,236.73 +237.01,237.0,236.23,236.46 +236.43,237.03,236.26,236.84 +236.93,237.77,236.71,237.18 +237.23,237.77,236.8,237.14 +237.13,237.24,236.58,237.08 +237.08,237.45,236.91,237.25 +237.2,237.5,236.67,237.2 +237.08,237.44,236.57,237.31 +237.3,237.67,237.19,237.64 +237.64,237.67,237.62,237.63 +237.63,237.63,236.82,237.52 +237.5,237.67,237.09,237.67 +237.62,237.67,237.01,237.6 +237.6,237.68,236.85,237.25 +237.24,237.41,236.5,236.5 +236.51,236.51,235.01,236.14 +236.14,236.15,235.66,235.7 +235.68,236.17,235.68,235.97 +235.98,236.65,235.85,236.54 +236.47,236.7,236.07,236.35 +236.32,236.74,235.23,236.42 +236.42,236.97,236.26,236.8 +236.78,236.99,236.36,236.5 +236.49,236.99,236.26,236.27 +236.73,237.0,236.34,237.0 +236.93,237.0,236.39,236.84 +236.95,237.22,236.42,237.13 +237.09,237.17,236.63,236.88 +236.89,237.01,236.6,236.9 +236.9,237.09,236.61,236.94 +236.93,236.94,236.51,236.93 +236.84,236.99,236.78,236.78 +236.77,236.99,236.7,236.98 +236.60500000000002,236.99,236.42,236.42 +236.44,236.74,236.42,236.59 +236.54,236.54,235.81,236.08 +236.21499999999997,236.1,235.77,235.89 +235.89,236.1,235.79,236.07 +236.07,236.14,236.0,235.77499999999998 +236.1,236.16,235.01,235.48 +235.04,235.7,235.0,234.365 +234.49,235.49,232.61,233.25 +233.94,233.79,232.61,232.64 +233.39,233.26,232.31,232.81 +232.84,233.03,232.08,232.56 +232.58,233.68,232.49,233.37 +233.32,233.46,232.23,233.1 +233.06,233.7,232.26,232.35 +232.66500000000002,232.93,232.06,232.26 +232.27,232.88,232.0,232.61 +232.69,232.98,232.11,232.7 +232.67,233.21,232.1,233.06 +233.04,233.17,232.13,233.17 +233.18,233.19,231.0,232.44 +232.55,233.8,232.22,232.9 +232.9,233.81,232.85,233.43 +233.43,233.65,233.07,233.09 +233.1,233.34,233.01,233.32 +233.32,233.94,233.24,233.73 +233.8,233.8,233.43,233.59 +233.695,233.69,233.54,233.53333333333333 +233.59,233.7,233.03,233.47666666666666 +233.46,233.59,233.34,233.42 +233.47,233.57,233.16,233.49 +233.49,233.5,233.23,233.44 +233.125,233.58,232.75,232.76 +232.76,232.85,232.1,232.33 +232.34,232.45,231.2,232.0 +231.92,232.0,231.16,231.45 +231.5,232.93,231.5,231.81 +231.83,231.98,231.4,231.73 +231.72,232.53,231.63,231.92 +231.89,233.11,231.89,232.91 +232.92,233.13,232.28,232.97 +232.91,233.62,232.86,233.01 +232.95,233.12,232.29,232.57 +232.44,233.79,231.17,232.46 +232.45,232.47,230.13,230.87 +230.8,231.2,229.55,229.72 +229.71,230.74,229.58,230.42 +230.42,230.48,229.16,230.07 +230.06,230.93,229.68,230.91 +230.9,230.99,230.6,230.72 +230.78,230.85,230.11,230.85 +230.76,230.99,230.12,230.81 +230.81,230.99,230.78,230.78 +230.78,230.84,230.17,230.63 +230.63,230.99,230.46,230.99 +230.99,230.99,230.95,229.945 +230.95,230.98,228.64,228.9 +228.92,228.93,225.5,226.64 +226.65,228.86,226.39,228.11 +228.11,228.13,227.13,227.8 +227.78,228.99,227.38,228.62 +228.65,228.82,227.76,228.41 +228.37,228.66,223.02,223.82 +223.75,227.55,223.46,224.1 +224.1,224.94,222.54,222.89 +222.91,223.34,222.01,222.85 +222.84,223.49,222.2,223.32 +223.41,223.58,222.23,223.27 +223.19,223.31,221.67,222.17 +222.13,224.29,221.58,224.29 +223.85,224.72,223.35,223.51 +223.56,224.27,222.9,223.29 +223.3,224.97,223.26,224.9 +224.89,225.2,223.26,223.26 +223.26,223.53,222.62,222.67 +222.82,222.97,222.17,222.67 +222.47,223.83,221.84,223.34 +223.49,224.23,223.03,223.43 +224.11,224.15,223.22,223.52 +223.41,224.15,223.0,223.19 +224.01,224.08,223.0,223.22 +223.875,223.85,223.23,223.83 +223.74,224.79,223.35,224.14 +223.9,224.73,223.83,224.56 +224.56,226.52,224.47,226.27 +226.3,226.68,225.04,226.06 +226.07,226.13,225.31,226.0 +226.05,226.15,225.23,225.4 +225.68,225.86,224.23,224.89 +225.05,225.99,224.88,224.88 +225.21,226.37,224.95,225.83 +225.94,226.34,225.48,225.48 +225.56,225.99,224.92,225.28 +225.17,225.99,225.04,225.5 +225.43,225.99,225.17,225.83 +225.94,226.25,225.85,226.25 +226.25,226.99,226.25,226.99 +226.99,227.45,226.29,226.565 +226.72,226.72,225.0,226.14 +226.08,226.66,225.92,226.48 +226.48,226.62,225.56,226.095 +226.37,226.57,224.94,225.71 +225.215,225.89,224.01,224.01 +224.06,224.29,223.82,224.25 +224.3,225.49,224.3,225.4 +225.4,225.49,224.59,225.38 +225.38,225.89,224.75,225.56 +225.54,226.48,225.22,225.86 +225.9,226.79,225.34,226.35 +226.35,226.8,225.7,226.5 +226.36,226.5,225.61,225.86 +225.93,226.32,225.09,225.8 +225.76,226.5,225.07,226.5 +226.46,227.0,226.37,226.73 +226.73,227.0,226.64,226.75 +226.75,227.0,225.7,226.26 +226.21,226.7,225.87,225.87 +225.88,226.4,225.65,225.785 +225.65,226.04,225.17,225.7 +225.67,226.05,225.1,225.7 +225.76,225.88,225.1,225.57999999999998 +225.61,226.07,225.31,225.46 +225.46,225.53,224.99,225.19 +225.23,225.23,223.56,224.77 +224.78,225.51,224.51,225.11 +225.12,225.99,225.05,225.71 +225.71,225.8,225.2,225.825 +225.2,226.0,225.18,225.94 +225.96,225.97,225.34,225.89 +225.66,225.98,225.39,225.84 +225.49,225.97,224.97,225.46 +225.32,225.88,224.81,225.22 +225.22,225.58,224.69,225.49 +225.49,225.75,225.25,225.33 +225.34,225.93,225.29,225.67 +225.29000000000002,225.92,224.75,225.24 +225.24,225.89,225.16,225.77 +225.76,225.89,224.78,225.25 +225.26,225.62,225.21,225.38 +225.38,225.44,224.0,224.48 +224.48,224.75,224.28,224.33 +224.33,225.74,224.27,224.99 +224.95,224.95,224.3,224.85500000000002 +224.51,224.81,224.46,224.72 +224.65,224.77,224.27,224.77 +224.77,224.78,224.16,224.28 +224.175,224.4,223.56,223.59 +223.58,223.99,223.57,223.89 +223.84,224.02,223.44,223.8 +223.79,224.01,223.68,224.14 +223.85,224.48,223.01,224.48 +224.49,225.6,223.75,224.28666666666666 +224.18,224.47,223.61,224.09333333333333 +224.04000000000002,224.15,223.89,223.9 +223.9,225.22,223.9,224.8 +224.76,225.0,224.57,224.68 +224.68,225.0,224.68,225.0 +225.0,226.1,224.99,225.59 +225.59,225.92,224.77,225.52 +225.52,225.85,224.75,224.9 +224.91,225.67,224.75,225.41 +225.17000000000002,225.54,225.21,225.43 +225.43,225.99,225.21,225.99 +225.99,226.74,225.37,226.43 +226.52,226.68,225.21,225.54 +225.53,225.61,225.06,225.24 +225.23,225.41,224.9,225.07 +225.05,225.59,224.9,225.42 +225.43,225.6,224.9,224.91 +224.91,224.93,224.75,224.76 +224.75,224.87,224.63,224.81 +224.81,225.12,224.43,224.79 +224.76,225.6,224.75,225.16 +225.15,225.21,224.76,225.075 +225.01,225.2,224.91,224.99 +225.14,225.41,225.11,225.07999999999998 +225.35,225.61,225.11,225.17 +225.235,225.21,225.13,225.1175 +225.12,225.12,224.85,225.065 +225.07666666666668,225.46,224.82,225.0125 +225.03333333333333,225.1,224.7,224.96 +224.99,225.21,224.64,224.8 +224.7,224.8,224.27,224.79000000000002 +224.41,224.84,224.41,224.78 +224.78,225.12,224.76,225.05 +225.04,225.24,224.6,224.92 +224.92,225.49,224.91,225.27 +225.24,225.28,225.0,225.05 +225.05,225.14,225.01,225.11 +225.03500000000003,225.24,225.01,225.02 +225.02,225.49,225.0,225.49 +225.49,226.01,225.26,225.93 +225.99,226.09,225.42,225.78 +225.64,225.7,225.42,225.63 +225.63,225.68,225.51,225.6 +225.58,225.59,225.45,225.48 +225.54,225.7,225.01,225.7 +225.59,225.79,225.58,225.77 +225.77,225.82,225.57,225.63 +225.66000000000003,225.67,225.43,225.53 +225.55,225.63,225.31,225.43 +225.44,225.41,225.3,225.33 +225.33,225.36,224.81,224.94 +225.16000000000003,225.1,224.92,224.965 +224.99,225.1,224.96,224.99 +224.99,225.05,222.99,223.59 +223.59,223.95,223.5,223.5 +223.5,223.52,223.3,223.44 +223.42,223.5,223.29,223.42 +223.39,223.44,223.01,223.36 +223.36,223.4,222.88,223.28 +223.28,223.96,223.15,223.61 +223.59,223.99,223.43,223.95 +223.9,223.99,223.42,223.93 +223.93,223.98,223.77,223.88 +223.8,224.26,223.79,224.13 +224.13,224.26,223.63,223.91 +223.97,224.94,223.95,224.71 +224.74,224.95,224.03,224.35 +224.505,224.81,223.92,224.31 +224.27,224.35,224.1,224.14 +224.22,224.23,224.04,224.17 +224.57,224.99,224.06,224.93 +224.92,224.99,224.92,224.98 +224.98,225.19,224.88,225.11 +225.14,225.28,224.88,225.28 +225.28,225.78,225.2,225.78 +225.825,226.37,225.79,226.34 +226.37,228.72,225.12,228.15 +228.14,228.4,227.09,228.12 +228.11,228.13,226.21,226.96 +227.745,227.74,226.54,227.39 +227.38,229.48,227.13,229.47 +229.47,229.98,228.22,229.13 +229.13,230.16,228.71,230.09 +230.05,230.1,229.04,229.13 +229.13,229.35,228.37,228.55 +228.54,229.51,228.45,229.24 +229.23,229.36,228.97,229.13 +229.0,229.04,228.57,228.99 +228.99,229.08,228.31,228.4 +228.37,228.63,228.31,228.58 +228.57,228.9,228.49,228.78 +228.74,229.09,228.36,228.64 +228.62,228.74,228.34,228.51 +228.5,228.55,228.38,228.43 +228.45,230.99,228.45,230.94 +230.95,231.61,230.95,230.45999999999998 +231.09,231.17,229.95,229.98 +230.60000000000002,230.21,229.98,230.13 +230.11,232.06,230.05,231.29 +231.3,231.54,230.84,230.86 +230.85,231.9,230.85,231.17 +231.16,231.16,230.55,230.62 +230.61,231.0,229.97,230.24 +230.24,231.05,230.23,230.9 +230.9,231.4,230.7,231.36 +231.36,231.6,229.79,229.81 +229.81,230.31,229.8,230.01 +230.01,230.09,229.79,229.86 +229.92,230.12,229.79,230.09 +230.08,230.15,229.33,229.63 +229.61,229.76,229.18,229.26 +229.23,229.71,229.01,229.63 +229.63,229.66,229.01,229.12 +229.24,229.34,229.01,229.11 +229.11,229.25,228.81,228.96 +228.95,229.17,228.81,229.16 +229.1,229.52,229.02,229.365 +229.5,229.69,229.44,229.57 +229.57,229.57,228.8,228.87 +228.84,229.54,228.84,229.13 +229.12,229.56,228.89,229.14 +229.14,229.17,228.95,229.56 +228.99,230.45,228.99,229.98 +229.98,229.99,229.48,229.82 +229.83,229.92,229.56,229.56 +229.57,229.71,229.26,229.53 +229.44,229.67,228.88,228.97 +229.01,229.09,228.2,228.25 +228.21,229.06,227.98,229.02 +229.06,229.3,228.29,228.78 +228.64,228.96,228.19,228.67 +228.66,229.07,228.47,229.05 +229.04,229.05,228.5,228.73 +228.72,228.83,228.27,228.47 +228.57,228.95,228.5,228.83 +228.83,228.84,228.7,228.83 +228.83,229.15,228.79,229.08 +229.09,229.19,228.98,229.13 +229.14,230.13,228.88,230.09 +230.03,230.14,229.71,229.95 +230.01,230.0,229.8,229.99 +229.99,230.0,229.81,229.85 +229.85,230.39,229.82,230.31 +230.27,230.3,230.03,230.16 +230.25,230.22,230.06,230.22 +230.23,230.92,230.01,230.45 +230.15,230.75,230.03,230.68 +230.68,230.69,229.85,229.86 +229.85,229.99,229.7,229.755 +229.89,229.9,229.52,229.65 +229.6,229.69,229.45,229.57 +229.56,229.77,229.39,229.77 +229.75,229.94,229.51,229.88 +229.82,229.87,229.51,229.62 +229.57,229.69,229.41,229.62 +229.62,229.74,229.58,229.7 +229.73,229.73,229.5,229.64 +229.65,229.68,229.5,229.64 +229.63,229.7,229.54,229.69 +229.7,229.81,229.58,229.81 +229.82,229.82,229.01,229.19 +229.18,229.36,229.02,229.29 +229.28,229.5,229.05,229.42 +229.4,229.51,229.1,229.45 +229.45,229.49,229.23,229.5233333333333 +229.36,229.43,229.19,229.59666666666666 +229.31,229.7,229.28,229.67 +229.30666666666667,229.7,229.55,229.65 +229.30333333333334,229.67,229.01,229.97 +229.3,230.29,229.16,230.29 +230.29,230.44,230.05,230.265 +230.2,230.26,229.11,230.24 +230.22,230.74,229.93,230.7 +230.69,230.73,230.29,230.61 +230.6,230.84,230.59,230.61 +230.6,230.87,230.0,230.58 +230.68,230.83,230.52,230.78 +230.76,231.17,230.72,231.12 +231.13,231.32,230.67,230.67 +230.915,231.19,230.27,230.7 +230.7,231.2,229.7,229.89 +229.88,230.4,229.63,230.3 +230.3,230.3,229.01,229.31 +229.29,229.33,228.79,228.96 +229.435,229.71,228.93,229.305 +229.58,229.76,229.16,229.65 +229.72,230.3,229.69,230.2 +230.21,230.33,230.01,230.03 +230.01,230.09,229.69,229.91 +229.91,230.01,229.8,229.88 +229.9075,229.88,229.66,229.89499999999998 +229.905,229.91,229.59,229.91 +229.9025,229.95,229.79,230.04 +229.9,229.98,229.83,230.17000000000002 +230.10000000000002,230.33,229.86,230.3 +230.3,230.83,230.27,230.57 +230.71,230.99,230.36,230.84 +230.84,230.99,230.83,230.94 +230.89,231.0,230.82,231.0 +231.095,231.3,230.99,231.24 +231.3,231.72,231.21,231.49 +231.41500000000002,231.69,231.32,231.58 +231.53,231.97,231.29,231.97 +231.97,233.31,231.95,232.89 +232.89,233.03,232.07,233.03 +233.03,233.33,232.89,232.89 +233.08,233.49,233.07,233.47 +233.04000000000002,233.62,233.0,233.06 +233.0,233.55,232.53,233.2 +233.19,233.37,233.05,233.26999999999998 +233.33,233.59,233.06,233.34 +233.37,233.54,233.24,233.54 +233.54,234.17,233.51,234.13 +233.82999999999998,234.2,234.02,234.11 +234.12,234.31,233.99,234.555 +234.114,235.0,234.31,235.0 +234.108,235.0,234.25,234.5 +234.102,234.69,234.39,234.29000000000002 +234.096,234.7,234.05,234.08 +234.09,234.09,233.23,233.23 +233.82,233.6,233.27,233.56 +233.55,233.99,233.54,233.98 +233.98,234.0,233.27,233.38 +233.38,233.99,233.37,233.82 +233.83,234.0,233.46,233.88 +233.85500000000002,234.32,233.91,233.94 +233.88,234.21,233.99,234.0 +233.905,234.0,233.86,233.93 +233.93,233.93,233.85,233.8625 +233.8625,233.85,233.6,233.79500000000002 +233.79500000000002,233.61,233.6,233.7275 +233.7275,233.66,233.6,233.66 +233.66,234.99,233.66,234.99 +234.99,235.8,234.98,235.79 +235.8,235.91,235.09,235.26 +235.26,235.5,235.14,235.42 +235.42,235.42,235.19,235.37 +235.38,236.43,235.35,236.12 +236.05,236.14,235.5,235.5 +235.54000000000002,235.5,234.83,235.04 +235.03,235.15,234.97,235.06 +235.05,235.14,234.81,235.02 +235.09,235.52,235.05,235.38 +235.42000000000002,235.75,235.35,235.75 +235.75,235.75,234.81,235.0 +234.99,235.33,234.65,234.65 +234.64,235.18,234.57,235.18 +235.19,236.26,235.19,236.2 +236.2,237.22,236.06,237.2 +237.22,238.0,237.21,237.88 +237.88,238.37,237.57,238.25 +238.22,238.5,236.45,236.95 +237.21,237.48,236.16,236.63 +236.55,237.6,236.27,237.15 +237.15,237.52,236.01,236.6 +236.59,237.26,236.18,236.27 +236.36,236.72,236.18,236.71 +236.72,237.48,236.46,236.875 +237.38,237.46,236.6,237.04 +237.22,237.44,236.72,237.04 +237.06,238.35,236.93,238.35 +238.35,239.75,238.35,238.81 +238.81,239.0,236.91,238.45 +238.45,239.0,238.45,239.0 +239.0,240.0,238.99,239.99 +239.99,240.98,239.98,240.95 +240.95,241.22,240.51,241.0 +241.0,241.0,240.14,240.47 +240.45,240.89,237.55,240.67 +240.36,243.23,240.0,243.02 +243.01,253.26,242.88,250.98 +250.93,251.86,246.21,246.89 +246.88,249.41,245.2,247.66 +247.31,248.19,245.88,247.13 +247.15,248.95,246.72,248.17 +248.12,248.57,247.26,248.26 +248.36,248.74,248.18,248.51 +248.6,251.52,248.5,250.79 +250.65,252.31,250.54,251.99 +251.99,254.63,248.41,249.12 +249.12,249.82,248.21,249.82 +249.78,251.53,247.51,248.68 +248.69,249.6,248.52,249.6 +249.56,251.35,249.28,250.65 +250.64,251.46,249.49,250.07 +251.36,252.5,250.06,252.09 +252.08,252.89,251.74,252.34 +252.56,254.23,252.3,254.22 +253.505,254.5,253.55,254.45 +254.45,256.13,254.23,256.13 +255.64,257.49,254.97,255.04 +255.06,259.46,254.43,256.63 +256.6,256.6,250.51,252.0 +252.01,254.38,251.68,252.18 +252.38,252.93,248.5,248.54 +248.51,251.0,248.0,250.91 +250.91,252.99,250.85,251.81 +251.83,253.29,251.4,252.4 +252.38,253.22,251.96,252.95 +252.65,253.25,251.7,251.72 +251.72,252.01,249.02,249.32 +249.57,249.87,247.0,247.25 +247.44,250.25,247.24,250.0 +249.83,250.99,248.85,250.74 +250.74,251.29,250.0,250.48 +250.48,251.36,248.41,248.62 +248.62,248.87,247.0,247.18 +248.44,248.53,244.98,245.74 +245.73,245.73,243.51,243.93 +244.17,246.17,244.13,244.97500000000002 +245.73,246.61,245.29,246.02 +246.03,247.99,246.03,247.99 +247.97,249.19,247.97,248.75 +248.8,251.0,248.5,250.54 +250.55,250.99,250.18,250.5 +250.5,252.11,250.42,251.54 +251.54,253.29,251.34,252.17 +252.15,252.23,249.42,251.14 +251.02,251.25,249.0,249.9 +249.91,250.98,249.19,250.97 +250.97,251.8,249.9,250.0 +250.0,250.85,249.38,249.93 +250.01,250.95,249.55,250.64 +250.52,250.84,249.0,249.01 +249.01,249.88,248.76,249.23 +249.19,249.25,248.35,249.365 +248.78,249.5,248.43,249.5 +249.5,250.57,249.44,250.27 +250.37,250.76,249.24,249.73 +249.69,250.46,249.69,250.41 +250.41,250.54,249.22,249.84 +249.84,250.95,249.75,250.39 +250.44,250.45,249.16,250.13 +250.13,250.45,249.7,250.36 +250.34,250.5,249.39,249.98 +249.98,251.0,249.97,250.87 +250.86,251.05,249.1,249.52 +249.53,250.52,249.53,250.48 +250.36,250.95,247.98,247.98 +247.98,248.0,247.11,247.77 +247.76,247.76,246.84,246.84 +246.86,248.15,246.81,247.93 +247.88,248.6,247.51,247.96 +247.97,248.42,246.55,247.56 +247.68,248.75,247.45,248.72 +247.35000000000002,248.72,247.0,247.03 +247.02,247.6,246.39,247.13 +247.13,247.73,246.81,246.94 +246.84,247.7,246.81,247.44 +247.44,247.7,245.51,245.51 +245.52,246.91,245.04,246.06 +246.06,246.06,244.23,245.0 +245.0,245.01,244.74,244.76 +244.76,244.76,243.19,243.19 +243.19,243.19,242.07,242.5 +242.51,243.2,241.81,242.91 +242.91,243.11,241.6,242.32 +242.32,242.32,241.0,241.85 +241.85,241.42,240.64,241.38 +241.38,241.44,240.46,240.85 +240.85,241.09,240.61,241.03 +241.03,241.36,241.02,241.734 +242.025,243.22,241.34,242.43800000000002 +243.02,243.43,242.98,243.142 +244.01,245.06,243.42,243.846 +245.0,245.01,244.21,244.55 +244.56,246.99,244.55,246.96 +246.96,246.99,244.09,246.16000000000003 +245.02,245.8,244.66,245.36 +245.47,246.0,245.11,245.69 +245.56,246.62,245.56,246.02 +246.03,246.3,244.95,245.65 +245.65,245.91,245.45,246.10500000000002 +245.63,246.92,245.51,246.56 +246.56,246.99,246.06,246.15 +246.06,246.41,245.13,245.17 +245.15,245.38,244.03,244.03 +244.03,244.99,244.02,244.58 +244.68,244.99,244.45,244.98 +244.85,244.99,244.06,244.15 +244.15,244.78,243.63,244.07 +244.16,245.69,243.67,245.47 +245.47,245.59,245.16,245.50833333333333 +245.35,245.67,245.03,245.54666666666665 +245.23,245.61,245.12,245.58499999999998 +245.39,245.73,245.36,245.62333333333333 +245.55,245.55,245.41,245.66166666666666 +245.42,245.76,245.36,245.7 +245.71,246.98,245.71,245.93 +245.94,245.94,244.32,244.6 +244.6,244.69,243.5,243.54 +243.53,244.48,243.34,243.66 +243.65,243.65,243.0,243.16 +243.14,243.27,242.0,243.13 +243.1,243.28,242.58,242.99 +242.99,243.0,242.57,242.93 +242.92,244.86,242.73,244.84 +244.83,244.83,244.61,244.69 +244.68,244.69,244.55,244.67 +244.62,244.75,243.86,244.75 +244.81,245.0,244.73,245.0 +245.0,245.19,244.86,245.15 +245.16,245.39,244.7,245.15 +245.19,245.74,245.01,245.27 +245.27,245.53,245.0,245.305 +245.35,245.6,245.17,245.34 +245.34,245.34,244.95,245.05 +245.1,245.1,244.25,244.76 +245.71,244.66,244.14,244.47 +246.32,247.26,244.47,246.78 +246.93,247.67,246.69,246.88 +246.87,246.98,245.98,246.68 +246.45,246.68,244.79,245.93 +246.03,247.98,246.0,247.69 +247.69,247.69,247.12,247.49 +247.26,247.49,245.88,246.94 +246.93,247.27,245.95,246.46 +246.52,247.35,245.98,246.14 +246.61,246.71,245.72,246.02 +246.03,248.5,246.01,247.93 +247.91,247.94,247.62,247.72 +247.76,248.41,247.51,247.51 +247.68,247.97,247.05,247.51 +247.51,247.7,246.99,247.65 +247.46,247.65,246.88,247.12 +247.12,248.01,247.12,247.78 +247.74,248.06,247.6,247.92 +247.55,248.01,247.22,246.48 +247.36,247.36,245.0,245.04 +246.18,245.29,244.87,244.99 +245.0,245.23,244.99,244.864 +245.0,245.81,245.21,244.738 +245.0,245.77,245.0,244.61200000000002 +245.0,245.36,244.86,244.48600000000002 +245.0,245.48,243.89,244.36 +244.28,244.65,243.01,244.385 +243.25,244.54,243.25,244.41 +244.38,244.93,244.0,244.41 +244.41,245.25,244.25,244.82 +244.83,245.01,244.21,244.69 +244.68,244.85,243.92,244.63 +244.57,245.2,243.88,244.87 +244.96,245.14,244.26,244.85500000000002 +244.79,245.21,244.65,244.84 +244.77,245.1,244.35,244.47 +244.47,244.62,243.29,243.87 +243.89,244.86,243.87,244.82 +244.84,244.92,244.09,244.1 +244.1,244.27,243.51,244.07 +244.07,244.3,243.51,243.95 +243.92,243.92,243.43,243.5 +243.51,243.54,242.01,242.52 +242.54,243.74,242.54,243.48 +243.47,243.91,242.9,243.305 +243.74,243.84,243.58,243.13 +243.585,243.8,243.17,242.95499999999998 +243.43,243.46,242.64,242.78 +243.06,243.24,242.91,242.60500000000002 +243.1,243.51,243.09,242.43 +243.255,243.74,243.26,242.255 +243.41,243.42,241.3,242.08 +242.07,242.4,241.76,241.97 +242.02,242.15,239.51,240.19 +240.18,241.38,240.18,240.75 +240.75,241.71,240.74,241.41 +241.45,241.69,241.05,241.11 +241.12,242.0,241.02,242.0 +242.0,242.36,241.8,242.05 +242.05,242.2,241.0,241.06 +241.06,241.12,240.2,240.75 +240.79,240.97,240.01,240.04 +240.05,241.04,240.04,240.71 +240.69,240.81,239.98,240.22 +240.21,240.55,239.91,240.5 +240.5,241.69,240.5,241.41 +241.41,241.63,240.74,241.61 +241.61,243.1,241.44,243.02 +241.78,243.02,241.83,241.87 +241.95000000000002,242.31,241.84,241.985 +242.12,242.22,241.82,242.1 +242.1575,242.13,241.37,241.57 +242.195,241.92,241.57,241.95 +242.23250000000002,242.84,241.85,242.33 +242.27,242.63,241.83,241.84 +242.03,241.9,241.43,241.55 +241.79,243.44,241.57,242.02 +242.02,243.23,241.82,242.305 +242.93,243.0,242.32,242.59 +242.59,242.71,242.52,242.54500000000002 +242.67,243.22,242.23,242.5 +242.5,242.5,240.75,241.25 +241.38,241.77,240.12,240.99 +240.99,241.83,240.76,241.77 +241.77,242.04,241.56,242.03 +242.03,242.8,242.02,242.29 +242.29,243.1,242.0,242.89 +242.40333333333334,242.9,242.34,242.43 +242.51666666666665,242.88,242.15,242.64 +242.63,242.9,242.51,242.59 +242.59,242.75,242.0,242.0 +242.10500000000002,242.0,241.52,241.64 +241.62,241.91,241.0,241.91 +241.78666666666666,242.0,241.45,241.83 +241.95333333333335,242.17,241.82,242.11 +242.12,242.12,241.52,241.62 +241.61,241.82,241.5,241.68 +241.65,241.86,241.6,241.76 +241.76,242.15,241.6,241.575 +242.03,242.5,241.0,241.39 +241.39,241.74,241.19,241.27 +241.27,241.5,241.26,241.42 +241.41,241.5,240.76,241.12 +241.64999999999998,242.05,241.11,241.89 +241.89,242.11,241.61,241.75 +241.95499999999998,242.12,241.54,242.0 +242.02,242.03,241.01,241.74 +241.69,242.8,239.91,242.8 +242.8,242.95,241.61,242.32 +242.72,243.0,242.3,242.99 +243.0,243.31,242.6,243.29 +243.28,243.46,243.07,243.45 +243.44,243.45,242.73,242.96 +242.96,243.0,242.73,243.085 +242.86,243.21,242.83,243.21 +243.21,243.38,243.07,243.36 +243.36,243.67,243.17,243.49 +243.54000000000002,243.89,243.47,243.62 +243.72,243.88,243.57,243.66 +243.67,244.3,243.65,244.03 +244.04,244.44,244.03,244.4 +244.41,245.67,244.37,245.175 +245.65,246.56,245.47,245.95 +245.715,246.0,245.22,245.78 +245.78,246.49,245.78,246.33499999999998 +246.45,247.19,246.31,246.89 +247.37,248.5,246.91,248.5 +248.29,250.0,248.29,248.97 +248.97,249.0,248.47,248.99 +248.99,249.15,247.71,248.23 +248.17,248.33,247.7,247.99 +248.0,251.51,247.99,249.93 +249.96,252.22,249.45,251.63 +251.64,252.0,251.01,251.34 +251.32,251.32,251.0,251.01 +251.0,251.38,249.6,251.14 +251.13,251.3,250.22,250.77 +250.77,251.87,250.51,251.28 +251.27,251.48,250.09,250.34 +250.4,250.64,249.73,250.26 +250.26,250.6,249.59,249.61 +249.995,249.75,249.45,249.88 +249.73,250.47,249.72,250.15 +250.08499999999998,251.02,250.39,250.42 +250.44,250.77,249.87,249.89499999999998 +249.91,249.89,248.75,249.37 +249.38,250.0,249.36,249.95 +249.82999999999998,250.61,249.93,250.47 +250.28,250.99,249.72,249.72 +249.71,250.54,249.65,250.47 +250.46,250.87,249.82,250.14 +250.14,250.27,248.96,249.19 +249.2,250.03,249.0,249.02 +249.0,249.0,247.51,248.0 +248.0,249.05,247.93,248.47 +248.49,249.19,248.47,249.19 +249.18,249.95,248.97,249.87 +249.86,249.99,249.09,249.1 +249.11,249.98,249.09,249.7 +249.73,250.68,249.53,250.3 +250.31,251.56,250.3,251.52 +251.38,251.56,250.71,251.56 +251.56,252.22,251.28,252.07 +252.07,252.22,249.74,250.995 +249.95,250.52,249.92,249.92 +249.92,250.53,249.77,250.28666666666666 +250.435,250.96,250.36,250.65333333333334 +250.95,251.02,250.74,251.02 +251.02,251.72,251.02,253.125 +251.71,255.58,251.7,255.23 +255.23,257.0,255.0,256.54 +256.33,257.0,255.6,255.83 +255.62,255.89,253.16,253.47 +253.72,255.87,253.44,255.87 +255.88,257.99,255.49,256.52 +256.52,257.51,254.02,255.5 +255.5,255.9,254.91,255.53 +255.54,255.9,254.9,255.75 +255.75,256.6,255.34,256.4 +256.4,256.66,255.26,255.73 +255.73,256.94,255.44,256.38 +256.49,257.71,256.43,257.51 +257.25,257.79,257.14,257.31 +257.45,258.0,255.91,257.03 +257.15,259.25,256.73,259.2 +259.2,260.09,258.99,259.77 +259.83,263.01,259.62,263.01 +263.0,267.0,261.98,267.0 +267.0,267.99,264.0,265.81 +266.68,266.71,264.19,264.62 +264.93,264.94,263.43,263.43 +263.42,265.0,262.52,264.4 +264.36,265.0,262.45,262.77 +262.78,264.27,262.78,263.2 +263.2,264.0,263.08,263.81 +263.81,266.18,263.81,265.98 +265.94,266.99,264.69,266.98 +266.79,269.39,266.49,266.135 +266.04,267.18,264.25,265.29 +265.29,265.29,262.5,263.1 +263.14,263.25,260.16,262.56 +262.56,263.11,261.77,262.02 +261.98,262.2,260.0,261.69 +261.7,264.41,261.21,264.17 +264.15,264.52,262.91,264.5 +264.5,265.39,263.14,263.6 +263.59,265.0,263.54,264.88 +264.87,265.45,264.31,264.86 +264.83,265.17,263.53,263.54 +263.53,263.53,261.14,261.86 +261.86,262.56,259.26,260.32 +260.28,260.94,259.77,260.38 +260.38,261.71,259.87,261.6 +261.61,262.54,259.63,260.01 +260.09,260.56,256.7,257.96 +257.96,257.96,255.35,255.36 +255.36,256.71,255.12,256.23 +256.3,257.54,256.3,257.26 +257.25,258.0,255.35,256.09 +256.24,257.72,256.24,257.72 +257.17,257.99,257.05,257.85 +257.43,258.0,257.49,257.49 +257.69,259.19,257.5,258.8 +258.88,259.5,257.93,258.18 +258.19,259.73,257.71,258.86 +258.86,259.93,258.76,259.31 +259.29,260.0,259.19,259.32 +259.31,260.0,259.02,259.03 +259.15,259.16,257.81,258.45 +258.44,259.5,257.8,258.6 +258.79,259.67,258.56,258.86 +258.87,261.36,258.87,261.36 +261.02,262.0,259.76,260.56 +260.56,261.98,260.01,260.19 +260.24,260.59,258.24,258.24 +258.36,259.98,258.1,259.01 +259.02,260.1,258.71,257.515 +258.86,258.86,255.23,256.02 +256.01,256.17,255.45,255.56 +255.56,257.44,255.56,256.44 +256.44,257.33,256.35,256.13666666666666 +256.77,258.48,256.63,255.83333333333334 +258.2,258.28,254.58,255.53 +255.57,255.57,253.0,253.95 +253.93,255.5,253.88,255.37 +255.05,255.39,254.15,254.64 +254.63,255.4,254.37,255.35 +255.39,256.48,255.22,256.23 +256.16,256.33,254.73,254.73 +254.78,257.33,254.71,254.7925 +254.87,257.33,254.67333333333335,254.855 +254.95999999999998,257.33,254.63666666666666,254.9175 +255.04999999999998,257.33,254.6,254.98 +255.14,255.22,254.6,254.91 +254.9,256.0,254.85,255.99 +255.7,256.53,255.85,256.5 +256.5,257.09,256.06,256.56 +256.55,256.86,255.98,256.03 +256.03,256.3,255.51,255.72 +255.74,255.84,254.72,255.25 +255.23,255.35,253.69,253.69 +253.69,253.69,252.77,253.53 +253.53,253.98,253.2,253.32 +253.27,254.16,253.27,253.39 +253.82,253.82,253.38,253.46 +253.49,253.66,253.02,253.53 +253.96666666666667,254.33,253.47,254.04 +254.44333333333333,255.18,253.5,254.73 +254.92,256.11,254.92,254.76999999999998 +255.63,256.23,254.8,254.81 +254.81,256.45,254.7,255.28 +256.11,256.51,255.22,255.75 +255.75,256.13,255.3,255.96 +255.97,256.5,255.37,255.83 +255.83,256.4,255.46,256.135 +256.4,257.35,255.96,256.44 +256.43,257.37,256.43,256.59 +256.87,257.28,256.28,256.84 +256.85,257.39,256.81,257.04 +257.05,257.06,255.93,255.93 +256.46500000000003,256.62,255.75,255.94 +255.88,256.6,254.94,255.66 +255.72,256.5,255.67,255.97 +255.82,256.19,254.4,255.76 +254.56,255.59,254.53,255.55 +255.55,255.58,255.06,255.07 +255.5225,255.66,254.91,255.2275 +255.495,255.71,255.56,255.385 +255.4675,255.67,255.41,255.5425 +255.44,255.72,255.22,255.7 +256.12,256.87,255.68,256.76 +256.8,258.0,256.78,257.46 +257.99,258.06,257.42,258.16 +257.97,258.99,257.9,258.86 +258.13,258.98,258.2,258.22 +258.29,258.76,257.79,258.23 +258.22,258.51,256.07,256.62 +256.61,257.24,256.61,257.685 +257.16,258.75,257.14,258.75 +258.74,260.85,258.74,260.78 +260.84,261.0,260.1,260.28 +260.17,260.95,260.17,260.68 +260.69,261.47,260.19,261.32500000000005 +261.32,262.78,261.32,261.97 +261.98,262.4,261.4,262.4 +262.4,262.86,261.69,261.75 +261.85,262.9,261.85,262.41 +262.41,262.41,261.26,261.28 +261.46,261.75,261.22,261.32 +261.33,261.33,260.57,260.58 +260.57,260.58,258.99,260.245 +260.5133333333333,259.92,259.76,259.91 +260.45666666666665,260.4,259.92,260.4 +260.4,260.4,259.77,260.36 +260.35,261.03,260.33,261.01 +261.01,261.89,260.98,261.89 +261.84,261.93,261.31,261.33 +261.42,263.6,261.41,263.6 +263.6,268.12,263.6,265.4 +265.38,272.77,264.88,272.77 +272.77,275.25,266.7,267.45 +267.6,272.34,267.44,270.5 +270.5,271.99,269.0,269.0 +269.01,272.22,268.46,271.28 +271.93,272.34,270.0,271.54 +271.53,272.54,270.6,271.01 +271.02,272.32,270.44,271.14 +271.14,271.29,268.27,269.58 +269.58,270.14,268.51,270.14 +270.15,270.35,268.5,268.5 +268.5,269.98,268.38,268.81 +269.0,271.34,268.8,269.89 +269.98,270.6,269.24,271.42499999999995 +270.58,272.96,270.26,272.96 +272.96,274.9,272.17,273.78 +273.46,274.36,271.83,271.85 +273.80333333333334,272.04,270.56,270.67 +274.14666666666665,274.89,270.73,274.49 +274.49,275.0,273.51,274.97 +274.99,277.88,273.98,275.0 +275.0,277.16,274.99,275.36 +275.48,277.0,273.7,277.0 +277.0,277.19,271.5,273.57 +273.46,275.34,271.99,273.02 +273.02,275.5,272.23,275.49 +275.49,276.49,273.3,273.99 +273.99,274.99,272.75,274.18 +273.9,275.37,273.59,275.01 +275.05,275.13,271.17,272.4 +272.38,272.38,268.68,271.51 +271.51,271.51,268.3,270.75 +270.74,272.0,270.46,271.67 +271.63,272.11,271.04,271.28 +271.39,271.9,271.0,271.9 +271.9,271.9,270.5,270.51 +270.5,270.51,268.01,268.93 +268.92,268.92,266.5,267.49 +267.47,268.55,266.96,267.96333333333337 +267.55,268.02,267.35,268.43666666666667 +268.03000000000003,268.93,267.74,268.91 +268.51,269.26,268.36,269.12 +268.99,269.91,268.62,269.47 +269.47,270.5,268.79,270.39 +270.32,270.63,265.33,265.86 +265.79,267.41,265.54,265.94 +265.93,267.5,265.2,266.8 +266.84,268.17,266.75,267.63 +267.68,268.0,267.43,268.0 +267.86,268.0,267.45,267.99 +267.98,268.25,267.5,267.78 +267.99,268.0,265.96,265.98 +265.98,266.5,264.5,266.0 +266.0,267.19,265.3,267.19 +266.95,267.79,265.69,265.82 +266.79499999999996,266.66,265.81,266.66 +266.64,267.68,266.2,267.49 +267.45,267.47,264.41,264.78 +264.88,265.8,264.88,265.58 +265.56,266.57,265.24,265.75 +265.85,265.96,265.04,265.5 +265.5,267.99,264.86,267.98 +267.98,269.75,267.97,269.75 +269.75,270.0,269.44,269.58500000000004 +269.48,269.67,268.47,269.42 +269.43,270.21,268.29,269.22 +268.95,270.52,268.88,270.39 +270.39,271.81,270.39,271.81 +271.8,273.87,270.44,272.5 +272.49,273.97,270.01,272.09 +272.15,273.94,270.55,271.75 +271.78,273.04,271.2,272.75 +272.75,273.0,270.31,270.89 +270.94,271.0,269.35,270.13 +270.16,270.5,269.5,269.95 +269.94,269.96,267.76,268.13 +268.09,268.25,266.25,267.89 +267.89,270.34,267.54,270.0 +269.99,271.93,269.81,271.01 +271.03,271.03,268.23,269.56 +269.22,269.92,267.1,267.72 +267.7,268.85,267.31,268.68 +268.68,270.0,268.52,268.975 +269.63,270.14,269.01,269.27 +269.27,270.23,268.65,269.41 +269.4,270.07,269.13,269.97 +270.01,271.66,269.8,270.76 +270.78,271.1,269.43,270.24 +270.27,272.0,270.26,270.85 +270.86,271.97,270.62,271.34 +271.34,271.65,268.84,271.08 +271.04,271.74,269.77,271.58 +270.86,272.5,270.34,272.08 +271.94,272.39,271.16,271.63 +271.62,271.63,270.14,271.04 +271.04,271.9,270.14,271.0 +271.0,271.5,270.88,271.47 +271.47,271.5,269.91,270.16 +270.15,271.0,269.47,270.25 +270.24,271.0,269.63,270.72 +270.91,271.39,268.45,270.42 +270.4,271.1,269.78,270.37 +270.44,270.66,269.0,269.58 +269.57,270.3,269.25,269.8 +270.0,270.24,269.3,270.0 +269.99,270.38,269.8,270.22 +270.22,271.0,269.42,270.63 +270.63,271.29,269.82,271.01 +271.02,271.5,270.67,270.88 +270.89,271.19,269.73,271.04 +271.02,271.04,270.67,271.01 +271.02,283.25,271.02,283.25 +283.43,292.22,283.11,290.01 +290.17,290.17,284.21,286.18 +286.18,290.21,284.87,289.72 +290.0,290.03,283.11,284.05 +284.09,287.79,282.1,286.89 +286.94,289.22,286.17,287.9 +287.88,288.73,285.28,286.81 +286.66,286.95,285.0,285.89 +285.92,286.8,285.1,286.59 +286.6,294.71,286.6,292.01 +292.01,294.64,292.01,293.69 +293.58,294.7,288.0,288.0 +288.0,288.72,285.02,288.3 +288.47,289.08,285.0,285.46 +285.46,288.0,284.5,286.03 +285.92,287.49,285.0,285.96 +285.96,287.0,285.12,285.85 +285.88,286.67,284.75,286.16 +286.16,292.0,284.5,292.0 +292.0,292.25,288.08,292.23 +292.22,292.22,290.42,290.54 +290.57,291.55,290.16,289.81 +290.16,290.16,289.03,289.08 +289.14,291.01,289.11,290.47 +290.28,290.46,288.91,288.92 +290.87,291.46,288.92,291.46 +291.46,292.44,291.25,291.27 +291.27,295.06,291.27,294.97 +294.87,298.65,294.5,298.65 +298.65,299.0,291.99,295.07 +295.07,295.79,293.99,295.39 +295.42,296.41,292.84,294.38 +294.39,296.57,293.83,294.28 +294.23,297.12,294.04,295.06 +295.06,295.93,293.02,294.93 +294.93,295.21,294.26,294.3 +294.69,295.43,293.9,294.18 +294.53499999999997,295.88,294.15,294.39 +294.38,295.47,293.5,294.98 +294.92,296.0,293.5,295.99 +295.71,301.26,294.51,301.16 +301.03,301.19,299.0,299.62 +299.65,303.99,298.78,303.01 +303.01,303.12,298.87,298.88 +298.88,301.52,298.21,300.02 +299.08500000000004,301.99,298.61,299.29 +299.29,301.82,298.66,300.1 +299.9,300.87,299.93,302.245 +300.51,304.4,300.51,304.39 +304.38,304.7,303.17,304.7 +304.7,309.26,304.7,309.26 +309.14,311.85,307.32,307.32 +307.75,311.65,306.76,311.58 +311.48,316.52,311.3,312.69 +312.54,314.59,310.84,312.06 +312.3,314.79,309.42,310.92 +311.04,311.62,308.43,308.8 +308.65,310.0,306.15,307.25 +307.24,309.14,307.24,308.93 +308.9,310.52,308.33,309.81 +309.82,310.16,307.58,308.69 +308.87,312.25,308.49,311.09 +311.79,312.73,310.73,311.99 +311.28,312.91,309.65,310.77 +310.77,312.09,309.06,309.85 +309.86,310.21,307.18,308.98 +308.94,309.49,305.87,305.94 +305.95,307.58,304.36,307.29 +307.16,309.02,307.0,307.29 +307.31,307.46,305.8,306.33 +306.33,306.33,283.64,286.89 +286.64,292.18,282.9,284.13 +284.5,285.21,281.62,285.21 +285.21,287.05,283.96,288.21 +285.73,291.22,285.4,291.21 +291.2,291.2,285.19,286.25 +286.25,289.0,285.07,286.18 +286.17,291.36,286.06,288.51 +288.51,291.31,288.28,290.27 +290.39,291.38,288.28,289.42 +289.42,291.37,289.08,291.27 +290.72,291.61,288.28,288.9 +288.9,289.61,287.39,289.25 +289.25,292.5,288.4,292.14 +292.15,294.48,291.57,293.1 +293.12,293.13,290.68,291.67 +291.66,293.78,291.11,292.41 +292.2,294.15,291.01,293.94 +293.99,294.27,292.78,293.79 +293.73,296.14,293.58,295.38 +295.37,295.37,290.5,291.97 +291.98,293.0,291.0,290.055 +291.62,291.62,288.14,288.14 +289.795,288.31,286.25,287.96 +287.97,290.17,287.78,288.40999999999997 +288.71750000000003,290.09,287.89,288.86 +289.46500000000003,289.63,288.6,289.31 +290.2125,291.01,289.1,290.98 +290.96,291.5,290.31,290.92 +290.91,292.29,290.13,291.17 +291.17,295.0,291.04,294.98 +294.92,297.78,293.74,294.74 +294.74,294.85,293.0,293.29 +293.26,294.06,291.69,292.5 +292.5,292.95,292.04,292.91 +292.9,293.5,291.98,292.15 +292.14,292.14,289.11,290.64 +290.65,291.7,289.96,291.14 +291.14,291.24,289.52,290.07 +290.2,290.78,288.79,289.43 +289.45,289.97,286.97,289.0 +288.99,292.89,288.99,292.41 +292.36,292.68,290.93,291.49 +291.55,291.82,289.01,290.02 +290.0,290.11,289.66,290.1 +288.975,290.13,287.48,287.91 +287.95,289.2,287.92,288.90250000000003 +288.75,291.2,288.35,289.895 +290.64,291.16,290.54,290.8875 +290.67,291.88,290.51,291.88 +291.87,292.88,291.82,292.22 +292.32,293.11,292.17,292.57000000000005 +292.77,293.27,290.88,292.92 +292.92,294.11,291.7,291.89 +291.93,292.86,291.55,292.15 +292.15,293.48,292.05,292.36 +292.3,293.0,291.29,291.59 +291.74,292.99,291.51,292.35 +292.35,292.35,291.0,291.24 +291.21,292.66,291.06,291.41 +291.49,292.49,291.14,292.1 +291.93,292.31,288.68,290.45 +290.45,291.13,289.93,291.06 +291.0,291.47,286.93,288.13 +288.15,289.13,284.98,286.09 +286.09,292.78,285.87,290.9 +290.87,291.49,289.62,289.9 +289.85,289.98,288.0,288.09 +288.09,289.32,288.09,289.32 +289.24,289.58,288.34,288.37 +288.34,288.9,287.0,287.01 +287.01,287.01,284.3,286.28 +286.28,287.03,285.1,285.1 +285.1,285.13,283.0,283.55 +284.84000000000003,284.59,283.36,284.59 +284.58,285.06,284.51,284.6 +284.61,284.99,283.87,284.15 +284.13,284.99,283.52,284.13 +284.13,284.34,275.48,275.7 +275.66,280.3,275.46,277.81 +277.84,278.35,275.73,277.02 +277.03,278.0,275.01,275.9 +275.91,277.14,275.0,276.39 +276.35,276.35,275.59,275.92 +275.91,276.98,275.38,276.52 +276.68,278.57,276.6,278.39 +278.41,281.0,278.41,280.73 +280.73,280.74,277.8,278.2 +277.98,280.26,277.78,279.44 +279.54,279.78,278.17,279.32 +279.31,279.99,278.59,279.71 +279.38,280.03,278.76,279.16 +279.17,279.45,277.94,278.14 +278.13,279.7,278.13,279.29 +279.21,279.22,276.6,276.61 +276.90999999999997,276.62,274.61,274.61 +274.61,274.63,272.64,273.61 +273.61,276.32,273.32,276.31 +276.29,276.32,274.52,275.48 +275.48,276.09,274.63,276.4325 +274.63,275.43,273.88,277.385 +274.88,275.85,274.59,278.33750000000003 +277.005,279.29,275.4,279.29 +279.13,280.14,277.76,278.33 +278.69,279.34,277.96,278.62 +278.68,281.0,278.63,279.2 +279.2,279.99,278.89,278.89 +278.95,279.01,278.39,279.0 +278.92,280.1,278.92,280.1 +280.08,281.13,278.32,278.52 +278.76,280.1,278.48,279.55 +279.53,281.38,279.2,279.53 +279.53,281.06,278.96,280.58 +280.57,281.1,279.79,280.64 +280.59,281.38,280.3,280.46 +281.0,281.02,279.28,280.08 +280.02,280.39,278.79,279.99 +279.99,280.0,278.64,279.6 +279.61,280.49,279.61,280.03 +280.03,280.1,278.58,279.29 +279.3,279.46,278.43,279.13 +279.04,281.75,278.41,281.38 +281.37,282.71,280.65,280.53999999999996 +282.51,282.7,279.7,279.7 +279.7,279.7,278.83,279.21 +279.2,280.33,278.48,280.22 +280.22,280.39,278.32,280.31 +280.31,280.33,278.22,278.28 +278.3,279.45,277.9,278.14 +277.95,278.93,277.02,277.21 +277.21,277.98,276.34,277.96 +277.98,278.82,277.0,277.64 +277.68,278.62,277.08,278.26 +278.26,278.26,276.66,277.81 +277.39,277.85,276.88,277.36 +277.36,278.02,277.02,277.86 +277.86,278.07,277.15,277.73 +277.73,277.86,277.0,277.58 +277.33,277.91,277.3,277.91 +277.81,278.47,277.81,278.42 +278.21,278.47,277.62,278.46 +278.43,278.47,277.9,278.32 +278.39,278.48,277.82,278.25 +277.92499999999995,278.21,277.3,277.47 +277.46,277.6,277.32,277.6 +277.6,278.05,277.59,277.7 +277.76,278.05,276.19,276.31 +276.26,276.55,275.81,276.55 +276.56,276.85,276.07,276.16 +276.28999999999996,276.5,276.0,276.09 +276.02,276.87,276.02,276.65 +276.64,276.64,275.0,275.76 +275.75,276.28,275.75,276.07 +276.05,276.1,275.28,275.63 +275.63,276.58,275.43,276.39 +276.36,276.42,275.89,276.08 +276.08,277.16,276.05,276.47 +276.24,276.6,276.07,276.39 +276.18,276.7,275.39,275.4 +275.4,275.74,275.17,275.57 +275.56,275.79,275.06,275.26 +275.12,275.31,274.71,275.15 +274.91,275.3,273.34,275.2 +275.19,275.95,275.19,275.42 +275.41,276.87,275.36,276.81 +276.8,276.92,276.45,276.74 +276.74,277.54,276.71,277.54 +277.54,277.73,277.31,277.44 +277.44,277.53,277.29,277.35 +277.4,277.53,277.22,277.33500000000004 +277.36,277.52,277.21,277.32 +277.32,278.63,277.32,278.5 +278.5,278.63,278.11,278.4125 +278.31,279.45,278.3,278.325 +278.305,279.6,278.13,278.23749999999995 +278.3,278.85,278.0,278.15 +278.21,279.72,278.01,278.04499999999996 +278.51,279.26,277.74,277.94 +278.0,279.15,277.51,278.15 +278.34,278.5,277.5,277.62 +277.6,278.34,277.54,278.34 +278.34,278.92,277.4,277.66 +277.67,278.25,277.57,278.24 +278.24,278.5,277.37,278.29 +278.42,280.0,278.39,279.93 +279.91,281.0,279.38,280.9 +280.9,281.15,280.19,280.37 +280.33,280.46,279.54,280.23 +280.21,281.04,280.21,281.03 +281.03,281.27,280.97,280.5233333333333 +280.98,281.23,280.53,280.01666666666665 +280.52,280.54,279.28,279.51 +279.51,279.77,279.25,279.57 +279.655,280.15,279.54,279.34000000000003 +279.8,280.89,279.11,279.11 +279.435,279.46,278.98,278.98 +279.07,279.77,278.76,279.0 +279.02,279.02,278.3,278.65 +278.8,279.5,278.25,279.33 +279.21,279.67,278.9,279.4 +279.38,279.66,279.01,279.63 +279.66,280.0,279.62,279.86 +279.85,279.88,279.6,279.75 +279.76,280.0,279.0,279.99 +279.99,280.0,279.6,279.86 +279.86,280.0,279.12,279.85 +279.83,279.86,279.4,279.55 +279.56,279.67,278.01,278.06 +278.04,278.04,276.85,277.32 +277.32,278.15,277.32,278.0 +278.14,278.3,276.48,276.7 +276.62,277.16,276.01,276.59 +276.73,276.92,276.21,276.76 +276.74,276.95,276.31,276.61 +276.20000000000005,276.81,275.51,275.73 +275.66,276.79,275.01,276.25 +276.27,276.79,275.9,276.77 +276.77,276.79,276.64,276.88 +276.7,277.0,276.69,276.99 +276.98,277.03,276.33,277.03 +276.84,277.13,276.52,277.13 +277.14,277.14,276.11,276.41 +277.03,277.15,276.0,276.97 +276.92,278.18,276.89,277.93 +277.85,278.5,277.54,278.35 +278.22,278.54,277.57,278.0 +278.0,278.0,277.54,277.55 +277.62,277.93,276.53,276.76 +277.05,277.19,276.06,276.36 +276.37,277.61,276.0,277.49 +277.5,277.51,276.74,277.13 +277.12,277.44,276.86,277.38 +277.38,278.0,277.38,277.95 +278.0,278.31,277.91,278.12 +278.14,278.74,277.93,278.74 +278.75,279.75,278.74,278.93 +278.93,279.11,277.73,277.8 +277.81,278.62,277.79,278.37 +278.37,278.56,277.33,277.78 +277.77,277.94,277.47,277.56 +277.885,278.0,277.5,277.98 +278.0,278.19,277.7,277.82 +277.82,278.04,277.67,277.88 +277.79,278.16,277.72,277.79 +277.78,277.78,277.14,277.44 +277.43,277.98,277.25,277.77 +277.77,278.25,277.7,277.84 +277.95,278.25,277.58,277.64 +277.65,277.65,276.36,276.94 +276.93,277.21,276.6,276.8 +276.73,277.29,276.53,277.29 +277.28,277.8,277.16,277.43 +277.42,277.43,276.38,277.27 +277.26,277.35,276.45,276.65 +276.68,277.54,276.28,276.62 +276.6,277.38,276.59,277.18 +277.13,277.42,276.56,276.79 +276.8,277.0,276.55,276.98 +276.98,276.98,276.51,276.91 +276.83000000000004,276.99,276.66,276.69 +276.68,277.01,276.43,277.0 +277.01,277.61,277.0,277.55 +277.55,277.63,277.54,277.63 +277.63,277.88,277.6,277.71 +277.67,278.38,277.67,278.38 +278.4,284.34,278.4,283.42 +283.41,286.44,283.41,285.99 +286.0,286.72,284.01,286.42 +286.41,286.41,284.83,285.09 +285.44500000000005,285.1,283.87,284.48 +284.48,284.88,284.12,284.88 +284.88,284.89,283.75,284.48 +284.46,284.6,283.96,284.34 +284.34,286.87,284.12,286.47 +286.43,288.99,286.41,288.69 +288.52,288.94,287.79,288.66 +288.65,290.32,288.64,290.02 +290.0,291.52,289.26,289.35 +289.32,289.94,289.03,289.28 +289.3,289.33,289.13,289.29 +289.27,289.55,288.95,289.22 +289.18,289.18,287.75,287.75 +287.84,287.84,286.82,287.35 +287.38,288.56,287.37,288.3 +288.27,289.29,288.1,288.31 +288.33,289.99,288.31,288.355 +289.45,289.45,287.7,288.4 +288.4,288.65,288.02,288.39 +288.4,289.3,288.4,288.97 +288.98,289.34,288.63,289.1 +289.09,289.09,288.52,288.73 +288.73,289.99,288.43,289.98 +289.99,291.25,289.98,290.64 +290.56,291.14,290.47,291.12 +291.13,291.67,290.37,290.65999999999997 +290.8433333333333,290.74,289.63,290.2 +290.5566666666667,290.6,289.82,290.31 +290.27,290.3,288.71,288.92 +288.92,288.93,288.0,288.01 +288.01,288.86,287.62,288.81 +288.81,288.97,288.51,288.79 +288.79,288.93,288.45,288.58 +288.58,288.6,288.45,288.49 +288.46,289.47,288.37,289.38 +289.37,289.7,289.37,289.65 +289.64,289.99,289.57,289.67 +289.68,289.99,289.63,289.95 +289.95,289.99,289.2,289.51 +289.51,289.6,289.17,289.5 +289.275,289.4,288.98,289.24 +289.04,289.27,288.65,288.98 +289.03,289.07,288.93,289.16 +289.02,289.07,288.89,289.34000000000003 +288.95,288.95,288.83,289.52 +288.84,289.7,288.65,289.7 +289.71,293.33,289.71,293.12 +293.15,293.87,292.95,293.85 +293.85,293.86,293.07,293.35 +293.35,293.35,292.52,292.53 +292.52,293.0,291.92,293.0 +293.0,293.3,292.94,292.99 +292.99,292.99,292.63,292.68 +292.69,292.85,292.52,292.58 +292.59,293.04,292.42,292.67 +292.67,292.79,292.03,292.33 +292.6,293.54,292.13,293.13 +292.95,294.1,292.73,293.81 +293.81,294.49,293.29,293.34 +293.34,293.99,293.19,293.44 +293.45,293.69,292.87,293.69 +293.69,294.96,293.39,293.94 +293.93,294.03,292.72,293.68 +293.68,293.68,292.42,292.81 +292.8,293.17,292.7,292.98 +292.98,293.0,292.37,292.41 +292.42,292.5,292.0,292.07 +292.08,292.1,287.24,287.67 +287.7,288.64,287.27,288.25 +288.435,289.48,288.25,289.17 +289.17,289.2,288.87,288.96 +288.95,289.04,288.31,289.04 +288.9,289.12,288.36,288.86 +288.76,288.96,288.54,288.73 +288.71,289.92,288.56,289.78 +289.75,289.92,288.61,289.0 +289.01,289.01,288.11,288.59 +288.53,288.75,288.17,288.75 +288.75,295.0,288.75,295.0 +295.0,296.0,293.7,295.0 +295.0,295.85,294.25,295.83 +295.82,296.81,294.99,296.8 +296.8,297.0,294.75,295.32 +294.94,294.98,293.35,294.46 +294.46,296.97,294.46,296.91 +296.9,297.87,295.61,296.16 +296.16,296.82,296.01,295.675 +296.72,297.15,294.74,295.19 +295.17,297.01,294.8,297.01 +296.94,298.0,296.25,297.21 +296.99,297.25,297.03,297.25 +297.04,297.18,295.54,295.71 +295.84,296.06,293.69,295.89 +295.89,295.98,294.5,294.67 +294.64,295.64,294.49,295.29 +295.29,295.29,294.42,295.065 +294.65,295.19,294.27,294.84 +294.85,295.44,294.4,294.99 +294.98,295.35,294.43,294.96 +295.15,296.65,295.09,296.53 +296.65,297.13,295.51,296.11 +296.405,296.3,296.02,296.02 +296.16,296.29,295.63,295.63 +295.74,296.3,295.53,295.89 +295.86,296.51,295.73,296.4 +295.695,296.53,295.5,295.52 +295.53,296.02,295.5,295.77 +296.01,296.55,295.51,296.03 +296.02,296.14,294.99,294.99 +294.99,296.58,294.3,296.34 +296.13,296.37,295.0,295.78 +295.79,296.0,294.26,294.52 +294.73,295.13,294.06,294.27 +294.26,294.39,291.5,291.68 +291.78,291.8,290.51,291.2 +291.1,291.1,290.22,290.48 +291.05,291.1,290.46,291.0 +291.0,291.0,290.38,290.51 +290.5,290.5,289.01,290.52 +290.5233333333333,290.69,289.37,290.53 +290.5466666666667,290.72,290.32,290.57 +290.57,291.84,290.55,291.84 +291.28,292.19,291.64,291.98 +291.99,291.99,291.32,291.32 +291.39,291.96,290.45,290.55 +290.61,291.01,290.27,291.0 +290.98,293.0,290.97,291.71 +291.71,291.84,291.5,291.67 +291.61,292.0,291.5,291.69 +291.69,291.69,291.5,291.55 +291.53,291.53,291.5,291.51 +290.7,291.51,289.12,289.87 +289.87,289.87,288.24,289.13 +288.94,289.59,288.46,289.51 +289.53,289.96,289.21,289.44 +289.44,290.27,289.44,289.72 +289.73,290.42,289.7,290.08 +290.08,290.98,290.03,290.39 +290.64,291.56,290.52,291.0 +290.99,290.99,289.78,289.84 +289.84,289.85,289.45,289.58 +289.57,289.59,286.66,286.7 +286.67,286.69,286.56,286.71000000000004 +286.68,286.72,286.68,286.72 +286.71,286.96,286.71,286.86 +286.95,287.04,286.88,287.0 +286.99,287.54,286.99,287.42 +287.45,288.84,287.43,288.005 +288.71,288.73,288.02,288.59 +288.63,289.4,288.01,288.56 +288.55,289.27,288.25,288.5 +288.51,288.66,288.0,288.39 +288.25,288.5,287.71,288.11 +288.11,288.48,287.74,288.48 +288.42,288.89,288.4,288.5 +288.51,288.51,288.25,288.49 +288.49,288.98,288.32,288.71 +288.83,289.24,288.73,289.21 +289.11,290.0,289.04,289.62 +289.59,289.59,287.85,288.55 +288.55,288.81,287.89,288.04 +288.02,288.02,285.0,285.01 +285.0,285.37,283.0,283.09 +283.01,283.14,282.79,283.14 +283.24,283.33,283.24,283.32 +283.32,283.47,282.98,283.47 +283.45,283.58,283.46,283.58 +283.58,285.03,283.58,284.85 +284.86,285.78,284.81,285.65 +285.65,285.8,285.41,285.58 +285.6,285.76,285.11,285.76 +285.76,286.25,285.56,285.92 +285.9,286.07,283.68,284.71 +284.7,286.03,284.62,285.85 +285.7,286.39,285.57,285.94 +286.02,287.54,285.75,286.97 +286.87,286.99,284.75,285.4 +285.35,285.75,284.53,285.2 +285.31,285.4,284.28,284.29 +284.31,285.39,284.29,285.23 +285.23,285.6,284.87,285.2 +285.07,285.07,282.25,282.25 +282.71,283.61,282.27,283.28 +283.28,283.85,283.08,283.79 +283.66,284.0,283.43,283.57 +283.57,283.66,282.19,282.19 +282.12,282.12,280.41,280.45 +280.98,280.98,278.7,278.71 +280.46500000000003,279.95,278.7,279.29999999999995 +279.95,280.45,279.87,279.89 +279.815,280.15,279.63,279.68 +279.68,279.68,277.82,278.0 +278.05,279.62,278.04,278.93 +278.92,279.84,278.66,279.59 +279.63,279.84,277.26,277.74 +277.73,279.31,277.48,279.31 +279.28,281.66,279.05,281.18 +281.18,281.3,280.38,281.13 +281.13,281.6,280.78,281.595 +281.61,282.22,281.18,282.06 +281.94,282.19,280.89,280.89 +281.29,281.6,280.75,280.88 +280.98,282.83,280.98,282.37 +282.49,282.66,280.61,280.62 +280.61,280.79,279.41,279.44 +279.97,279.41,278.18,279.845 +279.33,280.73,278.89,280.25 +280.2,280.9,279.62,279.95 +279.305,280.31,278.19,278.41 +278.41,280.0,277.33,277.59 +277.53,278.64,277.44,278.61 +278.61,278.65,278.53,278.685 +278.52,278.76,278.52,278.76 +278.66666666666663,278.83,278.43,278.83 +278.81333333333333,278.96,278.82,279.90999999999997 +278.96,281.0,278.96,280.99 +280.59,281.63,280.59,281.57 +281.6,281.62,281.24,281.62 +281.3,281.63,281.0,281.01 +281.0,281.32,280.5,281.15 +281.14,281.75,280.89,281.39 +281.53,282.01,280.92,281.81 +281.76,282.35,281.41,282.2 +282.1,282.55,281.98,282.42 +282.44,282.49,282.1,282.48 +282.46,282.49,282.07,282.51 +282.17,282.54,282.17,282.54 +282.54,282.62,282.49,282.59 +282.56,282.59,282.1,282.37 +282.4,282.44,281.25,281.32 +281.61,282.05,281.21,281.23 +281.2,281.23,280.27,280.6 +281.1,281.16,280.46,280.97 +281.0,281.37,280.74,281.37 +281.37,283.06,281.26,283.06 +283.04,284.4,283.02,283.81 +283.16,284.31,283.87,283.765 +283.28,284.39,283.72,283.72 +283.4,283.72,283.42,283.71000000000004 +283.52,283.7,283.47,283.7 +283.69,285.81,283.69,285.56 +285.5,285.55,283.74,283.9 +284.08,284.43,283.99,284.39 +284.31,285.19,284.19,284.96 +284.89,285.2,284.56,284.85 +284.98,285.39,284.82,285.08 +285.05,285.86,283.2,283.75 +283.75,283.76,283.04,283.17 +283.17,283.35,282.62,282.63 +282.62,283.0,282.33,282.33 +282.34,282.35,281.38,281.53 +281.47,281.72,280.48,280.73 +280.73,282.16,280.11,281.4 +281.4,283.38,281.4,283.28 +282.945,284.6,283.01,284.42 +284.49,284.71,284.12,284.47 +284.21,284.32,283.57,283.68 +283.68,283.83,283.0,283.55 +283.49,283.51,282.83,283.13 +283.12,284.01,282.0,283.91 +283.81,284.0,283.75,284.0 +283.99,284.0,283.81,283.85 +283.84,283.99,282.94,283.85 +284.07,284.39,283.86,284.3 +284.3,285.0,284.24,284.76 +284.99,285.31,284.36,285.22 +285.26,285.49,284.76,285.4 +285.35,285.95,285.14,285.71 +285.74,285.85,284.24,285.51 +285.53,286.31,285.2,286.02 +286.18,286.47,286.0,286.28 +286.27,286.47,285.82,285.82 +285.99,286.47,285.81,286.47 +286.4,286.47,285.64,285.64 +285.64,285.92,285.27,285.76 +285.5,285.68,284.84,285.2 +285.2,285.39,284.76,284.92 +284.9,286.25,284.9,286.09 +285.435,286.1,285.88,286.07 +285.97,286.12,285.5,285.5 +285.52,285.56,284.65,284.65 +284.66,284.67,283.54,283.86 +283.86,283.89,283.57,283.6 +283.59,283.67,283.55,283.66 +283.65,283.67,282.01,283.25 +283.25,283.13,282.01,282.84 +282.85,282.98,282.14,282.55 +282.33,283.22,282.33,283.22 +283.21,283.42,283.08,283.2 +283.24,283.48,282.64,283.12 +283.11,283.52,282.86,283.31 +283.31,283.53,282.8,283.53 +283.51,283.55,282.47,282.87 +283.03,283.5,282.87,283.21 +283.07,283.54,283.06,283.19 +283.24,283.26,282.46,282.74 +283.38,284.12,282.65,283.99 +283.52,284.44,282.83,283.33 +283.33,283.69,282.81,282.88 +282.93,282.94,282.01,282.14 +282.11,282.61,281.08,282.38 +282.32,282.35,281.38,281.78 +281.74,282.24,281.62,282.23 +282.15,282.28,281.95,282.06 +282.11,282.31,281.53,281.66 +281.66,281.89,281.05,281.13 +281.13,281.29,280.27,280.29 +280.29,281.06,280.08,280.35 +280.57,280.57,280.09,280.14 +280.24,280.86,280.08,280.52 +280.33,280.9,280.08,280.265 +280.16999999999996,280.79,280.0,280.01 +280.01,280.05,279.77,279.95 +279.95,280.15,279.3,279.33 +279.32,279.51,279.25,279.46 +279.43,279.88,278.95,279.15 +279.25,279.55,279.06,279.27 +279.38,280.1,278.98,279.6 +279.58,279.75,278.96,279.41 +279.41,279.45,279.21,279.45 +279.39,279.62,279.07,279.38 +279.37,279.54,279.02,279.21 +279.2,279.39,279.02,279.1 +279.14,280.04,279.03,279.88 +279.67,280.75,279.37,280.15 +280.14,280.35,278.82,279.54999999999995 +278.83,279.0,278.82,278.95 +278.89,278.89,277.3,277.74 +277.74,278.13,277.3,278.12 +278.02,278.41,277.8,277.77 +278.0,278.29,277.3,277.42 +277.36,278.29,277.05,278.2033333333333 +278.26,279.77,278.26,278.9866666666667 +278.7633333333333,279.77,279.76,279.77 +279.26666666666665,279.82,279.76,280.03666666666663 +279.77,280.0,279.77,280.30333333333334 +280.16999999999996,280.57,279.91,280.57 +280.57,280.73,279.94,280.21 +280.45,280.45,279.28,280.16 +280.14,281.08,280.06,281.04 +281.04,281.17,279.63,279.9 +279.83,279.93,278.76,279.61 +279.8,279.99,279.61,279.98 +279.95,280.45,279.77,280.11 +279.84,280.32,279.8,280.07 +280.04,280.16,279.7,279.85 +279.81,279.92,279.19,279.52 +279.4,280.15,279.18,280.15 +280.15,280.16,279.59,280.02 +280.1,280.05,279.24,280.05 +280.05,280.08,278.8,279.28 +279.3,279.83,279.16,279.47 +279.47,279.47,278.58,278.63 +278.91,278.61,278.23,278.35 +278.35,278.41,278.05,278.08 +278.07,279.08,278.07,278.49 +278.43,278.71,278.39,278.66 +278.64,278.69,278.39,278.48 +278.46,278.58,278.42,276.18 +278.51,278.51,273.88,273.88 +273.88,274.11,272.01,272.48 +272.4,273.5,267.43,268.39 +268.4,270.0,268.4,269.64 +269.63,270.27,268.96,268.96 +268.9,271.78,268.75,270.6 +270.68,271.06,270.11,270.19 +270.18,270.22,268.71,268.96 +268.95,269.14,268.74,269.13 +269.12,269.28,269.03,269.1 +269.06,269.18,266.63,266.96 +266.98,267.08,263.91,264.73 +264.72,264.72,260.07,263.35 +263.08,263.59,260.97,263.19 +263.19,264.1,262.71,263.08 +263.05,263.47,262.12,262.78 +262.8,264.43,262.78,263.46 +263.23,263.57,262.01,262.02 +262.02,263.35,262.01,263.35 +263.35,263.92,263.01,263.92 +263.91,263.97,263.0,263.0 +263.0,263.99,263.0,263.15 +263.58,265.73,263.2,265.17 +265.35,265.9,264.76,265.7 +265.7,267.46,265.25,266.495 +267.01,267.41,266.1,267.29 +267.29,268.47,267.09,268.21 +268.2,268.22,267.8,267.81 +267.81,267.81,265.84,267.04 +266.96,267.32,265.81,266.54 +267.1,267.1,266.1,266.9 +266.9,266.9,265.77,266.35 +266.38,266.45,262.63,263.11 +263.2,264.65,263.14,264.65 +264.68,267.11,264.41,267.11 +267.11,268.75,266.78,268.15 +268.75,268.8,266.87,268.02 +268.02,268.89,267.73,267.89 +267.93,268.62,264.88,266.14 +266.75,267.4,266.08,266.39 +266.41,267.6,266.41,267.3 +267.3,267.3,266.6,266.83500000000004 +266.83500000000004,267.26,265.88,266.37 +266.37,267.2,266.16,266.68333333333334 +266.3,266.62,265.49,266.99666666666667 +266.8,267.32,265.34,267.31 +267.3,267.33,267.14,267.2 +267.15,267.15,265.38,266.64 +266.25,267.04,265.52,266.08 +266.05,266.72,265.08,265.3 +265.27,265.32,263.17,265.0 +263.7,265.79,263.65,264.7 +264.72,265.04,263.83,264.86 +264.78,265.12,264.24,264.24 +264.21,265.18,264.2,264.68 +264.6,265.99,264.01,264.33 +264.44,265.26,264.31,264.79 +264.78,265.98,264.72,264.89 +265.56,265.56,264.77,264.99 +265.0,265.4,264.78,264.98 +264.9,265.19,263.48,265.19 +265.15,265.24,264.96,265.19 +265.13,265.63,265.0,265.41 +265.4,265.63,264.91,265.26 +265.31,266.77,265.31,266.7 +266.73,267.65,266.41,267.09 +267.09,267.5,266.67,266.77 +266.76,267.23,266.51,267.23 +267.23,267.24,265.24,265.31 +265.31,266.77,265.12,266.25 +266.25,266.33,265.63,266.1 +266.14,266.69,266.14,266.69 +266.68,267.33,266.68,267.19 +267.17,267.17,265.84,266.39 +266.28,267.0,266.01,266.65 +266.65,266.65,265.99,266.27 +266.19,266.97,266.0,266.72 +266.73,266.73,265.22,266.13 +266.13,267.02,265.68,266.65 +266.59,266.93,265.93,265.93 +266.1,266.87,266.07,266.375 +266.63,267.3,266.37,266.82 +266.81,270.09,266.78,269.58 +269.79,271.99,269.79,271.41 +271.4,271.99,271.17,271.93 +271.96,271.96,269.81,270.37 +270.01,270.38,268.15,269.01 +269.1,272.34,269.1,272.34 +272.35,272.4,271.06,272.01 +272.14,272.14,269.78,271.05 +271.05,272.05,269.2,269.39 +269.91499999999996,270.15,268.62,268.91 +268.78,268.92,268.12,268.16 +268.24,268.41,267.43,268.09333333333336 +267.66,268.57,267.66,268.02666666666664 +268.65,268.69,267.95,267.96 +268.04,268.1,267.27,267.41 +267.41,267.42,265.79,266.6 +266.59,267.0,266.32,266.99 +266.99,268.68,266.95,268.5 +268.5,268.99,267.81,267.81 +268.56,268.69,267.94,268.01 +268.09,269.83,267.6,269.83 +269.33,270.43,268.27,269.34 +269.34,270.45,268.46,269.89 +269.89,270.47,269.69,270.16 +270.08,270.25,269.54,270.0 +270.03,270.19,269.38,269.57 +269.53,269.75,266.49,266.53 +266.63,267.82,266.61,267.32 +267.32,267.33,266.23,267.09 +267.05,267.32,266.47,266.8 +266.81,267.13,265.6,266.1 +266.11,266.12,264.72,265.26 +265.37,265.79,264.9,264.96 +264.68,265.85,264.5,264.7 +263.99,264.7,263.12,263.22 +263.3,263.69,263.28,263.68 +263.66,263.8,263.59,263.67 +263.6,263.81,263.33,263.45000000000005 +263.48,263.51,262.94,263.23 +263.24,264.49,263.17,264.06 +264.295,266.06,263.7,265.35 +265.35,266.03,264.85,264.97 +265.02,265.54,264.85,265.02 +264.98,266.24,264.86,265.88 +265.88,266.4,265.6,266.19 +266.18,266.29,264.97,265.41 +265.73,265.81,265.27,265.47 +265.37,265.85,265.15,265.45 +265.44,266.09,264.65,264.88 +265.08,265.37,264.64,264.79 +264.82,265.28,264.35,264.65 +264.77,265.28,264.66,265.28 +265.23,265.33,264.86,264.87 +264.86,264.87,263.2,263.21 +263.21,265.15,262.5,264.15 +264.14,264.27,263.78,263.99 +264.09,264.52,263.67,263.79 +264.66666666666663,265.0,263.65,264.65 +265.24333333333334,265.99,263.92,265.87 +265.82,265.82,264.53,265.58 +265.58,265.58,263.46,265.14 +265.14,265.76,264.76,265.35 +265.4,265.77,265.07,265.28 +265.27,267.26,264.71,266.31 +266.17,267.56,265.84,266.04 +266.07,267.46,266.0,266.87 +266.87,267.91,266.28,266.65 +266.71,267.42,266.64,267.28 +267.25,267.98,267.25,267.76 +267.77,267.98,267.05,267.54 +267.58,267.97,266.83,267.96 +267.94,267.98,267.13,267.62 +267.62,267.8,267.18,267.56 +267.57,267.74,266.21,266.3 +266.33,266.81,265.89,266.28 +266.25,266.92,266.1,266.53 +266.68,267.42,266.0,266.01 +266.01,266.32,265.81,266.32 +266.32,267.21,266.32,267.1 +267.1,267.52,266.61,266.89 +266.86,266.99,266.86,266.97 +266.875,267.32,266.76,266.89 +266.89,267.02,266.04,266.79499999999996 +266.47,267.57,266.47,266.7 +266.7,267.21,266.63,266.85333333333335 +266.68,266.7,266.37,267.00666666666666 +266.92,267.57,266.65,267.16 +267.16,267.47,266.57,266.89 +266.57,266.87,266.16,266.72 +266.78,267.65,266.32,266.92 +266.99,267.47,266.33,267.1 +267.1,267.67,266.71,267.56 +267.57,267.69,267.2,267.21 +267.21,267.21,266.72,266.83 +266.83,266.91,266.1,266.25 +266.23,266.46,264.07,264.58 +264.62,264.99,264.0,264.0 +263.57,264.4,262.52,262.52 +262.52,263.17,261.77,262.44 +262.34,262.36,260.11,261.59 +261.5,262.22,260.97,262.01 +261.8,263.1,261.8,262.9 +262.89,263.05,261.41,261.61 +261.6,261.83,261.27,261.41 +261.42,261.42,260.76,261.53 +261.15,261.82,260.76,261.65 +259.015,261.81,255.67,256.88 +256.88,258.94,256.8,258.89 +257.62333333333333,259.99,258.99,259.0 +258.3666666666667,259.69,259.03,259.11 +259.11,259.15,257.64,259.845 +258.87,260.74,257.99,260.58 +260.59,260.94,260.05,260.75 +260.71,261.22,259.82,260.05 +260.02,260.21,259.3,259.81 +259.8,260.12,259.26,259.68 +259.68,260.37,259.36,259.59 +259.38,259.85,258.54,258.6 +258.73,259.41,258.07,258.43 +258.6,258.92,258.14,259.64 +258.47,261.18,258.47,260.85 +260.84,260.84,259.15,259.3 +259.3,259.4,259.12,259.31 +259.3,259.75,259.11,259.12 +259.11,259.76,258.19,258.93 +258.91,259.14,258.56,258.67 +258.67,260.0,258.67,259.91 +259.87,261.0,259.71,260.88 +260.325,261.57,260.64,260.85 +260.78,260.83,259.06,259.78333333333336 +259.63,259.87,258.46,258.71666666666664 +258.48,259.04,257.6,257.65 +257.64,258.23,257.49,257.57 +257.5,257.88,256.57,257.44 +256.6,257.75,256.56,257.31 +257.28,257.32,255.94,256.62 +256.28,257.42,255.58,256.77 +257.0,258.14,256.49,258.07 +258.07,258.18,256.47,257.69 +258.33,259.16,257.57,258.61 +258.59,259.21,257.95,258.89 +258.87,260.0,258.18,259.2 +259.15,259.98,259.13,259.35 +259.25,259.51,258.11,258.54 +258.48,258.92,258.25,258.62 +258.62,258.84,257.95,258.21 +258.16,258.64,257.05,257.09 +257.12,258.0,256.67,257.64 +257.57,258.04,256.25,256.62 +257.24,257.44,255.48,255.5 +255.9,256.97,255.72,256.84 +256.78,256.89,254.56,254.85 +254.85,256.57,254.55,255.19 +255.22,255.83,254.71,255.0 +255.69,256.38,255.13,256.2 +256.16,256.31,255.73,255.98 +255.91500000000002,256.36,255.64,255.76 +255.67,256.24,255.42,255.8 +255.81,257.29,255.04,255.87 +255.87,256.0,255.0,255.3 +255.02,255.02,253.0,253.25 +253.16,254.0,252.73,253.51 +253.75,254.34,252.74,253.63 +253.92,254.11,252.89,253.97 +254.07,254.55,253.0,253.99 +253.97,254.16,252.52,252.91 +252.615,253.03,251.07,251.33 +251.26,251.41,245.67,250.99 +250.98,252.32,249.65,251.03 +251.85,251.85,249.18,250.53 +250.53,250.53,200.0,228.95 +228.95,233.5,220.7,231.75 +231.76,238.99,230.9,237.5 +237.91,237.91,234.56,237.0 +236.9,237.87,230.87,231.4 +231.4,234.02,230.9,233.52 +233.67,235.11,233.29,235.11 +234.51,236.62,233.7,236.62 +236.13,237.81,236.13,237.0 +237.0,237.98,234.95,235.31 +234.98,234.98,233.01,233.68 +233.79500000000002,233.65,232.47,232.62 +232.61,233.73,232.01,232.93 +232.84,234.0,232.38,233.98 +233.98,234.53,232.59,232.92 +232.91,233.49,232.76,233.26 +233.26,235.13,233.26,234.36 +234.36,234.36,232.9,233.81 +233.88,235.03,233.34,233.47 +233.4,234.22,233.25,233.64 +233.62,234.0,232.97,234.0 +233.6,233.99,225.01,225.15 +225.15,226.73,222.11,225.06 +225.3,227.97,224.2,227.33 +227.79,229.04,226.58,227.53 +227.53,229.98,227.53,229.39 +229.7,230.0,229.13,229.84 +229.85,230.0,229.04,229.89 +231.89999999999998,234.0,229.73,233.96 +233.95,234.0,233.42,234.0 +233.97,234.0,233.71,233.99 +233.99,234.67,233.93,234.44 +234.53,234.54,232.92,233.02 +233.16,233.43,231.6,231.8 +231.79,232.52,230.45,230.68 +230.6,238.2,230.27,235.31 +235.48,235.57,234.16,234.81 +234.96,235.95,234.8,235.49 +235.53,235.61,234.41,234.54 +234.65,234.75,233.62,234.1 +234.1,234.99,232.0,232.72 +232.71,233.79,232.04,233.11 +233.03,233.64,232.72,233.5 +233.5,235.75,233.26,235.75 +235.75,236.72,235.75,236.65 +236.64,236.96,236.26,236.76 +236.76,237.04,236.17,236.4 +236.41,236.67,236.1,236.1 +236.01,236.01,235.01,235.6 +235.59,235.91,235.51,235.74 +235.63,235.66,233.33,233.97 +233.98,234.93,233.7,233.82 +233.82,236.07,233.77,235.77 +235.77,235.96,234.88,235.26 +235.27,236.24,235.27,236.07 +236.06,236.07,234.79,234.88 +234.88,236.99,234.87,235.64499999999998 +236.8,236.99,236.38,236.41 +236.4,236.48,234.77,235.915 +235.07,235.53,234.95,235.42 +234.94,235.42,234.4,234.82 +234.81,235.64,233.44,233.64 +233.64,233.65,232.0,233.1 +233.1,234.49,232.89,234.01 +234.02,234.43,233.36,233.42 +233.38,233.99,231.37,233.385 +233.66,233.99,233.26,233.35 +233.29,233.64,233.18,233.55 +233.55,233.95,233.55,233.92 +233.435,234.0,233.04,233.32 +233.32,234.38,232.49,233.67 +233.67,234.03,233.31,233.77 +233.76,234.04,231.15,232.78 +232.92,233.48,232.77,233.46 +233.28,235.53,233.2,235.07 +235.07,235.31,234.38,234.83 +234.82,234.87,234.2,234.36 +234.3,234.44,233.5,234.16 +233.72500000000002,234.24,231.03,233.25 +233.15,233.47,232.23,233.15 +233.15,233.51,231.72,232.7 +232.64,232.75,231.32,231.98 +231.94,232.11,231.0,231.89 +231.865,232.31,231.63,231.81 +231.79,232.16,228.01,228.52 +230.25,230.48,228.0,228.7 +228.71,229.01,227.78,228.68 +228.68,229.13,227.47,228.65 +228.61,229.41,225.27,227.08 +227.09,227.73,227.09,227.63 +227.63,227.76,224.57,226.21 +226.21,226.34,222.68,225.93 +226.01,227.0,225.0,226.74 +226.84,231.5,226.64,231.5 +231.71,232.97,230.17,231.315 +231.28,231.47,230.74,231.13 +231.07,231.3,230.42,231.12 +231.11,231.62,230.91,231.35 +231.36,231.53,230.57,231.27 +231.76,233.12,231.25,232.22 +232.16,233.25,232.01,232.14 +232.2,232.99,232.03,232.72 +232.81,233.08,230.9,230.9 +230.9,231.7,230.43,231.36 +231.38,231.51,230.57,230.6 +230.65,230.66,229.42,230.04 +229.93,230.94,229.93,231.245 +230.94,232.84,230.2,232.45 +232.45,232.45,231.15,232.26 +231.16,232.6,231.15,232.07 +231.27499999999998,232.92,231.03,231.4 +231.39,231.53,229.83,230.515 +230.45,230.61,229.4,229.63 +229.51,229.75,227.0,227.11 +227.07,228.64,226.15,228.62 +228.67,228.68,227.66,228.44 +228.33999999999997,229.51,228.0,228.01 +228.01,229.22,228.01,228.93 +228.74,228.74,227.79,227.79 +227.76,228.62,227.1,228.13 +228.2,229.84,227.96,228.99 +228.96,229.05,225.22,226.16 +226.16,228.0,226.03,227.31 +227.36,228.2,227.2,227.87 +227.96,228.88,227.87,228.56 +228.56,228.84,226.29,226.35 +226.29,226.3,222.34,223.55 +223.51,223.68,220.86,222.96 +222.96,223.15,220.81,222.82 +221.94,222.71,221.23,222.68 +222.68,223.12,220.82,222.34 +222.35,223.67,221.77,223.61 +223.61,223.64,221.98,222.65 +222.65,222.71,215.0,219.65 +219.64,222.16,218.57,222.0 +221.99,222.18,219.94,220.95 +220.95,221.18,216.25,217.0 +216.99,218.5,216.99,217.8 +217.9,218.25,210.0,213.3 +213.31,215.5,212.17,214.25 +214.22,218.91,214.22,216.4 +216.36,217.1,214.0,215.18 +215.38,216.17,210.48,212.91 +213.0,214.79,212.23,213.21 +213.19,214.27,210.54,210.88 +210.98,211.67,198.02,204.64 +204.88,208.45,203.01,207.63 +207.63,210.91,206.05,210.22 +210.25,212.46,204.45,205.0 +205.52,210.84,203.78,210.14 +210.23,214.49,210.23,211.03 +211.04,211.05,207.05,210.45 +210.44,214.75,209.51,214.75 +214.75,217.09,214.11,214.6 +214.57,216.74,213.42,215.91 +214.29500000000002,215.91,212.96,214.03 +214.02,214.32,212.51,212.51 +212.69,213.0,211.72,212.83 +212.72,215.5,212.54,215.5 +215.4,218.5,215.28,218.5 +218.49,224.98,218.38,222.9 +222.89,223.98,222.33,223.36 +223.36,224.6,221.89,221.9 +221.88,223.97,221.67,223.05 +222.92,225.54,222.3,224.48 +224.48,229.49,223.81,224.5 +224.5,225.88,222.02,223.62 +223.62,224.98,223.0,223.62 +223.63,224.61,222.21,223.98 +223.99,226.9,223.51,226.22 +226.23,226.73,223.1,225.76 +225.76,226.59,223.25,224.77 +224.82,224.86,220.17,220.62 +220.62,223.85,220.16,221.35333333333332 +223.84,223.85,222.4,222.08666666666667 +222.77,225.12,222.51,222.82 +223.14,225.22,222.83,224.43 +224.75,227.89,223.14,223.65 +223.98000000000002,224.59,222.79,224.25 +223.21,225.29,223.04,224.85 +224.95499999999998,227.49,224.42,226.7 +226.7,230.99,226.67,230.55 +230.47,230.93,227.79,230.35 +230.82,231.97,229.0,229.0 +229.01,230.52,227.87,228.25 +228.37,230.03,227.92,229.77 +229.47,230.0,228.39,229.33 +229.33,230.99,228.42,230.58 +230.56,230.56,226.5,226.81 +228.95,227.83,225.55,227.34 +227.34,228.48,227.02,227.58 +227.58,228.27,226.14,226.17 +226.13,227.44,225.68,227.37 +227.36,228.0,226.33,227.98 +227.95,228.48,226.51,226.495 +226.52,226.92,225.0,225.01 +225.01,226.66,224.14,225.07 +224.92,225.16,224.26,224.31 +224.31,225.97,224.0,225.86 +225.71,225.95,224.63,226.155 +225.7,226.81,225.37,226.45 +226.44,227.67,224.13,225.7 +225.69,225.7,225.3,225.49 +225.48,226.1,225.12,225.95 +225.96,227.57,225.19,226.59 +226.6,227.58,225.97,226.72 +227.01999999999998,227.68,226.69,227.41 +227.44,227.99,226.3,227.08 +227.08,227.99,226.68,227.18 +227.19,227.98,227.12,227.52 +227.52,229.99,227.23,229.32 +229.33,229.61,227.56,228.71 +228.66,228.83,226.83,227.89 +227.9,228.0,226.98,227.27 +227.18,227.9,227.09,227.9 +227.77,227.92,225.12,225.28 +225.23,226.08,224.05,224.55 +224.61,224.71,222.13,222.32 +222.19,223.53,221.2,222.32 +222.3,224.92,222.07,223.45 +224.74,225.82,224.44,224.58 +224.58,224.58,223.13,223.44 +223.44,224.98,223.0,224.78 +224.78,227.24,224.33,227.24 +227.17,227.44,226.26,226.73 +226.73,227.41,226.46,227.37 +227.35,227.44,226.96,226.96 +227.05,227.76,225.91,226.78500000000003 +226.73,227.69,226.42,226.61 +226.61,227.53,226.42,226.97 +226.94,227.69,226.81,227.58 +227.33,229.38,227.3,229.22 +229.17,231.55,228.45,230.07 +229.99,236.18,229.48,234.58 +234.65,235.99,234.05,235.01 +235.01,235.01,232.38,233.63 +233.63,235.38,232.62,232.94 +233.5,235.47,232.76,235.07 +235.47,235.67,232.95,234.36 +234.2,234.2,233.26,233.56 +233.55,233.55,231.13,231.78 +231.83,232.35,230.26,231.56 +231.55,233.79,231.55,233.73 +233.7,233.8,232.36,233.25 +233.24,233.43,231.77,232.22 +232.23,233.47,231.56,232.65 +232.58,233.95,231.76,232.14 +232.14,232.99,232.12,232.74 +231.975,233.13,231.81,231.47 +231.81,231.81,230.01,230.2 +230.09,230.96,230.0,231.06 +230.945,232.15,230.55,231.92 +231.8,232.58,231.79,232.17 +232.17,232.17,230.53,230.76 +230.66,230.78,229.62,229.95 +229.91,230.58,229.17,230.58 +230.56,230.74,229.5,230.0 +230.17,230.72,229.01,229.79 +229.435,230.72,228.51,228.66 +228.7,229.46,228.53,229.2 +229.21,229.21,228.2,228.6 +228.59,229.26,228.0,228.04 +228.34,229.37,228.09,228.86 +228.85,229.64,228.03,228.3 +228.36,230.92,228.14,230.92 +230.92,233.01,230.92,231.49 +231.44,232.72,231.05,231.59 +231.6,233.47,231.42,232.42 +232.46,232.75,231.35,231.6 +231.65,231.7,230.24,230.38 +230.3,231.15,229.79,230.31 +230.31,231.55,230.27,230.67 +230.14499999999998,231.7,229.89,229.97 +229.98,232.15,228.9,229.345 +228.91,229.18,228.22,228.72 +228.72,229.18,228.01,229.08 +229.17,229.64,228.76,229.63 +229.64,229.99,228.64,229.04 +229.0,229.26,229.0,228.97 +229.1,229.55,228.54,228.9 +228.88,228.97,228.0,228.01 +228.01,228.39,226.59,226.77 +226.78,228.54,226.71,227.35 +227.44,228.11,226.73,226.73 +227.66,228.54,226.8,227.88 +227.88,228.85,227.46,228.0 +228.05,228.28,227.32,227.84 +227.75,228.47,227.59,228.25 +228.41,229.59,228.28,229.59 +229.59,229.98,228.96,229.24 +229.24,229.42,227.53,228.62 +227.71,228.73,227.4,228.0 +228.01,228.39,227.0,228.09 +227.9,228.94,227.9,228.18 +228.12,228.77,227.57,228.21 +228.21,228.76,227.66,227.84 +228.01,228.06,227.27,227.47 +227.42,227.6,225.23,227.15 +227.11,227.64,226.83,226.84 +226.99,228.09,226.62,227.51 +227.5,230.73,227.48,230.24 +230.33,231.81,230.0,230.52 +230.53,230.65,229.62,230.21 +230.11,230.45,229.67,230.86 +230.82,233.0,229.84,231.51 +231.53,232.5,230.6,231.27 +231.14,232.18,230.69,231.51 +231.55,233.0,231.51,232.71 +232.87,232.87,231.5,231.92 +231.92,232.04,230.7,231.01 +231.0,232.52,230.04,230.55 +230.5,230.98,230.23,230.85 +230.85,231.3,230.39,231.09 +231.01,233.5,230.98,232.27 +232.21,232.48,231.71,232.0 +232.01,232.15,230.0,230.03 +230.02,230.45,229.67,230.06 +230.05,230.51,229.0,229.05 +229.02,230.13,228.88,228.98 +228.94,230.48,228.93,229.71 +228.56,229.89,228.17,228.17 +228.18,229.0,228.0,228.31 +228.33,229.07,227.75,227.97 +227.99,228.01,226.42,227.21 +227.25,228.48,227.23,228.32 +228.34,229.81,228.25,228.53 +228.53,229.44,228.49,229.2 +229.14,229.3,227.0,227.84 +227.82,228.79,227.26,228.11 +227.77,229.03,227.45,228.27 +228.49,228.95,227.96,228.49 +228.41,229.5,227.12,228.89 +228.93,228.94,227.57,227.91 +227.8,228.02,226.61,226.95 +226.95,227.48,226.86,227.4 +227.36,228.2,227.11,228.14 +228.08,228.22,227.54,228.04 +228.06,228.23,227.54,228.0 +227.99,228.29,227.04,227.06 +227.05,227.05,226.63,226.86 +226.87,227.15,226.46,227.14 +227.1,227.37,226.43,226.9 +226.78,228.41,226.58,227.57 +227.8,228.45,227.8,228.24 +228.23,228.28,228.01,228.01 +228.24666666666667,228.54,228.01,228.14999999999998 +228.26333333333332,228.36,228.11,228.29 +228.28,228.46,228.08,228.38 +228.34,229.11,228.3,228.9 +228.4,228.92,228.21,228.775 +228.46,228.79,228.46,228.65 +228.63,229.04,228.51,228.7 +228.68,229.98,228.59,229.57 +229.58,230.62,229.46,230.11 +229.99,231.29,229.75,230.93 +230.82,231.43,229.35,230.53 +230.51,230.59,229.0,229.39 +229.35,229.85,229.14,229.56 +229.46,229.85,229.01,229.59 +229.5,229.83,229.03,229.12 +229.12,231.36,229.08,229.85 +229.95,230.78,229.43,230.42 +230.33,230.79,230.11,230.35 +230.33,230.5,229.6,230.0 +229.96,230.35,229.35,229.58 +229.56,229.83,229.03,229.08 +229.12,230.1,227.13,228.69 +227.4,228.47,227.23,228.3 +227.89,228.7,228.04,228.39 +228.38,229.19,227.65,227.65 +227.82,228.36,227.09,228.03 +227.98,227.98,226.97,227.16 +227.815,227.66,227.12,227.54 +227.65,228.25,227.54,228.25 +228.23,228.82,227.78,228.27 +228.29,228.43,227.7,227.71 +227.71,228.18,227.57,228.08 +228.08,228.09,227.39,227.44 +227.45,227.58,227.13,227.37 +227.305,227.46,227.04,227.16 +227.16,227.61,227.14,227.43 +227.42,227.52,227.01,227.43 +227.41,227.58,227.01,227.37 +227.36,227.71,227.12,227.57 +227.51,227.68,226.48,227.37 +227.37,228.0,227.26,228.0 +228.0,228.96,227.97,228.31 +228.23,228.72,227.96,227.96 +228.09,228.33,227.62,228.085 +227.75,228.49,227.65,228.21 +228.25,229.0,228.16,229.0 +229.0,230.45,229.0,229.25666666666666 +230.42,230.99,229.88,229.51333333333335 +230.34,230.0,229.21,229.77 +230.26,230.33,229.57,229.68 +230.18,230.95,229.98,229.59 +229.97,231.89,229.27,229.5 +229.64,229.86,229.01,229.14 +229.15,229.78,229.15,229.37 +229.34,231.75,228.63,229.6 +229.63,231.74,229.63,230.72 +230.72,231.01,230.23,230.99 +230.94,232.49,230.88,231.54 +230.745,232.26,229.97,230.56 +230.55,231.65,230.34,231.1 +231.07,231.94,230.89,231.61 +231.6,231.6,230.94,231.48 +231.26,231.97,231.17,231.82 +231.82,232.0,230.87,231.31 +231.29,231.57,231.0,231.04 +231.01,231.02,230.12,230.4 +230.4,230.98,230.34,230.8 +230.79,231.1,230.3,231.0 +230.81,231.0,230.82,230.82 +230.83,230.92,230.5,230.62 +230.62,230.95,230.6,230.78 +230.78,230.96,230.5,230.5 +230.5,230.84,230.5,230.63 +230.72,230.78,230.65,231.565 +230.73,231.0,230.73,232.5 +230.99,231.7,230.99,233.435 +231.48,236.12,231.47,234.37 +232.96499999999997,234.95,234.32,234.56 +234.45,235.14,234.3,234.86 +234.64999999999998,235.0,234.45,234.85 +234.85,237.24,234.85,235.82 +235.82,235.85,235.18,235.37 +235.37,235.72,235.05,235.57 +235.56,236.77,235.25,235.37 +235.37,236.56,235.37,235.75 +235.74,236.13,235.43,236.09 +236.09,237.07,235.33,236.06 +235.97,236.34,235.69,236.03 +236.04,236.75,235.54,236.75 +236.75,237.75,236.68,237.73 +237.65,241.32,237.65,240.9 +240.92,243.75,240.92,242.43 +242.38,242.44,240.52,241.38 +241.4,242.29,240.81,242.21 +242.21,242.21,241.06,240.645 +241.07,241.15,239.0,239.08 +239.07,240.04,238.88,239.77 +239.575,240.05,239.53,239.99 +240.08,241.49,239.86,241.46 +241.5,241.65,240.55,241.02 +241.01,241.46,240.78,241.11 +241.1,244.82,241.1,243.82 +241.945,244.76,242.74,242.86 +242.79,242.79,241.1,241.29 +241.28,241.35,239.72,241.5 +239.89,241.75,239.89,241.71 +240.45999999999998,241.57,240.38,241.04 +241.03,241.43,240.62,241.42333333333332 +240.8,242.38,240.59,241.80666666666667 +242.28,242.82,242.14,242.19 +242.18,242.47,241.6,241.61 +241.6,241.84,240.57,241.84 +241.82,242.86,241.4,242.45 +241.57,242.98,242.45,242.5 +241.32,242.71,240.7,241.03 +241.07,241.23,240.95,241.07 +241.07,241.18,239.37,240.69 +240.57,240.57,239.21,239.82 +239.83,240.78,239.82,240.78 +240.79,241.48,240.79,240.535 +241.11,241.2,240.0,240.29 +240.29,240.59,240.07,240.58 +240.655,241.02,240.59,240.92333333333335 +241.02,241.02,240.17,241.26666666666668 +240.73,241.71,240.69,241.61 +241.24,242.18,240.69,241.255 +241.75,241.76,240.5,240.9 +240.89,241.47,240.64,240.85500000000002 +241.1,241.5,240.41,240.81 +240.81,241.32,240.62,241.26 +241.25,241.33,240.76,240.88 +240.79,240.93,240.5,240.5 +240.5,241.19,240.4,241.11 +241.12,241.66,240.25,240.82 +240.8,241.59,240.8,241.47 +241.47,241.7,240.01,241.35500000000002 +241.2,242.0,240.31,241.24 +241.25,243.7,240.76,243.7 +243.7,243.95,241.51,241.67 +241.71,243.0,241.71,242.58 +242.6,242.97,242.35,242.8 +243.22,244.11,242.83,243.86 +243.84,244.39,242.99,243.83 +243.87,244.2,243.7,244.04 +244.45666666666668,247.0,244.04,244.845 +245.04333333333332,246.21,244.73,245.65 +245.63,247.82,245.09,245.09 +245.07,245.18,244.46,244.97 +245.29,246.23,244.82,245.55 +245.51,245.79,244.96,244.96 +244.98,245.28,243.01,243.16 +243.16,243.33,241.93,242.62 +242.86,243.23,242.59,243.05 +242.99,243.75,242.77,243.03 +243.18,243.52,242.78,243.38 +243.37,244.49,243.37,244.38 +244.44,244.51,243.93,244.3 +244.27,244.4,243.72,244.01 +244.08,244.5,243.71,244.33 +244.21,244.38,243.89,244.08 +244.09,244.2,243.02,243.56 +243.48,244.51,243.33,244.35 +244.35,244.47,243.65,244.09 +244.51999999999998,244.69,243.97,244.69 +244.69,244.69,244.01,244.34 +244.255,244.36,243.82,243.89 +243.82,243.89,240.83,242.81666666666666 +241.58,241.58,240.4,241.7433333333333 +240.79,240.8,240.61,240.67 +240.66,240.67,239.34,239.34 +239.83499999999998,240.02,239.0,239.0 +239.01,240.25,239.0,239.79 +239.76,240.2,239.26,240.225 +240.06,240.93,239.9,240.66 +240.7,240.84,238.99,239.86 +239.85,241.43,239.74,239.93 +239.95,240.64,239.64,240.64 +240.66,241.49,240.58,241.46 +241.46,241.46,240.41,240.8 +240.8,241.03,240.6,240.6 +240.68,240.7,239.97,240.27 +240.09,240.25,239.11,239.12 +239.12,239.12,238.6,238.72 +238.72,238.78,238.71,238.78 +238.78,239.3,238.77,239.29 +239.3,239.5,239.29,239.47 +239.4,239.5,239.29,239.49 +239.49,239.51,238.72,238.81 +238.82,238.9,237.96,238.03 +238.06,238.16,237.06,238.15 +238.13,238.13,236.69,237.01 +237.01,238.77,237.01,238.42 +237.88,238.81,238.42,238.75 +238.75,238.81,238.34,238.67 +238.655,238.79,238.27,238.88 +238.56,239.79,238.56,239.09 +239.56,239.96,239.0,239.3 +239.3,240.76,239.3,240.76 +240.76,241.4,240.36,240.49 +240.41,240.51,240.07,240.27 +240.22,240.27,239.37,239.38 +239.37,239.85,238.0,239.85 +239.79,239.92,238.58,239.0 +239.1,239.4,238.06,238.97 +238.92,239.66,238.46,238.9 +238.92,239.53,238.76,239.2 +239.39,239.73,236.88,238.4 +238.31,238.58,238.11,238.51 +238.56,240.36,238.51,240.25 +240.25,240.47,239.33,240.19 +240.18,241.17,240.18,241.09 +241.08,241.18,240.95,241.18 +241.18,241.49,240.88,240.93 +240.92,240.95,240.0,240.05 +240.05,240.81,239.95,240.81 +240.82,241.15,240.59,240.86 +240.99,241.39,240.92,241.39 +241.16,241.38,240.45,241.27 +241.22,241.22,240.53,240.69 +240.67,241.01,240.41,240.69 +240.62,240.73,239.67,240.15 +240.18,240.75,239.33,239.75 +239.76,240.47,239.36,239.95 +239.97,240.67,239.93,240.34 +240.34,240.93,240.0,240.86 +240.87,241.54,240.4,240.96 +240.92,241.25,239.9,240.33 +240.33,240.64,239.96,240.52 +240.46,240.81,240.14,240.74 +240.71,241.08,240.43,241.08 +241.05,241.1,240.55,240.97 +240.97,241.13,240.38,240.78 +240.68,240.98,240.33,240.74 +240.78,240.83,240.61,240.75 +240.73,240.96,240.69,240.93 +240.92,241.06,240.04,240.615 +240.15,240.39,240.09,240.3 +240.31,241.12,239.85,239.98 +240.22,240.49,239.87,240.13666666666666 +240.13,240.45,240.05,240.29333333333332 +240.26999999999998,240.65,240.27,240.45 +240.41,240.51,240.17,240.45666666666665 +240.415,240.42,240.07,240.46333333333334 +240.42,240.48,240.41,240.47 +240.47,240.61,240.47,240.61 +240.6,240.62,239.98,240.15 +240.15,240.18,239.46,239.58 +239.53,239.62,239.18,239.28 +239.26,239.4,237.23,237.24 +237.24,237.24,235.53,236.27 +236.26,236.37,235.32,235.33 +235.33,235.85,235.26,235.84 +235.85,236.64,235.83,236.31 +236.28,237.02,236.27,236.85 +236.85,236.88,236.5,236.58 +236.7,236.92,236.49,236.5 +236.5,236.91,235.81,235.81 +235.81,235.81,235.03,235.57 +235.55,236.05,235.47,235.93 +235.85,236.44,235.85,236.1 +236.1,236.47,236.01,236.08 +236.17,236.27,235.79,235.85 +235.85,236.38,235.77,235.94 +235.94,235.94,235.41,235.48 +235.52,235.72,235.5,235.5 +234.76,235.68,234.0,234.0 +234.0,234.01,233.22,233.86 +233.78,234.11,233.78,233.92000000000002 +234.09,234.78,234.0,233.98 +234.03,234.89,233.74,234.04 +233.97,234.22,233.84,233.91 +233.91,233.91,233.02,233.13 +233.01,233.01,230.09,230.12 +230.11,231.23,230.11,230.98 +231.08,231.46,230.68,231.24 +231.37,231.52,230.38,230.38 +230.39,230.96,230.09,230.86 +230.89,230.89,230.1,230.12 +230.12,230.14,229.82,229.92 +229.85,230.86,229.72,230.86 +230.86,232.31,230.84,232.08 +232.03,232.15,231.37,231.71 +231.71,231.71,229.22,230.845 +229.89,230.13,229.72,229.98 +230.01,230.14,229.79,230.04 +230.04,230.76,230.04,230.62 +230.7,230.79,228.01,228.95 +228.94,230.11,228.94,229.39 +229.385,230.12,229.69,229.83 +229.83,231.61,229.44,229.6 +229.62,229.66,229.35,229.74 +229.41,230.02,229.38,229.88 +229.93,232.03,229.87,231.8 +231.78,231.82,231.23,231.69 +231.68,233.99,231.68,233.08 +233.08,233.08,232.06,232.38 +232.37,232.38,232.2,232.31 +232.29,232.42,232.18,232.31 +232.25,232.57,232.05,232.19 +232.19,232.24,232.01,232.18 +232.18,232.49,232.18,232.39 +232.42,232.71,232.23,232.59 +232.59,232.59,231.23,231.59 +231.57,231.59,231.0,231.01 +231.01,231.84,230.92,231.665 +231.85,232.32,231.7,232.32 +232.33,232.4,231.81,231.85 +232.38,232.43,231.36,231.38 +231.38,231.92,231.38,231.88 +231.87,231.93,231.67,231.84 +231.76,231.85,231.38,231.76 +231.75,231.77,230.91,231.555 +231.46,231.47,231.13,231.35 +231.35,232.3,231.35,232.24 +232.25,232.25,231.87,231.91 +231.95,231.95,230.73,230.79 +230.8,231.23,230.77,230.91 +231.01,231.81,231.0,231.45 +231.45,231.48,231.23,231.29 +231.29,231.35,231.06,231.09 +231.1,231.29,230.91,231.04 +231.0,231.03,230.74,230.97 +230.93,230.95,230.6,230.6 +230.61,230.61,230.29,230.36 +230.32,230.44,230.27,230.44 +230.39,230.44,230.28,230.34 +230.34,230.36,230.26,230.35 +230.35,230.77,230.32,230.69 +230.69,230.99,230.49,230.99 +230.98,231.05,230.79,231.05 +231.05,231.62,231.04,231.58 +231.56,232.0,231.42,231.84 +231.86,231.87,231.39,231.52 +231.655,231.55,231.37,231.37 +231.45,231.53,230.86,231.3 +231.39,231.5,230.21,230.6 +230.58,230.66,229.31,229.46 +229.35,229.69,227.08,227.36 +227.36,227.89,227.12,227.68 +227.68,227.98,227.24,227.67 +227.77,228.91,227.62,228.91 +228.83,229.87,228.63,229.35 +229.34,229.61,228.79,229.0 +229.0,229.07,228.27,228.28 +228.28,228.53,227.2,228.53 +228.55,228.68,226.85,228.3 +228.45,228.45,226.92,228.11 +228.11,228.4,227.43,228.03 +228.11,228.68,228.03,228.44 +228.51,228.94,228.04,228.785 +228.92,229.2,228.65,229.13 +229.13,229.74,228.95,229.51 +229.53,229.76,229.04,230.17000000000002 +229.55,231.24,229.55,230.83 +230.82,231.23,230.22,230.42 +230.36,230.65,230.01,230.43 +230.44,230.55,229.82,230.28 +230.28,230.48,230.0,230.25 +230.28,230.48,229.79,229.81 +229.81,230.19,229.63,229.64 +229.7,229.7,229.11,229.22 +229.26,229.29,229.01,229.06 +229.05,230.18,229.05,230.18 +229.81,230.41,229.61,229.86 +229.87,231.09,229.84,230.65 +230.62,231.06,230.27,230.97 +231.01,231.55,230.67,231.54 +231.55,232.71,231.54,232.71 +232.75,235.0,232.75,234.99 +234.98,235.93,233.66,234.43 +234.43,235.14,233.16,233.88 +233.77,234.35,232.46,233.29 +233.16,234.09,233.05,233.7 +233.69,233.99,233.6,233.72 +233.69,233.88,233.07,233.21 +233.21,233.36,232.95,233.27 +233.33,234.14,233.08,234.08 +234.08,234.96,233.68,233.68 +233.68,233.68,232.45,232.45 +233.09,233.59,232.07,233.59 +233.6,234.29,233.46,233.83 +233.76,234.38,233.75,233.98 +233.97,234.29,233.26,233.37 +233.63,233.86,233.27,233.34 +233.29,234.39,233.01,234.11 +234.11,234.4,233.92,234.25 +234.16,234.25,232.63,232.8 +233.125,232.86,232.02,232.4 +232.09,232.09,231.75,232.0 +232.42333333333335,232.55,232.04,232.3525 +232.75666666666666,233.09,232.58,232.70499999999998 +233.09,233.41,233.09,233.0575 +233.2175,233.41,233.41,233.41 +233.345,233.41,233.39,233.41 +233.4725,234.26,233.3,233.6 +233.6,234.16,233.45,233.86 +233.93,234.5,233.43,233.84 +233.84,233.95,233.42,233.5 +233.5,233.8,233.12,233.44 +233.44,233.83,233.06,233.82 +233.82,234.31,233.07,233.49 +233.14,233.36,232.77,232.99 +233.0,233.33,232.75,233.03 +233.04,233.71,232.95,233.57 +233.62,233.89,233.14,233.24 +233.24,233.71,232.99,233.21 +233.41,233.51,233.08,233.18 +233.58,233.75,233.2,233.75 +233.75,233.91,233.37,233.73 +233.74,233.76,233.26,233.29 +233.24,233.61,233.13,233.4 +233.42,233.46,232.97,232.97 +232.95499999999998,233.03,232.21,232.49 +232.49,232.49,232.0,232.01 +232.0,232.14,232.0,232.12 +232.11,232.64,232.04,232.55 +232.62,232.76,232.35,232.425 +232.53,232.8,232.24,232.3 +232.37,232.6,232.17,232.55 +232.58,233.04,232.3,232.87 +232.87,232.97,232.52,232.78 +232.78,232.8,232.09,232.8 +232.8,233.29,232.15,233.03 +233.04,233.06,232.06,232.78 +232.78,232.91,232.24,232.27 +232.77,233.22,232.21,232.21 +232.21,233.22,232.14,232.39 +232.44,232.57,232.03,232.57 +232.53,232.7,232.19,232.26 +232.3,232.55,232.05,232.05 +232.07,233.26,232.07,232.95 +232.87,232.87,232.01,232.59 +232.59,232.8,232.41,232.62 +232.55,232.8,232.48,232.65 +232.51,232.8,232.35,232.35 +232.515,232.79,232.21,232.32 +232.52,232.95,232.04,232.29 +232.77,232.23,232.01,232.05 +233.02,233.61,232.02,233.33 +233.27,233.47,232.77,233.435 +233.21,233.73,233.04,233.54 +233.7,234.0,232.78,232.93 +233.09,233.18,232.24,232.37 +232.27,232.91,232.04,232.6 +232.63,233.08,231.85,232.41 +232.38,232.59,231.95,232.56 +232.55,232.69,231.87,232.44 +232.44,232.48,231.84,232.36 +232.36,233.64,232.08,232.67 +232.7,233.4,232.39,232.82 +232.73,232.73,232.01,232.38 +232.33,232.36,231.89,232.24 +232.17,232.56,227.12,227.33 +227.34,229.4,227.06,228.47 +228.35,228.51,227.0,228.03 +227.97,227.99,227.29,227.64499999999998 +227.58,227.69,227.0,227.26 +227.37,227.55,227.19,227.36 +227.36,227.99,227.36,227.99 +227.99,228.0,227.97,227.98 +228.0,228.68,227.91,228.59 +228.56,229.24,228.56,229.0 +229.03,229.17,228.52,228.64 +228.55,229.66,227.92,228.89 +228.89,228.89,227.92,228.54 +228.53,228.68,227.94,228.28 +228.49333333333334,228.4,227.91,228.32 +228.45666666666665,228.57,227.83,228.43 +228.42,228.68,228.37,228.43 +228.43,229.01,227.93,228.17 +228.18,228.18,227.0,227.19 +227.19,227.36,226.87,227.26 +227.26,228.29,227.26,228.29 +228.19,228.84,228.17,228.84 +228.83,229.17,228.6,228.81 +228.85,229.41,228.03,228.03 +228.03,228.25,227.05,227.22 +227.64,227.27,227.2,227.25 +227.25,227.39,227.06,226.39499999999998 +227.17,227.44,224.45,225.54 +225.56,226.16,225.49,226.16 +226.17,231.86,226.16,230.95 +231.09,232.39,230.86,231.64 +231.6,232.5,231.25,231.93 +231.95,232.18,231.45,231.83 +231.76,231.99,231.24,231.54 +231.55,231.92,230.71,230.99 +231.0,231.6,230.83,231.05 +231.06,231.29,230.43,231.04 +231.04,231.45,230.93,231.22 +231.15,231.51,230.75,231.4 +231.39,231.78,231.29,231.47 +231.47,231.54,230.01,230.68 +230.61,230.82,230.04,230.49 +230.49,230.57,230.07,230.47 +230.52,231.87,230.52,231.84 +231.86,233.0,231.85,232.36 +232.36,232.74,232.29,232.43 +232.42,232.43,231.65,231.65 +231.63,232.0,231.63,232.0 +232.0,232.0,231.52,231.6 +231.6,232.22,231.56,231.20999999999998 +232.1,232.1,231.89,230.82 +232.0,232.0,231.7,230.43 +231.01,231.67,230.02,230.04 +230.02,230.49,229.99,229.99 +229.95499999999998,230.02,229.27,229.86 +229.89,230.14,229.7,230.08 +230.05,230.61,229.9,230.3 +230.32,231.35,230.31,231.15 +231.21,231.73,231.01,231.32 +231.27,231.84,231.01,231.49 +231.48,231.48,230.68,230.85 +230.84,231.36,230.82,231.01 +231.0,231.42,230.67,231.26 +230.965,231.43,230.87,230.93 +230.93,231.22,230.6,230.78 +230.515,230.88,230.0,230.1 +230.1,230.1,230.05,230.1 +230.1,230.3,230.01,230.1 +230.1,230.82,230.09,230.82 +230.82,231.1,230.82,231.06 +231.07,231.5,231.07,231.41 +231.41,231.45,231.4,231.42 +231.42,231.5,231.41,231.5 +231.5,232.95,231.49,232.95 +231.48,232.96,232.31,232.43 +231.46,232.4,231.37,231.47 +231.44,231.47,231.0,231.02 +231.02,231.3,231.0,231.23 +231.315,231.65,231.09,231.64 +231.61,232.0,231.16,231.815 +231.85000000000002,232.37,231.42,231.99 +232.09,232.67,231.77,232.44 +232.44,232.79,232.38,232.57 +232.7,234.5,232.66,233.15 +233.15,235.0,233.03,234.98 +234.98,235.56,234.59,234.73 +234.64,235.68,234.53,235.68 +235.71,235.99,235.61,235.7 +235.71,235.94,235.55,235.9 +234.865,235.92,233.95,234.82999999999998 +234.02,234.28,233.5,233.76 +233.75,235.64,231.6,235.0 +235.01,235.01,234.51,234.57 +234.57,234.97,234.53,234.74 +234.73,234.98,234.63,234.81 +234.8,234.8,234.02,234.3 +234.31,234.95,234.3,234.76 +234.77,235.96,234.54,235.83 +235.87,235.99,235.87,235.99 +235.99,236.99,235.36,236.94 +236.95,236.97,236.67,236.68 +236.68,236.75,236.49,236.75 +236.75,237.0,236.71,236.99 +237.0,237.49,236.94,237.135 +237.14,237.62,237.22,237.28 +237.28,237.46,236.8,236.84 +236.86,237.01,236.57,236.75 +236.75,237.08,236.39,236.4 +236.39,236.51,235.95,236.3 +236.3,236.76,236.07,236.56 +236.55,236.77,236.31,236.65 +236.64,236.76,235.89,236.04 +236.04,236.12,235.02,235.11 +235.06,235.4,234.56,235.33 +235.38,235.86,235.37,235.75 +235.81,236.0,235.51,235.67 +235.67,236.0,235.66,236.0 +235.99,236.2,235.79,235.96 +235.92,236.2,235.75,235.82 +235.86,236.12,235.66,236.02 +236.03,236.03,234.48,234.58 +235.67,234.98,234.31,234.97 +235.31,235.0,234.9,235.0 +234.95,235.0,234.52,234.6 +234.65,234.74,234.34,234.4 +234.4,234.53,234.29,234.38 +234.38,234.46,234.2,234.21 +234.21,234.82,234.2,234.72 +234.81,235.48,234.8,235.11 +235.41,235.5,235.4,235.5 +235.45,235.53,235.29,235.48 +235.4,235.44,235.22,235.25 +235.24,235.24,234.11,234.31 +234.31,234.52,233.5,234.12 +234.12,234.68,234.12,234.65 +234.6,235.25,234.54,235.2 +235.18,235.34,234.92,235.12 +235.12,235.23,234.65,235.23 +235.055,235.2,234.57,235.01 +234.99,235.13,234.61,234.61 +234.61,234.81,234.36,234.46 +234.46,234.91,234.4,234.8 +234.55,234.86,234.46,234.55 +234.64,235.03,234.59,234.635 +234.73,234.86,234.5,234.72 +234.7,234.75,234.34,234.56571428571428 +234.63,235.02,234.59,234.41142857142856 +234.92,234.95,234.35,234.25714285714284 +234.63,234.66,234.07,234.10285714285715 +234.37666666666667,234.3,234.09,233.94857142857143 +234.12333333333333,234.45,233.79,233.7942857142857 +233.87,233.96,233.63,233.64 +233.675,233.66,233.26,233.52 +233.48,233.63,233.34,233.62 +233.51999999999998,233.69,233.33,233.35 +233.56,233.66,233.35,233.63 +233.6,233.98,233.46,233.64999999999998 +233.7,233.91,233.51,233.67 +233.71,233.91,233.23,233.37 +233.72,234.03,233.27,233.78 +233.73,234.01,233.2,233.38 +233.31,233.81,233.31,233.66 +233.62,233.89,233.47,233.73 +233.65,233.76,233.4,233.66 +233.66,233.94,233.59,233.93 +233.94,234.55,233.9,234.0 +234.06,235.34,233.96,235.33 +235.33,238.98,235.29,238.74 +238.75,239.03,237.78,237.98 +237.92,238.6,237.66,237.69 +237.68,237.7,237.0,237.43 +237.44,238.98,237.43,238.98 +238.07,239.27,238.71,238.71 +238.7,239.13,238.58,239.025 +238.61333333333332,239.43,238.57,239.34 +238.52666666666667,239.44,238.31,238.51 +238.44,238.62,238.04,238.5 +238.35,238.59,237.9,238.49 +238.49,240.25,238.49,239.02 +239.04,239.89,238.73,239.6 +239.52,239.58,238.3,239.1 +239.1,239.17,238.7,239.04 +239.01,239.24,238.44,238.93 +238.87,239.83,238.16,238.71 +238.73,238.83,238.53,238.83 +238.83,240.0,238.83,239.47 +239.64,239.78,238.93,239.57 +239.57,240.52,239.41,239.67 +239.69,241.05,238.63,238.7 +238.68,239.6,238.68,239.19 +239.19,239.86,238.96,239.495 +239.63,239.8,238.9,239.8 +239.81,240.68,239.72,240.51 +240.51,240.98,240.41,240.92 +240.92,240.98,240.28,240.82 +240.84,240.9,239.74,239.84 +239.78,239.78,238.88,238.95 +238.94,239.0,237.61,237.97 +237.97,237.99,237.62,237.89 +237.92,238.16,237.02,237.03 +237.04,237.99,237.03,237.79 +237.8,238.87,237.7,238.03 +238.03,238.76,238.03,238.41 +238.38,238.98,238.32,238.37 +238.57,239.0,238.3,238.87 +238.85,238.99,238.29,238.32 +238.33,238.47,237.0,237.41 +237.39,238.0,237.27,237.94 +237.97,238.0,237.27,237.43 +237.43,237.83,237.13,237.66 +237.65,237.79,237.05,237.71 +237.71,237.8,236.65,237.03 +237.01,237.71,236.91,237.64 +237.58,238.29,237.53,238.28 +238.23,238.36,237.99,238.26 +238.24,238.74,238.24,238.25 +238.74,238.75,238.06,238.24 +238.11,238.47,237.94,238.4 +238.39,238.45,237.82,237.82 +237.69,237.82,236.99,237.075 +236.99,236.99,236.26,236.33 +236.32,236.73,236.32,236.68 +236.69,236.84,236.58,236.73 +236.84,237.37,236.66,236.93 +236.99,236.99,236.54,236.89 +236.9,237.0,236.88,236.99 +237.0,237.95,236.99,237.63 +237.61,237.93,237.28,237.82 +237.73,238.37,237.62,238.36 +238.37,238.5,238.29,238.32 +238.42,238.48,237.31,237.51 +237.52,237.57,237.15,237.55 +237.5,237.96,237.11,237.67 +237.64,237.74,237.1,237.47 +237.47,237.56,237.14,237.38 +237.37,237.46,236.68,237.26 +237.18,237.45,236.91,237.45 +237.45,237.82,237.0,237.8 +237.82,238.19,237.8,238.06 +238.06,238.24,237.94,238.11 +238.11,238.26,237.63,238.23 +238.09,238.21,237.75,238.0 +238.0,238.07,237.26,237.39 +237.39,237.4,237.0,237.29 +237.06,237.46,237.01,237.19 +237.21,237.5,236.97,237.45 +237.45,237.5,237.05,237.39 +237.45,237.52,237.09,237.4 +237.46499999999997,237.55,237.15,237.48 +237.48,237.55,237.07,237.49 +237.54,238.29,237.4,238.27 +238.28,239.86,238.2,239.8 +239.8,239.86,238.85,239.1 +239.1,239.51,238.89,239.19 +239.12,239.25,239.01,239.12 +239.25,239.25,239.03,239.05 +239.1,239.19,238.47,239.0 +238.94,239.0,238.41,238.845 +238.58,238.77,238.39,238.69 +238.7,238.82,238.24,238.535 +238.34,238.8,238.24,238.38 +238.41,239.29,238.4,239.04 +239.06,239.4,238.95,239.0 +239.14,239.16,238.58,238.96 +238.85,239.14,238.67,238.86 +238.89,239.32,238.79,238.96 +239.1,239.17,238.16,239.06 +239.05,239.16,238.84,239.16 +239.16,239.25,239.08,239.25 +239.25,239.25,239.24,238.8 +239.25,239.25,238.29,238.35 +238.36,238.5,237.72,237.73 +238.53,238.78,237.67,238.76 +238.7,238.75,238.19,238.63 +238.63,238.63,238.07,238.28 +238.26,238.34,237.54,238.0 +238.08,238.6,237.72,237.96 +237.97,238.07,237.6,238.04 +238.05,238.42,237.9,237.93 +237.93,238.34,237.87,237.94 +238.02,238.02,237.63,237.88 +237.87,238.1,237.76,237.98 +237.97,238.08,236.97,238.105 +237.68,238.38,237.57,238.23 +238.22,238.32,237.87,238.17 +238.2,238.37,237.73,238.37 +238.34,238.76,238.33,238.76 +238.76,238.83,238.51,238.64 +238.64,238.87,238.4,238.6 +238.56,238.66,238.22,238.47 +238.48,238.8,238.45,238.8 +238.8,238.8,238.2,238.9714285714286 +238.19,238.88,238.15,239.14285714285714 +238.9,238.98,238.71,239.31428571428572 +238.94,239.11,238.91,239.4857142857143 +239.02,239.23,238.92,239.65714285714287 +239.01,239.5,238.98,239.82857142857142 +239.505,240.0,239.5,240.0 +240.0,240.04,239.83,239.99 +240.0,240.4,239.54,240.39 +240.39,240.62,240.39,240.57 +240.58,240.58,239.81,240.09 +240.09,240.2,239.79,239.99 +240.0,240.06,239.67,240.06 +240.06,240.18,239.79,240.18 +240.18,240.21,239.94,239.94 +240.02,240.21,239.84,239.92 +239.94,240.0,239.4,239.51 +239.57,239.91,239.57,239.89 +239.86,240.22,239.7,240.21 +240.21,240.21,239.75,239.78 +239.79,239.92,239.76,239.7725 +240.01,240.25,239.78,239.765 +240.23,240.28,240.21,239.7575 +239.94666666666666,240.26,239.75,239.75 +239.66333333333333,239.75,239.39,239.57 +239.38,239.39,239.34,239.39000000000001 +239.38,239.38,239.15,239.21 +239.2,239.21,239.2,239.35250000000002 +239.21,239.51,239.21,239.495 +239.47,239.86,239.47,239.6375 +239.69,239.8,239.42,239.78 +239.79,239.91,239.64,239.7 +239.65,239.81,239.51,239.53 +239.53,239.94,239.45,239.83 +239.87,239.99,239.07,239.95 +239.94,240.12,239.9,239.9 +239.91,239.93,239.61,239.85 +239.85,240.02,239.6,239.61 +239.61,239.67,239.51,239.65 +239.65,239.78,239.5,239.78 +239.46,239.99,239.61,239.95 +239.27,240.14,238.92,239.08 +239.08,240.19,238.88,240.16 +240.17,240.21,239.12,239.24 +239.22,240.01,239.11,239.85 +239.84,239.99,239.52,239.765 +239.85,240.0,239.6,239.68 +239.67,239.68,239.19,239.33 +239.34,239.38,237.96,237.96 +237.95,239.44,237.7,238.1825 +239.18,239.18,238.38,238.405 +238.36,238.68,238.26,238.6275 +238.645,238.99,238.67,238.85 +238.93,238.99,238.66,238.94 +238.93,238.97,238.53,238.95 +238.96,240.06,238.86,239.69 +239.85,240.1,238.52,239.0 +239.51,239.56,238.66,239.12 +239.17,239.86,237.5,239.82 +239.82,239.97,239.5,239.93 +239.92,240.11,239.53,239.86 +239.8,240.1,239.63,240.1 +240.1,240.19,239.87,240.19 +240.17,240.49,239.63,240.46 +240.47,240.98,240.47,240.93 +240.94,241.51,240.5,241.43 +241.41,241.46,241.03,241.46 +241.39,241.55,241.33,241.54 +241.51,241.57,240.31,241.5 +241.31,241.57,240.94,241.46 +241.4,241.58,240.97,241.28 +241.3,241.69,241.1,241.14499999999998 +241.3375,241.65,240.87,241.01 +241.375,241.59,240.83,241.58 +241.4125,241.58,241.09,241.9625 +241.45,241.67,241.31,242.34500000000003 +241.44,241.99,241.28,242.72750000000002 +242.275,243.11,241.65,243.11 +243.11,244.0,242.0,244.0 +244.02,247.0,244.02,245.97 +245.98,248.0,245.98,246.5 +246.5,247.82,246.5,246.54500000000002 +246.89,246.93,246.38,246.59 +246.56,246.87,246.56,246.82 +246.86,247.58,246.83,247.58 +247.51,247.79,246.39,246.79 +246.79,246.95,246.07,246.2 +246.3,247.79,246.3,247.46 +247.46,247.46,245.98,246.91 +247.55,247.79,246.56,247.62 +247.64,247.96,247.35,247.62 +247.57,247.89,247.3,247.48 +247.5,247.85,247.1,247.55 +247.54,247.6,246.87,247.03 +246.98,247.34,246.75,246.95 +246.96499999999997,247.14,246.58,246.825 +246.95,246.97,246.44,246.7 +246.7,246.7,244.87,245.26 +245.26,245.42,244.92,244.98 +244.95,245.0,244.91,244.97 +245.01,245.46,244.41,245.1 +245.07,245.49,244.8,245.45 +245.46,245.75,245.2,245.45 +245.5,245.55,245.0,245.18 +245.19,245.68,244.41,244.82 +244.88,245.22,244.36,245.22 +245.22,245.5,244.76,245.34 +245.43,245.5,245.03,245.35 +245.425,245.5,245.32,245.47 +245.42,245.44,244.81,245.15 +245.15,245.19,243.58,243.89 +243.76,244.53,240.2,244.0 +244.03,244.19,243.38,244.19 +244.425,244.82,244.06,244.79 +244.82,244.86,244.42,245.02499999999998 +244.73,245.3,244.73,245.26 +245.3,245.38,244.98,245.28 +245.22,245.38,245.12,245.17 +245.17,245.17,244.77,245.065 +245.07,245.09,244.85,244.96 +244.97,245.33,244.97,245.29 +245.27,245.29,244.55,244.55 +244.55,244.56,243.22,243.34 +243.35,243.67,243.33,243.845 +243.66,244.39,243.65,244.35 +244.36,244.71,244.35,244.38 +244.64,244.92,244.25,244.41 +244.4,244.5,243.79,243.86 +243.83,244.35,243.82,244.33 +244.32,244.57,244.21,244.49 +244.5,244.74,244.22,244.43 +244.43,244.69,244.05,244.26 +244.24,244.5,244.02,244.39 +244.36,244.42,243.71,244.21 +244.21,244.3,243.52,243.77 +243.73,243.73,242.2,243.41 +243.32,243.53,242.2,242.97 +242.97,243.11,241.66,242.97 +242.95,243.03,242.65,242.94 +242.94,243.2,241.1,242.48 +242.48,244.21,242.48,244.2 +244.16,244.5,243.86,244.155 +244.12,244.41,243.76,244.11 +244.1,244.23,243.34,243.67 +243.6,243.98,243.17,243.74 +243.49,243.86,243.29,243.37 +243.38,243.71,243.27,243.7 +243.64,243.69,243.39,243.95 +243.735,243.96,243.48,244.2 +243.83,244.19,243.74,244.45 +244.2,244.87,244.19,244.7 +244.68,244.71,244.02,244.18 +244.13,244.65,244.02,244.65 +244.58,244.83,244.58,244.75 +244.75,244.79,244.54,244.73000000000002 +244.73,244.88,244.51,244.71 +244.73,244.78,244.25,244.41 +244.32,244.65,244.24,244.64 +244.64,244.85,243.93,244.36 +244.33,244.52,244.29,244.47 +244.46,244.56,244.29,244.55 +244.53,245.0,244.52,245.0 +245.0,245.38,244.96,245.24 +245.25,245.39,245.03,245.21 +245.1,245.4,244.96,245.4 +245.34,245.34,245.1,245.335 +245.15,245.35,245.02,245.27 +245.31,245.37,244.42,244.42 +244.9475,244.63,244.35,244.26 +244.585,244.57,243.98,244.1 +244.22250000000003,244.25,243.8,243.81 +243.86,244.37,243.81,243.985 +244.31,244.31,243.94,244.16 +244.1,244.56,244.1,244.47 +244.375,244.65,244.15,244.65 +244.65,244.99,244.65,244.96 +244.95,245.19,244.95,245.08 +245.08,245.87,245.02,245.79 +245.82,245.98,245.8,245.98 +245.98,246.07,245.94,246.02 +246.02,246.1,246.01,246.03 +246.04,246.06,245.98,246.04 +246.04,246.1,246.01,246.06 +246.04,246.08,246.01,246.05 +246.04,246.08,246.04,246.28 +246.07,246.52,246.05,246.51 +246.5,246.62,246.43,246.6 +246.6,246.6,246.07,246.13 +246.34666666666666,246.13,245.63,245.72 +246.09333333333333,245.87,245.66,245.85 +245.84,245.86,245.66,245.73 +245.74,245.74,245.72,245.72199999999998 +245.73,245.81,245.72,245.714 +245.79,245.82,245.78,245.706 +245.76999999999998,245.81,245.78,245.698 +245.75,245.81,245.68,245.69 +245.73000000000002,245.73,245.64,245.71 +245.71,245.83,245.67,245.77 +245.78,246.07,245.77,246.07 +246.08,246.27,246.06,246.24 +246.23,246.26,246.1,246.12 +247.51,249.0,246.11,248.79 +248.79,250.0,248.77,248.72 +248.93,249.6,247.96,248.65 +248.56,249.99,248.11,248.76999999999998 +248.58,249.55,248.0,248.89 +248.6,249.42,248.36,248.67 +248.62,249.11,248.42,249.0 +248.98,249.08,248.71,248.98 +248.98,248.98,248.04,248.04 +248.04,248.92,247.81,248.62 +248.64,248.98,248.31,248.85 +248.87,249.13,248.67,249.13 +249.1,249.14,248.14,248.595 +248.2,248.32,248.03,248.06 +248.06,248.12,247.92,248.08 +248.064,248.24,248.0,248.05 +248.068,248.26,248.04,248.14 +248.072,248.53,248.21,248.23 +248.07600000000002,248.23,248.02,248.08 +248.08,248.09,247.76,247.54000000000002 +247.78,247.8,247.0,247.0 +247.0,247.01,245.89,246.1 +246.1,246.72,246.07,246.63 +246.63,246.86,246.63,246.79 +246.78,247.33,246.66,247.27 +247.26,247.55,247.07,247.11 +247.11,247.21,246.38,246.69 +246.71,246.96,246.6,246.79 +246.8,247.12,246.57,246.88 +246.79,247.0,246.45,246.45 +246.63,247.3,246.35,246.95 +246.96,246.96,246.28,246.47 +246.45,246.45,246.15,246.29 +246.3,246.34,245.0,245.01 +245.01,245.87,244.86,245.62 +245.61,245.61,245.33,245.38 +245.37,245.76,245.34,245.76 +245.71,246.1,245.65,246.32 +246.01,246.91,245.91,246.88 +246.99,248.49,246.84,247.99 +247.97,248.37,247.79,248.24 +248.19,248.25,247.89,248.24 +248.135,248.24,247.75,248.24 +248.08,251.5,248.04,251.29 +251.26,251.4,250.22,250.90333333333334 +250.99,251.15,250.68,250.51666666666665 +250.9,250.9,250.0,250.13 +250.13,250.53,248.77,249.725 +249.72,249.93,249.28,249.32 +249.32,250.07,249.32,250.06 +250.04,250.58,250.04,250.46 +250.46,250.89,250.35,250.7 +250.81,250.96,250.27,250.29 +250.28,250.42,250.05,250.24 +250.13,250.44,250.03,250.44 +250.44,251.0,250.11,251.0 +250.97,251.49,250.93,251.23 +251.27,251.73,251.04,251.15 +251.1,251.16,250.32,250.91 +250.9,250.9,250.25,250.4 +250.36,250.92,250.27,250.85 +250.78,251.2,250.82,251.2 +251.2,251.28,251.19,251.27 +251.27,252.12,251.25,252.06 +251.00666666666666,252.13,250.25,250.49 +250.74333333333334,250.97,250.34,250.68 +250.48,251.19,250.44,250.87 +250.93,251.36,250.88,251.12 +251.2,252.15,251.03,252.07 +252.07,252.27,251.08,251.67 +251.67,252.25,251.67,251.98 +251.99,253.35,251.92,253.35 +253.35,254.3,253.35,254.09 +254.09,254.98,252.5,254.6 +254.6,255.0,253.42,254.515 +253.53,254.74,253.2,254.43 +254.43,254.58,254.04,254.29 +254.09,254.38,253.95,254.29 +254.29,254.34,253.41,253.62 +253.61,253.66,253.03,253.25 +253.43,253.49,253.18,253.68 +253.49,254.17,253.46,254.11 +254.14,256.75,253.91,256.75 +256.67,256.77,254.81,255.36 +255.4,256.61,255.36,256.07 +256.05,256.68,254.41,254.51 +254.52,254.75,254.25,254.26 +254.54,254.55,253.86,254.01 +253.92,253.94,253.63,253.71 +253.69,253.99,253.29,253.97 +254.04,255.42,254.04,254.96 +254.95,255.91,254.79,255.47 +255.49,255.49,255.01,255.49 +255.41,256.0,255.22,255.72 +256.05,256.69,255.77,256.68 +256.69,256.75,254.73,255.66 +255.58,256.26,255.41,256.23 +256.18,256.49,255.26,255.71 +255.72,255.72,255.0,255.02 +255.02,255.72,255.0,255.08 +255.1,255.28,255.01,255.2 +255.18,255.61,254.7,254.7 +254.7,254.84,254.37,254.38 +254.845,254.99,254.22,254.85666666666665 +254.99,255.18,254.86,255.33333333333334 +255.21,255.88,255.19,255.81 +255.82,256.47,255.82,256.47 +256.47,256.79,255.86,256.395 +255.97,256.33,255.52,256.32 +256.33,256.89,256.3,256.81 +256.82,256.87,256.0,256.52 +256.52,256.94,256.41,256.93 +256.9,259.04,256.86,258.98 +258.98,261.49,258.98,261.25 +261.27,261.28,259.46,260.78 +259.82,260.67,259.82,260.31 +260.31,261.66,260.21,261.39 +261.38,262.4,260.67,262.19 +262.25,263.0,262.12,262.99 +262.99,265.0,262.99,264.94 +264.98,267.12,264.45,267.12 +267.09,267.6,264.42,264.47 +264.41,265.58,262.01,265.46 +265.36,266.18,265.0,265.8 +265.8,265.88,260.0,260.73 +260.89,262.73,260.89,261.62 +261.59,262.79,260.9,262.79 +262.16,263.58,262.16,263.56 +263.34000000000003,264.52,263.05,264.52 +264.52,264.79,263.46,264.68 +264.68,267.45,264.68,267.35 +267.35,268.98,265.45,267.07 +267.04,270.0,267.0,270.0 +270.0,273.0,264.79,269.43 +269.57,272.23,268.13,268.19 +268.19,269.79,266.49,268.78 +268.72,271.41,268.25,269.505 +271.31,272.02,270.2,270.23 +270.23,271.08,269.84,270.92 +270.91,272.02,270.0,270.0 +270.01,271.0,269.65,270.65 +270.67,274.49,270.19,274.29 +274.33,274.81,272.51,272.62 +272.67,274.08,271.6,273.74 +273.74,273.82,271.51,271.73 +271.73,273.04,271.68,272.78 +272.73,272.73,264.18,269.62 +269.68,269.75,266.47,268.42 +268.33,268.61,267.58,267.97 +267.94,271.91,267.81,271.82 +271.81,272.23,269.48,271.76 +272.53499999999997,273.5,270.99,271.55 +273.26,273.5,272.93,271.34 +273.16,273.5,271.13,271.13 +272.15,272.74,271.14,271.14 +271.14,271.2,270.5,270.86 +271.03,271.52,270.0,270.19 +270.18,270.88,269.96,270.88 +270.87,272.5,270.5,270.55 +270.58,272.0,270.52,271.88 +271.89,272.5,271.62,272.47 +272.5,272.5,270.52,270.54 +271.48,270.89,270.37,270.46 +270.46,270.62,269.99,269.32666666666665 +270.21,270.34,268.11,268.1933333333333 +268.38,268.89,267.06,267.06 +267.07,267.07,263.79,263.79 +263.8,264.54,262.94,264.19 +264.1,265.32,263.5,264.19 +264.18,264.28,262.97,263.75 +263.75,266.99,263.74,266.16 +266.05,266.35,265.34,265.73 +265.73,265.82,264.58,264.58 +264.56,264.93,264.2,264.82 +264.84,265.44,264.59,265.15 +265.14,265.48,264.13,265.48 +265.49,266.49,265.48,266.48 +266.48,266.78,265.92,266.67 +266.67,266.96,265.97,266.16 +266.15,268.05,266.15,267.79 +267.8,268.23,265.41,266.04 +266.36,266.3,264.54,264.93 +264.92,264.94,262.05,264.23 +264.93,264.98,263.85,264.88 +264.94,265.68,264.26,265.2 +265.23,265.99,265.13,265.52 +265.52,265.71,263.73,265.48 +264.28,265.74,264.2,265.44 +265.44,267.0,263.84,264.0 +264.11,266.99,263.0,266.21 +266.5,266.93,264.86,264.91 +264.96,266.05,264.6,265.46 +265.47,265.47,264.6,264.88 +264.88,264.88,264.0,264.52 +264.5,264.68,264.07,264.365 +264.415,264.21,264.07,264.21 +264.33000000000004,264.26,264.19,264.42333333333335 +264.245,264.2,264.1,264.63666666666666 +264.16,264.85,264.08,264.85 +264.502,265.17,264.8,265.105 +264.844,265.99,265.16,265.36 +265.18600000000004,265.94,265.88,265.615 +265.528,265.94,265.87,265.87 +265.87,265.87,265.22,265.984 +265.53333333333336,265.29,264.38,266.098 +265.19666666666666,264.86,264.54,266.212 +264.86,266.61,264.86,266.326 +266.62,267.0,266.12,266.44 +267.0,267.69,267.0,266.554 +267.004,267.61,266.33,266.668 +267.008,266.31,266.31,266.782 +267.012,266.56,266.45,266.896 +267.01599999999996,267.01,266.5,267.01 +267.02,268.57,267.02,268.145 +267.4575,269.3,268.4,269.28 +267.895,269.77,269.0,269.7233333333333 +268.3325,269.32,268.78,270.1666666666667 +268.77,270.61,268.64,270.61 +270.62,272.95,270.48,272.32 +272.33,272.33,270.8,271.92 +271.99,272.7,270.0,270.02 +270.01,270.72,268.58,269.43 +269.43,270.74,269.09,270.67 +270.69,271.5,270.69,270.76 +270.76,271.41,270.67,271.41 +271.41,272.73,271.19,272.3 +272.36,272.85,271.1,271.25 +271.27,271.6,271.02,271.42 +271.39,271.62,271.3,271.44 +271.365,271.56,271.36,271.36 +271.34,271.34,267.85,269.34 +270.294,269.6,268.68,269.22 +269.248,269.56,269.14,269.36 +268.202,269.51,265.32,266.07 +267.156,266.47,265.51,266.1 +266.11,266.61,265.9,266.51 +266.51,266.65,265.9,266.09 +266.07,267.11,265.0,267.11 +267.12,268.54,267.11,267.81 +268.22,269.99,267.78,269.29 +269.32,269.51,269.13,269.16 +269.16,269.24,268.68,268.68 +268.71,269.24,268.54,269.34000000000003 +269.04,270.24,268.75,270.0 +269.94,270.0,269.0,269.0 +269.17,269.6,268.96,269.32 +269.41,269.55,269.32,269.48 +269.42,269.42,268.52,268.77 +268.77,269.01,268.77,268.89 +268.92,269.17,268.91,269.07 +269.08,269.4,269.01,269.17 +269.17,269.18,268.8,269.11 +268.88,269.18,268.83,269.05 +269.1,269.23,269.09,270.155 +269.19,271.3,269.19,271.26 +271.25,271.25,270.56,270.87 +270.87,272.04,270.82,272.04 +272.925,275.0,272.01,275.0 +274.98,275.68,274.76,275.68 +275.67,280.0,275.65,277.0 +277.0,277.96,276.43,276.48 +276.47,276.81,274.76,276.59 +276.58,276.61,274.61,274.87 +274.87,275.49,274.74,274.82 +274.81,274.93,274.11,274.74 +274.74,275.24,274.67,274.67 +274.74,274.74,274.09,274.45 +274.42,274.49,274.21,274.48 +274.45,276.12,274.43,275.99 +275.98,276.24,274.81,275.11 +275.11,275.21,274.68,275.19 +275.21,275.98,275.21,275.58 +275.59,276.89,275.52,276.28 +276.28,276.88,275.94,276.74 +276.75,276.76,276.04,276.27 +276.27,276.35,275.79,275.79 +275.82,276.75,275.82,276.67 +276.66,279.5,276.62,279.46 +279.49,280.72,278.71,278.8 +278.8,279.39,278.74,279.19 +279.19,281.17,279.19,280.19 +278.99666666666667,280.26,278.1,278.52 +278.80333333333334,278.69,278.08,278.69 +278.61,279.51,278.44,279.19 +279.16,279.32,275.98,276.74 +276.78,278.14,276.56,278.03 +278.04,278.08,276.98,277.36 +277.38,278.21,277.36,278.21 +278.22,278.24,277.72,277.87 +277.87,278.13,277.87,278.03 +278.03,278.43,278.02,278.4 +278.4,278.71,278.34,278.67 +278.64,278.67,278.11,278.17 +278.14,278.21,277.72,277.73 +277.79,277.98,277.59,277.91 +277.9,278.78,277.87,278.78 +278.77,281.17,278.77,281.03 +281.03,281.24,280.48,280.52 +280.5,280.56,279.87,279.98 +279.98,281.98,279.98,281.85 +281.85,282.0,281.52,282.0 +282.0,282.2,280.89,280.9 +280.9,280.9,279.87,280.12 +280.12,280.65,279.94,280.24 +280.22,280.45,280.03,280.45 +280.45,280.75,280.44,280.74 +280.75,280.75,280.14,280.72 +280.46500000000003,280.74,280.16,280.26 +280.18,280.39,280.1,280.29 +280.74,281.3,280.15,281.3 +281.3,281.97,281.26,281.94 +281.9,282.0,281.22,282.0 +281.99,282.16,281.29,281.39 +281.4,281.73,280.81,281.73 +281.69,281.91,281.2,281.91 +281.79,282.0,280.84,281.07 +281.06,281.2,280.74,280.89 +280.9,281.01,280.7,280.91 +280.92,281.84,280.89,281.72 +281.76,284.49,281.49,284.28 +284.28,285.68,284.28,284.3 +284.68499999999995,285.09,284.6,285.09 +285.09,287.23,285.09,287.23 +287.23,290.0,287.23,287.78 +287.77,289.52,286.97,289.38 +289.4,294.15,289.33,292.71 +292.71,293.02,291.48,291.71 +291.73,291.73,289.54,289.91 +289.91,290.84,289.91,290.86 +290.855,292.16,289.91,291.81 +291.8,292.55,290.9,290.9 +290.9,290.9,288.0,289.2 +290.47,290.14,289.14,290.0 +290.04,292.22,290.04,292.22 +292.22,295.93,291.66,295.66 +295.67,295.69,293.7,294.43 +294.42,294.49,293.13,293.44 +293.44,294.14,293.27,294.0 +293.99,294.25,292.55,293.57 +293.49,294.04,291.12,291.12 +291.0,291.0,288.48,290.06 +290.02,290.18,283.28,286.41 +287.0,289.41,285.7,288.83 +288.91,289.88,283.4,285.34 +285.34,286.02,284.45,285.56 +285.56,287.68,285.43,286.28 +286.32,286.32,284.38,285.31 +285.3,285.88,284.64,285.35 +285.35,285.51,282.04,283.3 +283.29,283.87,282.43,283.6 +283.63,284.59,283.22,283.79 +283.81,285.12,283.02,285.09 +285.08,285.11,284.03,284.89 +284.89,285.07,282.56,283.88 +284.01,284.01,282.92,283.39 +283.32,285.12,283.32,284.22 +284.195,285.36,283.99,285.06 +285.07,285.96,284.07,285.9 +285.9,286.16,284.5,285.84 +285.9,286.67,284.27,284.4 +284.4,285.48,283.02,285.2 +285.15,285.5,284.47,284.9 +284.9,285.39,283.96,284.64 +284.61,284.68,283.92,284.27 +284.26,286.58,284.18,286.45 +286.45,287.12,286.42,286.95 +286.95,287.04,286.51,286.74 +286.73,287.1,286.57,287.09 +287.1,291.0,286.93,291.0 +291.02,291.14,290.65,290.77 +290.77,293.76,290.74,292.54 +292.43,292.56,288.4,289.51 +289.5,289.56,287.75,288.75 +288.74,291.97,288.72,291.46 +291.46,291.87,290.46,291.04 +290.98,291.48,289.19,289.29 +289.29,290.76,289.29,290.05 +290.03,290.47,289.94,290.16 +290.25,290.84,290.08,290.545 +290.62,290.94,290.58,290.93 +290.94,294.83,290.93,294.83 +294.83,295.35,294.49,294.83 +294.97,297.98,293.48,294.61 +294.61,295.26,293.98,294.44 +294.48,296.96,294.23,295.91 +295.93,296.89,294.37,294.74 +294.74,295.91,293.84,295.7 +295.72,296.85,295.72,296.27 +296.25,296.48,295.66,296.26 +296.28,297.99,294.91,294.91 +294.9,295.75,292.9,295.63 +295.68,296.08,295.51,295.77 +295.78,298.0,295.75,297.99 +298.0,299.99,297.99,298.95 +298.94,303.6,298.8,299.25 +299.25,302.74,299.13,302.39 +302.4,303.93,301.7,302.22 +302.25,303.22,301.57,302.88 +302.87,302.87,300.0,301.35 +301.35,301.48,300.64,300.93 +301.25,301.14,299.63,301.14 +301.15,303.14,301.15,301.82 +301.49,304.0,299.19,301.7 +301.71,303.98,301.71,303.4 +303.39,304.74,301.94,304.48 +304.7,306.01,304.64,305.52 +305.52,308.32,305.18,308.12 +308.11,308.93,302.66,303.95 +303.95,303.95,297.91,301.47 +301.47,301.47,298.52,299.03 +299.01,301.5,296.88,300.15 +300.33,302.6,299.8,299.88 +300.05,303.01,299.99,302.47 +302.51,302.76,302.44,302.76 +302.76,303.46,302.73,303.46 +303.49,304.35,303.48,304.34 +304.34,304.67,301.8,304.0 +304.0,304.61,303.82,304.25 +304.19,306.39,303.83,306.15 +306.18,307.5,304.81,305.42 +305.46,307.0,305.41,306.99 +307.0,307.5,306.42,306.65 +306.66,306.99,306.34,306.86 +306.87,306.87,306.07,306.5 +306.735,306.6,305.37,306.59 +306.6,309.73,306.58,309.5 +308.20000000000005,310.0,309.43,309.48 +309.8,310.04,309.24,310.53499999999997 +310.04,311.9,307.3,311.59 +311.49,315.0,311.07,314.87 +314.87,316.06,314.43,314.92 +314.92,317.0,314.87,316.13 +316.13,320.99,310.22,310.22 +310.21,313.31,309.83,311.49 +311.43,315.68,310.68,314.0 +313.93,316.13,312.84,314.34 +314.24,315.0,314.0,314.99 +314.99,317.0,314.02,316.5 +316.59,317.0,315.09,316.86 +316.88,317.0,315.0,316.1 +316.09,318.01,315.95,317.98 +318.01,328.67,317.98,325.02 +324.59,327.0,323.21,326.03 +326.03,330.25,326.0,330.25 +330.25,336.97,326.34,330.53 +330.74,334.88,325.01,332.51 +332.5,334.95,327.51,334.92 +334.91,335.0,331.57,334.96 +334.98,336.93,330.86,334.0 +334.0,334.03,323.92,328.72 +328.72,331.92,327.86,327.86 +327.8,328.53,323.12,324.67 +324.67,324.75,316.49,320.04 +319.89,321.1,319.48,321.0 +321.0,324.95,321.0,324.24 +324.15,324.25,321.28,323.31 +323.3,324.99,321.0,324.98 +324.98,329.64,324.96,328.51 +328.52,330.88,328.52,329.75 +329.95,330.01,325.51,326.97 +326.99,327.0,320.87,324.25 +324.06,325.05,322.02,324.38 +324.41,328.16,323.55,327.64 +327.64,330.97,327.53,330.97 +330.54,334.28,330.44,331.42 +331.42,334.05,331.4,332.08 +332.48,334.17,331.99,334.17 +334.16,334.19,328.21,328.21 +329.23,329.23,324.35,326.66 +326.71,327.16,324.45,326.72 +326.72,329.87,326.7,329.62 +329.63,331.45,328.87,329.3 +329.47,329.89,328.25,329.28 +329.85,329.86,328.2,329.26 +329.27,329.56,324.6,325.18 +324.97,325.84,323.57,325.25 +325.21,327.81,324.32,327.21 +325.48,327.51,324.5,325.75 +325.75,326.39,323.91,324.33 +324.69,324.84,318.63,320.0 +319.99,321.68,317.0,318.31 +318.32,320.56,314.91,315.24 +315.38,317.41,306.72,314.96 +314.96,316.0,313.54,314.85 +314.84,314.99,306.29,308.38 +308.54,317.98,307.78,313.91 +313.18,316.99,311.6,315.25 +314.74,317.15,312.87,316.59 +316.3,319.09,315.0,315.445 +317.51,318.1,311.8,314.3 +314.3,315.97,311.44,313.02 +313.25,314.0,311.55,313.14 +313.12,318.0,312.43,317.9 +317.85,318.9,314.03,317.225 +318.61,318.61,314.62,316.55 +316.56,319.18,315.61,316.98 +318.29,321.04,316.7,320.36 +320.33,322.73,319.63,322.11 +322.11,323.6,320.67,322.02 +321.72,323.21,319.64,321.9 +321.91,321.92,320.85,321.08 +321.1,321.61,320.18,320.42 +320.32,320.32,318.34,318.34 +318.35,318.52,316.66,317.29 +317.28,317.76,316.79,316.9 +317.03,318.0,311.44,314.92 +314.93,318.17,312.12,317.66 +317.66,322.0,317.66,320.77 +320.78,324.0,320.75,323.92 +323.89,331.88,322.34,331.81 +331.61,332.0,325.94,329.01 +329.0,331.89,326.94,329.56 +329.52,331.37,329.25,329.8 +329.86,329.92,326.07,327.25 +327.24,329.5,326.81,328.18 +328.18,329.85,328.11,328.11 +328.13,331.29,328.02,331.09 +331.14,332.3,330.31,332.07 +332.05,332.07,326.54,330.73 +330.72,331.09,326.5,329.25 +329.22,332.1,327.64,332.02 +331.96,332.5,329.67,332.45 +332.405,334.32,331.5,332.88 +332.85,338.0,330.42,337.36 +337.47,340.96,337.47,339.65 +339.65,342.03,339.62,341.6 +341.59,342.07,334.95,336.79 +336.79,339.57,336.79,337.42 +337.45,338.25,336.94,337.5 +337.5,341.81,336.97,341.81 +341.81,343.98,340.01,343.98 +343.98,360.0,343.97,360.0 +359.98,362.18,350.12,356.22 +356.27,371.82,355.6,364.21 +364.26,370.02,360.08,370.02 +370.02,370.79,362.83,366.75 +366.76,366.76,362.07,362.36 +362.35,367.81,362.1,367.6 +367.59,369.04,366.85,366.97 +366.97,380.0,366.82,378.57 +378.89,380.91,373.49,378.07 +378.0,384.47,372.15,374.36 +374.36,376.24,367.49,374.99 +375.0,375.0,371.95,375.0 +375.0,377.86,372.87,376.69 +376.69,383.66,376.69,381.5 +381.49,387.0,368.78,378.07 +381.355,381.25,375.74,381.25 +381.22,395.99,381.22,390.95 +390.97,397.29,390.4,396.49 +396.5,399.0,390.48,392.25 +392.3,395.0,390.07,394.92 +394.91,405.0,394.46,404.38 +404.38,415.0,403.44,412.3 +412.54,422.3,412.02,415.44 +415.43,419.24,381.22,384.11 +384.13,404.99,383.5,403.03 +402.86,408.88,393.55,399.94 +399.87,404.85,398.09,402.33 +402.83,407.0,397.61,405.11 +405.14,416.42,405.11,411.1 +412.25,424.49,411.91,423.5 +424.17,435.54,424.05,433.01 +433.39,444.49,431.51,444.49 +444.5,452.0,425.8,450.0 +449.92,449.93,433.27,444.74 +444.6,445.82,420.0,434.9 +434.88,445.82,426.66,444.14 +444.24,444.28,431.75,438.5 +438.51,444.84,437.31,439.51 +440.03,468.97,439.98,468.97 +468.97,478.17,461.79,477.14 +477.12,494.44,466.33,492.35 +491.84,499.99,477.18,477.18 +477.08,494.67,465.53,483.67 +484.42,492.05,478.07,482.67 +484.02,493.33,477.46,481.67 +482.73,482.73,455.35,463.27 +463.08,477.95,436.79,476.69 +476.69,477.97,462.3,466.94 +466.82,469.8,450.53,453.43 +453.0,461.5,405.22,430.05 +431.64,431.64,368.15,385.52 +385.51,414.19,369.12,402.63 +403.01,407.44,381.81,404.4 +404.2,435.77,398.31,431.01 +431.77,444.2,426.87,441.9 +441.64,450.0,422.0,425.12 +422.99,435.0,409.24,415.86 +415.87,421.12,375.0,383.6 +383.55,399.0,370.42,392.55 +392.09,404.03,379.96,390.82 +390.74,391.58,370.0,374.78 +374.68,382.62,366.66,381.49 +381.35,400.0,377.25,392.67 +393.19,394.43,380.6,383.45 +383.43,399.94,381.0,394.92 +394.9,407.77,392.2,403.55 +404.0,404.39,388.79,390.32 +390.98,395.2,381.33,392.58 +392.16,400.95,386.32,396.6 +396.55,397.84,390.0,397.84 +397.86,411.92,397.0,410.42 +411.55,417.12,404.01,409.66 +409.42,409.65,398.8,408.99 +408.96,408.99,393.0,393.0 +394.44,397.02,385.0,389.63 +390.01,390.99,377.91,386.87 +383.19,387.31,369.87,376.37 +376.37,376.38,352.0,362.83 +362.85,375.29,362.12,369.49 +369.49,370.0,353.65,357.06 +357.2,361.45,354.54,354.54 +354.42,363.0,351.0,362.66 +362.67,373.13,359.2,365.42 +365.39,379.31,363.12,376.35 +376.95,378.8,363.14,367.53 +367.41,370.65,367.4,370.24 +370.23,370.31,366.99,368.43 +368.43,376.28,368.21,373.61 +373.62,379.43,373.62,377.54 +377.55,378.48,372.0,376.48 +376.43,376.85,373.93,376.42 +376.25,387.1,375.23,387.1 +387.11,394.5,387.11,392.07 +393.18,395.0,387.21,391.95 +391.95,391.95,376.28,379.59 +379.3,379.55,362.11,370.96 +371.01,373.11,365.0,370.2 +370.21,375.96,368.24,372.0 +371.99,379.9,371.0,371.0 +371.03,374.7,368.24,373.48 +373.23,381.2,371.43,381.19 +381.19,385.0,374.31,378.1 +378.11,382.03,376.25,376.25 +376.24,378.69,374.33,376.21 +376.2,383.55,376.01,381.56 +381.57,384.95,380.86,384.95 +384.86,388.79,383.55,384.74 +384.75,386.44,372.24,376.79 +376.8,383.3,376.8,382.34 +382.39,388.23,381.64,387.99 +387.95,392.0,385.66,390.3 +390.3,390.7,385.75,385.86 +385.77,389.27,385.6,388.79 +388.75,390.98,387.92,390.39 +390.4,390.4,385.0,387.48 +387.57,387.72,379.99,382.87 +382.85,382.88,379.61,382.88 +382.88,387.18,379.36,387.11 +387.14,390.0,385.44,388.65 +388.66,388.66,385.04,386.54499999999996 +387.14,387.14,380.95,384.44 +384.08,385.99,383.99,384.0 +383.99,387.15,383.83,386.87 +387.12,387.23,383.91,385.64 +385.66,388.29,385.14,387.38 +387.34,387.82,385.47,387.59 +387.62,389.0,383.57,387.64 +387.73,388.13,386.91,387.48 +387.53,388.5,386.87,387.89 +387.89,388.48,385.31,387.21500000000003 +387.79,388.83,385.79,386.54 +386.57,386.57,376.0,380.98 +385.96666666666664,384.31,380.98,382.815 +385.36333333333334,385.47,382.89,384.65 +384.76,385.78,384.73,385.35 +385.24,385.49,383.33,383.47 +383.33,385.05,382.89,383.82 +383.72,384.1,381.67,382.19 +382.15,383.02,378.63,381.67 +381.62,384.0,381.56,383.74 +383.45,385.34,382.86,384.3 +384.3,384.91,380.29,380.53 +380.64,382.94,380.52,381.23 +381.25,381.95,380.0,380.04 +380.04,382.76,379.77,381.27 +381.27,381.27,363.58,371.86 +371.92,375.69,365.64,374.7 +374.66,374.83,370.62,374.44 +374.43,374.44,364.33,366.24 +365.97,367.43,360.8,363.13 +363.12,372.97,363.0,368.85 +368.85,372.46,368.78,371.79 +371.79,373.38,368.88,370.05 +370.05,370.34,366.02,366.12 +366.15,373.97,366.1,373.97 +373.96,374.46,368.21,368.21 +368.22,371.9,367.51,368.53 +368.54,374.37,368.53,373.91 +373.9,373.9,372.21,373.35 +373.35,386.56,373.35,386.55 +386.55,386.96,383.22,383.65 +383.69,383.9,379.65,381.81 +381.8,385.0,380.51,384.15 +384.14,385.0,380.05,380.07 +380.06,380.07,370.0,376.71 +376.74,377.54,375.03,377.53 +377.52,382.76,377.25,381.65 +381.74,382.3,377.25,377.27 +377.95,380.53,375.01,378.48 +378.47,381.0,377.14,380.76 +380.76,382.25,379.69,380.85 +380.85,381.05,379.29,379.64 +379.65,381.04,369.07,374.67 +374.37,377.77,373.48,375.32 +375.32,377.93,375.3,377.69 +377.5,379.0,375.65,375.93 +375.93,378.54,375.13,378.25 +378.47,380.35,377.99,379.81 +379.82,381.91,379.3,380.4 +380.4,382.23,380.4,381.52 +381.54,381.99,375.51,378.43 +378.43,379.54,375.01,375.36 +375.36,377.48,374.15,377.26 +377.22,377.28,374.06,374.59 +374.57,375.27,371.29,373.77 +373.77,373.77,355.12,358.17 +358.12,362.33,353.76,357.91 +357.91,360.0,353.8,354.66 +354.65,360.92,353.81,356.59 +356.54,359.87,353.01,353.92 +353.98,355.0,352.37,353.55 +353.56,354.44,351.16,354.42 +354.4,355.01,343.75,349.0 +349.0,350.0,330.0,336.0 +335.95,337.3,323.66,333.69 +334.49,341.75,322.0,338.69 +338.68,340.99,329.0,329.0 +329.0,332.99,311.0,317.99 +317.0,318.16,293.32,307.44 +307.43,314.61,303.79,314.61 +314.92,322.01,310.72,313.35 +313.63,314.43,308.06,313.69 +313.71,317.34,313.71,314.1 +314.1,314.91,308.92,314.06 +314.05,325.0,312.56,322.64 +322.4,326.99,320.25,326.98 +326.97,326.97,315.38,318.75 +318.58,319.83,315.86,318.5 +318.5,326.72,318.49,325.24 +325.32,325.81,320.42,321.35 +320.92,321.79,310.0,310.74 +310.73,314.38,305.02,311.38 +311.38,312.4,307.5,312.32 +312.04,315.0,310.2,311.31 +311.31,312.98,309.49,310.5 +309.78,315.1,309.78,314.59 +314.59,314.97,310.06,310.98 +310.98,314.65,309.12,309.5 +309.5,309.85,302.42,307.33 +307.17,315.0,304.45,315.0 +315.0,318.12,312.24,317.61 +317.63,321.92,315.05,318.19 +319.99,321.26,317.18,318.77 +319.31,321.5,318.99,321.5 +321.51,321.94,317.99,318.0 +318.0,330.42,317.99,330.42 +330.55,335.01,327.68,329.55 +329.54,334.01,327.6,332.94 +332.99,336.63,332.68,335.25 +335.84,344.99,334.0,340.81 +340.81,343.21,331.14,333.3 +333.29,337.06,331.28,335.71 +335.92,337.39,332.75,331.85 +335.53,335.54,325.25,327.99 +327.64,332.4,325.38,332.2 +332.19,333.0,327.81,329.7 +329.7,329.7,324.64,327.51 +327.55,329.4,325.04,329.4 +329.4,333.29,326.53,328.86 +328.99,330.0,327.6,328.48 +328.48,330.0,326.08,328.0 +328.0,329.0,325.1,326.95 +326.95,333.99,326.95,333.81 +333.76,339.94,333.76,338.22 +338.42,339.99,335.09,339.45 +339.44,343.0,337.94,340.0 +339.885,340.34,335.86,340.33 +340.33,340.88,337.5,340.88 +340.87,342.09,339.39,341.37 +341.39,341.55,338.31,339.36 +340.695,340.61,336.39,339.99 +340.0,340.27,331.0,331.26 +331.88,331.95,327.27,328.09 +328.09,332.94,327.97,331.88 +331.96,332.67,328.66,329.34 +329.91,330.32,326.64,327.54 +327.56,329.67,325.0,328.14 +328.13,337.0,328.03,335.0 +335.02,335.02,331.85,331.85 +331.9,333.66,330.43,333.56 +333.6,333.66,330.5,332.16 +332.0,333.13,331.55,333.01 +333.01,335.17,332.17,332.91 +332.9,333.63,332.25,333.21 +333.33,333.81,331.89,332.17 +332.17,335.49,332.13,333.33 +333.34,339.09,333.31,339.07 +339.07,339.07,335.0,337.5 +337.52,339.0,335.0,335.53 +335.54,335.62,331.94,333.5 +333.12,336.35,332.89,335.17 +335.18,335.75,334.07,335.73 +335.74,337.4,335.18,337.04 +337.01,338.48,335.23,335.23 +336.33,336.66,332.71,333.84 +333.85,336.89,333.85,335.3 +335.53,336.67,334.58,335.89 +335.89,338.0,335.18,335.28 +335.25,336.61,335.2,334.52666666666664 +334.56,336.44,333.04,333.7733333333333 +333.87,334.36,333.0,333.02 +333.02,333.26,329.85,329.85 +329.85,332.51,329.4,331.86 +331.86,334.44,331.73,332.685 +334.08,334.41,333.5,333.51 +333.51,333.64,332.66,333.555 +332.93,333.92,332.03,333.6 +333.23,333.99,333.46,333.53 +333.53,333.99,333.53,333.99 +333.98,334.37,333.15,333.35 +333.37,339.57,330.19,330.19 +330.32,334.71,329.47,334.46 +334.45,334.89,333.59,334.7 +334.7,336.46,334.58,336.26 +336.25,336.39,334.35,335.46 +335.46,335.79,334.98,335.38 +335.38,335.38,332.88,334.08 +334.1,334.94,333.03,334.64 +334.64,335.77,334.21,335.56 +335.56,335.76,334.73,335.49 +335.22,335.77,334.66,335.76 +335.75,335.89,335.39,335.48333333333335 +335.73,335.85,335.18,335.20666666666665 +335.48,335.8,334.4,334.93 +335.23,335.38,334.24,334.85 +334.85,334.85,325.67,325.88 +325.87,335.92,320.73,326.29 +326.28,326.6,320.75,323.3 +323.25,327.58,323.19,327.52 +327.54,327.54,323.97,324.37 +324.36,327.09,324.01,327.04 +326.82,327.1,324.13,324.69 +325.08,326.1,323.05,325.88 +325.88,326.17,321.0,321.01 +321.12,326.02,320.0,321.09 +320.98,324.06,319.89,322.62 +322.61,322.61,321.05,322.27 +322.28,322.28,316.75,317.02 +317.05,320.13,316.12,319.78499999999997 +319.85,322.61,319.03,322.55 +322.54,323.0,318.08,322.86 +322.73,323.0,320.19,322.99 +321.84000000000003,322.99,320.2,320.77 +320.95,322.97,320.36,321.17499999999995 +322.5,322.5,319.85,321.58 +321.56,322.35,320.18,321.7 +321.7,321.92,319.81,321.01 +320.6,320.8,319.8,320.32 +320.29,320.32,319.8,320.32 +320.31,320.99,320.21,320.66 +320.67,321.61,320.56,321.61 +321.61,323.32,321.0,322.24 +322.24,322.99,321.92,322.99 +322.99,334.1,322.0,331.95 +331.92,332.39,329.69,332.0 +331.99,332.0,329.15,330.52 +330.53,331.11,329.17,329.68 +329.65,333.79,329.65,333.07 +333.06,333.06,330.51,330.64 +330.61,333.03,330.41,332.12 +332.18,333.06,330.1,333.06 +333.06,340.0,332.45,339.96 +339.98,339.98,337.3,339.44 +339.43,340.72,337.5,338.19 +338.18,338.53,336.22,336.46 +336.615,336.55,334.81,335.05 +335.05,336.25,334.28,336.25 +335.26,337.53,335.2,335.33 +335.47,335.65,333.21,333.47 +333.48,334.8,333.15,333.82 +333.79,334.04,333.5,333.93 +334.65999999999997,335.61,333.93,335.54 +335.53,338.87,335.53,338.39 +338.38,338.38,332.36,334.32 +334.32,335.48,334.11,335.06 +335.06,335.24,333.21,334.92 +334.97,335.8,334.5,335.59 +335.75,335.8,333.93,335.43 +335.44,337.11,335.44,336.93 +336.92,336.97,334.97,336.65 +336.66,336.87,335.5,336.35 +336.36,336.91,335.85,336.62 +336.65,337.7,334.32,335.5 +335.51,336.74,335.22,336.27 +336.36,336.47,335.56,336.44 +336.44,336.54,335.89,336.32 +336.32,336.5,335.21,335.38 +335.38,335.92,332.99,333.55 +333.56,335.2,333.55,334.31 +334.26,335.16,330.63,330.67 +330.66,332.89,330.0,331.43 +331.44,332.6,331.29,332.0 +332.01,333.5,332.0,332.43 +332.42,332.86,332.42,332.61 +332.59,333.37,332.1,333.03 +333.01,333.46,332.93,333.36 +333.36,334.34,333.33,334.34 +334.34,335.05,333.83,334.93 +334.91,335.98,334.0,334.0 +334.26,334.8,334.0,334.74 +334.315,335.1,332.68,334.33 +334.37,334.65,332.77,334.5 +334.45,334.84,333.36,334.67 +334.71,335.42,334.49,334.93 +334.93,335.26,334.83,335.26 +335.25,336.57,334.74,336.57 +336.57,338.0,336.04,336.5 +336.5,336.89,335.07,335.62 +335.62,336.38,335.2,336.14 +336.2,336.2,333.75,334.02 +334.03,334.96,333.91,334.23 +334.23,335.02,333.83,334.71 +334.71,334.99,333.86,334.23 +334.22,334.36,333.71,333.91 +334.01,334.73,334.01,334.64 +334.245,334.68,334.2,334.39 +334.48,334.58,334.48,334.58 +334.555,334.63,334.55,334.63 +334.63,334.69,334.55,334.68 +334.69,335.28,334.55,334.83 +334.83,335.07,327.0,327.67 +328.02,328.9,326.27,327.96 +327.97,329.41,327.19,327.86 +327.75,328.0,327.0,327.0 +326.94,327.42,325.0,326.76 +326.76,328.0,326.75,327.99 +328.0,329.29,327.87,328.94 +328.78,328.81,327.55,328.25 +328.26,329.0,328.01,329.0 +329.0,329.46,326.98,327.11 +327.16,327.72,326.5,326.5 +326.54,327.12,324.9,326.39 +326.41,326.97,320.83,322.26 +322.28,322.51,311.23,314.06 +314.06,317.16,311.86,316.04 +315.97,318.83,314.02,315.07 +315.12,317.18,314.66,317.0 +317.0,317.61,315.13,315.59 +315.65,319.54,315.52,319.24 +319.26,319.75,316.38,317.07 +316.51,319.08,316.51,318.41 +319.08500000000004,321.67,318.7,321.66 +321.66,323.08,319.65,320.67 +320.67,324.06,320.66,324.06 +324.06,325.0,322.8,324.27 +324.26,324.26,321.52,323.99 +323.84,324.58,322.39,322.87 +322.9,323.38,321.75,321.91 +321.9,321.99,319.66,320.98 +320.98,322.5,320.98,322.26 +322.26,322.26,319.82,320.02 +320.01,321.0,318.95,319.95 +319.93,321.97,319.02,321.81 +321.62,323.0,321.12,322.0 +322.0,322.21,321.33,321.8 +321.8,322.96,321.42,322.18 +322.18,322.19,318.31,319.03 +319.04,320.8,316.33,320.28 +320.2,321.48,319.97,320.88 +320.78,322.0,320.48,321.05 +321.0,322.05,320.25,321.5 +321.43,325.99,321.43,325.94 +325.94,327.0,325.91,327.0 +326.89,328.0,326.36,326.71 +326.74,327.73,326.45,327.48 +327.48,328.0,326.85,327.99 +328.0,328.0,327.99,327.45500000000004 +328.0,328.0,326.92,326.92 +326.94,327.59,324.72,327.17 +327.18,327.18,325.37,325.66 +325.65,325.84,323.2,323.97 +325.28499999999997,325.0,324.02,324.92 +324.92,325.74,324.7,325.47 +325.47,325.69,325.47,325.67 +325.69,325.7,325.06,325.45 +325.43,325.43,323.26,324.22 +324.23,325.0,324.22,324.78 +324.96,325.77,324.76,325.77 +325.77,325.8,325.02,325.24 +325.24,327.0,325.12,326.99 +326.99,327.0,326.34,326.5 +326.5,326.91,326.29,326.69 +326.49,326.76,326.09,326.24 +326.28,326.67,326.11,326.37 +326.37,326.98,325.96,326.105 +326.105,326.92,325.83,325.84 +325.84,325.84,325.01,325.21 +325.2,326.24,325.14,326.18 +324.7733333333333,326.5,325.98,326.21 +324.34666666666664,326.2,325.54,325.98 +323.91999999999996,325.98,325.51,324.32500000000005 +323.49333333333334,326.13,322.52,322.67 +323.06666666666666,323.01,322.4,322.64 +322.64,322.73,321.0,321.11 +321.11,322.6,321.01,322.43 +322.43,322.52,321.85,322.47 +322.45,322.62,321.22,322.3 +322.26,323.02,322.2,322.92 +322.92,323.53,322.83,323.51 +323.51,323.52,322.26,322.93 +322.95,323.49,322.84,323.28 +323.48,325.05,323.36,324.89 +324.9,324.9,323.43,323.75 +323.73,323.77,323.38,323.72 +323.73,323.97,323.35,323.62 +323.53,323.53,322.87,323.28 +323.23,324.17,323.03,323.03 +323.03,323.23,323.0,323.05 +323.04,323.26,322.5,322.5 +322.64,323.04,322.45,322.65 +322.69,323.05,322.45,322.73 +322.73,322.73,322.0,322.01 +322.01,322.54,322.0,322.36 +322.31,322.65,322.02,323.20000000000005 +323.16999999999996,324.04,322.38,324.04 +324.03,324.1,324.03,324.09 +324.04,324.39,324.04,324.12 +324.12,324.13,324.12,324.12 +324.12,326.0,323.71,325.67 +325.65,325.65,324.23,324.57 +324.57,324.78,323.84,324.01 +323.93,324.69,323.85,324.44 +324.44,324.5,323.8,323.98 +323.93,324.15,323.93,324.12 +324.05,324.13,324.0,324.13 +324.13,324.42,324.07,324.07 +324.14,324.16,322.76,322.79 +322.79,323.01,322.74,322.95 +322.99,323.01,322.0,322.23 +322.24,322.36,320.0,320.0 +320.0,320.81,318.0,320.51 +320.51,321.68,320.19,320.8 +320.76,321.21,320.18,320.21 +320.21,321.9,319.98,321.28999999999996 +321.83,322.42,321.47,322.37 +322.38,322.65,321.65,321.65 +321.66,322.12,321.07,321.72 +321.525,322.35,321.38,322.0475 +321.39,323.15,321.36,322.375 +322.07,323.14,322.44,322.7025 +322.75,323.17,322.26,323.03 +323.05,323.06,321.77,321.77 +321.77,321.99,321.63,321.89 +321.9,322.0,321.73,321.8 +321.76,322.0,321.58,321.96 +321.99,322.0,321.74,321.89 +321.89,322.0,321.35,321.54 +321.51,321.69,320.0,320.66 +320.57,320.82,319.87,320.18 +320.15,321.74,320.11,320.49 +320.49,320.85,320.06,320.21 +320.25,321.29,319.48,321.04 +321.03,321.23,319.73,320.85 +320.85,321.0,319.0,319.02 +319.01,319.01,318.0,318.33 +318.23,319.58,316.26,318.7 +318.66,318.87,317.91,318.68 +318.7,319.12,318.23,318.95 +318.95,319.64,318.94,319.01 +318.96500000000003,319.09,318.17,318.98 +318.98,318.98,318.62,318.98 +318.98,318.98,318.18,318.85 +318.86,318.98,318.44,318.87 +318.82,327.76,318.67,326.67 +326.83,327.01,325.25,326.19 +326.18,326.19,325.29,325.38 +325.37,325.37,324.49,324.53 +324.52,325.27,324.07,325.17 +325.17,325.88,324.96,325.76 +325.79,325.88,324.99,325.31 +325.3,325.31,324.9,325.22 +325.22,328.29,324.82,328.28 +328.29,330.06,328.27,330.02 +328.415,330.06,327.46,328.54 +328.54,328.95,327.65,328.02 +328.06,328.99,328.02,328.99 +328.99,334.36,328.98,331.5 +331.5,332.29,330.65,332.29 +332.27,332.86,331.59,331.65 +331.65,332.28,331.64,332.28 +332.28,334.0,332.27,333.95 +333.87,333.99,332.0,332.12 +332.43,333.99,332.43,333.98 +333.99,337.01,333.91,336.98 +336.97,341.0,336.9,341.0 +340.74,343.8,338.0,343.8 +343.8,349.75,343.8,347.21 +347.21,358.0,347.21,357.99 +358.0,368.18,350.71,357.06 +356.36,358.02,349.88,353.44 +353.41,354.79,350.0,350.29 +350.25,351.46,340.49,345.91 +345.5,348.17,339.96,348.13 +348.13,348.63,344.86,348.23 +348.21,350.46,347.4,348.89 +348.89,348.89,341.65,344.52 +344.52,347.74,343.96,346.63 +346.63,350.03,345.89,348.78 +348.78,354.73,348.65,354.51 +354.51,357.31,350.2,352.21 +352.21,353.65,350.0,350.02 +350.0,354.99,349.71,354.12 +354.22,354.58,351.02,353.01 +353.0,353.19,347.96,348.0 +348.0,352.0,347.97,351.99 +351.99,352.78,350.26,352.46 +352.46,352.68,351.19,351.87 +351.86,354.95,348.04,354.95 +354.41,360.0,354.41,359.99 +360.0,362.0,355.66,359.27 +359.84,364.46,355.91,361.29 +361.37,363.03,352.0,356.34 +356.34,359.35,353.53,359.28 +359.29,359.67,355.27,359.58 +359.57,359.94,351.58,352.69 +352.69,356.55,352.34,356.3 +356.35,360.0,354.58,358.81 +358.83,359.18,357.2,358.03 +357.97,359.88,357.9,359.13 +359.23,359.24,356.67,357.34 +357.34,360.46,357.24,359.54 +359.8,361.07,358.93,359.0 +358.99,359.13,358.27,359.02 +359.02,360.0,355.0,355.0 +354.96,355.97,351.09,355.33 +355.32,357.0,354.47,356.4 +356.4,356.69,355.0,355.0 +355.11,355.13,353.3,355.0 +354.99,356.0,354.63,355.57 +355.56,359.63,353.0,357.69 +357.8,357.81,352.0,357.11 +357.08,357.64,355.98,357.61 +356.66499999999996,358.12,356.18,355.315 +356.25,356.25,352.8,353.02 +355.75333333333333,355.99,353.01,353.89 +355.25666666666666,355.27,354.26,354.76 +354.76,355.17,352.0,352.37 +352.28,353.91,352.03,352.69 +352.73,355.08,352.0,354.35 +354.38,354.91,352.64,354.77 +354.86,356.46,354.41,355.3 +354.85,355.38,354.02,354.92 +354.84,354.93,354.32,354.77 +354.77,356.0,354.57,355.99 +355.96,356.75,354.12,356.24 +356.24,356.24,355.0,355.69 +355.67,355.81,355.02,355.19 +355.18,357.26,355.18,357.14 +357.16,358.2,356.19,356.69 +356.61,356.7,356.26,356.69 +356.68,356.75,355.75,356.05 +356.05,356.9,356.0,356.15 +355.795,356.31,354.66,355.58 +355.54,356.13,354.69,355.41 +355.43,356.73,354.26,356.0 +355.98,356.5,354.61,356.44 +356.515,358.52,356.42,357.05 +357.05,357.12,356.14,357.045 +357.055,357.21,356.47,357.04 +357.06,365.0,357.06,364.15 +364.15,364.17,362.49,363.77 +363.78,364.5,361.0,361.1 +361.11,362.51,361.11,361.95 +361.96,362.28,361.28,362.28 +362.29,363.22,362.15,362.45 +362.45,364.19,362.44,364.04 +364.03,364.04,363.0,363.04 +363.03,363.51,363.0,363.51 +363.51,365.0,363.5,365.0 +365.0,367.98,364.28,367.85 +367.84,373.63,367.84,370.71 +370.64,373.16,367.0,371.77 +371.94,377.57,370.29,377.57 +377.63,378.05,375.52,377.04 +377.03,379.56,372.12,376.47 +376.46,377.38,373.52,377.38 +377.38,377.38,376.03,376.44 +376.43,378.01,376.1,378.01 +378.0,382.33,378.0,382.32 +382.33,382.33,377.0,379.44 +379.44,381.49,376.88,381.49 +381.5,382.87,377.55,377.66 +377.73,381.58,377.72,379.81 +379.82,380.74,377.22,378.76 +378.76,379.42,377.45,377.45 +377.44,378.15,373.63,375.16 +375.15,375.15,367.5,372.88 +372.88,374.29,371.93,373.16 +373.16,373.95,371.0,372.62 +372.64,374.0,371.24,372.83 +372.83,375.19,372.25,374.85 +374.91,376.97,374.79,374.98 +374.97,376.93,374.45,376.73 +376.67,376.75,372.25,375.0 +375.0,378.55,374.82,378.02 +378.01,378.3,376.62,378.11 +377.88,378.55,376.0,377.62 +377.48,377.89,375.8,377.03 +377.33,377.82,376.05,376.82 +376.82,377.86,376.82,377.7 +377.7,378.94,377.15,378.59 +378.6,378.72,377.29,377.29 +377.32,377.65,376.69,377.54 +377.54,378.54,376.85,376.85 +377.72,377.73,361.21,365.7 +365.7,366.58,364.84,366.39 +366.39,366.4,354.6,357.73 +357.95,361.48,357.23,360.42 +360.41,363.2,360.06,362.53 +362.53,363.18,361.84,362.01 +362.01,363.92,360.48,363.54 +363.53,364.86,363.53,364.62 +364.61,364.62,359.52,359.52 +359.64,360.63,355.0,359.56 +359.52,364.0,359.05,363.58 +363.58,364.1,360.95,361.09 +361.18,363.76,361.18,363.17 +363.17,363.21,359.97,360.5 +360.5,363.59,360.5,362.96 +363.01,363.01,360.85,362.27 +362.27,362.27,350.0,350.0 +350.01,353.04,347.55,349.86 +349.85,352.58,349.68,352.5 +352.5,352.73,351.77,352.24 +352.23,352.86,350.4,352.86 +352.94,354.96,352.94,354.36 +354.36,354.62,353.89,353.96 +354.755,355.15,351.29,355.14 +355.15,356.03,353.18,354.74 +354.74,354.84,351.67,351.69 +351.66,353.47,351.32,353.41 +352.32000000000005,353.66,351.5,352.89 +352.98,353.22,351.6,352.57 +352.57,353.04,352.12,352.93 +352.92,359.0,352.91,358.91 +358.94,360.03,357.44,359.73 +359.68,359.97,358.74,359.12 +359.0,363.06,358.99,361.27 +361.19,361.19,358.38,359.06 +359.19,359.49,358.0,358.47 +358.8,361.36,358.68,360.97 +360.96,360.97,358.7,360.92 +360.92,360.93,359.2,360.3 +360.21,360.5,359.32,359.41 +359.41,359.72,358.68,359.5 +359.4,360.79,359.01,360.79 +360.78,366.0,360.46,366.0 +365.99,366.9,364.36,366.87 +366.9,369.99,366.73,367.45 +367.44,369.23,367.35,369.23 +369.3,369.98,361.93,365.14 +365.17,366.09,362.62,363.96500000000003 +363.985,363.03,360.94,362.79 +362.8,365.0,362.16,363.58 +363.59,364.06,356.52,359.84 +359.83,363.21,358.53,361.05 +361.12,363.0,359.13,361.57 +361.43,363.14,360.46,360.46 +360.95,363.49,360.91,362.46 +362.33,362.33,358.04,361.04 +361.03,361.96,359.13,361.09 +361.09,363.32,361.09,363.28 +363.28,364.55,362.27,364.38 +364.34,364.56,363.13,363.84 +363.85,364.22,362.24,362.53 +362.83,363.0,360.1,360.53 +360.5,362.23,360.11,361.72 +361.65,362.51,360.79,361.63 +361.62,362.81,361.32,362.46 +362.34,362.45,356.4,356.4 +356.4,358.86,355.43,358.78 +358.78,360.22,358.4,359.88 +359.88,360.55,359.83,360.16 +360.17,361.5,358.82,359.41 +359.41,360.18,358.68,358.69 +359.46000000000004,360.45,358.53,359.41 +359.51,360.59,358.6,360.59 +360.59,360.69,360.11,360.53 +360.58,360.69,359.22,360.47 +360.54,360.69,358.41,359.74 +359.74,360.69,359.74,360.69 +360.69,361.63,359.75,360.93 +360.93,364.85,360.9,364.27 +364.21,364.27,362.51,363.16 +363.16,363.96,362.37,362.99 +362.99,363.78,361.02,361.18 +361.19,362.98,361.14,362.64 +362.67,363.39,362.41,363.25 +363.25,363.25,361.3,361.31 +361.33,364.29,361.05,363.88 +363.96,363.96,361.92,362.42 +362.41,364.29,362.41,364.29 +364.29,365.98,364.23,365.11 +365.12,369.98,365.11,369.44 +369.44,369.44,368.12,368.4 +368.41,371.24,368.39,370.65 +370.68,374.0,370.65,372.46 +372.46,372.62,368.74,371.24 +371.85,371.24,371.23,371.24 +371.24,372.18,370.36,371.67 +370.55,372.2,370.55,372.1 +372.0,374.5,371.4,374.41 +374.41,379.5,373.41,378.39 +378.39,383.0,378.38,383.0 +382.99,382.99,376.5,378.29 +378.3,378.93,373.64,373.94 +373.87,379.63,373.57,377.54 +377.54,379.78,377.26,378.11 +378.46000000000004,379.52,377.93,379.41 +379.38,379.91,377.0,377.84 +377.81,378.74,377.47,377.72 +377.82,379.25,377.15,378.5 +378.5,378.5,376.0,377.07 +377.05,378.36,377.01,377.08 +377.05,390.0,376.43,388.57 +388.57,390.0,386.61,388.5 +388.49,397.0,388.03,391.14 +391.73,396.0,390.63,392.56 +392.57,393.99,387.0,392.13 +392.12,395.21,390.17,393.25 +393.25,397.0,392.03,396.89 +397.0,401.01,396.32,397.76 +397.76,398.0,396.0,396.51 +396.77,396.77,386.1,389.64 +389.64,395.23,388.0,394.96 +394.97,394.97,389.88,390.09 +390.09,391.97,385.0,390.55 +390.72,391.14,388.48,389.88 +387.36,389.89,383.51,384.0 +384.0,388.44,375.22,386.0 +386.3,389.87,384.33,389.83 +389.65,393.84,385.0,390.46 +390.13,394.36,388.0,393.79 +393.76,394.45,387.0,389.99 +390.1,393.97,389.4,393.96 +393.97,397.86,390.59,392.17 +392.16,395.66,391.0,394.95 +394.95,395.48,392.0,394.79 +394.84,394.93,392.01,392.83 +392.78,394.0,386.0,388.29 +388.29,388.49,383.0,388.15 +388.15,391.0,388.12,389.0 +389.0,392.84,388.99,391.96 +392.0,392.24,389.42,390.0 +390.02,391.22,387.64,388.24 +388.5,389.0,385.01,388.48 +388.93,390.75,385.11,389.86 +389.8,391.0,386.31,390.94 +390.49,391.0,386.0,391.78999999999996 +391.56,392.64,388.33,392.64 +392.63,394.0,388.11,392.04 +391.93,394.83,388.22,393.92 +393.92,397.57,385.0,397.04 +397.04,397.08,388.7,395.61 +395.96500000000003,396.0,389.0,394.9 +394.89,397.0,390.14,393.06 +393.17,395.99,392.0,393.7 +393.7,395.0,393.0,394.18 +394.16,397.0,393.41,396.09 +396.02,396.97,393.42,394.5 +394.49,394.97,390.05,392.59 +392.54,396.0,392.17,394.67 +394.79,396.0,391.0,394.26 +394.78,395.88,390.18,394.75 +394.65999999999997,395.0,391.46,394.41 +394.54,394.68,392.21,393.98 +393.98,394.2,391.13,393.0 +393.01,395.35,393.0,395.35 +395.33,395.77,394.5,395.0 +395.0,395.0,390.5,390.5 +390.52,393.85,387.51,393.18 +393.42,393.96,392.23,393.05 +393.06,395.88,392.23,395.21 +395.22,396.0,395.21,395.98 +395.98,395.98,386.69,395.4 +395.3,396.0,393.82,395.81 +395.82,396.0,392.44,395.61 +395.6,396.0,393.09,396.0 +396.0,396.0,394.5,394.54 +394.53,395.95,393.0,393.59 +393.58,395.0,393.45,394.06 +394.35,395.72,393.81,394.53 +394.94,395.0,394.01,395.0 +394.99,395.79,393.8,395.26 +395.08,395.78,393.76,395.47 +395.48,396.3,394.0,396.3 +396.29,396.29,393.55,396.07 +396.07,418.99,395.25,414.99 +415.01,416.0,410.53,415.86 +415.86,415.94,406.27,413.55 +413.55,419.0,413.45,416.0 +415.99,420.0,412.0,416.98 +416.92,418.7,412.0,415.1 +415.09,418.94,412.51,417.87 +417.87,425.0,412.42,417.85 +417.88,419.3,414.14,415.69 +415.78,419.1,412.04,418.22 +418.24,419.01,415.78,417.45 +417.39,420.0,416.96,419.25 +419.2,420.0,415.62,420.0 +419.97,420.0,412.0,417.57 +417.66,420.0,414.94,419.99 +419.98,420.0,417.74,418.0 +418.04,418.5,411.8,411.8 +411.8,413.75,401.0,401.0 +402.85,412.22,401.0,411.73 +411.69,413.94,404.5,411.83 +411.82,413.7,405.73,411.93 +411.71,412.98,410.69,412.04 +412.03,417.2,411.04,416.34 +416.36,418.0,415.01,417.99 +417.95,418.5,416.59,418.35 +418.45,419.5,414.87,415.71 +415.61,417.53,414.82,414.82 +414.82,416.15,414.12,416.15 +416.13,416.14,414.12,414.72 +414.75,414.97,414.21,414.55 +414.72,414.97,411.5,411.71 +411.72,413.34,411.71,412.59 +412.6,413.6,411.3,412.94 +412.95,414.96,412.62,414.95 +413.81,415.0,414.46,414.52 +414.67,415.68,414.25,414.7 +414.68,414.68,413.18,414.14 +414.15,417.2,413.5,417.2 +417.2,418.45,417.18,418.29 +418.26,418.36,417.23,417.53 +417.64,417.66,413.43,414.39 +414.41,415.74,414.25,415.21 +415.21,416.38,414.75,416.27 +416.27,416.37,415.44,415.99 +415.99,415.99,408.0,414.65 +414.66,416.0,413.87,414.98 +414.99,417.47,414.5,417.06 +417.05,418.53,415.39,416.64 +416.65,417.06,415.67,415.79 +415.77,417.53,415.77,416.9 +416.9,419.95,416.22,419.12 +419.18,421.0,418.49,420.57 +420.98,423.27,420.98,423.15 +423.19,425.0,423.13,424.54 +424.51,425.3,420.79,421.88 +421.87,422.25,420.9,422.23 +422.22,422.87,420.57,422.86 +422.89,434.69,422.74,433.14 +433.15,434.29,431.17,434.29 +435.565,438.0,432.14,437.99 +437.98,438.0,433.14,434.0 +433.99,436.05,433.99,435.5 +435.49,435.99,432.01,435.78 +435.78,435.78,433.1,433.2 +433.12,435.82,433.1,435.48 +435.51,439.56,435.48,436.9 +436.9,441.16,436.1,440.945 +439.94,445.0,439.37,444.99 +444.54,448.95,442.13,444.99 +444.99,452.73,444.25,448.31 +448.06,450.61,444.44,449.0 +448.99,449.45,443.57,448.12 +448.12,453.13,448.0,449.37 +449.46,453.0,449.41,451.36 +451.71,454.96,442.38,453.57 +453.29,468.27,446.0,465.0 +465.07,469.34,461.96,465.82 +465.78,465.78,421.37,434.06 +434.02,434.02,403.0,410.79 +410.79,426.41,410.79,422.44 +422.44,431.42,421.44,427.14 +430.14,430.25,420.92,421.35 +421.34,425.86,420.97,424.95 +425.24,436.62,425.16,431.26 +431.25,435.23,430.0,432.71 +432.71,437.16,430.05,430.39 +430.39,431.42,420.46,425.1 +425.03,428.08,424.15,424.6 +424.28,426.56,423.36,425.61 +424.58,432.17,424.56,429.2 +429.19,431.81,427.49,428.77 +428.77,429.03,424.46,427.3 +427.0,430.3,426.69,427.48 +427.47,429.12,424.2,426.85 +426.85,427.91,424.79,427.44 +427.45,433.4,425.36,432.84 +432.82,438.13,432.58,432.88 +432.91,437.42,432.91,436.61 +436.62,437.55,434.01,437.38 +435.13,438.15,435.13,438.15 +438.15,439.01,419.42,424.43 +424.43,433.15,424.43,431.43 +431.44,434.99,429.96,432.34 +432.35,434.82,432.35,433.33 +433.37,433.99,432.63,433.245 +433.39,436.19,433.16,433.16 +434.12,435.18,433.32,434.22 +434.19,434.28,432.53,433.85 +433.86,435.37,433.86,434.75 +434.71333333333337,435.97,433.73,435.65 +435.56666666666666,436.81,434.65,436.45 +436.42,441.23,436.23,439.71 +439.75,441.18,435.0,438.35 +438.19,441.09,437.51,440.52 +440.45,440.68,438.3,440.54 +440.53,440.78,439.44,439.63 +439.45,442.06,439.39,441.98 +441.98,443.83,438.2,440.09 +439.71,439.71,432.1,435.99 +435.99,436.58,434.49,435.73 +435.84,437.24,429.12,429.79 +429.81,437.08,429.32,436.62 +436.42,437.68,435.01,436.87 +436.86,438.93,435.05,438.05 +438.04,438.99,437.23,437.9 +437.9,438.5,436.81,438.1 +438.25,439.32,437.87,438.11 +438.12,439.09,437.76,439.07 +439.07,439.13,438.69,438.82 +438.83,439.79,437.92,439.62 +439.72,445.42,434.91,439.5 +440.49,448.06,435.55,445.42 +445.42,450.0,435.0,441.5 +441.75,447.25,441.03,444.53 +445.0,446.65,441.77,443.6 +443.95,447.0,441.03,445.54 +445.59,448.24,439.0,446.40999999999997 +443.04,447.8,443.04,447.28 +447.29,447.29,446.11,446.11 +446.755,446.34,445.76,446.27 +446.22,446.25,435.61,440.85 +440.84,446.0,440.84,445.97 +445.97,446.0,440.36,440.52 +440.52,443.5,440.52,442.28 +442.35,444.55,441.35,444.41 +444.43,452.73,444.19,450.66 +450.64,451.99,447.85,451.06 +451.05,458.8,450.5,457.95 +458.02,458.19,451.0,453.15 +453.44,453.99,451.02,453.72 +453.71,456.54,452.91,454.94 +454.93,460.0,454.93,459.45 +459.3,460.0,456.07,459.88 +459.87,459.87,456.57,458.33 +458.29,458.51,453.42,453.81 +453.78,455.48,452.37,455.3 +455.03,455.77,454.01,454.49 +454.48,455.85,452.37,453.93 +453.92,459.76,453.92,458.2 +458.28,458.35,456.87,458.0 +457.99,461.88,457.99,460.82 +460.82,463.63,460.52,462.04 +462.04,462.04,457.99,459.83 +459.99,461.13,458.71,458.74 +458.73,460.6,456.92,460.4 +460.6,460.6,458.5,460.1 +459.98,462.7,459.98,461.58 +461.56,464.67,460.61,461.02 +461.02,464.95,460.92,463.83 +464.18,464.18,458.03,463.46 +463.45,463.61,457.5,461.68 +461.82,463.32,460.57,462.07 +462.43,463.17,440.0,440.11 +440.12,453.93,440.12,448.15 +448.13,453.85,447.67,452.71 +452.71,453.06,449.29,453.01 +453.01,455.2,453.01,454.92 +455.08,457.0,453.34,456.58 +456.57,461.11,454.27,459.11 +459.12,459.24,454.66,457.7 +457.47,460.47,454.65,459.07 +459.06,459.13,455.32,456.58 +456.56,457.24,450.59,452.39 +452.33,454.96,448.91,454.01 +453.99,456.44,452.01,455.96 +455.97,457.62,452.1,453.52 +453.46,454.5,451.2,453.94 +453.94,453.94,452.03,452.97 +452.97,456.0,445.48,454.55 +454.38,454.53,451.19,453.8 +453.8,456.2,452.55,455.37 +455.63,455.97,452.2,453.34 +453.34,453.97,452.2,453.51 +453.58,453.87,451.12,451.36 +451.36,451.95,447.0,450.2 +450.28,450.89,448.09,449.07 +449.15,449.82,446.01,449.82 +449.82,452.81,449.4,452.77 +452.76,455.97,452.76,454.49 +454.5,454.5,453.27,454.18 +454.19,454.49,452.96,453.44 +453.42,454.64,452.03,454.5 +454.52,455.5,454.01,455.5 +455.5,456.0,455.19,455.24 +456.0,456.0,454.73,454.98 +454.98,455.99,454.23,455.55 +455.47,455.56,454.59,455.54 +455.54,456.0,454.81,455.99 +455.99,456.33,455.67,456.12 +456.1,456.14,455.01,455.37 +455.37,455.37,452.83,453.42 +453.43,454.23,452.63,453.98 +453.99,454.0,451.01,452.3 +452.3,453.84,451.98,453.13 +453.13,455.0,453.13,454.46 +453.5175,455.0,454.45,454.30499999999995 +453.905,455.5,455.0,454.15 +454.2925,455.0,454.34,453.995 +454.68,454.68,453.33,453.84 +455.1,455.63,453.43,455.15 +455.52,455.54,455.43,455.455 +455.635,455.76,455.45,455.76 +455.75,463.03,455.75,460.11 +459.46000000000004,464.0,460.11,463.17 +463.17,464.25,462.01,464.24 +464.25,465.1,453.28,463.29200000000003 +463.186,459.34,457.72,462.344 +462.122,459.49,459.14,461.396 +461.058,459.46,458.18,460.448 +459.994,459.5,457.77,459.5 +458.93,460.15,458.91,459.655 +460.16,460.16,459.81,459.81 +460.10333333333335,459.8,458.89,459.87 +460.0466666666667,459.99,459.0,459.93 +459.99,460.01,459.98,459.99 +459.72,460.0,459.41,460.495 +459.45,461.0,459.29,461.0 +460.99,463.99,460.99,463.99 +463.98,463.99,461.22,462.02 +461.98,464.13,461.91,464.13 +464.07,464.16,462.02,463.01 +462.94,464.75,462.8,464.74 +464.75,465.0,463.85,463.9 +463.98,464.0,463.0,463.86 +463.97,464.0,462.94,463.97 +463.96,464.3,463.89,464.3 +464.29,464.99,463.36,464.01 +464.175,464.74,464.05,464.08 +464.06,464.08,460.01,464.02666666666664 +463.69,464.33,463.02,463.97333333333336 +463.32,463.97,463.31,463.92 +463.73,464.0,463.69,464.315 +464.14,465.0,463.79,464.71 +464.55,465.6,463.79,463.54999999999995 +463.85,464.38,462.32,462.39 +462.39,463.7,462.2,463.53 +463.55,463.75,460.0,460.12 +460.12,461.02,451.58,458.91 +458.88,460.91,457.95,459.41 +460.74,460.81,457.23,459.91 +459.99,460.87,459.26,460.59 +460.59,460.86,459.1,459.58 +459.58,460.6,459.55,460.6 +460.6,461.35,460.59,460.66 +460.77,461.4,460.47,461.29 +461.29,461.29,461.1,461.29 +461.28,461.3,459.43,460.45 +460.48,460.58,456.12,459.24 +459.3,459.97,458.38,459.57 +459.58,459.61,458.05,458.42 +458.3,459.3,458.07,459.0 +459.06,459.61,459.06,459.59 +459.58,459.58,458.77,458.77 +458.67,459.61,458.55,459.61 +459.61,459.61,459.6,459.61 +459.61,459.61,458.72,459.4 +459.42,459.51,457.25,457.28 +457.22,457.22,455.0,455.13 +455.12,456.53,455.12,455.89 +452.75,456.07,449.79,450.37 +450.38,453.53,450.35,451.36 +451.34,451.34,438.62,444.98 +444.97,445.52,431.12,431.13 +431.21,443.39,430.0,440.56 +439.68,442.22,436.34,440.3 +440.32,443.99,438.91,439.47 +439.37,442.0,437.54,439.95 +439.95,442.0,439.14,440.88 +441.0,442.55,440.5,442.5 +442.34,442.49,424.66,426.0 +426.03,431.58,426.03,430.42 +429.76,432.57,429.22,431.43 +431.38,435.0,430.27,433.9 +433.9,437.22,433.34,436.63 +436.91,438.68,433.38,436.31 +435.76,436.78,434.32,436.63 +436.62,436.83,434.51,436.79 +436.78333333333336,437.57,434.53,436.95 +436.94666666666666,437.44,435.1,437.11 +437.11,444.44,437.08,440.61 +440.61,444.44,442.57,444.11 +444.11,444.11,439.53,439.89 +439.89,441.88,439.89,441.62 +441.74,442.07,435.0,438.94 +434.97,437.99,433.53,436.26 +436.1766666666667,438.0,436.27,438.0 +437.3833333333333,439.24,437.99,438.55 +438.59,438.93,433.35,434.28 +434.29,437.83,434.29,436.3 +436.33,436.93,433.26,433.58 +433.59,435.0,433.3,433.52 +433.5,437.0,432.91,436.33 +436.33,437.98,435.56,435.74 +435.72,438.7,435.51,438.0 +437.97,440.09,437.97,438.87 +439.08,439.1,436.0,437.54 +437.59,438.42,437.1,437.25 +437.24,437.97,437.21,437.94 +437.93,437.93,435.98,436.8 +436.81,437.66,436.66,437.37 +437.38,440.45,437.37,439.66 +439.66,441.69,439.65,441.03 +441.03,441.91,439.72,441.88 +441.91,442.0,437.32,437.74 +437.74,440.3,437.74,439.97 +439.97,439.97,438.3,438.83 +438.83,438.83,433.0,433.21 +433.18,435.56,433.18,434.7 +434.65,436.19,433.96,436.19 +436.19,436.91,436.18,436.91 +436.9,436.9,434.38,435.37 +435.825,435.61,434.23,434.76 +434.75,435.13,434.0,434.0 +434.01,436.01,432.58,435.28 +435.34,436.15,434.98,436.14 +436.14,437.85,433.08,434.72 +434.82,435.27,433.67,434.36 +433.97,436.32,433.42,435.43 +435.2,435.25,428.29,432.98 +432.98,436.08,432.98,436.08 +436.1,436.98,435.68,436.69 +436.7,437.27,435.88,437.03 +437.03,437.8,436.91,437.79 +437.78,437.99,437.61,437.92 +437.96,437.96,436.62,437.04 +436.92,437.94,436.63,437.83 +437.83,438.0,434.52,437.4 +436.87,437.0,435.31,436.97 +436.97,438.73,436.33,438.72 +438.46,439.1,435.0,438.18 +438.14,439.99,438.01,439.08 +439.08,440.37,438.9,440.34 +440.33,440.48,436.18,438.99 +438.91,439.95,438.02,439.58 +439.66,441.68,439.54,441.0 +441.0,444.57,440.99,444.28 +444.34,444.4,443.0,443.83 +443.85,445.0,443.46,444.52 +444.51,445.0,444.15,445.0 +445.0,445.11,442.35,443.17 +443.18,443.85,442.0,443.44 +443.48,445.56,442.79,445.56 +445.55,448.4,445.55,448.09 +448.08,456.99,448.07,456.65 +456.06,458.87,455.12,457.52 +457.53,457.53,453.02,455.44 +455.54,457.1,455.44,455.59 +455.55,456.22,455.33,456.22 +456.0,456.95,455.65,456.52 +456.45,458.84,455.69,458.36 +458.36,460.0,457.48,458.36 +458.36,458.61,457.61,457.7 +457.69,457.69,456.75,457.61 +457.61,457.62,453.57,454.39 +454.37,456.82,454.07,456.82 +456.33,457.58,456.33,457.58 +457.54,457.79,456.14,457.44 +457.08,458.51,457.08,457.76 +457.75,457.81,455.73,455.73 +455.73,455.74,453.37,454.16 +454.13,454.73,453.25,454.66 +454.66,454.72,453.01,453.13 +453.1,453.79,452.72,454.41999999999996 +452.79,455.97,452.72,455.71 +455.84,456.0,455.71,455.89 +456.91499999999996,458.0,455.9,458.0 +457.99,458.7,457.99,458.62 +458.62,458.83,456.92,457.09 +457.1,458.43,456.08,456.35 +456.36,458.96,456.36,458.7 +458.71,458.99,458.12,458.74 +458.74,458.9,457.49,457.9 +457.9,458.91,450.01,450.71 +450.85,455.38,450.85,453.51 +453.51,454.57,453.37,453.6 +453.25,453.7,452.62,453.69 +452.99,454.09,452.7,452.73 +452.73,452.74,451.29,451.7 +451.69,452.7,451.69,452.67 +453.02,454.48,452.6,454.48 +454.35,454.69,453.56,453.62 +454.34000000000003,454.37,453.57,454.34 +454.33,455.21,454.01,455.21 +455.22,456.18,455.22,455.77 +455.81,455.98,455.25,455.44 +455.44,455.98,455.26,455.85 +455.71500000000003,456.0,455.77,455.99 +455.99,456.3,455.67,455.85 +455.86,456.13,455.6,455.62 +455.61,458.29,455.53,457.35 +457.35,457.5,455.87,455.95 +455.95,455.95,452.34,455.38 +455.38,455.61,445.29,449.58 +449.58,449.58,442.79,446.23 +446.23,446.23,440.54,444.66 +444.67,444.67,442.06,442.76 +442.74,443.0,442.57,442.99 +442.98,442.99,438.21,438.9 +438.91,438.91,435.0,435.04 +435.0,442.56,420.62,429.87 +429.87,430.79,424.0,426.36 +425.89,428.81,418.97,428.3 +424.645,428.3,420.0,423.4 +423.4,428.28,423.39,427.6 +427.6,427.69,424.5,425.68 +425.68,426.28,413.6,417.94 +417.93,428.0,410.0,423.39 +423.4,428.3,420.0,427.17 +427.21,427.98,423.0,427.85 +427.86,427.86,422.01,425.23 +425.19,426.4,412.78,417.0 +417.04,423.4,417.0,417.5 +417.43,420.98,417.01,417.11 +417.1,419.82,410.02,414.17 +413.21,417.44,412.49,415.04 +415.04,425.4,412.4,423.59 +423.01,424.99,422.2,424.55 +424.55,424.55,421.68,421.71 +422.57500000000005,422.29,419.0,420.6 +420.6,427.9,420.6,425.56 +425.57,425.95,420.98,423.57 +423.205,424.55,419.16,424.06 +420.84,424.85,420.84,424.55 +424.54,428.26,424.21,428.15 +428.15,429.85,428.15,429.17 +429.16,429.17,420.07,422.3 +422.28,422.3,420.24,420.27 +420.27,424.31,420.0,423.7 +423.65,425.76,419.68,421.87 +421.86,421.93,418.02,421.67 +421.66,422.3,419.53,420.88 +420.88,421.0,419.94,421.0 +421.0,422.44,420.6,420.6 +420.62,424.91,420.45,423.9 +423.9,424.0,422.68,423.4 +423.4,426.85,422.97,426.0 +426.0,426.0,423.0,425.97 +425.98,429.0,425.58,428.87 +428.87,428.99,427.67,428.99 +428.99,429.9,428.99,429.76 +429.82,429.9,428.45,428.52 +428.48,429.82,426.71,429.82 +429.8,429.89,428.52,429.04 +429.03,429.9,428.54,429.47 +429.55,429.9,428.92,428.69500000000005 +429.89,429.89,427.47,427.92 +427.92,427.92,422.61,425.91 +425.9,426.0,424.8,426.22 +425.89,426.55,425.05,426.53 +426.53,426.91,422.93,424.35 +424.35,424.62,423.23,424.6 +424.6,426.0,424.25,423.93 +425.43,425.62,423.26,423.26 +423.26,424.59,422.6,422.97 +422.98,423.6,422.81,423.6 +423.6,423.9,422.0,422.13 +422.12,422.12,418.56,419.63 +419.65,420.85,418.0,418.78 +418.79,419.35,418.28,419.3 +419.25,421.34,418.0,421.34 +421.34,421.95,421.28,421.95 +421.94,424.9,421.94,424.87 +424.87,425.41,424.54,424.84 +424.83,425.21,423.52,424.39 +424.49,424.62,423.22,423.66 +423.65,423.79,422.28,423.38 +423.38,423.59,421.74,422.21 +423.15,423.21,420.36,422.77 +422.92,423.91,421.54,422.11 +422.11,422.87,419.31,420.51 +420.51,422.38,420.19,422.38 +422.38,423.11,422.29,422.84 +422.79,423.7,422.79,422.85 +423.12,423.93,422.23,423.21 +423.23,423.8,422.5,422.8 +422.79,425.0,422.0,424.19 +425.975,431.01,424.39,429.16 +429.16,429.89,428.47,429.08 +429.07,433.0,428.71,432.25 +432.22,432.22,429.23,430.05 +430.05,430.05,428.37,428.56 +428.67,428.75,428.12,428.55 +428.54,430.0,428.54,428.64 +428.64,431.44,428.64,430.77 +430.6,433.9,430.58,433.9 +433.9,434.87,433.42,434.48 +434.72,434.99,433.55,433.62 +433.61,433.61,431.97,432.74 +432.73,432.74,431.3,431.4 +431.4,434.0,431.39,432.74 +432.74,432.8,431.24,432.28 +432.23,432.76,431.76,432.51 +432.47,433.74,432.47,433.33 +433.38,434.85,432.0,433.92 +433.93,433.97,432.0,432.5 +432.51,433.61,432.29,432.65 +432.46,432.85,431.67,432.8 +432.78,433.14,426.0,426.2 +426.2,426.21,422.35,423.31 +423.32,426.89,423.31,426.01 +426.01,426.68,425.12,425.93 +425.95,427.41,425.7,426.75 +426.75,427.87,426.59,427.72 +427.56,427.83,426.73,427.81 +427.81,427.89,426.0,427.53 +427.34,428.43,427.34,428.38 +428.37,428.63,427.0,427.41 +427.44,428.88,427.39,428.78 +428.71,428.79,427.0,427.25 +427.25,427.25,424.25,425.76 +425.78,427.0,425.24,427.0 +426.94,426.96,426.17,426.91 +426.91,426.94,426.3,426.84 +426.84,426.84,426.5,426.68 +426.69,426.69,419.04,421.99 +421.94,423.4,421.5,422.79 +422.69,424.57,422.58,424.0 +424.03,424.03,421.32,423.94 +423.83,425.62,423.45,425.46 +425.46,426.85,424.24,426.00666666666666 +426.25,427.97,424.73,426.55333333333334 +427.04,427.99,426.76,427.1 +427.1,427.52,426.0,426.12 +426.1,426.2,424.0,425.38 +425.37,425.99,423.33,424.31 +424.33,432.01,424.24,431.95 +432.0,432.37,429.69,429.9 +429.85,431.49,429.85,430.93 +430.72,431.42,430.36,430.57 +430.62,433.85,430.44,432.95 +432.96,434.0,431.46,432.69 +432.68,433.12,430.25,431.65 +431.6,431.6,429.0,431.18 +431.17,431.82,430.44,430.61 +430.65,430.98,430.0,430.67 +430.67,430.96,430.31,430.96 +430.9,433.0,430.82,433.0 +432.99,437.15,432.99,436.04 +436.04,436.65,432.45,432.45 +432.45,436.0,432.02,436.0 +435.94,436.46,432.65,432.79 +432.8,435.0,432.8,432.915 +432.63666666666666,433.61,433.0,433.04 +432.47333333333336,433.31,432.04,433.735 +432.31,434.59,432.0,434.43 +434.49,434.49,432.03,432.55 +431.925,432.87,427.92,432.065 +429.36,432.26,428.95,431.58 +431.57,435.0,431.26,433.57 +433.55,433.9,432.8,433.36 +433.49,433.83,432.97,433.59 +433.45,433.86,432.55,433.06 +433.05,433.75,433.05,433.6 +433.7,434.28,433.17,434.1 +434.09,435.29,433.81,435.18 +435.18,435.73,434.22,434.5 +434.5,436.11,434.32,436.11 +436.09,437.56,435.94,436.63 +436.61,436.67,432.41,435.0 +435.0,435.0,433.51,434.22 +434.22,435.43,434.22,435.22 +435.2,436.0,434.06,435.0 +435.0,436.08,434.99,435.9 +435.92,435.92,434.93,435.11 +435.51666666666665,434.92,434.03,434.03 +435.11333333333334,434.84,434.01,434.77 +434.71,435.31,434.64,435.31 +435.34,435.7,435.05,435.15 +434.335,435.58,433.33,433.33 +433.33,434.31,433.13,433.64 +433.6,434.0,432.64,434.0 +434.0,434.0,433.09,433.88 +433.88,435.0,433.69,435.0 +435.0,435.55,434.55,434.96 +434.96,436.6,434.92,436.29 +436.28,436.28,435.5,435.82 +435.62,436.0,434.55,434.93 +434.81,436.0,434.23,436.0 +435.98,435.99,435.65,435.86 +435.82,436.0,435.65,435.59000000000003 +435.615,435.96,435.09,435.32 +435.41,435.75,435.08,435.39 +435.4,435.7,433.0,433.41 +433.41,433.52,432.07,433.31 +433.3,434.2,433.3,433.99 +433.93,434.32,433.5,433.92 +433.92,434.98,433.11,434.25 +434.25,434.25,432.0,432.96 +432.93,433.0,432.63,433.0 +432.96,432.97,432.5,432.89 +432.89,432.89,432.5,432.51 +432.5,432.98,432.0,432.17 +432.44,432.65,431.9,431.93 +431.93,432.32,431.58,430.515 +431.64,431.76,428.57,429.1 +429.09,430.28,427.81,427.9 +428.09,430.72,427.53,429.7 +429.69,429.85,426.16,429.22 +429.23,430.0,428.31,429.49 +429.48,429.96,429.07,429.61 +429.6,429.87,425.02,425.79 +427.01,428.09,425.48,427.77 +427.78,431.09,427.01,429.6 +429.69,432.49,429.1,430.53 +430.5,433.08,430.5,432.39 +432.12,432.91,431.47,432.02 +432.01,433.42,431.46,433.42 +433.42,433.5,432.01,433.685 +433.5,434.0,433.49,433.95 +433.98,434.29,432.93,433.18 +433.18,433.94,432.42,433.5733333333333 +432.77,433.96,432.77,433.9666666666667 +433.29,434.37,433.01,434.36 +434.37,434.8,433.55,433.75 +433.72,433.76,432.33,433.16 +433.32000000000005,433.79,432.3,432.92 +432.92,433.55,431.86,433.23 +433.24,433.65,432.44,432.88 +432.9,432.94,431.76,432.39 +432.42,433.0,432.0,432.99 +432.99,434.97,432.87,434.34 +434.33,434.69,433.84,434.33 +434.26,434.99,434.21,434.27 +434.35,434.5,433.92,434.06 +434.05,434.41,433.95,434.41 +434.44,435.0,433.67,433.76 +433.68,435.47,433.68,435.13 +435.12,435.79,434.2,434.2 +434.58,434.58,432.0,433.65 +433.65,435.47,433.51,434.81 +434.81,435.15,434.0,434.93 +434.91,435.64,434.55,435.07 +435.05,435.08,433.18,434.9 +434.9,434.9,434.19,434.26 +434.26,434.37,433.61,433.78 +433.78,434.06,433.21,433.28 +433.56666666666666,433.99,433.13,433.14 +433.3533333333333,434.0,433.13,433.15 +433.14,433.42,431.94,433.04499999999996 +432.985,433.83,431.76,432.94 +432.83,432.92,431.65,431.575 +431.95,432.07,430.0,430.21 +430.18,433.08,430.18,432.91 +432.9,433.62,432.76,433.24 +433.25,434.0,432.43,433.95 +433.95,433.96,432.56,432.56 +432.89,433.96,432.52,433.56 +433.57,433.73,433.49,433.6 +433.6,433.61,432.9,433.06 +433.05,433.4,432.7,432.95 +432.93,433.17,432.5,432.93 +432.94,433.5,432.71,433.11 +433.14,433.34,432.43,432.98 +432.92,432.92,431.88,432.24 +432.24,433.46,432.18,432.76 +432.76,432.85,430.0,431.76 +431.78,431.8,428.15,429.01 +429.01,431.09,428.96,430.71 +430.72,431.31,430.69,431.31 +431.355,432.0,431.08,432.0 +431.99,432.33,431.42,431.42 +431.52,432.85,431.1,432.56 +431.76,432.68,431.84,431.99 +432.0,432.07,431.31,431.42 +432.0933333333333,432.93,431.56,431.84000000000003 +432.18666666666667,433.0,432.2,432.26 +432.28,432.95,432.2,432.68 +432.68,433.0,431.73,432.47 +432.47,433.0,431.82,431.83 +431.94,432.53,431.39,432.42 +432.42,432.6,432.05,432.38 +432.37,432.44,431.54,431.88 +431.82,432.49,430.92,431.23 +431.15,431.9,430.82,431.9 +431.9,432.57,431.54,432.44 +432.42,432.65,431.84,432.5 +432.49,432.5,430.21,431.07 +431.12,432.43,431.0,432.43 +432.4,432.44,430.64,430.91 +430.91,444.98,430.89,443.83 +443.81,444.0,440.59,441.18 +441.17,441.74,439.71,441.7 +441.7,443.61,440.74,443.51 +443.5,450.95,443.5,449.58 +449.58,452.68,449.43,450.18 +450.18,451.99,447.26,449.54 +449.54,451.12,449.09,450.62 +450.58,451.67,450.58,451.4 +451.4,452.27,451.39,451.87 +451.86,456.0,451.86,454.61 +454.75,455.3,454.25,455.03 +455.06,455.4,452.19,454.48 +454.47,458.54,454.2,456.57 +456.56,456.56,455.12,455.16 +455.17,455.61,455.05,456.33000000000004 +455.6,457.89,455.49,457.5 +457.5,457.5,456.0,456.6 +456.6,457.0,455.99,456.43 +456.46,457.07,456.01,457.0 +456.99,457.85,455.88,457.5 +457.49,460.15,456.97,458.16 +458.17,463.0,458.15,462.85 +462.86,464.4,455.39,460.85 +460.85,462.1,457.75,459.98 +459.8,460.67,458.55,458.55 +458.56,458.9,457.48,458.12 +458.13,458.6,457.37,458.57 +458.57,458.6,456.18,456.38 +456.375,456.86,452.51,454.19 +454.18,457.76,454.18,457.76 +457.75,458.12,457.1,458.12 +458.13,458.6,456.81,457.62 +457.40999999999997,457.62,455.9,456.67 +456.69,457.0,456.61,456.99 +456.99,457.07,456.0,456.21 +456.0,457.14,455.9,457.08 +457.05,457.14,455.0,456.09 +456.09,456.48,453.78,453.78 +453.78,453.78,448.29,448.75 +448.51,452.45,447.53,451.11 +451.05,452.99,451.05,452.55 +452.54,453.99,452.32,453.75 +453.75,454.49,452.5,453.53 +453.53,455.03,453.48,454.73 +454.87,455.11,453.4,454.4 +454.39,455.44,454.22,455.44 +455.43,456.0,453.03,453.87 +453.72,454.15,453.2,453.79 +453.79,455.25,453.47,453.55 +453.5,453.5,447.66,451.01 +451.01,451.15,449.02,449.99 +449.97,450.97,449.97,450.54 +450.54,452.6,450.45,451.56 +452.4,453.12,452.04,452.58 +452.225,452.8,451.44,452.05 +452.05,452.37,450.31,450.31 +450.31,451.69,450.12,451.43 +451.42,451.42,450.4,451.01 +451.01,451.48,449.69,449.69 +449.68,449.83,449.02,450.81 +449.17,451.95,448.73,451.93 +451.93,452.64,451.91,452.41 +452.41,452.42,451.75,452.05 +452.07,452.88,452.07,452.3 +452.29,454.0,452.09,453.77 +453.78,454.03,452.5,452.5 +452.51,452.51,451.84,452.18 +452.13,452.56,451.13,451.27 +451.23,451.66,450.27,451.21 +451.19,451.24,445.29,445.7 +445.74,447.96,445.74,447.1 +447.13,447.75,446.11,447.75 +447.75,447.8,446.31,447.35 +447.35,448.0,447.35,447.98 +447.98,447.98,447.02,447.05 +447.04,448.24,447.02,448.24 +447.54,448.3,447.97,448.03 +448.04,448.04,446.31,446.31 +446.79,447.16,445.0,445.19 +445.19,445.71,444.21,444.21 +444.21,444.21,443.01,444.07 +443.31,443.94,443.01,443.93 +444.04499999999996,444.86,443.93,444.77 +444.78,444.78,442.96,443.35 +443.44,445.39,443.44,445.06 +445.06,448.14,444.81,448.04 +448.02,448.02,447.42,447.7 +447.7,448.79,447.69,448.75 +448.74,449.29,446.81,447.66 +447.66,447.79,446.89,447.79 +447.65,448.8,447.65,448.78 +448.8,449.0,448.72,448.9 +448.87,450.05,448.84,450.05 +450.05,451.83,449.95,451.49 +451.5,452.59,450.98,452.54 +452.58,452.65,450.86,451.83 +451.83,452.57,451.65,452.09 +452.07,452.1,451.15,451.59 +451.6,451.99,450.91,449.335 +451.37,451.39,446.11,447.08 +447.27,447.3,446.0,446.1 +446.11,447.52,446.1,447.18 +447.18,447.18,446.47,446.7 +446.71,446.71,445.88,447.1 +446.59,448.11,446.38,447.5 +447.37,447.59,446.96,447.59 +447.2866666666667,448.18,447.51,448.18 +447.2033333333333,448.23,446.9,447.15 +447.12,447.91,446.49,447.7 +447.71,449.5,447.69,449.17 +449.16,449.34,447.98,448.95 +448.9,449.49,448.36,448.88 +448.85,448.98,448.2,448.28 +448.2,448.92,448.2,448.49 +448.52,449.0,448.52,449.0 +449.0,449.47,448.8,449.2 +449.22,449.5,449.13,449.26 +449.19,449.19,445.99,446.46 +446.49,447.78,446.21,446.3 +446.22,448.47,446.21,448.3 +448.3,448.3,447.25,447.55 +447.55,447.85,446.96,447.52 +447.53,447.89,447.06,447.89 +447.89,447.9,447.27,447.27 +447.28,448.98,447.28,447.61 +447.6,447.68,446.25,446.33 +446.33,446.72,445.7,446.72 +446.7,447.32,446.52,446.53 +446.53,447.13,446.46,446.92 +446.93,447.12,446.6,446.75 +446.9,448.04,446.64,446.77 +446.75,446.86,445.22,446.29 +446.39,446.5,445.61,446.49 +446.5,447.97,446.49,447.86 +447.89,448.07,447.63,447.64 +447.64,447.74,447.25,447.53 +447.46,448.4,447.25,447.4 +447.45,448.0,446.78,447.27 +447.22,447.42,446.25,447.4 +447.4,447.4,446.25,446.6 +441.76,447.13,431.54,436.12 +436.12,437.5,425.0,428.71 +428.7,437.16,427.0,432.83 +432.82,434.73,430.24,432.15 +431.77,435.97,431.74,434.53 +434.53,434.71,431.58,431.58 +431.59,433.6,431.13,431.79 +431.85,433.32,431.13,433.0 +433.28,433.9,432.21,433.3 +433.29,433.87,432.09,433.26 +433.28,433.62,431.45,431.71 +431.72,431.72,429.03,429.37 +429.38,431.74,429.02,429.09 +429.1,429.84,425.51,425.81 +425.79,431.76,425.23,430.5 +430.5,431.8,429.2,430.36 +430.37,432.14,430.14,430.66 +430.9,431.0,429.75,430.0 +430.0,430.58,429.17,430.26 +430.1,430.39,428.07,429.6 +429.66,430.0,428.21,429.89 +429.9,429.99,428.58,428.64 +428.76,429.9,428.5,429.8 +429.8,433.51,429.35,432.2 +432.2,432.98,432.03,432.68 +432.69,432.72,431.56,432.06 +432.06,433.9,431.84,433.88 +433.88,435.0,433.62,435.0 +435.0,435.27,432.58,433.2 +433.2,433.65,432.67,433.65 +433.02,433.46,431.75,431.89 +432.06,432.53,429.2,429.2 +429.2,431.23,429.15,430.31 +430.31,431.73,430.31,431.5 +431.53,431.74,430.62,430.76 +430.73,430.97,428.0,428.73 +428.73,430.84,428.73,429.95 +429.99,432.5,429.92,430.93 +431.92,432.0,431.46,431.91 +432.0,432.0,431.59,431.96 +431.97,431.99,431.36,431.86 +431.85,431.94,431.32,431.7 +431.7,432.47,431.51,432.4 +432.4,433.0,432.18,433.0 +433.0,433.5,432.76,433.41 +433.38,433.66,432.65,431.97 +432.095,433.5,430.53,430.53 +430.81,431.18,430.16,430.58 +430.51,430.67,429.5,430.2 +430.14,430.27,428.08,428.31 +428.31,428.31,420.0,423.49 +423.48,423.89,420.99,422.77 +422.75,422.76,410.77,411.98 +411.88,415.88,410.0,414.49 +414.49,416.43,413.05,413.475 +413.46500000000003,416.41,410.0,412.46 +412.44,413.0,396.43,398.66 +398.64,409.92,392.8,408.49 +408.48,410.67,408.48,409.09 +409.09,409.61,406.76,406.76 +406.75,406.75,397.77,400.83666666666664 +403.855,404.85,399.15,394.91333333333336 +400.96,401.32,381.13,388.99 +388.7,391.72,380.0,389.98 +389.79,394.72,387.69,390.33 +391.04,393.49,389.0,384.765 +389.27750000000003,389.03,378.25,379.2 +387.515,380.98,379.18,382.34666666666664 +385.7525,391.0,381.0,385.49333333333334 +383.99,391.0,381.01,388.64 +387.54,389.01,383.46,384.41 +384.5,384.63,359.8,368.0 +368.0,380.0,357.3,361.5 +361.66,379.97,357.0,379.69 +379.63,380.72,365.87,370.06 +370.02,375.0,367.84,373.66 +373.71,374.84,370.69,371.0 +371.25,374.49,368.23,374.01 +373.96,373.96,365.0,369.93 +369.93,370.0,364.0,366.0 +365.9,367.45,350.92,352.66 +352.63,363.09,351.65,356.47 +356.48,361.14,355.45,361.14 +361.13,373.73,357.6,370.69 +371.01,371.61,367.1,370.4866666666667 +369.92,371.18,366.11,370.2833333333333 +369.85,373.19,368.22,370.08 +370.1,371.95,368.56,371.09 +371.05,371.15,366.72,369.9 +369.92,369.98,365.35,368.79 +368.69,370.62,368.06,369.72 +369.68,374.5,369.34,374.5 +374.5,382.97,374.23,382.15 +382.15,387.81,382.11,383.25 +383.25,386.0,379.46,382.24 +382.25,384.78,382.21,382.33 +382.33,391.0,382.33,386.22 +386.23,391.0,386.22,390.26 +390.25,391.0,389.4,389.4 +389.27,389.87,384.61,385.63 +385.63,385.79,383.45,384.96 +384.95,386.52,384.76,384.33 +384.74,384.92,382.36,383.7 +383.65,384.78,382.7,382.7 +382.59,382.59,378.42,379.99 +380.0,382.4,379.6,380.96 +380.97,384.22,380.88,383.47 +383.47,383.72,380.08,380.42 +380.39,380.78,379.9,380.78 +380.78,381.17,380.77,380.8 +380.93,382.14,380.77,381.46 +381.69,384.65,381.44,384.23 +384.0,386.58,382.89,386.1 +385.9,387.18,382.83,384.98 +384.97,385.58,384.02,384.99 +385.0,385.73,384.32,385.73 +385.73,385.84,384.77,385.57 +385.48,385.59,384.21,385.34 +385.49,385.8,385.19,385.51 +384.99,385.85,384.47,384.54 +384.49,384.49,372.0,380.17 +380.16,382.14,377.65,381.35 +381.2,382.85,377.39,380.63 +380.55,381.54,378.01,381.19 +381.19,381.79,375.89,378.0 +378.15,378.41,375.62,377.15 +377.15,377.62,371.93,374.91 +374.91,377.2,371.0,375.71 +375.71,376.37,370.1,373.37 +373.39,379.75,372.7,378.99 +378.7,382.39,378.7,380.42 +380.41,382.63,379.97,381.54 +380.44500000000005,381.77,376.76,380.43 +380.48,381.44,378.99,380.71 +381.09,385.2,380.5,385.2 +384.6,386.1,380.0,384.1 +383.97,385.15,382.21,383.44 +383.54,384.97,381.5,383.08 +383.11,383.7,378.11,383.12 +382.935,383.2,382.1,382.81 +382.76,382.83,378.0,382.0 +381.96,382.69,378.85,380.0 +380.2,381.5,377.0,379.9 +379.98,384.0,378.95,383.18 +382.84,385.0,379.42,384.63 +384.63,384.99,384.35,384.5 +384.44,384.57,381.34,381.99 +382.76,383.51,381.38,381.89 +381.89,381.99,380.32,381.58 +381.57,384.19,380.05,381.88 +382.68,384.49,382.79,382.17999999999995 +383.79,384.14,381.1,382.47999999999996 +382.45,384.09,381.87,382.78 +383.0,384.0,382.32,383.59 +383.55,384.05,382.79,383.01 +382.995,384.03,382.07,382.43 +382.44,383.86,382.44,382.9 +383.03,383.37,382.3,383.37 +383.13,385.5,382.68,385.02 +385.02,385.02,384.19,384.46 +384.71,384.79,378.45,380.82 +380.83,380.98,377.54,379.19 +379.28,380.37,376.0,376.0 +376.0,378.74,372.89,373.79 +373.78,377.63,370.0,376.75 +376.74,377.66,374.9,377.24 +377.05,378.36,376.7,377.98 +378.15,378.9,377.18,378.35 +378.29,378.29,372.25,374.5 +374.51,374.78,369.0,374.02 +373.89,377.19,372.74,375.49 +375.5,377.3,374.92,376.36 +376.36,378.61,375.46,378.52 +378.51,380.0,378.2,379.78 +379.91,380.98,378.57,379.71 +379.71,379.98,376.47,379.03 +379.11,379.44,378.98,379.38 +379.04333333333335,379.86,379.02,379.73 +378.9766666666667,379.76,378.42,378.71 +378.91,378.93,377.62,378.32 +378.26,381.0,378.26,380.65 +380.45,390.45,380.16,390.45 +390.45,398.25,382.59,398.25 +398.25,402.79,397.4,402.79 +402.79,415.2,402.78,407.0 +406.98,408.12,396.0,406.53 +406.39,406.6,404.98,405.16 +407.74,409.5,404.91,409.09 +409.09,410.0,407.85,408.66 +408.38,409.05,405.0,408.57 +408.6,409.06,406.0,407.28 +406.95,415.0,404.0,415.0 +414.96,425.1,412.0,418.99 +418.69,420.42,418.0,418.84 +418.75,424.78,418.06,421.87 +421.87,421.87,418.95,420.77 +420.74,420.79,415.56,417.25 +417.32,418.4,413.08,413.51 +413.51,415.91,413.0,414.14 +415.13,416.03,413.0,414.77 +414.93,415.05,412.55,413.72 +413.72,416.33,411.01,413.3 +413.11,418.42,412.47,418.06 +418.06,418.34,413.84,414.73 +414.73,416.39,413.43,414.17 +414.21,415.19,413.41,413.95 +413.96,414.29,412.0,412.79 +412.84,415.97,412.5,415.57 +415.56,415.57,411.47,412.68 +412.68,413.61,403.21,404.84 +405.0,409.97,404.78,405.98 +405.99,408.06,404.5,407.81 +407.84,409.34,406.58,409.03 +406.93499999999995,409.1,404.29,406.03 +406.03,407.42,405.18,406.15 +406.14,412.07,405.07,408.78 +408.78,409.38,407.4,408.14 +408.52,409.13,405.92,407.9 +407.9,408.01,405.5,407.54 +407.58,413.99,407.58,408.57 +408.57,408.57,401.18,402.61 +402.62,403.9,395.36,397.91 +397.92,399.49,395.93,398.38 +398.38,401.01,398.37,399.46 +399.46,400.28,396.06,399.93 +399.93,401.34,398.62,399.15 +399.15,399.56,396.71,397.47 +397.6,398.61,396.71,396.71 +396.71,396.71,391.5,393.67 +393.5,395.62,392.59,393.85 +393.86,397.65,393.86,396.38 +396.43,396.44,394.45,395.36 +395.31,397.13,392.26,392.26 +392.67,392.67,382.69,387.0 +386.99,387.0,383.17,384.15 +384.16,385.94,382.99,384.65 +384.56,384.75,380.02,380.02 +380.02,382.09,373.86,380.0 +380.01,382.5,376.88,381.25 +381.25,381.25,377.2,378.04 +378.03,383.99,377.99,383.3 +383.12,391.99,383.12,391.98 +391.99,398.72,387.33,392.5 +394.06,394.06,389.5,390.04 +389.82,390.57,387.12,389.9 +389.89,396.16,389.75,393.4 +393.37,396.12,392.69,393.26 +392.98,393.64,389.3,389.64 +389.64,391.3,389.14,390.71 +390.83,391.04,388.33,389.55 +389.55,390.8,389.55,390.275 +390.33,392.35,390.23,391.0 +388.18666666666667,391.82,390.36,390.54 +386.0433333333333,391.16,383.92,383.92 +383.9,387.3,382.55,387.13 +387.02,387.86,384.82,386.42 +386.47,393.27,383.35,392.32 +392.23,395.0,390.44,392.0 +391.87,392.82,387.74,389.77 +389.77,391.15,388.43,390.27 +390.31,390.48,389.13,391.27 +390.46,392.84,389.6,392.27 +390.76666666666665,392.88,389.53,391.83 +391.0733333333333,391.58,389.37,391.39 +391.38,391.4,385.0,388.4 +388.23,390.06,387.49,390.06 +390.06,390.29,389.53,390.005 +390.28,390.64,390.01,389.95 +390.1433333333333,390.1,389.74,389.895 +390.00666666666666,389.84,388.65,389.84 +389.87,390.09,389.87,389.4733333333333 +389.91499999999996,390.09,389.92,389.1066666666667 +389.96,389.96,388.74,388.74 +391.34749999999997,388.67,388.66,394.98 +392.735,402.0,388.59,401.22 +394.1225,401.22,399.39,401.95500000000004 +395.51,400.19,399.44,402.69 +396.8975,400.4,399.51,403.425 +398.28499999999997,400.13,395.47,404.16 +399.6725,402.62,398.28,404.895 +401.06,406.93,400.69,405.63 +405.62,405.63,400.0,400.1 +400.07,402.48,400.01,402.48 +402.5,404.19,402.5,403.89 +403.9,404.88,403.44,403.61199999999997 +404.89,406.72,402.93,403.334 +404.29333333333335,403.55,402.65,403.056 +403.69666666666666,403.3,402.5,402.778 +403.1,403.94,402.5,402.5 +402.5,402.5,399.35,399.35 +399.27,399.27,396.04,398.36 +398.37,399.18,397.43,398.94 +398.94,398.95,397.63,398.395 +398.49,399.32,397.72,397.85 +397.84,398.68,397.51,398.49 +398.49,398.78,396.94,398.16 +398.17,401.88,398.02,399.82 +399.84,401.28,399.68,400.32 +400.32,400.32,398.68,400.14 +400.09,400.8,399.67,400.11 +400.11,400.12,396.47,397.28 +397.29,399.25,397.28,398.0 +398.08,399.35,397.95,395.8933333333333 +399.35,399.69,398.99,393.7866666666667 +399.35,399.35,389.96,391.68 +391.64,393.16,388.89,390.98 +390.95,392.08,388.83,388.89 +388.78,391.15,386.41,389.32 +389.32,390.89,389.16,391.075 +390.16,393.16,389.1,392.83 +392.91,392.98,390.74,391.47 +391.45,393.73,391.07,393.27 +393.29,393.39,391.31,392.91 +392.89,393.0,392.02,392.64 +392.72,394.0,392.15,392.87 +392.95,393.74,391.61,393.0 +393.0,393.6,389.47,390.39 +390.71,392.25,390.7,391.77 +391.7,393.36,390.85,392.53 +392.37,392.55,391.07,391.94 +391.94,393.46,391.87,392.84 +392.78,393.64,392.13,393.13 +393.26,396.5,393.15,396.29 +396.29,397.0,395.1,395.1 +395.05,395.29,394.49,394.74 +394.96000000000004,395.16,393.49,394.87 +394.87,395.0,394.78,393.15 +394.77,395.0,390.86,391.43 +391.42,394.14,390.6,394.02 +394.05,394.48,393.06,393.46 +393.48,394.0,393.15,393.33 +393.38,393.62,392.5,392.96 +392.95,393.0,392.4,393.0 +392.99,393.0,392.39,392.9 +392.9,393.13,392.45,392.92 +392.92,395.3,392.42,393.69 +393.7,393.78,387.78,391.56 +391.56,392.17,390.7,391.58 +391.58,392.9,391.53,392.67 +392.7,393.88,392.55,392.96 +392.87,393.03,392.09,392.48 +392.43,394.23,392.09,394.09 +394.08,395.94,393.8,395.11 +395.21,397.18,395.08,396.86 +396.8,396.8,394.93,395.81 +395.58,396.0,394.01,395.25 +395.25,396.23,394.22,395.38 +395.37,395.81,394.24,395.23 +395.38,395.55,394.68,394.68 +394.78,394.78,393.87,394.0 +394.0,395.0,393.99,394.99 +395.0,395.0,394.44,394.96 +394.99,395.0,393.45,394.62 +394.63,394.91,394.03,394.04 +394.13,394.75,393.91,393.91 +394.16,394.49,393.53,394.04 +393.95,396.0,393.43,395.84 +395.87,396.74,394.8,395.22 +395.22,395.22,394.14,394.28 +394.24,394.67,393.73,394.38 +394.35,394.99,394.16,394.45 +394.44,395.0,394.18,394.99 +394.94,395.0,393.3,394.23 +394.23,394.23,378.28,378.36 +378.23,387.0,377.12,383.28 +383.23,384.23,381.25,382.6 +382.59,384.23,382.1,382.44500000000005 +383.11,384.76,381.18,382.29 +382.33,384.12,382.03,383.9 +383.9,384.76,383.54,384.72 +384.67,384.76,384.01,384.42 +384.42,384.46,382.69,384.11 +384.47,384.5,383.23,384.39 +384.52,384.52,382.5,384.19 +383.5,383.99,383.0,383.99 +383.99,385.16,383.51,384.31 +384.12,384.92,383.67,384.41 +384.21,384.51,382.18,382.58 +382.58,383.0,381.44,381.97 +381.94,383.25,381.01,382.78 +382.78,383.0,382.25,382.92 +382.84,383.0,382.69,382.78 +382.79,382.93,381.9,382.05 +382.05,382.51,379.4,379.79 +379.91,380.27,379.32,379.37 +379.35,379.44,368.97,369.06 +370.13,370.94,366.81,370.83 +370.86,373.0,368.48,368.48 +369.19,375.02,363.25,372.19 +372.2,376.85,371.35,374.61 +374.61,376.04,370.81,372.95 +374.71,376.99,374.12,374.74 +376.01,377.77,374.72,376.53 +376.52,376.88,374.27,375.48 +375.48,381.08,374.19,381.07 +381.07,385.0,380.93,382.81 +382.81,385.05,382.71,383.88 +383.79,383.79,380.93,380.93 +381.06,382.0,380.21,380.26 +380.25,381.0,378.74,379.25 +379.21,379.85,379.19,379.49 +379.49,379.75,377.05,378.15 +378.14,378.81,377.33,377.78 +377.79,378.5,376.69,377.82 +377.81,377.85,374.8,375.52 +375.52,375.8,373.23,375.17 +375.16,375.92,373.57,374.53 +374.53,381.5,372.21,380.5 +380.41,380.41,377.0,378.19 +378.19,381.44,378.19,381.21 +381.23,381.27,379.3,380.0 +380.01,380.3,379.26,378.115 +380.09,380.21,375.0,376.23 +376.22,379.37,376.14,379.32 +379.28,380.34,379.23,380.06 +380.04,382.04,379.81,380.81 +380.78,381.59,379.94,380.62 +380.0,380.49,379.23,380.43 +380.35,380.4,379.29,379.92 +379.82000000000005,379.93,378.53,379.33 +379.29,379.48,378.02,378.25 +378.04,378.73,376.69,378.24 +378.0,378.7,377.64,378.23 +378.5,379.28,377.79,379.15 +379.0,379.74,378.16,379.59 +379.43,379.43,377.01,379.39666666666665 +378.21,378.21,376.53,379.2033333333333 +378.615,379.78,377.69,379.01 +379.02,379.42,377.0,379.37 +379.42,379.43,378.1,378.47 +378.42,381.65,378.17,381.65 +381.65,382.0,378.04,378.14 +378.14,379.51,378.14,378.78 +378.72,379.91,378.72,379.235 +379.15,380.72,378.31,379.69 +379.74,380.73,379.15,380.43 +380.5,380.94,379.23,380.37 +380.44,381.56,379.78,381.38 +381.39,382.5,381.0,381.31 +381.51,382.02,381.32,382.01 +381.95,382.1,381.33,381.79 +381.72,382.08,381.3,381.745 +381.71000000000004,382.11,381.4,381.7 +381.7,381.81,380.39,381.5 +381.58,381.93,380.49,381.55 +381.5,381.67,380.54,381.4 +381.45,381.5,378.0,378.58 +378.57,380.29,377.85,378.52 +378.51,379.53,378.18,378.93 +378.95,378.98,378.43,378.89 +378.6,379.0,378.12,378.65 +378.67,379.0,378.39,378.95 +378.98,379.0,378.55,378.85 +378.89,379.0,378.04,378.99 +378.96,379.0,378.0,378.43 +378.16,378.98,374.37,374.37 +374.36,374.53,365.0,369.35 +369.18,370.84,368.05,368.49 +368.49,368.5,366.26,367.66 +367.66,370.99,367.25,370.95 +370.96,374.0,370.88,373.96 +373.83,375.0,372.99,374.06 +373.76,375.0,373.39,375.0 +375.0,375.89,374.8,375.5 +375.5,376.0,374.66,375.555 +375.59,376.0,374.48,375.61 +375.39,375.39,372.92,374.1 +374.05,379.0,372.9,377.91 +377.87,378.04,375.57,377.23 +377.1,377.1,375.2,376.0 +376.0,376.27,375.39,376.0 +375.93,375.93,372.9,373.7 +373.76,374.21,373.16,374.21 +374.21,374.77,373.08,373.52 +373.61,374.02,370.2,373.18 +373.19,373.19,371.4,372.31 +372.26,372.27,368.11,370.21 +370.08,370.49,369.01,370.49 +370.42,371.09,369.69,370.99 +370.95,371.5,370.07,370.64 +370.6,371.5,370.41,371.46 +371.42,372.79,371.36,372.68 +372.8,372.95,372.09,372.58 +372.52,373.0,371.97,372.84 +372.84,373.43,372.01,372.46 +372.46,373.51,372.05,373.51 +373.51,374.1,373.01,373.98 +373.97,374.07,372.52,373.5 +373.605,374.11,372.55,373.38 +373.24,374.41,372.7,373.55 +373.56,373.73,372.1,372.11 +372.11,373.04,371.3,371.68 +371.68,372.51,371.67,372.18 +372.18,372.49,371.51,371.88 +371.56,373.0,371.56,373.0 +373.0,373.0,371.84,372.64 +372.68,373.98,372.32,373.98 +373.96,373.96,372.12,372.75 +372.88,373.0,371.83,371.98 +372.17,373.0,371.95,372.63 +372.63,373.5,372.2,372.51 +372.28,373.65,372.28,373.41 +373.41,373.51,373.08,373.45 +373.44,373.49,373.22,373.3 +373.3,373.3,372.11,372.93 +372.89,373.01,371.99,372.03 +372.34,372.73,371.58,372.01 +372.05999999999995,372.58,371.78,371.78 +371.78,372.82,368.2,372.52 +372.52,373.0,372.11,372.27 +372.25,373.0,372.04,372.18 +372.18,372.58,371.53,372.59000000000003 +372.5,373.0,372.05,373.0 +372.98,373.0,372.9,373.0 +372.99,373.0,372.69,372.92 +372.9,372.94,372.29,371.73 +372.48,372.55,367.21,370.54 +370.53,372.14,370.14,371.08 +371.08,371.96,370.86,370.67999999999995 +371.62,371.84,369.69,370.28 +370.23,370.91,368.02,370.8 +370.8,371.11,369.46,370.03 +370.06,370.58,368.51,368.86 +368.87,369.75,367.8,369.74 +369.74,370.93,369.36,370.47 +370.44,370.54,369.26,369.46 +369.47,369.9,368.31,368.36 +368.35,368.45,365.63,367.2 +367.19,369.23,366.45,368.84 +368.84,369.67,368.74,369.56 +369.56,371.39,369.56,370.75 +370.75,371.0,370.55,370.95 +370.95,370.95,369.3,370.26 +370.2,370.64,368.94,369.89 +369.81,371.5,369.49,371.17 +371.15,371.5,371.02,371.49 +371.49,371.71,370.93,371.71 +371.66,371.91,370.95,371.6 +371.49,371.78,371.17,371.71 +371.77,371.92,371.17,371.92 +372.13,372.5,371.71,372.49 +372.49,372.84,372.26,376.49 +372.74,380.9,372.68,380.49 +380.49,385.0,380.49,383.5 +383.5,385.0,382.78,384.58 +384.57,388.1,383.61,385.95 +385.88,386.83,385.08,385.27 +385.44,386.1,383.23,383.7 +383.77,386.0,380.0,384.61 +384.56,390.0,383.69,389.99 +389.99,390.03,385.46,386.39 +386.39,388.29,386.0,388.28 +388.29,390.63,386.11,386.81 +386.81,388.5,386.07,388.46 +388.44,388.49,386.37,387.14 +387.13,387.49,386.0,386.0 +386.01,386.2,384.51,385.75 +385.7,386.19,384.73,385.89 +385.84,386.29,384.95,385.32 +385.61,385.84,382.99,383.31 +383.32,384.61,382.99,384.36 +384.36,386.31,384.08,385.79 +385.8,386.39,385.39,385.41 +385.4,386.0,384.4,387.21500000000003 +385.8,389.02,385.69,389.02 +389.01,389.36,388.0,388.16 +388.45,388.45,386.38,387.11 +387.11,387.16,385.77,386.71 +386.69,387.95,385.98,387.7 +387.71,388.46,384.85,385.34 +385.34,385.4,384.43,384.81 +384.8,386.0,384.2,385.76 +385.76,385.76,384.45,385.38 +385.4,386.0,384.35,385.4 +385.36,385.48,383.61,384.02 +383.96,385.36,383.29,384.84 +384.9,385.02,383.13,383.58 +384.05,384.54,374.98,378.0 +378.07,380.03,376.79,380.03 +380.03,380.36,379.03,379.33 +379.33,380.33,376.2,377.88 +377.87,378.43,372.89,373.85 +373.8,375.03,370.05,374.39 +374.55,376.04,372.72,373.98 +373.97,374.61,372.35,374.61 +374.64,375.34,374.27,374.7 +374.62,375.5,374.47,374.82 +374.78,375.64,374.93,374.94 +374.94,375.37,374.92,375.13 +375.45,376.2,375.23,375.78999999999996 +375.96,376.53,375.88,376.45 +376.44,376.5,375.0,375.23 +375.14,376.0,375.12,375.87 +375.83,375.97,372.71,373.85 +373.84,374.71,373.6,374.09 +374.06,374.96,373.57,374.31 +374.31,374.78,373.74,374.25 +374.19,374.72,373.79,374.71 +374.72,375.38,374.63,374.98 +375.02,375.22,374.11,374.54 +374.84,375.49,374.28,375.32 +375.16499999999996,375.49,374.45,375.49 +375.49,375.7,373.57,375.13 +375.12,376.08,374.79,376.05 +376.08,377.21,376.07,377.17 +377.2,377.21,376.36,376.6 +376.59,376.9,376.5,376.67 +376.64,376.86,376.09,376.225 +376.315,376.45,375.78,375.78 +375.99,376.11,374.99,375.85 +375.85,376.38,375.74,376.37 +376.32,376.5,375.91,376.26 +376.19,377.8,376.15,377.7 +377.55,379.53,377.55,379.14 +379.27,379.58,378.64,379.58 +379.58,379.81,377.21,377.61 +377.62,377.66,377.07,377.45 +377.43,377.67,377.09,377.09 +377.1,377.46,375.32,375.86 +375.91,376.82,374.74,376.11 +376.11,376.46,373.28,375.58 +375.58,375.64,373.24,373.74 +373.69,376.29,373.69,376.15 +376.15,377.71,375.58,377.71 +377.57,378.16,376.94,377.14 +378.03,378.5,376.87,378.5 +378.49,378.82,377.68,378.63 +378.63,378.76,378.15,378.39 +378.41,378.52,377.84,378.4 +378.4,378.98,378.2,378.595 +378.6,378.96,378.39,378.79 +378.8,379.15,378.64,378.85 +379.04,379.15,378.69,379.15 +378.775,379.35,378.5,378.51 +378.51,378.56,377.52,378.4 +378.44,378.57,377.8,378.14 +378.13,378.8,377.54,377.67 +377.66,377.66,376.63,376.64 +376.64,376.8,375.0,376.11 +376.1,376.29,374.7,374.93 +374.94,375.38,374.62,375.12 +375.07,375.12,373.61,374.14 +374.04,375.09,373.71,374.71 +374.65,375.12,373.4,373.4 +373.51,373.51,371.48,371.5 +371.62,372.28,371.04,371.49 +371.52,372.1,371.33,371.82 +371.9,372.5,370.51,371.21 +371.14,371.48,370.5,371.335 +370.9,372.13,370.53,371.46 +371.57,372.1,370.9,371.92 +371.93,372.02,371.29,371.5 +371.6,372.1,371.16,372.1 +372.06,372.1,370.74,371.0 +371.0,371.61,370.62,370.9 +371.0,371.52,370.13,370.51 +370.5,370.92,370.23,370.23 +370.29,370.86,370.19,370.45 +370.76,371.22,370.33,371.22 +371.23,372.0,370.91,371.39 +371.67,371.92,370.92,371.77 +371.71,374.48,371.46,374.32 +374.31,374.79,373.1,374.01 +374.01,374.93,373.11,373.42 +373.32,373.81,372.3,373.21 +373.225,373.24,372.01,373.24 +373.13,373.28,372.52,372.94 +372.94,373.58,372.46,372.64 +372.64,372.66,371.52,372.0 +372.13,372.58,371.8,372.5 +372.43,372.6,371.78,372.23 +372.21,372.54,372.1,372.31 +372.3,373.13,372.1,372.68 +372.7,373.3,372.01,372.07 +372.06,373.33,371.87,373.14 +373.14,373.21,372.39,372.87 +372.78,374.49,372.36,374.49 +374.33,374.95,373.83,374.38 +374.44,374.82,374.04,374.04 +374.23,374.75,373.87,374.56 +374.615,375.0,374.1,375.0 +375.0,375.0,374.11,374.62 +374.59,374.99,373.96,374.59 +374.605,374.92,373.75,374.63 +374.62,375.0,373.76,375.0 +375.0,377.2,374.93,377.0 +377.0,382.32,376.9,381.31 +381.32,383.34,381.07,381.93 +381.94,381.99,376.65,378.0 +378.29,379.67,377.5,377.8 +377.69,378.06,375.04,376.75 +376.77,378.6,376.29,377.84 +377.77,378.0,376.72,377.27 +377.48,378.48,376.77,377.8 +377.78,378.48,376.2,377.89 +377.89,378.41,376.82,378.17 +378.17,379.0,378.01,378.56 +378.58,378.58,377.0,377.85 +377.81,379.5,377.01,379.36 +379.36,379.4,376.5,376.7 +376.68,378.46,376.4,377.01 +376.92,377.26,375.48,376.69 +376.57,376.57,374.8,374.99 +374.91,375.97,373.81,374.32 +374.35,377.09,373.76,375.41 +375.17,375.99,373.0,373.57 +373.56,373.85,370.0,370.1 +370.1,374.95,370.0,374.68 +374.7,376.68,373.91,376.17 +375.92,377.0,375.3,376.76 +376.76,377.11,376.56,376.97 +376.96,377.4,373.84,374.59 +374.62,376.22,374.53,375.2 +375.21,375.99,374.11,375.18 +375.18,375.99,374.29,374.91 +374.78,375.01,361.1,372.7 +372.68,372.93,364.0,371.75 +371.79,374.2,371.75,374.11 +374.18,375.82,374.12,375.14 +375.33,376.25,374.16,376.03 +375.96,378.27,375.54,378.13 +378.13,378.81,377.49,377.92 +377.92,378.43,377.46,377.77 +377.77,379.0,377.75,378.5 +378.59,379.0,378.35,378.9 +378.95,379.4,378.34,379.15 +379.15,379.25,378.95,379.29499999999996 +379.16,379.5,379.13,379.44 +379.48,379.5,379.11,379.35 +379.35,379.98,379.2,379.79 +379.67,380.0,379.79,379.99 +379.99,380.0,379.53,379.96 +380.0,380.0,379.51,379.9 +379.9,381.5,379.79,380.99 +381.02,381.14,380.34,381.06 +381.01,381.47,380.05,380.85 +380.85,381.48,380.18,381.48 +381.49,381.5,381.08,381.32 +381.32,381.5,380.9,381.41 +381.45,381.49,379.76,380.58 +380.59,381.13,379.84,380.26 +380.28,381.45,380.09,381.32 +381.3,381.52,379.78,380.45 +380.36,381.52,380.16,381.52 +381.52,382.24,381.26,382.19 +382.22,384.25,382.06,384.25 +384.25,386.7,384.24,386.69 +386.69,386.69,385.33,386.56 +386.56,390.33,386.56,390.24 +390.23,391.49,388.41,390.405 +389.0,396.0,388.54,390.57 +390.6,390.72,389.18,389.24 +389.24,389.24,388.63,388.87 +388.8,388.87,387.46,387.59 +387.6,389.07,387.6,388.85 +388.89,389.1,387.88,389.03 +388.71999999999997,389.1,388.49,389.03 +388.55,389.55,387.79,388.825 +388.38,389.11,388.24,388.62 +388.62,388.74,387.43,388.3 +387.91,388.6,387.79,387.98 +388.01,388.66,387.97,388.63 +388.62,388.9,388.13,388.89 +388.985,389.74,388.89,389.34 +389.35,389.69,389.27,389.63 +389.52,389.73,389.32,389.655 +389.73,389.89,389.03,389.68 +389.67,389.83,389.12,389.12 +389.22,394.29,388.2,394.17 +394.19,396.71,392.59,395.35 +395.3,398.82,395.3,398.0 +397.99,398.7,395.5,396.44 +396.44,397.0,395.55,397.0 +397.0,397.0,395.75,396.84 +396.83,397.26,395.95,397.0 +397.01,398.24,396.53,397.68 +398.24,398.68,397.53,398.36 +398.38,399.0,397.93,398.98 +398.98,399.88,397.75,399.63 +399.63,399.94,399.07,399.94 +399.435,399.94,398.0,399.27 +399.24,399.34,397.81,398.01 +398.01,398.63,396.1,398.63 +398.63,401.15,398.63,401.04 +401.04,403.14,400.7,402.55 +402.55,403.11,400.9,401.0 +401.01,401.08,400.42,401.04 +401.05,401.49,401.04,401.4 +401.4,401.4,400.08,400.58 +400.61,400.65,399.3,400.615 +399.9,400.85,399.65,400.65 +400.65,403.78,400.65,403.34 +403.34,406.92,399.29,406.63 +406.64,409.09,401.05,404.79 +404.83,405.3,400.0,405.24 +404.79,406.0,404.72,405.69 +405.69,405.8,404.38,404.79 +405.03,406.23,404.8,405.71 +405.65,406.75,404.56,404.56 +404.59,406.76,404.27,406.41 +406.4,406.87,405.51,405.04 +404.99,406.57,402.0,403.67 +403.58,404.14,402.61,401.505 +402.9,402.9,397.62,399.34 +399.52,400.12,398.39,399.09 +399.11,404.57,399.11,402.19 +402.18,404.05,401.77,402.54 +402.54,403.34,401.33,401.69 +401.7,402.07,401.0,401.4 +401.44,402.3,399.31,401.0 +401.0,402.92,400.63,402.4 +402.39,402.4,400.56,400.85 +400.77,400.99,398.23,399.65 +399.62,400.9,396.12,398.0 +397.79,398.42,394.03,397.24 +397.11,397.55,395.34,397.31 +397.32,399.26,397.03,399.18 +399.18,400.4,398.37,399.17 +399.06,399.7,397.01,399.13 +399.11,400.83,399.03,400.34 +400.64,401.91,400.2,401.61 +401.6,401.69,399.8,400.685 +400.39,400.91,399.11,399.76 +399.71,401.77,399.71,401.77 +401.73,401.94,400.29,400.8 +400.68,401.75,400.21,401.61 +401.66,401.75,401.42,401.74 +401.975,402.36,401.2,402.275 +402.29,403.0,402.03,402.81 +402.82,402.92,402.0,402.92 +402.91,404.98,402.55,404.92 +404.93,406.11,403.72,406.08 +406.06,406.34,390.0,404.9 +404.95,405.9,404.71,405.42 +405.42,407.5,405.4,407.25 +407.25,407.49,404.71,406.4 +406.47,406.79,405.72,406.37 +406.3,406.32,405.05,405.54 +405.54,406.27,405.04,405.5 +405.5,407.1,405.5,406.45 +406.46000000000004,407.48,405.69,407.4 +407.42,407.86,405.69,406.61 +406.61,407.32,405.9,406.2 +406.32,407.01,405.87,406.81 +406.8,407.72,406.24,407.65 +407.66,409.0,407.57,408.92 +408.91,409.71,408.5,409.71 +409.68,412.0,409.68,412.0 +411.99,412.0,411.0,412.0 +412.0,415.65,411.84,415.43 +415.43,415.75,415.03,415.16 +415.16,415.41,414.75,414.76 +414.77,414.77,412.0,413.52 +413.53,415.5,413.53,415.5 +415.5,418.98,415.5,417.65 +417.64,419.46,417.14,418.41 +418.68,419.5,418.21,418.4 +418.37,419.0,416.5,418.98 +418.97,419.0,416.5,417.12 +417.02,419.79,416.99,418.84 +419.02,419.85,417.38,419.84 +419.84,420.13,418.73,419.57 +419.57,419.87,418.0,419.07 +419.05,419.64,418.0,418.19 +418.18,418.18,414.24,416.54 +418.145,418.11,416.53,418.1 +418.11,419.0,417.69,418.78 +418.78,419.75,417.44,419.29 +419.25,419.98,417.0,417.19 +417.2,418.93,417.01,418.58 +418.73,419.95,418.33,419.95 +419.95,420.38,419.61,419.85 +419.78,419.89,418.36,419.48 +419.48,421.75,419.32,421.75 +421.75,422.0,421.33,422.0 +422.0,423.0,421.99,422.68 +422.72,423.0,422.71,423.0 +423.0,423.1,422.04,422.8 +422.88,423.2,417.0,418.56 +418.56,420.34,418.0,420.0 +419.99,420.0,415.01,415.77 +415.76,418.26,415.76,418.26 +418.14,419.5,417.89,418.92 +418.93,419.5,418.64,418.94 +418.87,418.96,418.45,418.74 +419.43,420.0,418.5,420.0 +419.99,420.49,418.62,420.44 +420.49,421.89,420.35,421.68 +421.68,421.69,420.53,421.14 +421.14,421.4,421.08,421.22 +421.22,421.63,420.76,421.42 +421.27,421.99,420.97,421.62 +421.62,421.62,421.15,421.57 +421.59,421.89,420.88,421.89 +421.86,422.0,420.4,420.76 +420.76,420.84,418.52,419.05 +419.0,419.0,416.0,417.85 +417.85,420.14,417.84,418.98 +418.97,418.97,417.66,418.38 +418.39,418.69,417.68,417.78 +417.8,419.3,417.57,419.3 +419.25,420.27,419.15,420.03499999999997 +420.0,420.82,419.92,420.77 +420.77,421.4,418.98,420.63 +420.59,420.63,418.21,418.63 +418.63,418.99,418.08,418.78 +418.77,418.91,417.91,418.28 +418.28,418.81,417.8,417.99 +417.99,418.5,417.94,418.49 +418.49,418.61,418.44,418.61 +418.61,418.77,418.14,418.69 +418.69,419.39,418.28,418.9 +418.9,422.56,418.81,422.02 +422.01,422.5,421.68,421.83 +421.84,422.5,421.8,422.17 +422.16,423.77,421.98,423.48 +423.48,424.0,423.12,423.62 +423.8,424.41,423.38,423.69 +423.69,424.98,423.48,424.98 +424.98,425.0,423.7,424.4 +424.39,425.98,424.15,425.91 +425.92,426.0,425.67,425.9 +425.89,430.6,425.72,430.6 +430.55,430.96,428.5,430.72 +430.61,433.0,430.16,431.04 +431.04,433.94,431.04,432.7 +432.64,433.48,431.96,432.7 +432.69,432.71,429.78,430.62 +430.65,431.2,430.27,431.17 +431.17,437.0,431.16,437.0 +436.99,440.0,436.99,439.85 +439.85,443.91,438.7,440.5 +440.68,443.71,440.5,442.55 +442.6,444.03,436.42,436.62 +436.68,440.42,436.65,438.53 +438.51,441.91,438.51,441.8 +441.79,442.25,436.0,438.76 +438.83,440.59,435.51,436.09 +436.08,438.2,435.14,438.13 +438.07,440.55,438.06,440.5 +440.55,441.58,438.9,440.12 +440.16,440.55,438.28,439.22 +439.23,439.72,438.4,439.59 +439.47,440.33,439.47,440.19 +440.08,446.99,440.08,446.3 +446.29,448.7,444.59,445.57 +445.57,445.99,443.41,444.76 +444.63,445.43,443.15,444.47 +444.4,445.11,444.25,445.11 +445.1,445.89,428.0,430.63 +430.48,434.72,430.48,431.9 +430.02,432.04,426.01,429.04 +429.56,430.45,426.17,430.41 +430.41,436.96,430.38,433.63 +433.71,435.14,433.0,433.54 +433.64,434.38,433.37,433.59 +433.59,437.0,432.5,437.0 +437.0,439.86,436.94,437.76 +437.77,439.58,434.01,438.54 +438.54,439.0,434.81,438.53 +438.52,438.67,437.47,437.325 +437.325,438.13,434.75,436.12 +436.13,436.23,434.0,434.51 +434.51,434.88,430.95,434.78 +434.77,435.49,433.5,434.82 +434.96,435.81,434.44,435.81 +435.62,435.81,434.45,435.12 +435.19,435.87,432.36,434.81 +434.8,435.48,434.01,435.1 +435.1,436.8,434.92,434.91 +434.70000000000005,436.4,433.88,434.72 +434.3,436.0,433.23,435.18 +435.18,436.07,434.17,435.75 +435.79,436.78,435.63,435.75 +435.81,438.5,435.54,438.49 +437.13,438.48,437.55,438.175 +438.45,438.45,436.19,437.86 +437.87,438.44,436.01,437.73 +437.5,437.76,436.35,437.43 +437.43,438.0,437.33,437.96 +437.655,438.14,436.9,437.87 +437.88,439.0,437.7,438.99 +438.98,438.99,436.68,436.69 +436.75,437.0,435.24,436.8 +436.78,437.67,436.41,437.6 +437.6,439.22,437.39,439.17 +439.16,440.62,438.78,440.61 +440.61,440.9,439.6,439.91 +439.93,440.12,438.62,439.06 +439.06,439.45,438.57,438.94 +438.96,439.2,437.15,438.63 +438.62,438.87,434.84,436.29 +436.28,436.28,434.0,434.01 +429.485,434.0,420.0,422.61 +422.69,423.63,420.99,423.37 +423.39,425.1,422.67,424.93 +424.94,425.55,418.29,422.34 +422.35,423.25,420.84,421.82 +421.76,422.71,421.36,422.53 +422.53,423.34,421.72,422.8 +422.82,423.76,420.67,421.17 +421.31,421.86,416.08,418.62 +418.87,419.78,414.31,414.66 +414.73,418.32,414.16,415.72 +415.63,418.46,415.01,418.11 +418.07,420.74,417.82,420.04 +420.04,421.27,419.5,419.55 +419.58,421.26,418.49,420.66 +420.65,420.89,419.2,420.66 +420.65,424.75,420.65,424.48 +424.49,425.6,423.8,424.52 +424.52,425.1,418.04,420.52 +420.49,421.38,419.0,421.38 +421.25,421.5,420.73,420.8 +420.8,421.15,410.0,413.45 +413.43,415.35,413.43,414.62 +414.63,417.6,414.31,417.02 +416.87,417.62,415.86,416.06 +416.1,419.47,415.87,419.27 +419.34,419.34,417.88,419.065 +417.93,418.86,417.73,418.86 +418.81,421.9,418.81,421.9 +421.88,422.0,419.7,421.9 +420.75,422.18,420.41,421.9 +421.78,424.32,421.78,423.83 +423.83,423.9,422.5,423.04 +423.06,423.9,421.16,423.58 +423.44,424.0,420.1,423.88 +423.82,424.92,423.39,424.0 +424.0,424.0,422.66,423.33 +423.94,424.0,422.93,423.93 +423.88,424.0,422.37,423.37 +423.33,424.0,421.42,424.0 +424.0,425.99,423.39,425.03 +425.16,425.97,423.9,425.22 +425.22,426.44,424.76,425.47 +425.47,425.47,421.15,421.15 +421.12,422.14,420.9,420.9 +420.91,421.43,418.6,420.96 +420.97,421.5,420.68,420.96 +420.85,424.47,420.27,422.90999999999997 +424.29,424.88,423.93,424.86 +424.24,425.5,419.8,424.19 +424.19,424.48,423.07,423.08 +423.42,423.73,422.3,423.73 +423.73,423.85,419.43,419.9 +419.98,421.94,419.98,421.44 +421.45,423.13,420.86,422.96 +422.89,422.96,421.5,422.09 +422.18,422.75,421.13,422.6 +422.59,422.61,421.95,422.32 +422.32,422.77,421.31,422.7 +422.69,425.0,422.01,424.75 +424.77,424.77,422.39,423.49 +423.64,423.75,422.45,423.3 +423.36,423.39,422.52,422.89 +422.9,423.75,422.81,423.49 +423.45,423.51,421.08,421.2 +421.2,422.3,419.53,421.91 +421.9,422.0,421.0,421.0 +421.04,421.58,420.0,420.89 +420.87,421.81,420.68,421.68 +421.76,423.59,421.76,423.56 +423.55,423.59,423.22,423.5 +423.51,424.5,423.05,424.49 +424.49,424.56,424.15,424.4 +424.4,424.4,423.78,424.14 +424.14,424.16,423.55,423.77 +423.77,424.56,423.56,424.4 +424.39,424.85,422.29,423.65 +423.49,423.88,422.9,423.69 +423.67,423.83,422.66,423.75 +423.75,423.86,423.6,423.75 +423.75,423.82,423.0,423.56 +423.63,424.01,421.78,423.16 +423.21,423.85,422.85,423.46 +423.44,423.5,421.1,422.5 +422.5,423.13,422.09,423.13 +423.0,423.89,422.56,423.83 +423.89,426.82,423.73,426.59 +426.6,431.73,426.59,431.64 +431.64,434.97,431.63,432.66 +432.65,433.5,432.52,433.07 +433.06,434.77,432.73,434.17 +434.15,434.2,433.04,433.46 +433.46,433.6,431.0,432.38 +432.38,432.9,431.5,432.9 +432.89,433.71,432.47,432.95 +432.91,433.29,432.49,432.52 +432.62,433.14,432.24,431.45 +432.33,432.34,430.38,430.38 +430.38,430.83,430.22,430.39 +430.4,432.07,430.4,431.96 +431.96,432.43,430.88,431.1 +431.05,431.78,431.05,431.36 +431.36,431.98,431.29,431.76 +431.76,432.01,430.68,431.6 +431.625,431.48,430.32,431.44 +431.49,432.95,431.49,432.75 +432.74,433.13,432.16,432.46 +431.985,432.46,430.14,431.22 +431.23,431.29,430.51,431.19 +431.17,431.52,431.0,431.52 +431.52,432.51,431.52,432.5 +432.5,433.21,432.3,433.08 +433.16,433.35,425.57,426.66 +426.67,426.75,423.0,423.88 +423.88,426.06,423.88,425.63 +425.65,426.79,425.2,425.82 +426.11,426.5,425.23,426.03 +426.01,426.31,425.7,426.16 +426.14,426.88,425.49,426.82 +426.81,427.3,426.72,427.3 +427.3,427.6,427.23,427.01 +427.25,427.25,426.5,426.72 +426.72,426.72,425.33,425.97 +425.97,426.23,425.68,426.15 +426.16,428.68,426.16,428.41 +428.51,429.97,428.49,429.97 +429.99,436.07,429.99,435.61 +435.6,435.6,433.22,434.0 +434.0,434.0,433.23,434.0 +434.0,434.63,433.76,434.63 +434.52,434.92,433.96,434.66 +434.66,435.29,434.13,434.49 +434.49,435.0,433.43,433.63 +433.71,434.0,433.14,433.82 +433.9,433.9,431.93,433.66 +433.67,434.0,433.0,433.0 +433.01,433.85,431.13,433.84 +433.85,435.05,433.85,435.05 +435.05,438.36,435.05,436.72 +436.42,438.45,435.21,437.24 +437.28,437.68,436.49,436.5 +436.49,437.48,436.24,436.83 +436.78,438.26,436.06,438.08 +438.08,438.14,434.12,434.5 +434.48,437.31,434.15,436.64 +435.565,437.07,435.24,436.66 +436.65,442.0,435.91,440.63 +440.65,442.0,433.61,435.33 +435.37,437.07,435.12,436.2 +436.28,437.14,435.57,435.83 +435.88,438.95,435.66,437.64 +437.48,438.2,434.0,437.07666666666665 +436.52,437.0,436.2,436.5133333333333 +436.25,438.0,435.89,435.95 +435.97999999999996,436.24,434.98,435.64 +435.71,436.51,434.04,434.27 +434.27,435.25,434.16,435.25 +435.22,435.3,433.36,433.96 +433.97,436.0,433.91,436.0 +436.0,436.5,435.99,436.37 +436.37,437.5,436.2,436.48 +436.49,437.78,435.72,437.13 +437.17,437.38,435.32,437.06 +437.03,437.27,436.13,436.56 +436.56,436.56,433.73,435.0 +435.01,435.91,433.56,435.72 +435.7,435.72,434.43,435.52 +435.56,435.72,427.5,432.04 +434.16999999999996,432.97,430.96,432.91 +432.78,435.06,432.78,433.54 +433.55,435.42,432.95,435.28 +433.49,435.28,432.96,433.39 +433.43,434.33,433.19,433.9 +433.66,434.64,433.42,434.41 +434.38,434.65,432.21,432.43 +432.43,432.64,428.8,429.87 +429.87,432.37,429.87,431.76 +431.69,432.77,429.5,430.4 +430.35,431.72,430.01,431.64 +431.64,432.91,430.4,431.39 +431.28,431.57,430.31,431.39 +431.23,432.49,431.13,431.72 +431.78,432.5,431.71,432.39 +432.39,433.22,431.99,432.94 +432.93,435.36,432.82,435.12 +435.12,435.18,432.14,434.26 +434.27,435.2,434.27,434.595 +434.595,434.93,433.92,434.93 +434.92,435.04,433.47,434.68 +434.67,434.82,432.62,434.355 +433.04,434.18,432.56,434.03 +434.03,434.03,432.4,432.4 +432.31,432.98,431.2,431.68 +432.64,433.5,431.52,432.97 +432.97,432.99,432.4,432.05 +432.49,432.69,431.09,431.13 +431.17,431.5,428.02,431.02 +431.04,431.07,426.88,428.09 +428.26,429.59,428.11,428.18 +428.2,430.0,428.17,430.0 +430.0,430.0,428.74,428.77 +428.77,429.18,428.09,429.08 +429.01,429.64,428.71,428.85 +428.85,429.18,428.63,428.365 +428.82,429.25,427.88,427.88 +427.88,428.37,427.4,427.4 +427.41,427.41,423.35,424.61 +424.6,424.6,418.36,421.45 +421.49,422.55,415.82,418.37 +418.14,419.49,417.01,419.075 +419.32,422.34,418.93,419.78 +419.78,419.78,413.0,415.21 +415.21,417.0,408.63,413.55 +413.67,415.98,413.23,415.32 +415.23,415.98,412.0,414.95 +414.96,416.84,410.1,416.7 +416.62,421.19,416.29,421.19 +421.17,422.02,420.61,420.81 +420.85,421.14,419.05,420.55 +421.12,421.44,419.62,420.29 +420.25,421.17,419.62,420.775 +420.745,422.8,420.3,421.26 +421.24,421.34,419.81,420.17 +420.18,420.24,418.27,418.49 +418.46,418.46,415.0,415.39 +415.39,419.0,415.08,418.91 +418.91,419.0,416.9,417.31 +417.31,417.41,411.17,413.95 +413.94,417.77,410.76,417.77 +417.73,419.4,417.61,419.2 +419.2,419.69,418.61,418.99 +419.06,419.4,417.78,418.34 +418.74,419.18,418.03,418.35 +418.39,421.62,418.35,421.37 +421.38,421.85,420.47,421.115 +421.0,421.49,420.03,420.86 +421.12,421.83,420.65,421.14 +421.11,421.19,419.99,420.42 +420.42,421.84,420.32,421.27 +421.28,422.13,421.0,421.64 +421.63,422.21,419.37,419.75 +419.76,419.79,417.45,418.76 +418.75,418.75,416.77,416.98 +416.77,417.44,415.06,417.44 +417.44,418.29,417.44,418.29 +418.25,418.54,417.0,417.5 +417.72,417.99,417.0,417.95 +417.87,419.72,417.48,418.14 +418.13,418.89,418.01,418.55 +418.58,418.69,416.01,416.21 +416.18,416.95,415.63,416.09 +416.08,416.48,414.0,414.06 +414.07,414.07,405.5,410.68 +410.68,411.0,406.64,409.94 +409.94,411.74,407.0,407.58 +407.58,409.51,406.49,406.78 +406.82,407.02,402.98,405.49 +405.26,406.49,400.17,403.3 +403.3,403.3,396.45,400.32 +400.37,405.89,398.0,405.75 +405.83,408.83,405.71,407.65 +407.68,407.75,406.87,407.19 +407.17,407.24,400.0,400.0 +400.72,400.78,395.51,395.51 +395.93,395.94,387.29,387.29 +387.2,397.49,386.12,397.11 +397.11,399.33,389.0,399.32 +399.33,400.77,387.01,389.35 +389.35,397.65,385.41,396.43 +396.43,400.29,394.88,399.36 +399.11,399.11,385.0,391.03 +391.03,393.49,382.51,384.3 +384.3,394.69,381.09,394.49 +394.46,399.28,384.0,398.69 +398.69,398.69,395.47,396.74 +396.6,400.22,396.5,399.05 +399.05,399.87,398.13,399.87 +399.84,400.69,399.13,399.99 +399.99,400.0,399.35,399.87 +399.84,399.86,394.22,396.65 +396.55,396.58,391.51,391.51 +391.6,393.99,385.01,392.99 +392.99,395.44,392.41,393.96 +393.96,397.6,393.96,397.27 +397.14,398.61,393.0,396.62 +396.62,397.72,396.49,397.6 +397.6,398.09,396.71,396.78 +396.92,399.2,396.66,398.245 +399.19,399.85,398.9,399.71 +399.71,404.42,399.64,402.445 +403.6,405.19,403.49,405.18 +404.4,405.87,403.28,405.19 +405.2,405.29,402.48,402.62 +402.75,403.57,402.16,402.73 +402.73,405.42,402.73,405.42 +405.39,408.75,405.39,408.37 +408.5,409.27,406.69,406.99 +406.96,407.44,406.41,407.01 +407.05,407.82,406.77,407.5 +407.49,408.32,406.04,406.04 +406.04,406.53,405.04,406.33 +406.25,406.34,405.56,405.95 +405.96,407.68,402.73,402.73 +402.72,404.06,401.4,403.82 +403.76,403.83,395.0,399.04 +398.97,402.96,396.52,401.18 +401.18,403.96,400.21,402.64 +402.59,405.18,402.01,404.97 +404.94,405.14,403.0,404.38 +404.47,404.81,402.91,404.29 +404.27,405.39,403.96,404.395 +405.4,405.79,403.87,404.5 +404.34,405.3,404.1,404.95 +404.96,405.95,404.84,405.46 +405.46,408.0,403.77,408.0 +408.0,409.5,407.82,409.49 +409.5,410.0,408.16,410.12 +409.52,410.99,409.3,410.75 +410.77,411.0,407.13,408.45 +408.47,408.59,406.02,407.5 +407.49,409.64,407.22,409.15 +409.15,410.33,409.15,410.01 +410.33,411.76,410.18,410.87 +411.255,412.3,410.63,412.18 +412.18,412.2,411.29,411.5 +411.5,412.2,410.5,412.16 +412.09,415.62,412.06,415.62 +415.19,418.74,410.31,411.81 +412.21,412.77,410.96,411.61 +411.61,413.0,410.91,412.64 +412.53,413.6,412.33,412.71 +412.71,416.33,412.7,414.56 +414.57,414.9,414.01,414.61 +414.65,415.85,414.61,415.53 +415.35,415.93,415.23,415.53 +415.53,415.53,414.0,414.03 +414.11,414.44,413.0,413.02 +413.02,413.02,411.83,412.05 +412.06,413.0,411.5,411.69 +411.64,411.84,410.0,411.33 +411.33,411.33,408.01,409.28 +409.29,409.38,407.41,408.71 +408.72,410.49,407.4,410.44 +410.44,410.95,408.95,410.27 +410.3,411.83,409.11,411.6 +411.59,412.24,411.14,411.8 +411.9,412.1,410.5,410.87 +410.7,411.69,410.7,411.51 +411.5,411.8,410.7,411.03 +411.03,411.58,409.62,411.0 +410.85,412.19,410.41,411.11 +411.21,412.04,409.94,411.04 +411.07,411.17,408.75,408.8 +408.8,411.11,408.8,410.61 +410.62,411.33,410.51,411.25 +411.26,411.41,410.24,410.51 +410.5,410.95,410.08,410.56 +410.65,410.83,409.73,410.11 +410.1,411.33,410.0,410.81 +410.67,410.69,409.5,410.22 +410.345,410.34,409.74,410.08 +410.02,410.88,409.65,410.86 +410.96500000000003,411.99,410.55,411.9 +411.91,411.92,410.96,411.35 +411.38,411.39,410.31,410.85 +410.85,411.57,410.38,411.38 +411.22,411.9,410.51,411.61 +411.62,413.73,411.62,412.7 +412.68,414.0,412.38,413.98 +413.99,414.0,412.59,413.2 +413.2,413.59,412.51,412.54499999999996 +413.31,413.71,410.1,411.89 +411.92,411.95,410.44,410.6 +410.59,411.94,410.46,411.94 +411.95,412.6,410.41,412.09 +411.9,413.0,411.9,412.77 +412.6,413.0,411.57,412.46500000000003 +411.97,412.84,411.71,412.16 +412.27,412.39,411.28,411.66 +411.55,412.2,411.53,411.92 +411.85,411.85,410.71,411.48 +411.48,412.52,411.48,411.95 +411.96,412.54,411.71,412.52 +412.345,412.74,412.04,412.73 +412.73,412.73,412.01,412.37 +412.37,412.78,412.0,412.105 +412.5,412.69,411.57,411.84 +411.86,412.39,411.03,411.5 +411.51,413.69,411.51,412.79 +412.77,414.0,412.33,413.52 +413.72,415.57,413.72,415.45 +415.46,415.49,414.81,415.31 +415.33,415.49,414.24,414.62 +414.51,415.96,414.21,415.8 +415.85,416.0,414.17,415.19 +415.39,415.64,414.5,415.21 +415.0,415.77,413.35,415.7 +415.68,416.52,414.47,416.19 +416.31,416.43,414.79,415.65 +415.92,416.33,415.8,416.07 +416.06,416.31,414.97,416.29499999999996 +415.49,416.88,415.01,416.52 +416.38,416.93,416.19,416.78 +416.93,417.5,415.96,416.88 +416.9,418.0,416.13,417.36 +416.59,418.33,416.29,417.84 +417.84,418.38,417.67,418.38 +418.38,418.94,415.05,418.26 +418.29,418.96,415.72,417.93 +418.06,420.0,417.35,420.0 +419.005,420.0,419.33,420.03 +419.95,420.33,419.25,420.06 +420.06,421.0,419.86,420.97 +420.97,420.97,419.35,419.93 +419.94,420.0,418.78,419.84 +419.97,420.0,419.37,419.99 +420.0,420.0,419.83,420.0 +420.0,420.82,419.24,420.82 +420.83,420.96,419.7,420.94 +420.93,420.94,419.14,420.26 +420.26,420.42,418.0,419.45 +418.22,418.86,417.51,418.64 +418.64,419.37,417.79,419.17 +419.16,419.87,418.5,419.77 +419.61,420.73,419.29,420.31 +420.3,421.3,420.3,420.84 +420.84,420.86,418.44,418.94 +419.03,419.12,414.18,414.82 +415.03,416.54,412.48,412.8 +412.8,414.83,410.47,414.625 +414.27,416.86,414.26,416.45 +416.45,416.9,415.71,416.9 +416.125,417.41,415.68,415.68 +415.8,416.71,415.19,415.58000000000004 +416.0,416.13,414.32,415.48 +415.28,415.48,414.78,414.755 +414.655,415.05,413.09,414.03 +414.03,414.56,413.67,413.78 +413.81,413.81,411.66,411.94 +410.615,411.98,406.78,407.45 +407.42,410.13,406.52,410.12 +410.11,410.94,409.35,410.88 +410.83,410.83,408.12,410.41999999999996 +408.74,410.57,408.55,409.96 +409.96,410.17,409.41,409.6 +409.59,410.21,408.98,410.08 +410.06,411.0,409.87,410.71 +410.82,410.94,410.01,410.69 +410.56,411.0,410.41,410.8 +410.71,411.25,410.39,410.99 +411.0,412.02,410.98,411.99 +412.0,412.43,411.09,411.19 +411.18,411.93,411.06,411.93 +411.93,413.96,411.93,412.65 +412.66,414.09,412.44,413.53 +413.55,413.64,412.44,412.81 +412.76,413.0,412.13,413.0 +412.93,413.97,412.84,413.96 +413.97,415.83,413.97,415.76 +414.3966666666667,415.85,415.13,415.505 +414.8233333333333,416.38,415.08,415.25 +415.25,415.25,413.43,413.63 +413.61,413.73,412.09,412.77 +412.8,413.0,411.91,412.51 +412.52,413.57,412.33,413.36 +413.025,413.84,413.12,413.53 +413.53,413.89,412.75,412.87 +412.77,413.55,412.36,413.54 +413.56,413.73,412.77,413.54 +413.5,413.8,412.52,413.01 +413.03,414.14,412.29,412.77 +412.78,413.36,412.23,412.23 +412.43,413.26,412.12,412.93 +413.13,413.29,412.31,413.01 +413.17,415.0,412.75,415.0 +415.0,415.3,414.27,414.64 +414.64,415.31,414.64,415.1 +415.1,415.58,414.45,415.58 +415.58,415.84,414.1,414.45 +414.45,414.45,413.14,413.14 +413.15,413.55,412.7,413.3 +413.27,414.54,412.94,414.39 +414.39,414.39,413.25,413.43 +413.3,413.46,413.0,413.36 +413.37,414.88,412.79,414.88 +414.74,414.93,413.19,413.49 +413.54,414.13,413.17,413.92 +413.92,413.95,412.77,413.65 +413.38,413.65,412.13,412.97 +412.97,413.32,412.01,413.22 +413.19,413.37,411.61,412.0 +413.275,413.96,412.0,413.37 +413.36,413.91,412.85,413.75 +413.58,413.87,412.84,413.85 +413.81,414.13,413.27,414.0 +414.0,415.32,413.66,415.31 +415.31,415.9,415.13,415.9 +415.65,415.99,415.4,415.99 +415.99,416.94,413.82,414.22 +414.21,415.99,413.98,415.76 +415.76,416.5,415.54,416.29 +416.27,416.3,413.89,414.65 +415.53,415.22,413.87,414.89 +414.79,415.95,414.77,415.71 +415.71,415.79,414.8,415.04 +414.96,415.36,414.48,414.94 +414.71,415.98,414.4,415.66 +415.67,416.0,415.55,415.85 +415.98,416.01,415.23,415.34 +415.46,415.99,415.15,415.6 +415.61,415.69,412.48,413.37 +413.37,414.96,413.37,414.96 +414.85,415.75,413.95,415.28 +415.28,415.41,414.4,414.8 +414.83,415.34,414.6,415.22 +415.22,415.89,414.84,415.1 +415.13,415.65,414.73,415.0 +415.09,415.8,414.78,415.35 +415.48,415.5,414.77,415.49 +415.48,415.91,414.65,415.88 +415.88,416.25,415.52,416.01 +416.04,416.21,415.23,415.4 +415.38,415.84,415.2,415.69 +415.65,415.84,413.87,414.35 +414.4,414.9,414.25,414.68 +414.74,414.86,413.9,414.45500000000004 +414.53,414.89,414.23,414.23 +414.24,414.35,413.74,413.98 +413.99,414.2,413.76,413.91 +413.96500000000003,414.16,413.54,413.96 +413.94,415.13,413.56,415.13 +415.13,415.48,414.48,414.74 +414.74,414.83,414.4,414.76 +414.62,415.0,414.24,414.77 +414.8,415.66,414.64,414.99 +415.09,415.13,414.26,414.87 +414.88,415.84,414.75,415.28 +415.35,415.84,415.01,415.83 +415.84,415.84,413.0,415.09 +415.09,415.99,414.64,415.45 +415.03,416.33,414.98,415.66 +415.61,416.0,415.21,415.82 +415.81,416.39,415.5,416.0 +415.99,416.07,415.63,416.07 +416.0,416.07,415.7,416.07 +416.06,416.57,415.99,416.45 +416.56,417.23,416.24,416.64 +416.75,417.79,416.62,417.49 +417.52,418.19,417.46,418.04 +418.04,418.76,417.74,417.91 +417.87,418.16,417.68,417.9 +417.89,418.48,417.59,418.0 +417.91,418.46,417.59,418.1 +418.19000000000005,418.5,418.09,418.43 +418.47,418.89,417.95,418.89 +418.81,419.29,418.42,418.66 +418.52,419.0,418.01,419.0 +418.66,419.34,418.0,418.68 +418.76,419.75,418.33,419.03 +418.96,419.12,418.42,419.12 +419.12,419.2,417.87,418.85 +418.85,419.74,418.61,418.8 +418.87,419.34,418.4,418.61 +418.76,419.14,418.12,419.05 +419.04,419.06,417.66,417.89 +417.9,418.39,417.64,418.34 +418.3,418.48,417.99,418.24 +418.23,418.75,417.79,418.16 +418.05,418.22,416.93,417.81 +417.82,418.66,417.79,418.39 +418.39,418.39,416.53,416.99 +417.0,417.64,417.0,417.5 +417.5,417.92,416.44,416.5 +416.46,417.51,415.27,415.27 +415.27,415.74,414.1,415.44 +415.52,415.58,414.8,414.95500000000004 +415.22,415.23,414.06,414.47 +414.47,414.84,414.15,414.36 +414.36,414.65,413.72,414.20000000000005 +414.26,414.74,413.5,414.04 +414.35,414.71,413.63,414.45 +414.44,414.5,413.11,413.4 +413.33,413.89,410.0,410.4 +410.4,411.19,408.12,410.14 +410.15,412.41,410.15,410.55 +410.55,412.48,408.23,409.42 +409.54,410.01,406.19,407.165 +406.96,406.96,399.21,404.91 +404.76,408.37,404.76,406.47 +406.58,408.49,406.51,408.49 +408.49,409.54,408.09,409.29 +409.18,410.22,408.9,409.54 +409.53,410.3,409.36,409.36 +409.6,409.95,409.01,409.58 +409.6,410.11,408.17,409.9 +409.9,411.0,408.31,409.64 +409.64,409.72,407.3,408.09 +409.325,409.35,408.0,409.07 +409.01,409.51,408.82,410.03 +409.47249999999997,411.0,408.9,410.99 +409.935,411.0,410.14,410.775 +410.39750000000004,411.0,410.46,410.56 +410.86,410.99,410.03,410.025 +410.165,410.97,409.36,409.49 +409.47,409.47,407.28,408.4 +408.13,409.4,406.0,407.31 +407.44,408.0,406.92,407.24 +407.24,408.12,407.02,407.8 +407.7,407.7,404.72,405.66 +405.7,406.51,405.11,405.70000000000005 +405.12,406.0,405.12,405.74 +405.74,406.4,405.51,406.4 +406.02,406.77,406.18,406.18 +406.3,407.75,406.18,407.65 +407.7,408.25,407.5,408.2 +408.2,410.74,408.19,410.16 +410.14,411.0,409.6,409.89 +410.485,412.78,409.62,410.87 +410.83,411.83,410.24,410.47 +410.47,410.67,409.36,410.01 +410.02,411.26,409.78,410.02 +410.01,410.99,409.74,410.335 +410.55,410.75,410.24,410.65 +410.56,411.24,409.82,410.27 +410.32,410.92,409.83,410.54 +410.66,410.67,409.83,410.2 +410.16,410.57,409.67,409.9 +409.76,410.62,409.67,410.19 +410.16,411.2,409.99,411.2 +411.11,412.38,411.0,411.76 +412.0,412.57,411.55,412.57 +412.43,412.43,411.32,412.315 +412.57,412.06,410.51,412.06 +412.71000000000004,412.85,411.88,412.84 +412.85,415.0,412.64,414.89 +414.9,415.34,414.6,414.94 +415.11,415.25,413.1,413.18 +413.11,413.99,411.79,412.51 +412.43,414.5,411.55,412.08 +411.93,413.97,411.0,411.42 +411.35,412.13,410.0,410.94 +411.2,411.35,407.97,408.0 +408.0,408.44,407.63,407.87 +407.78,408.44,406.89,408.12 +408.16,408.97,407.25,408.57 +408.41,408.84,407.98,408.79 +408.895,409.53,408.74,409.38 +409.38,409.53,408.28,408.37 +408.44,408.78,408.22,408.5 +408.68,409.53,407.96,409.53 +409.41,409.42,408.55,408.88 +408.89,408.9,407.1,408.76 +408.78,409.28,407.98,408.37 +408.38,409.27,408.26,409.23 +409.23,410.56,409.14,410.24 +410.34,411.0,409.52,409.52 +409.56,410.46,409.12,409.90999999999997 +409.91,410.3,408.98,410.3 +410.29,411.55,409.85,410.77 +411.44,411.45,409.44,411.24 +411.25,411.57,409.0,410.64 +410.63,411.5,410.34,411.45 +411.45,411.93,411.06,411.21 +411.21,412.0,410.68,411.23 +411.19,411.83,411.0,411.78 +411.73,412.24,411.19,412.24 +412.24,415.0,412.22,414.86 +414.96,415.53,414.2,415.52 +415.53,416.9,415.53,416.89 +416.89,416.9,415.85,416.57 +416.395,416.56,415.77,415.91 +415.9,416.61,415.75,416.61 +416.61,416.62,415.97,416.24 +416.42,416.89,415.7,416.89 +416.89,417.0,416.15,416.97 +416.97,417.0,415.88,415.99 +415.87,416.02,415.61,415.78 +415.78,416.08,415.08,415.87 +415.76,415.9,415.52,415.67 +415.76,415.99,415.5,415.82 +415.71,416.86,415.71,416.47 +416.48,416.49,414.49,416.49 +416.41,417.79,416.36,417.29 +417.28,417.5,415.79,416.48 +416.45,417.09,416.25,416.49 +416.56,416.82,416.25,416.58 +416.7,417.0,415.76,415.98 +416.1,416.67,415.82,416.67 +416.66,416.67,416.01,416.57 +416.56,416.87,416.1,416.84 +416.8,417.43,416.6,417.35 +417.35,417.45,417.23,417.45 +417.35,417.48,417.11,417.25 +417.11,417.47,417.06,417.16 +417.26,417.48,416.39,416.74 +416.55,416.84,416.3,416.45 +416.35,416.69,416.3,416.61 +416.61,417.3,416.32,416.74 +417.3,417.48,416.7,416.87 +416.8,417.38,416.75,417.34 +417.2,417.46,416.78,417.42 +417.42,417.49,417.01,417.16 +417.21,417.35,413.95,415.37 +415.37,416.14,414.45,416.05 +416.06,417.25,415.2,417.13 +417.1,417.49,415.94,417.48 +417.45,417.75,416.93,417.47 +417.47,417.9,417.0,417.89 +417.89,418.7,417.76,418.69 +418.69,418.99,417.96,418.58 +418.57,418.71,417.93,418.17 +418.28,418.29,416.67,417.51 +417.5,417.72,416.88,417.04 +417.04,417.65,416.13,416.97 +416.97,417.23,415.67,415.81 +415.93,416.37,415.56,415.99 +415.9,416.73,415.84,416.65 +416.72,416.84,416.23,416.75 +416.75,416.83,415.79,415.81 +415.8,415.88,414.95,414.96 +414.96,414.96,414.39,414.83 +414.4,414.7,413.74,414.7 +414.7,415.15,414.15,414.4 +414.4,415.41,414.06,415.21 +415.09,415.44,414.66,415.44 +415.44,416.42,415.43,416.4 +416.39,416.65,415.46,416.01 +416.0,416.36,415.54,415.96 +415.95,416.37,415.42,415.88 +415.72,415.99,415.32,415.68 +415.81,416.05,415.44,415.72 +415.64,416.9,415.0,415.86 +415.8066666666667,416.39,416.35,416.0 +415.9733333333333,416.34,416.13,416.14 +416.14,416.14,413.09,414.11 +414.12,414.76,410.0,412.94 +412.89,412.95,411.0,412.07 +412.07,413.16,412.07,412.49 +412.46,414.45,411.77,413.81 +413.81,414.02,412.65,413.45 +413.44,414.0,413.23,413.83 +413.97,414.56,413.71,414.18 +414.31,414.37,413.44,414.2766666666667 +413.98,415.3,413.98,414.37333333333333 +414.265,415.3,414.25,414.47 +414.55,415.03,414.0,414.68 +414.68,415.02,414.12,414.58 +414.68,415.75,414.68,415.63 +415.68,416.11,414.71,415.4 +415.35,415.7,415.12,415.65 +415.65,416.48,415.59,416.33 +416.33,416.5,415.5,416.36 +416.48,416.7,415.82,416.27 +416.24,416.33,414.82,416.02 +415.1,415.32,414.0,415.77 +414.88,416.19,414.8,415.52 +415.51,415.79,415.01,415.72 +415.74,416.0,415.61,416.0 +415.99,416.26,415.83,416.23 +416.1,416.87,416.04,416.64 +416.52,417.22,416.0,417.04 +417.05,417.77,417.05,417.74 +417.74,417.77,417.24,417.25 +417.25,417.65,416.55,417.52 +417.63,417.69,416.68,417.15 +417.16,417.4,416.8,417.36 +417.27,417.43,417.01,417.43 +417.38,417.49,416.93,417.32 +417.36,417.5,416.22,416.22 +416.23,416.35,415.17,415.61 +415.37,415.47,415.0,415.0 +415.1,415.3,414.37,415.21 +415.22,415.5,414.46,415.42499999999995 +415.34,415.84,414.66,415.64 +415.64,416.03,415.06,415.38 +415.73,416.12,415.26,415.8 +415.82,416.43,415.54,416.38 +416.41,417.24,416.3,416.7 +416.77,417.34,416.55,416.73 +416.8,417.11,416.42,416.94 +416.94,417.25,416.76,417.14 +417.13,417.17,416.51,416.97 +416.97,417.09,416.65,416.84 +416.81,417.0,415.95,416.68499999999995 +416.98,417.07,416.5,416.53 +416.56,417.09,416.41,416.65 +416.65,416.66,416.35,416.5 +416.55,416.91,416.49,416.65 +416.65,416.91,416.58,416.89 +416.79499999999996,417.09,416.7,416.95 +416.94,416.95,416.83,416.92499999999995 +416.91,416.91,416.86,416.9 +417.1225,417.17,416.83,416.88 +417.33500000000004,417.38,416.87,417.38 +417.5475,417.77,417.32,417.77 +417.76,417.77,417.52,417.61 +417.6,417.6,417.05,417.49 +417.5,417.55,417.2,417.35 +417.4,417.4,417.06,417.33 +417.23,425.25,417.17,425.24 +425.24,426.07,424.06,425.97 +425.96,426.5,425.49,426.39 +426.39,426.5,425.58,426.5 +426.5,426.5,423.81,425.07 +425.07,425.34,424.15,424.87 +425.02,425.05,423.16,424.88 +424.84,425.35,423.86,424.11 +424.12,425.48,424.0,424.99 +424.98,424.99,423.85,424.08 +424.26,424.53,424.02,424.1 +424.2,424.33,422.56,422.91 +422.88,424.23,422.85,424.23 +424.22,424.59,422.23,422.77 +423.93,424.0,422.51,423.6 +423.64,423.91,423.22,423.29 +423.65,423.65,421.71,422.98 +422.74,422.88,422.53,422.67 +422.64,422.74,422.5,422.73 +422.62,422.74,420.61,423.45500000000004 +422.34,424.27,421.84,424.18 +424.17,424.3,422.22,423.975 +423.995,424.2,422.34,423.77 +423.82,424.0,422.16,423.24 +423.24,423.32,420.17,420.32 +420.31,421.36,419.63,420.44 +420.8,422.5,420.72,422.32 +422.11,422.14,420.59,421.9 +422.0,422.5,421.53,421.53 +421.56,422.49,421.39,421.7 +421.775,422.23,420.83,421.98 +421.99,422.3,421.19,422.15 +422.23,423.02,422.04,422.92 +422.91,423.28,422.37,423.16 +423.17,424.5,423.01,424.5 +424.5,424.62,422.2,422.88 +422.89,424.04,422.81,423.96 +423.98,424.33,422.78,423.01 +422.98,422.98,421.5,422.04 +422.04,423.56,422.01,423.28 +423.28,423.7,422.96,423.4 +423.4,423.58,422.89,423.0 +423.08,423.33,421.75,421.95 +422.09,422.2,420.0,420.01 +420.01,420.35,407.75,412.79 +412.79,414.27,412.45,413.765 +413.05,415.49,413.05,414.74 +414.74,415.0,412.8,413.05 +413.05,413.27,411.6,412.87 +412.88,413.69,411.85,413.69 +413.36,413.79,412.12,413.51 +413.5,414.2,412.63,414.0 +414.0,414.78,413.5,414.75 +414.72,415.0,413.01,414.83 +414.62,415.75,414.21,415.31 +415.41,416.32,414.81,415.96 +415.96,416.5,415.15,416.41 +416.4,416.4,414.48,414.81 +414.77,415.25,412.98,413.78 +413.89,415.03,413.35,414.41 +414.52,415.04,414.4,414.91 +414.87,415.18,414.68,414.9 +414.9,415.16,414.8,413.475 +415.16,415.16,412.05,412.05 +412.06,412.75,411.84,412.83000000000004 +412.855,414.0,412.7,413.61 +413.65,414.37,413.43,413.42333333333335 +414.13,414.19,412.99,413.2366666666667 +413.58500000000004,413.46,412.94,413.05 +413.04,413.27,412.86,413.15 +413.15,413.2,407.56,410.44 +410.42,412.84,410.29,412.39 +412.39,412.9,411.62,412.51 +412.58,413.11,412.2,412.52 +412.52,412.82,412.01,412.05 +412.05,412.37,411.01,411.87 +411.87,412.1,411.43,411.91 +411.77,412.99,411.75,411.805 +411.78499999999997,412.89,411.66,411.7 +411.8,412.8,411.76,412.62 +412.62,413.56,412.07,413.2 +413.3,415.42,412.93,415.06 +415.05,416.0,415.04,416.0 +416.0,416.0,415.0,415.71 +415.69,415.86,415.21,415.105 +415.51,416.0,414.5,414.5 +414.71,414.71,414.65,414.66 +414.66,414.66,414.0,414.04 +414.015,414.05,413.2,413.58000000000004 +413.37,413.5,413.1,413.12 +413.11,413.39,413.0,413.38 +413.32,413.87,412.98,413.87 +413.86,414.06,413.6,414.04 +414.01,415.4,413.89,413.98 +413.97,415.55,413.89,415.22 +415.02,415.49,413.17,414.71 +414.7,415.56,414.59,415.36 +415.36,416.69,415.14,416.69 +416.7,417.6,416.2,417.48 +417.48,417.5,415.81,416.46 +416.46,417.36,416.1,416.97 +416.89,417.0,416.25,416.99 +416.99,417.0,416.42,416.42 +416.5,416.76,416.1,416.27 +416.27,416.55,415.28,416.39 +416.39,417.0,415.01,415.96 +416.07,416.5,415.7,416.44 +416.48,416.8,416.0,416.46 +416.62,416.81,415.12,415.94 +415.94,416.91,415.39,416.6 +416.72,416.81,415.25,415.32 +415.3,415.56,414.85,415.48 +415.47,416.33,415.28,415.615 +416.08,416.32,415.7,415.75 +415.67499999999995,416.33,414.8,415.27 +415.27,415.7,414.12,415.27 +415.35,416.33,414.8,415.55 +415.43,416.24,415.13,415.89 +415.91,416.77,415.46,416.75 +416.66,417.0,415.94,416.56 +416.55,417.5,416.1,417.5 +417.35,417.5,416.11,417.27 +417.26,417.29,416.03,416.78 +416.7,417.25,416.48,417.24 +417.24,417.25,415.95,416.62 +416.62,416.98,416.27,416.74 +416.76,417.47,415.96,416.5 +416.52,417.21,416.4,417.11 +417.02,418.0,416.55,418.0 +418.0,420.5,417.51,420.5 +420.5,420.5,418.2,419.88 +419.88,419.91,417.41,418.56 +418.56,418.79,417.04,418.6 +418.59,419.53,417.85,419.53 +419.37,419.7,419.35,419.22 +419.49,419.49,418.44,418.91 +418.91,419.62,418.66,419.44 +419.05333333333334,420.0,419.32,419.32 +419.19666666666666,419.56,419.32,419.37 +419.34,419.4,419.32,419.41499999999996 +419.44666666666666,419.55,419.36,419.46 +419.55333333333334,419.9,419.36,419.66 +419.66,419.9,419.57,419.58 +419.58,419.9,419.34,419.46 +419.46,419.9,419.38,419.9 +419.9,419.98,418.51,419.3 +419.31,419.65,418.58,419.44 +419.46,419.9,419.07,419.7 +419.69,419.95,419.27,419.71 +419.75,419.92,419.2,419.85 +419.76,419.91,419.73,419.89 +419.89,419.9,419.7,419.88 +419.88,419.99,419.77,419.99 +419.99,420.0,419.81,419.98 +419.98,420.05,419.81,419.86 +419.85,420.25,419.5,420.0 +419.92,420.38,419.6,419.89 +419.86,420.0,419.47,419.81 +419.49,419.92,419.21,419.73 +419.41499999999996,419.9,419.01,419.49 +419.34,419.59,419.01,419.41 +419.4,419.59,419.0,419.36 +419.41,419.84,419.15,419.31 +419.6,419.74,418.87,419.5 +419.5,419.93,419.48,419.93 +419.93,419.93,418.5,418.74 +418.74,419.68,418.74,419.57 +419.65,420.24,419.62,420.23 +420.24,420.8,420.17,420.55 +420.55,420.56,419.71,419.96 +419.93,420.0,419.36,419.66 +419.72,420.0,419.51,420.0 +420.0,420.0,419.0,419.14 +419.16,419.73,418.33,419.71 +419.64,419.96,418.67,419.39 +419.36,420.39,419.21,420.39 +420.32,420.32,419.54,420.24 +420.25,420.61,419.84,420.06 +420.03,420.79,419.85,420.7 +420.6,421.0,419.11,419.63 +419.75,420.04,419.54,419.62 +419.76,419.8,419.3,419.61 +419.75,420.0,419.49,420.0 +420.0,420.0,419.69,419.735 +419.82,420.0,419.45,419.47 +419.46,419.79,419.21,419.54 +419.54,419.9,419.37,419.77 +419.89,419.9,418.43,418.64 +418.64,418.78,418.15,418.53499999999997 +418.34,418.78,418.11,418.43 +418.42,419.1,418.12,418.75 +418.73,419.1,418.02,418.5 +418.53,419.02,418.15,418.98 +418.97,419.65,418.96,419.42 +419.31,419.5,418.29,419.29 +419.29,420.0,419.05,419.99 +419.91,420.01,419.0,419.78 +419.77,419.86,417.58,418.6 +418.74,419.84,418.23,418.94 +419.02,419.5,418.0,419.46 +419.48,419.48,418.67,419.44 +419.36,419.49,418.01,418.89 +419.33,419.5,419.07,419.44 +419.65999999999997,420.0,419.47,419.99 +419.99,421.99,419.66,421.99 +421.99,423.22,421.92,423.09 +423.15,423.43,422.46,423.09 +423.09,423.18,422.07,422.41 +422.235,422.41,421.37,421.39 +421.38,422.06,420.88,421.9 +421.9,422.4,421.77,422.06 +422.04,422.54,421.21,421.58 +421.6,421.83,421.36,421.77 +421.76,422.49,421.64,422.45 +422.3,422.5,422.03,422.47 +422.46,422.5,421.55,422.2 +422.28,422.31,421.5,421.97 +421.97,422.15,421.5,421.74 +421.8,422.14,421.35,422.14 +422.13,422.14,420.2,421.52 +421.52,421.75,420.2,421.09 +421.19,421.51,420.17,420.84 +420.83,421.39,420.5,420.84 +420.8,421.89,420.5,421.89 +421.89,422.57,421.31,422.57 +422.48,423.0,422.32,422.88 +422.87,422.97,422.1,422.64 +422.7,422.74,421.69,422.46 +422.44,422.5,421.86,421.95 +422.12,422.49,421.72,422.37 +422.28,422.5,421.5,421.99 +422.01,422.04,421.82,422.04 +422.02,422.04,421.99,422.04 +422.03,422.04,421.62,421.96 +421.89,422.0,421.51,421.6 +421.59,421.75,421.04,421.65 +421.61,421.67,421.37,421.61 +421.59,421.89,421.15,421.85 +421.79,422.85,421.61,422.29 +422.49,422.87,421.75,421.8 +421.77,422.81,421.69,422.09 +422.31,422.86,421.94,422.13 +422.14,422.54,421.69,421.99 +422.0,422.45,421.77,422.25 +422.26,422.89,421.4,422.05 +422.01,422.1,421.24,421.57 +421.6,422.34,421.14,421.46000000000004 +421.45500000000004,422.0,420.61,421.35 +421.31,421.68,420.66,421.2 +421.15,421.93,420.9,421.65 +421.86,422.4,421.51,422.1 +422.05,422.22,421.71,422.11 +422.11,422.22,420.48,420.91 +420.91,420.91,419.41,420.04 +420.05,420.95,420.03,420.95 +420.93,421.78,420.61,421.45 +421.67,421.82,421.31,421.51 +421.51,421.68,420.33,421.52 +421.53,421.87,421.29,421.38 +421.395,421.87,420.8,421.24 +421.26,421.46,420.0,420.38 +420.39,421.66,420.07,421.36 +421.35,421.52,420.49,420.74 +421.04,421.4,420.65,421.4 +421.36,421.6,420.4,421.5 +421.53,422.22,421.26,422.22 +422.22,422.74,422.2,422.34 +422.34,422.5,421.5,421.5 +421.65,421.87,421.06,421.22 +421.2,422.08,420.75,421.72 +421.85,422.12,421.55,422.08 +422.06,422.15,420.82,421.71 +421.7,422.0,421.42,421.93 +421.67499999999995,422.15,421.55,421.65 +421.65,421.94,421.24,421.59 +421.6,422.2,421.57,421.99 +421.85,422.1,421.98,422.1 +422.1,423.0,422.09,422.86 +422.89,422.9,422.03,422.06 +422.22,422.44,421.97,422.1 +422.12,423.07,422.11,423.07 +423.07,423.3,422.69,423.13 +423.12,423.48,422.89,423.04 +423.34,423.57,422.64,423.265 +423.14,423.61,422.69,423.49 +423.46,423.72,422.63,423.69 +423.56,424.21,423.48,424.16 +424.08,424.14,423.04,423.72 +423.67,424.42,423.36,424.39 +424.29,424.5,423.74,424.02 +424.03,424.65,423.89,424.49 +424.45,424.45,422.81,422.81 +422.82,423.17,415.71,417.68 +417.73,420.29,417.73,419.35 +419.88,420.08,417.59,419.94 +419.95,420.08,419.26,419.66 +419.72,419.74,418.52,419.15 +419.2,419.54,417.94,418.93 +418.92,418.92,415.51,417.17 +416.98,417.75,416.46,417.35 +417.35,418.32,416.98,418.32 +418.22,419.47,418.21,418.86 +418.86,418.86,417.52,417.84 +417.83,417.95,416.91,417.14 +417.1,417.65,416.95,417.61 +417.46,417.8,417.18,417.635 +417.45,417.82,417.33,417.66 +417.67,418.5,417.01,418.46 +418.45,419.01,418.43,419.01 +419.01,419.19,418.5,418.77 +418.77,419.42,418.76,419.24 +419.22,419.79,418.53,418.75 +418.77,418.88,417.18,418.36 +418.37,419.3,418.29,419.07 +419.07,419.35,418.77,419.01 +419.01,419.19,417.97,419.07 +419.07,419.25,418.74,419.25 +419.16,419.25,418.12,419.16999999999996 +419.125,419.13,418.12,419.09 +419.09,419.25,418.53,419.14 +419.21,419.49,419.12,419.525 +419.56,420.17,419.46,419.91 +419.91,420.54,419.61,420.06 +420.3,420.54,420.03,420.03 +420.08,420.37,419.8,420.24 +420.33,421.3,420.06,421.3 +420.585,421.41,420.79,420.89 +420.84,420.9,420.23,420.62 +420.57,421.2,420.31,421.14 +420.98,421.17,420.23,420.23 +420.54,421.3,420.31,421.3 +421.16,422.42,421.15,422.13 +422.31,422.42,421.99,422.12 +422.24,422.66,422.05,422.66 +422.65,422.89,422.32,422.65 +422.76,422.94,422.64,422.83 +422.83,423.0,422.65,422.92 +422.99,423.98,422.78,423.83 +423.66,423.99,423.46,423.59 +423.6,423.89,423.08,423.75 +423.75,423.8,422.9,423.1 +423.1,423.8,422.82,423.26 +423.27,423.54,422.75,423.34 +423.34,423.36,422.5,423.36 +423.37,423.55,422.5,423.33000000000004 +423.36,423.51,422.9,423.3 +423.35,423.62,422.7,423.47 +423.48,424.0,423.36,423.84 +423.82,423.88,422.92,423.49 +423.4,423.59,423.0,423.49 +423.49,423.79,423.04,423.48 +423.48,424.0,421.61,421.76 +421.73,422.22,421.72,421.93 +421.93,421.94,421.04,421.05 +421.05,421.09,420.64,421.09 +421.08,421.5,420.43,421.13 +420.98,421.32,420.15,420.8 +420.79,423.07,420.7,422.51 +422.45,423.03,422.01,422.1 +422.32,423.28,421.6,423.25 +423.25,423.3,422.0,422.71000000000004 +422.745,422.9,421.89,422.17 +422.24,422.5,421.93,422.32 +422.36,423.26,422.13,422.68 +422.7,423.26,421.98,423.2 +423.06,423.5,423.0,423.15 +423.15,423.48,422.91,423.46 +423.35,423.75,422.43,423.2 +423.2,423.99,423.05,423.98 +423.89,424.5,423.75,424.4 +424.39,424.91,423.14,424.18 +424.23,424.65,423.49,424.4 +424.33,428.0,424.33,427.32 +427.34,429.77,427.34,428.16 +428.22,428.22,427.32,427.77 +426.95500000000004,427.76,425.43,425.7 +425.69,426.14,425.57,426.14 +426.07,426.69,425.83,426.69 +426.27,426.68,425.98,426.35 +426.47,426.6,425.51,426.48 +426.39,426.61,426.0,426.32 +426.79499999999996,427.4,426.31,426.71500000000003 +427.2,429.05,426.61,427.11 +427.13,428.27,426.67,426.86 +426.89,427.6,426.8,427.6 +427.46,427.62,426.55,427.18 +427.11,427.47,426.58,427.22 +427.23,428.61,427.17,427.43 +427.42,427.44,426.16,426.43 +426.44,428.03,426.44,427.09 +427.1,427.76,426.85,427.75 +427.75,427.81,427.19,427.8 +427.81,428.4,427.34,427.51 +427.52,428.38,426.77,428.03 +428.28,428.66,427.74,428.66 +428.64,429.44,428.34,429.11 +429.12,429.24,428.49,429.02 +429.0,429.13,428.12,428.29 +428.29,428.35,427.5,427.8 +427.82,429.4,427.48,428.97 +428.95,428.95,427.53,427.64 +427.61,427.65,426.0,426.05 +426.0,426.08,425.54,425.6 +425.6,425.95,425.25,425.45 +425.44,425.88,425.0,425.88 +425.87,426.3,424.18,424.44 +424.44,424.95,423.59,424.95 +425.0,426.09,424.99,426.07 +426.03,426.19,425.62,425.92 +425.92,426.2,425.67,426.17 +426.18,426.91,425.86,426.52 +426.53,427.1,425.8,426.36 +426.36,426.5,424.31,424.49 +424.43,425.59,424.19,425.53 +425.54,425.94,425.1,425.89 +425.93,426.0,425.16,425.71 +425.72,425.73,425.3,425.35 +425.36,426.5,425.3,426.4 +426.37,427.25,425.97,426.83 +426.88,428.0,426.15,427.68 +427.74,427.97,427.26,427.31 +427.31,427.31,425.46,425.85 +425.95,425.95,425.25,425.6333333333333 +425.7875,425.88,425.02,425.4166666666667 +425.625,425.41,425.03,425.2 +425.4625,425.39,425.02,425.46500000000003 +425.3,426.01,425.06,425.73 +425.74,426.25,425.2,425.46 +425.46,425.8,425.43,425.6 +425.435,425.69,425.2,425.39 +425.41,426.0,425.06,425.64 +425.62,426.0,425.61,425.82 +425.83,426.36,425.61,425.71000000000004 +426.1,426.1,424.52,425.6 +425.53,425.97,425.14,425.35 +425.35,426.0,425.05,425.87 +425.95,426.0,425.39,425.89 +425.9,426.08,425.21,425.37 +425.37,426.02,425.23,425.41 +425.475,425.58,425.2,425.49 +425.58,426.49,425.48,426.45 +426.44,426.92,426.08,426.505 +426.54499999999996,427.0,426.52,426.56 +426.65,427.67,426.51,427.67 +427.66,427.84,427.31,427.73 +427.72,428.23,427.72,427.99 +427.83,427.95,426.81,426.81 +426.86,426.92,425.72,427.02 +427.0575,426.53,426.13,427.23 +427.255,427.29,426.54,427.44 +427.4525,427.65,426.86,427.65 +427.65,428.05,427.65,428.78999999999996 +428.05,429.93,428.05,429.93 +429.93,430.0,429.93,429.98 +429.97,429.98,429.89,429.735 +429.735,429.9,429.01,429.49 +429.5,429.9,429.5,429.89 +429.45500000000004,429.91,428.35,429.47 +429.41,430.0,428.88,430.0 +430.0,431.0,429.42,430.94 +430.94,431.05,430.54,430.69 +430.69,431.0,430.47,430.76 +430.75,431.1,429.81,430.06 +430.07,430.75,429.57,430.49 +430.51,430.96,430.51,430.92 +430.92,431.12,430.66,431.05 +431.07,431.09,430.53,430.93 +430.92,431.11,430.62,431.0 +431.06,431.56,431.0,431.53 +431.53,431.98,431.35,431.8 +431.84,432.87,431.83,432.72 +432.68,434.02,432.52,434.02 +434.01,434.89,433.66,434.8 +434.86,434.89,433.15,433.63 +433.69,434.72,433.27,433.9 +434.19,434.19,432.96,433.22 +433.2,433.53,432.36,432.45 +432.49,432.58,430.78,431.23 +431.2,431.2,429.89,430.39 +430.39,431.73,430.2,431.56 +431.55,432.14,430.94,431.84 +431.83,432.19,431.29,432.03999999999996 +432.03499999999997,432.53,431.9,432.24 +432.24,432.67,432.2,432.33 +432.32,433.0,431.92,432.48 +432.5,433.3,432.02,433.06 +433.155,434.11,433.09,433.81 +433.81,433.84,433.23,433.82 +433.81,433.82,433.13,433.8 +433.78,433.83,433.12,433.64 +433.63,433.91,433.45,433.88 +433.815,434.2,433.42,434.01 +434.0,434.11,433.54,433.88 +433.735,434.05,433.15,433.48 +433.47,433.83,433.13,433.74 +433.70000000000005,433.99,433.52,433.82 +433.93,434.57,433.75,434.57 +434.58,434.9,434.58,434.9 +434.89,434.92,433.81,434.07 +434.66499999999996,434.54,433.31,434.42 +434.44,434.93,433.11,434.73 +434.74,434.74,432.17,432.89 +432.89,432.89,430.09,430.38 +430.41,432.2,430.26,430.685 +431.87,431.87,430.65,430.99 +431.18,431.79,430.54,431.49 +431.42,431.67,430.0,430.0 +430.15,431.57,429.91,430.87 +430.94,431.75,430.6,431.43 +431.155,431.63,430.7,431.42 +431.37,431.38,430.01,430.01 +430.02,430.51,429.15,430.2 +430.36,431.38,430.05,431.34 +431.38,431.61,430.59,431.38 +431.38,431.6,430.5,431.55 +431.56,431.85,431.29,431.72 +431.84,432.73,431.55,432.66 +432.68,433.5,430.64,433.5 +433.49,434.22,431.88,432.45666666666665 +434.12,434.46,433.39,431.41333333333336 +433.71,433.78,430.36,430.37 +430.37,430.55,430.2,430.55 +430.54,430.54,429.89,430.46000000000004 +430.1,430.92,429.88,430.37 +430.36,430.65,429.93,429.99 +429.96,429.97,428.83,429.2 +429.21,429.5,428.44,429.5 +429.49,430.29,429.25,429.25 +429.4,429.88,428.69,429.0 +429.06,429.94,428.78,429.0 +428.95,429.5,428.79,429.39 +429.42,430.37,429.35,430.19 +430.16,430.21,429.53,429.62 +429.62,430.0,429.21,430.0 +430.0,430.0,429.22,429.75 +429.75,429.75,428.97,429.18 +429.29,431.16,429.1,430.78 +430.79,431.29,430.45,430.91 +430.97,431.31,430.78,431.24 +431.22,431.7,430.79,430.84 +430.79,431.17,430.52,430.69 +430.62,431.29,430.34,431.14 +431.14,432.35,430.88,431.93 +432.0,432.5,431.51,431.67 +431.67,431.88,429.99,429.99 +430.0,430.09,429.87,429.87 +429.87,430.1,429.84,430.08 +430.09,430.63,429.76,430.0 +430.01,430.48,429.6,430.24 +430.23,430.69,430.08,430.65 +430.65,430.65,430.06,430.22 +430.26,430.43,429.9,430.25 +430.2,430.5,429.22,430.31 +430.4,430.89,430.32,430.89 +430.89,431.16,430.46,431.1 +431.08,431.2,430.44,430.74 +430.89,431.6,430.29,431.42 +431.4,432.9,431.15,432.9 +432.89,432.9,432.53,432.58 +432.69,436.14,432.23,436.14 +436.14,438.2,436.04,436.75 +436.75,437.34,436.44,437.0 +436.99,437.03,436.32,436.89 +436.88,436.92,436.27,436.92 +436.91,438.0,436.74,437.3 +437.31,438.0,437.29,437.94 +437.92,438.26,437.62,438.08 +438.08,438.25,437.0,437.76 +437.895,437.89,437.28,437.515 +437.71,438.0,437.0,437.27 +437.525,437.5,436.8,437.35 +437.34,437.49,436.65,436.83 +436.9,437.68,436.27,436.97 +436.91,437.42,436.44,437.2 +437.2,437.55,436.79,437.47 +437.45,438.4,437.34,438.09 +438.03,440.0,437.96,439.25 +439.26,442.92,439.26,442.8 +442.87,443.45,442.0,442.5 +442.49,442.5,440.5,440.78 +440.78,441.52,440.55,441.26 +441.21,443.6,441.09,443.6 +443.62,444.01,441.16,442.32 +442.32,444.07,441.86,442.17 +441.96,443.13,441.9,442.37 +442.37,443.43,442.11,443.16 +443.22,445.94,442.9,445.93 +445.93,446.32,444.01,444.2 +444.2,446.47,444.08,446.31 +446.34,446.39,444.22,444.28 +444.36,445.0,444.14,444.93 +444.94,444.99,441.99,442.39 +442.4,443.3,442.4,442.49 +442.97,443.0,442.19,443.0 +442.96500000000003,443.0,442.8,443.075 +442.96,443.28,442.13,443.15 +443.36,443.98,443.27,443.76 +443.76,443.81,442.67,443.14 +443.03,444.0,442.86,443.59 +443.43,444.32,443.05,444.28 +444.15,445.15,444.0,444.27 +444.27,445.49,444.2,445.34 +445.35,449.42,445.1,447.32 +447.57,448.94,447.26,448.0 +448.07,451.47,447.82,451.16 +451.11,452.18,450.63,451.51 +451.43,451.43,450.39,450.88 +450.95,453.8,450.95,451.67 +451.64,453.0,451.36,452.12 +452.14,452.95,449.99,450.03 +450.03,450.87,447.0,448.11 +448.12,449.47,447.0,447.09 +447.15,448.87,447.05,448.33 +448.32,449.23,447.04,447.07 +447.1,447.37,445.07,447.34 +447.13,448.09,446.04,446.04 +446.05,447.75,445.24,447.29 +447.75,448.54,447.75,448.54 +448.41,448.97,447.58,447.87 +447.88,448.6,447.32,448.42 +448.43,448.88,447.35,448.58 +448.51,448.6,447.05,447.18 +447.19,447.59,446.02,446.34 +446.29,447.35,445.58,447.08 +446.91,449.18,446.77,449.1 +449.12,449.24,447.13,448.52 +448.52,449.71,448.5,448.94 +448.92,450.0,448.83,449.98 +449.95,451.03,449.81,450.59 +450.58,450.58,448.77,449.71 +449.71,449.87,447.47,448.29 +448.29,448.34,447.63,448.3 +448.29,449.33,448.08,449.19 +449.14,450.34,449.01,449.63 +449.63,450.14,449.05,449.29 +449.28,449.29,447.9,448.3 +448.3,448.88,448.19,448.37 +448.42,448.8,448.16,448.36 +448.39,448.72,447.56,448.45 +448.47,448.56,447.55,447.7 +447.7,448.04,447.65,447.65 +447.65,447.9,447.43,447.715 +447.63,447.89,447.22,447.78 +448.69,450.0,447.03,449.13 +449.75,450.5,449.75,450.48 +450.47,451.3,450.07,450.775 +451.16,451.26,450.4,451.07 +451.07000000000005,451.3,449.4,450.99 +450.98,451.08,450.34,451.08 +451.07,451.47,450.71,450.92 +450.86,451.79,450.76,451.56 +451.5,451.65,450.78,450.97 +450.99,451.0,450.09,450.67 +450.7,451.01,450.0,450.82 +450.91,452.73,450.57,451.41 +451.42,455.69,451.15,454.59 +454.57,455.84,453.58,454.84 +454.83,458.88,454.78,458.88 +458.88,460.0,458.03,458.2 +458.18,458.39,457.09,457.56 +457.55,458.49,457.34,458.48 +458.49,459.54,458.48,459.0 +458.94,459.0,456.5,457.7 +457.69,458.56,457.66,458.53 +458.56,458.61,458.03,459.085 +458.46,460.0,458.45,459.64 +459.64,460.0,459.64,459.77 +459.78,459.86,458.72,458.75 +458.75,458.77,457.53,457.54 +457.53,459.51,457.4,459.05 +459.05,459.06,457.95,458.51 +458.51,458.54,454.55,457.71500000000003 +457.66999999999996,457.0,454.7,456.92 +456.83,458.06,456.06,457.7 +457.7,458.12,457.36,457.56 +457.57,458.3,457.36,460.485 +458.27,464.99,458.1,463.41 +463.65,465.0,463.09,464.87 +464.93,464.93,461.76,462.0 +461.99,463.93,461.99,463.36 +463.5,464.83,463.31,464.29 +464.34,466.23,464.16,465.81 +465.99,466.3,464.0,464.0 +464.01,464.76,463.7,464.35 +464.4,464.5,461.51,461.99 +461.99,464.9,461.99,464.9 +464.89,464.95,462.61,462.87 +462.94,463.88,461.75,462.09 +461.94,462.5,461.51,462.27 +462.14,466.23,461.76,465.62 +465.71,466.05,464.23,464.42 +464.44,464.44,461.2,462.0 +462.235,462.13,460.0,460.0 +460.03,460.24,454.65,459.76 +459.75,460.99,458.26,460.59 +460.45,464.34,460.35,462.24 +462.3,463.99,461.72,462.88 +462.88,465.0,462.81,464.99 +464.85,466.76,464.02,465.29 +465.03,466.1,464.5,466.0 +466.0,467.0,465.06,467.0 +467.0,468.83,466.98,467.94 +467.98,470.77,467.98,470.6 +470.6,472.38,466.1,467.61 +467.61,467.99,465.05,465.88 +465.88,468.37,465.65,467.48 +467.12,469.08,466.14,468.38 +468.38,468.94,467.72,468.48 +468.54,469.0,467.75,468.47 +468.47,468.89,467.75,467.77 +467.76,469.0,467.72,468.68 +468.67,468.96,468.3,468.3 +468.29,468.84,468.18,467.795 +468.72,468.93,467.11,467.29 +467.29,467.75,466.86,467.65 +467.65,467.84,466.49,466.66 +466.67,466.67,465.02,465.03 +465.31,465.84,464.01,465.13 +465.12,468.3,464.63,467.75 +467.75,469.0,466.99,468.44 +468.44,469.5,467.39,468.74 +468.75,470.0,467.55,469.1 +469.11,469.9,468.82,469.73 +469.67,472.0,467.73,469.52 +469.52,471.5,469.51,471.39 +471.49,471.92,469.79,471.28 +471.32,472.11,469.79,470.45 +470.31,470.64,469.79,470.1 +470.2,470.79,469.11,470.39 +470.43,470.79,469.42,470.13 +470.13,470.39,468.21,468.85 +468.66,469.14,467.7,468.5 +468.5,469.6,464.01,466.84 +466.85,469.28,466.64,468.58 +468.71,469.8,468.38,469.8 +469.8,470.2,469.78,470.03 +470.11,470.2,469.79,469.98 +469.92,469.98,466.56,466.9 +466.92,467.91,466.08,466.71 +466.72,467.78,466.04,467.6 +467.63,467.9,466.32,466.32 +466.41,466.59,451.5,457.18 +457.77,458.54,453.91,455.5 +455.6,459.53,455.35,459.0 +459.0,459.43,456.59,458.0 +457.71,458.86,457.01,457.33 +457.33,458.0,456.74,457.01 +457.03,457.6,456.06,456.35 +456.67,457.14,455.12,457.01 +456.98,456.99,455.23,455.59 +455.59,455.6,440.94,451.16 +451.16,451.4,444.3,448.67 +449.04,450.0,442.5,444.95 +444.89,445.77,434.79,440.23 +440.18,444.31,440.16,444.3 +444.12,445.49,442.88,444.61 +443.95,444.8,441.11,441.11 +441.15,444.24,439.21,443.58 +443.08,443.79,441.57,442.54 +442.07,443.95,441.8,443.19 +443.23,446.0,443.19,445.85 +445.84,445.85,444.85,445.0 +444.93,445.4,442.43,443.78 +443.72,446.04,443.08,446.02 +446.03,446.9,446.02,446.9 +446.9,450.36,446.88,448.97 +449.0,449.61,447.38,448.03 +448.04,448.04,446.13,447.7 +447.64,450.26,447.25,449.58 +447.845,449.56,447.76,448.2 +448.05,448.83,446.75,448.32 +448.61,449.43,447.41,447.66 +447.73,450.95,447.71,450.69 +450.69,451.0,450.63,450.68 +450.67,450.9,450.63,450.79 +450.71,450.8,450.63,450.75 +450.75,452.3,450.65,452.3 +452.3,452.99,449.77,451.05 +451.05,451.81,449.96,450.18 +450.48,451.43,449.82,450.84 +450.94,451.43,448.5,450.385 +450.44,450.35,448.6,449.93 +449.94,451.76,449.53,451.05 +449.975,451.33,450.0,450.28 +450.01,451.57,449.95,451.57 +451.5,451.84,450.04,450.34 +450.34,450.62,450.18,450.31 +450.41,451.45,450.05,451.03 +451.14,451.59,450.5,451.13 +451.24,452.4,451.24,452.16 +452.3,452.79,451.39,452.61 +452.57,452.7,450.65,451.84 +451.93,453.7,451.54,453.24 +453.03,455.0,452.86,454.75 +454.93,455.0,454.03,454.79 +454.78,457.3,454.77,456.69 +456.69,458.3,456.51,458.05 +456.87,458.83,456.86,457.05 +457.05,458.7,456.2,457.58 +457.58,457.75,456.2,457.05 +457.04,459.44,456.69,458.97 +459.21,459.33,458.02,458.24 +458.21,458.48,457.42,458.48 +458.43,458.5,456.75,457.07 +457.23,457.54,456.6,457.2 +457.31,457.89,456.56,457.33 +457.39,457.55,455.74,456.34 +456.34,456.43,454.63,455.11 +455.07,456.21,455.07,455.9 +455.9,456.29,455.89,456.14 +456.17,456.65,455.93,456.0 +456.21,456.65,455.99,456.49 +456.45,456.95,456.03,456.11 +456.12,456.14,454.62,455.73 +455.75,457.53,455.31,457.27 +457.25,458.88,456.07,457.13 +457.12,457.12,456.08,456.7 +456.69,456.77,455.0,455.26 +455.27,456.94,452.01,452.05 +452.46,455.06,450.13,452.67 +452.05,454.55,452.05,454.4 +454.4,455.33,454.22,454.78 +454.78,455.5,454.25,454.98 +455.1,456.0,453.58,454.36 +454.745,454.51,452.13,454.4 +454.39,455.0,453.1,453.9 +453.81,454.43,453.4,453.46 +453.59,453.78,453.45,453.49 +453.49,454.09,452.73,452.88 +452.93,454.37,452.7,454.37 +454.37,454.48,453.95,454.02 +454.02,454.89,453.86,454.36 +454.36,455.21,454.31,455.21 +455.21,456.99,455.12,456.99 +456.99,456.99,456.67,456.68 +456.65333333333336,456.72,455.49,456.6 +456.31666666666666,456.6,455.59,456.61 +455.98,456.46,455.11,456.62 +456.34,456.72,456.2,456.63 +456.64,456.76,456.31,456.73 +456.74,457.07,455.97,455.98 +456.0,456.28,455.28,455.49 +455.39,455.6,454.24,455.14 +455.13,455.14,451.55,454.17 +454.24,455.59,454.07,455.1 +454.97,455.6,454.35,455.52 +455.6,456.57,455.6,456.51 +456.51,456.7,456.48,456.61 +456.6,457.11,456.48,456.82 +456.82,457.44,456.64,456.92 +456.93,457.07,456.48,456.77 +456.77,457.24,456.48,457.18 +457.23,457.63,456.49,456.51 +456.51,457.1,456.51,457.02 +457.02,457.24,456.76,456.82 +456.82,457.38,456.77,457.37 +457.37,457.38,454.59,451.055 +454.6,454.6,442.98,444.74 +444.74,446.15,440.02,443.4 +443.45,446.98,441.8,446.83 +446.78,447.05,443.08,443.08 +443.08,446.1,442.34,444.53999999999996 +446.05,446.7,444.62,446.0 +446.01,446.02,442.44,443.7 +443.43,445.19,443.43,444.75 +445.01,445.7,444.0,444.5 +444.49,446.0,442.76,445.44 +445.44,445.44,442.76,442.8 +443.07,445.0,443.0,445.0 +445.0,446.89,444.2,445.88 +445.87,447.18,445.81,446.39 +446.54,447.47,445.98,446.24 +446.25,446.8,445.34,446.65 +446.61,447.22,446.0,446.2 +446.17,446.17,443.71,444.62 +444.62,445.0,444.03,444.6 +444.5,446.04,443.61,445.88 +445.89,446.62,445.38,446.09 +446.23,447.88,446.23,447.8 +447.81,447.89,446.61,447.04 +447.05,449.59,446.27,448.91 +448.79,449.83,448.27,449.66 +449.73,450.0,449.07,449.16 +449.17,449.86,448.89,449.44 +449.35,449.45,448.81,449.47 +448.9,450.0,448.19,449.5 +449.5,450.22,449.18,449.83 +449.85,450.0,449.07,449.73 +449.73,449.92,448.0,448.86 +448.71,449.7,448.68,448.76 +448.9,449.13,447.86,448.61 +448.55,451.5,448.55,451.5 +451.5,452.27,451.11,452.06 +451.99,452.06,451.13,451.3 +452.07,452.23,451.07,452.13 +452.15,453.29,451.39,453.0 +452.99,453.0,451.13,452.25 +452.24,453.23,452.1,452.42 +452.41,452.59,452.02,452.25 +452.25,452.48,451.42,451.53 +451.48,451.58,450.06,450.47 +450.45,451.39,450.24,451.175 +450.95,452.17,450.94,451.88 +451.88,452.11,451.21,452.1 +452.1,452.21,451.63,452.12 +452.12,452.12,450.79,451.13 +451.16,451.34,448.52,449.64 +448.65,449.46,448.0,448.15 +448.13,448.15,447.0,447.34 +447.34,447.52,446.76,447.12 +447.12,448.74,447.01,448.39 +448.37,449.67,448.04,449.02 +449.02,449.1,448.11,448.3 +448.765,449.01,448.13,448.6 +448.51,449.0,447.73,448.09 +448.09,448.67,447.59,447.71 +447.91,448.59,447.7,447.99 +447.98,447.99,447.0,447.64 +447.49,448.6,447.37,448.54 +448.54,449.28,448.34,448.85 +448.85,449.28,447.39,449.08 +448.99,450.0,448.02,450.0 +449.99,451.23,449.99,451.18 +451.13,451.4,450.56,451.22 +451.22,451.56,450.73,450.94 +450.94,451.18,450.69,450.85 +450.77,451.02,450.56,450.56 +450.56,450.57,448.31,448.39 +449.53,448.6,448.39,448.51 +448.5,448.57,448.18,448.18 +448.19,448.76,447.95,448.55 +448.64,448.86,447.0,447.01 +447.01,447.61,447.0,447.61 +447.62,448.61,447.44,448.44 +448.44,449.54,447.91,449.53 +449.43,449.55,448.68,449.04 +449.1,449.24,447.47,448.58 +448.57,449.91,448.24,449.69 +449.69,449.77,448.82,449.72 +449.53,450.65,449.32,450.31 +450.32,450.49,449.64,450.26 +450.31,450.5,449.3,449.63 +449.7,451.24,449.7,449.95 +450.23,450.46,449.76,450.27 +450.27,450.48,449.87,450.22 +450.22,450.33,449.76,449.89 +449.94,450.48,449.58,450.38 +450.43,450.78,449.9,450.63 +450.57,450.78,448.84,449.21 +449.2,449.69,449.11,449.29 +449.42,450.85,449.26,449.7 +449.68,452.0,449.64,452.0 +452.0,452.91,451.97,452.85 +452.87,453.4,452.8,452.92 +452.92,453.03,452.64,452.74 +453.03,453.15,452.5,452.56 +452.53,452.89,452.16,452.47 +452.48,453.09,451.96,452.99 +452.87,453.69,452.56,453.51 +453.51,454.0,453.41,453.84 +453.85,456.9,453.75,456.15 +456.12,456.6,454.82,455.8 +455.75,457.75,455.56,457.75 +457.76,458.12,457.27,457.53 +457.52,458.13,457.4,458.07 +458.07,463.43,457.97,463.43 +463.44,463.54,459.62,460.79 +460.79,463.73,460.77,461.545 +462.41,463.31,462.2,462.3 +462.23,462.43,461.02,461.46 +461.56,462.22,461.26,461.55 +461.52,461.63,459.55,460.06 +460.0,460.63,459.56,460.6 +460.11,460.81,459.91,460.23 +460.22,461.08,460.1,460.57 +460.56,460.72,459.94,460.24 +460.23,460.66,460.08,460.35 +460.865,461.5,460.3,461.185 +461.5,462.03,461.43,462.02 +461.595,462.03,461.37,461.76 +461.69,461.98,461.47,461.66 +461.71,461.96,461.37,461.49 +461.48,462.1,461.39,461.97 +461.98,462.16,460.12,460.48 +460.44,460.79,460.42,460.61 +460.77,461.91,460.57,461.22 +461.19,461.8,460.91,461.8 +461.79,464.0,461.49,463.46 +463.44,463.45,462.11,463.09 +463.09,463.42,462.76,462.95 +462.93,463.02,462.0,462.31 +462.26,462.54,461.71,462.18 +462.16,462.33,461.22,461.22 +461.23,461.73,461.05,461.39 +461.38,462.43,461.13,462.21 +462.26,462.85,462.03,462.55 +462.55,462.78,462.01,462.69 +462.52,463.57,462.07,463.08 +463.12,465.0,462.54,463.08 +463.23,463.44,462.39,462.68 +462.68,462.96,461.53,461.58 +461.57,461.71,460.23,460.89 +460.39,461.11,460.13,460.2 +460.2,460.43,459.86,459.92 +459.9,459.91,458.26,458.41 +458.4,458.69,457.5,458.09 +458.04,458.92,457.62,457.91 +457.94,459.82,457.76,459.67 +459.64,461.39,459.51,461.13 +461.13,461.26,459.86,460.81 +460.84,461.29,460.46,461.29 +461.16,461.77,461.16,461.41 +461.44,461.5,461.19,461.49 +461.49,461.62,460.82,460.92 +460.93,461.48,460.85,461.46 +461.48,461.81,461.14,461.68 +461.68,462.9,461.05,461.05 +461.07,461.62,460.5,461.56 +461.56,461.74,461.49,461.64 +461.68,462.32,461.28,462.26 +462.25,462.32,461.62,462.16 +462.15,462.61,461.03,461.48 +461.42,461.52,460.54,460.55 +460.54,460.55,459.71,460.06 +460.06,460.08,459.87,459.96 +460.03,460.0,459.92,460.0 +460.0,460.63,459.99,460.43 +460.44,460.44,459.41,459.75 +459.75,460.23,459.55,460.23 +460.23,462.01,460.04,462.01 +462.02,462.4,461.52,461.84 +461.85,462.67,460.65,461.11 +461.12,465.0,460.55,464.14 +464.08,465.0,463.4,464.38 +464.45,465.9,462.43,464.49 +464.44,465.0,463.76,464.86 +464.86,464.86,462.18,463.58 +463.58,463.7,463.04,463.19 +463.3,463.58,461.56,462.45 +462.53,464.1,462.53,463.96 +463.91,464.89,463.81,464.81 +464.76,465.0,463.27,463.89 +463.87,464.85,463.87,464.47 +464.49,464.49,463.44,463.57 +463.61,463.99,463.08,463.41 +463.38,463.77,462.86,463.04 +463.26,463.82,462.97,463.76 +463.75,463.79,461.68,461.72 +461.73,461.98,461.52,461.52 +461.53,461.53,460.74,460.74 +460.75,460.75,456.1,457.49 +457.5,457.5,448.2,452.5 +452.27,452.31,450.55,452.6 +452.98333333333335,453.58,451.74,452.7 +453.69666666666666,454.82,453.21,452.8 +454.41,454.41,453.28,452.9 +453.34,455.2,452.44,453.0 +452.98,454.75,452.98,454.57 +454.49,455.0,454.11,454.78 +454.74,455.16,453.16,454.93 +454.82,455.51,454.53,455.07 +455.01,456.09,454.75,455.93 +455.82,455.99,453.33,454.53 +454.53,454.53,451.44,451.45 +451.45,454.3,451.43,454.13 +453.7,455.71,453.53,455.71 +455.7,457.01,455.01,456.98 +456.97,457.32,455.8,457.755 +457.75,458.65,456.21,458.53 +458.53,458.53,455.67,456.78 +456.77,458.2,455.54,456.02 +456.0,456.25,455.18,455.55 +455.4,456.5,455.31,456.49 +456.44,456.77,456.01,456.77 +456.75,456.75,456.13,456.13 +456.13,456.43,455.77,456.1 +456.1,456.51,454.2,454.76 +454.81,456.3,454.81,455.01 +455.14,455.9,454.35,455.59 +455.41,456.1,454.0,456.09 +456.05,456.51,455.6,456.34 +456.34,456.4,455.89,456.08 +456.1,456.49,455.0,455.365 +455.15,455.61,453.32,454.65 +454.2,456.2,453.68,455.51 +455.53,455.83,454.01,454.48 +454.45,454.48,452.5,453.11 +453.04,454.88,452.77,454.04 +454.0,454.88,453.81,454.67 +454.65,454.96,453.06,454.34 +454.29,455.39,454.09,454.97 +454.28499999999997,455.26,453.28,454.27 +454.28,454.66,453.37,454.14 +454.14,454.66,451.6,453.38 +453.35,453.73,449.27,450.25 +450.04,450.93,449.76,450.93 +451.04,452.1,450.59,451.47 +452.04,452.33,451.78,452.01 +452.19,452.2,450.67,451.33 +451.36,452.26,450.71,451.32 +451.28,451.99,450.86,450.93 +451.17,452.0,450.56,451.71000000000004 +451.6,452.5,451.22,452.49 +452.5,453.88,452.5,453.57 +453.57,453.83,451.98,452.4 +452.4,452.4,451.01,451.23 +451.24,452.22,450.0,452.07 +451.98,452.15,449.96,450.88 +450.89,452.5,450.89,452.14 +452.14,453.47,451.66,453.47 +453.47,454.1,452.31,453.91 +453.85,455.91,453.84,455.91 +455.91,456.57,455.4,456.48 +456.47,456.7,455.87,456.46 +456.44,456.99,455.73,456.32 +456.32,456.7,454.01,455.16 +455.06,455.77,454.92,455.77 +455.55,456.16,455.02,455.46 +455.46,455.88,454.46,454.67 +454.67,454.67,454.31,454.32 +454.32,454.7,453.84,454.7 +454.69,455.93,454.69,455.92 +455.89,456.38,455.19,455.475 +455.61,455.73,454.13,455.03 +455.03,456.19,454.72,455.4 +455.39,455.9,454.87,455.84 +455.83,455.99,455.18,455.89 +455.9,456.49,455.3,455.49 +455.49,456.49,455.34,456.45 +456.46,457.69,455.47,457.69 +457.63,458.03,456.1,457.4 +457.35,457.9,457.25,457.78 +457.77,457.77,457.2,457.53 +457.53,458.0,457.44,457.95 +457.95,458.0,457.41,457.57 +457.57,457.71,457.05,457.6 +457.56,458.0,456.63,458.0 +457.97,459.01,457.66,459.01 +459.0,459.33,458.74,459.16 +459.15,459.5,458.3,458.72 +458.71,459.04,457.5,457.675 +457.87,457.87,456.63,456.63 +456.63,456.64,456.19,456.27 +456.26,456.95,456.25,456.76 +456.76,457.4,456.69,456.87 +456.79,457.74,456.55,457.61 +457.28,458.0,457.62,457.12 +457.77,457.83,456.0,456.63 +457.405,457.23,456.62,457.03 +457.04,457.33,456.76,456.93 +456.91,457.16,456.25,456.56 +456.56,457.57,456.47,457.27 +457.23,457.45,456.54,457.19 +457.06,457.49,456.95,457.42 +457.33,458.44,457.33,458.02 +458.1,459.12,458.08,458.5 +458.79,459.78,458.79,459.6 +459.64,459.83,458.09,458.84 +458.77,459.48,458.14,459.2 +459.2,459.32,458.75,459.12 +459.12,459.19,458.64,458.93 +458.92,459.2,458.58,459.03 +459.14,459.96,459.0,459.95 +459.96,460.0,459.5,459.97 +459.98,459.98,459.43,459.86 +459.86,460.24,459.23,460.23 +460.24,460.43,459.5,459.98 +459.89,460.27,459.51,459.69 +459.69,459.69,459.5,459.68 +459.68,459.69,459.13,459.46500000000003 +459.64,459.64,458.51,459.25 +459.14,459.24,458.49,458.88 +458.97,459.25,458.87,459.0 +459.0,459.3,458.94,459.27 +459.27,459.69,459.11,459.69 +459.69,460.0,459.68,459.96 +459.97,460.0,459.68,459.68 +459.78,461.34,459.68,460.21 +460.29,463.0,460.13,462.82 +462.82,462.98,461.91,462.56 +462.5,462.72,461.79,462.22 +462.2,462.24,461.0,461.88 +461.85,462.67,461.85,462.67 +462.67,463.62,462.39,462.66 +462.67,462.71,461.12,461.46 +461.49,461.5,460.93,460.99 +460.98,461.49,460.47,460.95 +460.81,461.5,460.65,460.91 +460.91,461.59,460.51,461.24 +461.35,461.39,459.9,460.08 +460.01,460.25,459.25,459.31 +459.31,459.32,458.7,458.7 +458.69,458.86,458.59,458.81 +458.81,458.87,458.25,458.4 +458.43,459.23,458.32,459.2 +459.17,459.68,458.73,458.77 +458.75,459.02,458.71,458.94 +458.94,459.3,458.67,458.67 +458.67,458.88,458.06,458.49 +458.49,459.0,457.05,457.87 +457.87,459.1,457.69,458.66 +458.63,459.0,457.31,458.87 +458.91,459.0,458.0,458.49 +458.43,458.5,457.53,458.01 +458.0,458.2,451.48,454.4 +454.3,455.2,454.0,454.74 +454.76,456.25,454.72,456.23 +456.24,456.5,455.62,456.5 +456.5,457.0,455.22,455.31 +455.39,457.49,455.01,457.3 +457.29,457.3,455.99,456.725 +456.645,456.39,455.39,456.15 +456.0,456.95,455.9,456.92 +456.91,457.25,456.65,456.72 +456.89,457.0,456.58,456.59 +456.59,456.59,455.7,455.75 +455.75,456.29,455.71,456.2 +456.2,456.32,455.89,456.18 +456.04,456.2,455.55,456.06 +456.06,456.06,455.44,455.6 +455.45,455.54,455.0,455.07 +455.2,455.73,454.15,455.5 +455.58,455.7,454.22,455.13 +455.28,455.81,455.2,455.81 +455.7,456.3,454.1,456.17 +456.17,456.94,456.17,456.65 +456.65,457.0,455.16,455.45 +455.44,456.24,454.0,454.89 +454.8,455.99,453.74,454.38 +454.38,455.29,454.06,454.68 +454.67,455.0,454.15,454.18 +454.26,454.8,452.2,453.7 +453.62,454.7,452.86,454.2 +454.2,454.84,453.6,454.74 +454.82,455.3,454.62,455.3 +455.3,456.05,454.64,455.72 +455.64,456.41,455.22,456.1 +456.03,456.52,455.83,456.52 +456.35,456.8,455.97,456.8 +456.8,456.81,455.83,456.08 +456.01,456.21,455.85,456.08 +456.07,456.15,455.68,455.97 +455.98,456.15,455.8,456.06 +456.04,456.15,454.79,455.73 +455.79,456.33,455.35,455.98 +455.98,456.5,455.85,456.3 +456.29,456.81,456.19,456.81 +456.8,457.4,456.55,457.11 +457.13,457.4,456.44,457.3 +457.305,457.6,456.85,457.49 +457.48,457.51,456.9,456.9 +456.93,457.45,456.49,457.37 +457.3,457.88,456.67,456.95 +456.93,457.3,456.0,456.4 +456.37,456.67,455.32,456.16 +456.05,456.29,455.0,455.45 +455.45,455.69,454.95,455.69 +455.67,456.24,455.23,455.95 +455.94,456.38,455.39,456.02 +455.91,456.41,455.64,455.74 +455.69,456.2,455.64,455.81 +456.16,456.2,455.86,456.2 +456.2,456.21,455.5,455.5 +455.65,455.78,455.43,455.56 +455.56,455.6,455.22,455.43 +455.22,455.34,454.71,455.06 +455.0,455.0,449.6,450.17 +450.12,450.12,447.33,450.1 +449.93,450.33,449.37,449.6 +449.6,450.12,447.85,448.04 +448.04,450.0,448.0,449.92 +449.89,450.1,449.4,449.97 +449.94,450.26,448.36,449.04 +449.05,449.05,446.91,448.15 +448.02,449.0,445.66,448.4 +448.48,448.87,447.69,448.46 +448.47,448.5,441.67,444.77 +444.76,445.89,443.99,444.49 +444.49,444.49,440.1,443.71 +443.73,444.49,441.92,443.24 +443.24,443.38,435.0,437.02 +437.12,440.0,436.52,438.19 +438.14,442.34,438.0,441.54 +441.54,443.46,441.09,442.28 +441.85,443.18,440.6,441.0 +441.0,441.53,440.0,440.3 +440.43,441.82,440.0,441.7 +441.55,443.07,441.48,442.97 +442.96,444.79,442.37,443.24 +443.23,443.73,441.8,442.31 +442.31,443.9,442.12,443.28 +443.54,444.0,441.95,443.87 +443.88,444.0,442.54,443.935 +443.51,444.0,442.96,444.0 +443.98,445.0,443.47,444.43 +444.52,445.5,444.21,445.35 +445.22,445.4,443.22,443.6 +443.6,444.59,443.45,444.55 +444.55,445.26,444.42,445.16 +445.16,445.5,441.5,442.47 +442.47,444.0,442.38,443.35 +443.35,443.99,442.58,443.78 +443.78,444.28,442.82,444.02 +444.16,444.31,443.0,443.99 +443.99,445.95,443.96,445.52 +445.91,446.0,445.29,445.76 +445.77,445.94,445.26,445.72 +445.65,446.24,445.0,445.55 +445.56,445.83,444.75,445.76 +445.76,446.36,445.75,446.23 +446.23,446.23,441.88,444.03 +444.04,444.93,443.87,444.18 +444.17,444.76,444.05,444.48 +444.54,444.93,443.96,443.96 +444.2,444.89,444.03,444.89 +444.7,444.9,444.34,444.89 +444.91,445.41,444.91,445.2 +445.14,446.99,445.1,446.65 +445.78499999999997,446.75,445.82,446.43 +446.43,446.61,445.81,446.41 +446.41,446.52,445.68,445.68 +445.75,446.27,445.56,446.15 +446.13,446.26,445.31,445.61 +445.61,445.91,445.28,445.72 +445.72,446.1,445.38,446.1 +446.1,446.21,445.5,446.2 +446.16,446.58,445.98,446.25 +446.24,446.45,446.11,446.31 +446.34,446.38,445.91,445.98 +446.17,446.24,445.2,445.98 +446.02,446.45,445.83,446.1 +446.16,446.27,445.76,446.15 +446.15,446.2,445.51,445.78 +445.79,446.0,445.37,446.0 +445.99,446.26,445.98,446.26 +446.26,446.27,445.0,445.19 +445.05,445.72,444.95,445.61 +445.53,446.08,445.7,446.03 +446.01,446.11,445.74,445.97 +445.97,445.97,445.22,445.79 +445.64,445.72,445.2,445.61 +445.53,445.89,445.26,445.43 +445.42,445.52,444.8,445.35 +445.34,445.74,444.19,444.26 +444.25,444.99,444.17,444.68 +444.68,444.68,442.0,442.35 +442.34,442.56,440.89,441.34 +441.34,442.78,441.34,442.78 +442.77,442.99,441.43,441.93 +441.93,443.11,441.75,442.5 +442.49,443.84,442.3,443.37 +443.37,443.38,442.84,443.18 +443.19,443.39,442.15,442.42 +442.49,442.99,441.99,442.53 +442.4,443.03,442.27,442.27 +442.54,443.74,442.0,443.65 +443.56,444.34,443.31,444.34 +444.34,444.99,444.31,444.78 +444.78,445.59,443.25,443.25 +443.26,443.26,442.93,442.93 +442.94,443.06,442.5,443.06 +443.06,443.52,442.97,443.125 +443.18,444.35,442.97,443.19 +443.3,443.7,440.79,443.35 +443.39,443.9,443.08,443.89 +443.88,443.9,441.67,442.05 +441.94,443.55,441.62,442.92 +442.87,443.77,442.15,443.33 +443.27,444.25,443.27,443.77 +443.76,444.09,442.6,443.87 +443.97,444.61,443.68,444.18 +444.18,444.62,443.53,444.37 +444.4,444.6,443.5,444.21 +444.2,444.66,443.66,444.54 +444.54,444.99,444.34,444.8 +444.8,445.3,444.22,444.74 +444.72,446.3,444.23,445.84 +445.69,446.31,445.45,446.11 +446.1,446.15,445.01,445.99 +446.0,447.3,445.99,447.29 +447.28,448.5,447.22,448.06 +448.07,448.07,447.09,447.42 +447.41,447.61,446.76,446.76 +446.76,446.77,445.69,446.38 +446.39,446.6,445.68,446.27 +445.82,446.16,445.62,446.16 +446.16,446.24,445.5,445.5 +445.795,445.55,444.33,445.4 +445.43,446.39,445.36,446.27 +446.26,446.27,445.78,445.78 +445.97,446.85,445.83,446.52 +446.51,446.99,443.06,446.62 +446.63,446.91,445.64,446.26 +446.24,446.56,445.29,446.1 +446.61,447.1,446.02,446.74 +446.98,447.75,446.02,447.38 +447.38,447.7,445.91,446.48 +446.24,447.4,445.74,443.49 +445.06,447.99,440.5,440.5 +443.88,447.42,440.52,447.38 +447.25,447.34,445.99,447.2 +447.12,447.5,446.88,447.25 +447.32,447.99,447.09,447.99 +447.99,448.99,447.65,448.43 +448.42,449.99,448.26,449.7 +449.7,450.03,448.76,450.01 +450.02,450.37,448.86,449.445 +450.2,450.4,448.88,448.88 +449.685,449.87,448.88,449.18 +449.17,450.22,449.04,450.22 +450.12,451.45,450.03,450.91 +450.91,452.42,450.78,451.49 +451.48,451.48,449.66,450.49 +450.36,451.0,449.78,450.88 +450.88,450.89,450.16,450.55 +450.53,451.0,448.73,449.38 +449.29,450.2,448.91,449.45 +449.36,450.0,449.19,449.71 +449.84,450.53,449.33,450.2 +450.19,450.39,449.5,449.96 +450.09,450.6,449.75,450.6 +450.59,451.0,450.18,450.8 +450.81,451.0,450.1,450.94 +450.94,451.84,450.39,451.55 +451.57,451.9,450.99,451.67 +451.58,451.79,449.42,450.03 +449.98,450.43,449.01,449.5 +449.61,450.83,449.31,450.28 +450.21,450.69,449.77,450.4 +450.4,451.01,449.8,450.64 +450.7,450.92,450.2,450.48 +450.55,451.09,449.0,450.94 +451.02,451.08,450.24,450.99 +450.98,450.99,450.12,450.33 +450.34,450.99,450.24,450.99 +450.99,451.99,450.0,451.78 +451.83,452.75,451.51,452.42 +452.39,452.99,451.72,452.91 +452.92,454.0,451.91,453.98 +453.97,453.99,451.12,453.96 +453.78,453.99,451.51,453.67 +453.6,453.6,451.69,453.0 +453.0,453.75,452.58,453.54 +453.53,454.68,452.22,453.94 +454.03,454.5,452.87,453.52 +453.62,454.42,453.26,454.42 +454.26,454.99,453.3,454.99 +454.98,454.99,454.4,454.46 +454.46,454.99,454.45,454.94 +454.98,458.0,454.35,457.99 +457.92,464.69,457.91,463.96 +464.15,471.92,463.1,467.64 +467.76,467.94,463.2,467.94 +467.94,468.87,466.31,467.99 +468.0,471.0,468.0,470.99 +471.0,474.95,465.45,474.9 +474.91,475.0,470.42,472.69 +472.73,473.06,468.41,469.71 +469.71,472.56,469.71,471.9 +471.94,473.79,468.26,473.55 +473.55,474.3,471.07,473.22 +473.04,476.43,471.21,475.25 +475.14,476.75,473.0,475.06 +475.23,476.0,473.89,475.0 +474.51,475.0,470.0,473.93 +473.55,476.41,472.68,474.78 +474.94,475.5,473.04,473.04 +473.79,474.25,472.35,472.99 +472.98,472.99,470.65,470.85 +471.28,471.54,464.1,469.78 +469.78,471.02,467.0,470.73 +470.95,471.7,468.82,470.04 +469.52,472.0,469.52,470.81 +470.76,472.2,470.7,471.38 +471.85,478.21,471.85,478.2 +478.21,480.0,478.2,480.0 +480.0,490.0,479.99,490.0 +489.99,499.0,486.0,489.93 +489.95,496.68,476.5,495.24 +495.09,499.0,480.3,497.03 +496.98,499.0,472.08,492.0 +492.91,493.19,483.1,491.14 +489.91,490.75,488.4,490.08 +490.06,494.25,488.64,490.96 +490.96,493.9,489.9,491.75 +491.69,500.89,490.56,497.44 +497.04,500.0,491.81,496.85 +496.82,498.21,492.7,494.98 +494.62,496.03,492.0,494.37 +494.37,498.21,493.29,497.6 +497.03,498.0,496.67,497.69 +497.98,498.0,495.31,498.0 +497.99,499.76,495.52,496.7 +496.82,520.0,496.15,514.3 +514.31,525.0,514.13,525.0 +523.88,539.49,521.06,530.24 +529.99,532.94,492.35,518.75 +518.2,527.2,511.24,524.84 +525.87,529.0,525.42,526.99 +526.99,527.0,495.0,521.05 +521.37,521.4,502.51,509.0 +509.0,516.93,507.0,515.28 +515.28,519.0,513.4,518.15 +518.87,519.0,516.49,517.45 +518.6,519.0,515.84,516.83 +516.84,517.67,514.75,516.01 +516.01,516.26,513.85,514.21 +514.67,514.88,510.28,512.41 +512.42,520.85,512.36,520.2 +520.55,520.99,519.61,520.33 +520.33,522.86,520.01,520.7 +521.12,521.15,518.02,521.15 +521.14,521.99,520.74,521.35 +521.85,522.1,516.0,522.0 +522.01,525.0,520.9,524.15 +522.96,549.99,521.7,548.36 +549.96,549.99,526.0,541.04 +540.95,541.25,525.35,535.24 +534.5,535.4,521.3,526.76 +526.75,526.75,513.5,520.16 +520.03,530.9,520.0,525.76 +525.03,526.15,520.0,522.97 +522.96,526.43,520.01,524.635 +524.62,526.8,522.45,526.3 +526.3,531.61,526.3,528.61 +528.65,532.21,519.0,524.22 +525.7,526.0,520.21,523.38 +523.76,524.7,520.56,524.15 +527.7049999999999,532.04,524.11,531.65 +531.65,533.5,524.1,531.79 +531.79,533.25,530.16,532.88 +532.85,539.56,530.16,537.69 +536.71,541.0,533.0,538.51 +538.95,539.83,535.0,536.5 +537.59,537.6,532.3,535.0 +535.0,535.0,529.0,529.0 +529.21,534.5,529.0,530.92 +532.895,538.25,529.81,536.51 +536.58,538.68,532.9,535.78 +535.01,536.94,532.9,536.8 +536.8,536.94,530.95,536.07 +536.07,536.23,531.15,532.89 +533.99,535.35,532.01,532.84 +532.95,533.73,532.0,533.58 +533.6,534.4,531.61,533.47 +533.25,533.82,528.77,530.39 +530.41,530.99,528.97,528.97 +528.96,534.0,528.31,533.03 +533.3,533.53,531.02,532.57 +532.8,534.55,531.03,533.67 +533.67,534.24,530.95,531.85 +531.86,534.25,531.69,534.24 +534.25,537.99,531.59,537.99 +537.96,543.42,537.57,543.11 +543.11,544.9,542.53,544.89 +544.9,544.9,539.35,540.78 +539.98,543.47,537.43,541.99 +542.03,542.92,539.0,540.73 +540.63,540.8,538.0,539.2 +539.17,542.0,534.04,535.94 +535.97,537.19,525.0,532.46 +532.47,534.0,527.35,530.99 +530.86,533.87,527.37,532.79 +532.52,532.7,530.22,530.43 +530.44,530.44,520.1,523.51 +523.94,525.95,520.01,521.1 +521.28,528.43,520.15,528.25 +528.19,534.03,526.74,532.51 +532.51,532.7,529.09,530.27 +530.38,533.24,528.68,533.15 +533.15,533.17,530.19,531.27 +531.22,531.23,528.2,528.2 +528.28,528.28,525.0,526.57 +527.24,530.0,524.39,529.69 +529.49,530.09,527.08,527.71 +528.61,533.1,528.34,533.0 +533.0,533.2,531.69,532.76 +532.76,532.98,530.6,531.83 +531.81,532.31,530.74,531.62 +531.68,534.99,531.21,534.81 +534.81,536.35,534.79,535.97 +535.97,538.83,534.38,537.83 +537.93,541.5,537.83,539.81 +539.58,540.28,538.28,539.94 +538.47,539.88,536.09,537.36 +537.36,537.36,531.6,534.14 +536.1375,535.49,533.88,535.49 +534.915,535.66,534.8,534.81 +533.6925,534.81,530.5,532.47 +532.47,535.0,532.47,535.0 +535.0,536.21,533.91,535.995 +535.54,536.99,532.61,536.99 +536.98,536.99,532.0,534.95 +534.9,535.19,531.86,532.28 +532.99,536.39,531.86,535.89 +536.15,538.73,536.15,536.8 +536.8,537.69,536.32,537.06 +537.0,537.95,534.82,536.53 +536.54,538.89,534.51,538.67 +538.65,538.7,537.65,538.55 +538.55,538.7,536.5,536.68 +536.67,536.8,534.0,536.65 +536.64,538.62,536.03,536.21 +538.52,538.52,535.44,535.77 +535.76,536.4,535.04,536.39 +536.4,536.51,533.8,534.0 +534.14,534.75,532.95,533.1 +533.64,535.34,532.02,534.02 +534.16,537.0,532.12,536.56 +536.35,540.0,535.0,536.44 +536.37,536.97,535.9,536.17 +536.3,536.56,535.29,536.33 +536.52,536.52,533.12,535.2 +535.19,536.73,535.19,536.68 +536.62,537.1,536.0,537.03 +537.03,541.2,536.01,540.95 +540.75,540.99,537.67,538.05 +538.08,539.48,538.03,539.44 +539.32,540.74,538.9,540.36 +540.35,540.36,539.0,539.12 +539.11,539.11,536.6,537.96 +537.98,538.36,535.96,538.09 +538.03,539.12,536.89,538.61 +538.66,538.97,536.8,538.6949999999999 +537.35,538.78,537.35,538.78 +538.78,548.99,538.77,548.99 +548.99,553.2,548.98,550.89 +551.44,553.13,550.18,551.1 +551.02,554.34,550.11,553.62 +553.64,555.0,552.5,554.0 +553.8,557.89,553.28,557.25 +557.1,566.22,556.8,565.39 +565.34,565.36,563.01,564.38 +564.38,574.5,564.38,573.55 +573.63,575.0,566.21,569.88 +569.85,576.29,569.35,574.05 +573.73,574.88,570.81,572.88 +572.88,578.0,571.36,576.84 +576.85,577.8,572.0,572.71 +572.62,573.59,565.0,570.55 +570.56,573.57,569.16,570.75 +570.75,574.95,570.75,573.82 +573.83,574.1,572.0,573.8 +573.77,575.74,572.76,574.73 +574.97,575.0,570.88,573.97 +574.0,575.59,569.0,575.53 +575.38,576.08,573.16,576.03 +576.08,581.11,576.08,581.07 +580.88,585.54,580.64,584.99 +584.82,588.63,583.67,588.62 +588.62,594.64,577.84,582.2 +582.2,583.74,577.21,581.77 +582.18,582.18,573.0,576.26 +577.28,581.0,576.18,580.21 +580.24,580.35,574.26,578.4 +578.4,579.5,574.51,576.0 +576.0,581.0,575.59,580.84 +580.75,580.75,565.22,570.31 +570.31,571.42,564.29,565.48 +565.86,572.69,565.68,570.85 +571.53,575.0,570.22,574.89 +574.89,581.25,572.0,579.0 +579.01,579.01,574.28,576.15 +576.37,576.75,575.27,575.55 +575.55,576.75,574.61,576.37 +576.37,585.0,575.6,584.19 +584.18,584.75,580.22,582.0 +581.99,582.61,577.5,579.85 +579.86,580.99,578.0,579.99 +580.37,580.94,579.03,580.7 +580.74,580.86,573.61,576.27 +576.27,578.13,576.25,577.48 +577.44,579.14,577.4,578.92 +578.89,580.0,578.61,579.98 +579.94,580.0,577.25,577.6 +577.61,578.95,575.01,578.95 +578.81,579.82,576.55,578.88 +578.81,581.91,570.22,574.98 +575.0,577.63,574.26,577.08 +577.08,578.47,574.81,577.8 +577.8,577.8,572.62,575.99 +575.99,578.1,575.42,577.03 +577.03,580.0,576.14,579.65 +579.4,579.9,576.3,577.76 +577.76,577.96,577.0,577.0 +577.26,577.28,576.26,576.33 +576.33,576.92,571.38,573.8 +574.66,576.99,574.66,576.99 +576.98,577.04,574.0,575.64 +575.65,578.07,575.02,576.77 +576.98,579.75,575.47,578.68 +578.68,580.94,577.85,580.2 +580.2,583.99,578.52,579.68 +579.69,581.69,578.85,580.99 +580.92,587.44,580.92,582.88 +582.7,584.69,581.82,583.33 +583.32,584.22,582.9,583.91 +583.91,584.04,580.4,582.55 +582.56,584.13,581.29,581.99 +582.04,584.2,581.52,581.88 +581.78,585.47,581.35,584.9 +584.47,585.03,583.72,584.81 +584.64,585.4,583.57,584.99 +584.98,585.21,583.31,584.0 +583.99,586.38,583.0,586.15 +586.36,588.15,583.12,585.99 +585.8,586.99,585.35,586.84 +586.84,587.4,585.25,585.76 +586.28,586.87,582.9,584.41 +584.02,584.8,583.01,583.41 +583.42,583.99,583.16,583.96 +583.97,584.7,583.67,584.62 +584.62,587.55,584.0,587.01 +587.19,590.95,585.11,589.8 +589.82,590.1,589.18,589.54 +589.54,590.69,589.33,589.86 +589.86,590.69,586.78,587.92 +587.9,588.65,583.0,588.48 +588.49,589.05,586.26,586.91 +586.89,586.89,586.3,586.33 +586.34,586.36,584.25,584.38 +585.25,587.72,584.81,587.62 +587.62,587.99,585.85,587.99 +587.98,589.47,586.79,589.47 +589.4,590.0,587.58,587.91 +587.9,589.7,586.95,589.17 +589.17,590.0,584.87,584.87 +584.86,584.87,483.78,575.47 +575.45,579.65,562.73,570.33 +570.39,573.36,563.84,569.16 +568.82,573.84,568.74,573.84 +573.83,577.0,573.6,576.04 +576.24,577.92,573.54,575.97 +575.99,579.98,574.63,576.95 +578.8,579.99,576.0,577.93 +578.8499999999999,579.97,574.5,578.91 +578.9,581.88,575.12,581.47 +581.06,581.06,578.82,579.36 +579.6,579.6,575.31,577.0 +577.0,577.48,575.01,576.75 +576.77,579.51,575.85,578.51 +579.0,579.01,575.12,575.8 +575.8,575.82,575.0,575.73 +575.63,576.01,572.96,573.65 +574.17,576.97,573.26,576.97 +576.97,579.5,575.83,579.5 +579.5,579.5,578.32,579.38 +579.38,579.97,578.0,579.86 +579.89,582.07,579.88,581.99 +581.94,582.88,580.78,581.64 +580.96,581.99,579.14,579.99 +579.98,580.0,577.58,578.42 +578.35,578.53,573.62,578.43 +578.1,580.0,577.4,579.89 +579.9,580.99,579.29,579.99 +579.59,580.26,579.22,579.64 +579.64,581.56,579.2,580.96 +581.03,582.0,579.4,581.19 +581.2,582.88,580.8,582.88 +582.87,583.99,581.93,583.61 +583.6,583.61,582.41,583.22 +583.22,583.22,581.21,582.6 +582.57,582.82,579.04,580.86 +580.81,582.21,580.33,580.76 +580.83,581.7,579.58,581.69 +581.7,582.18,580.17,580.63 +580.74,581.23,580.08,580.32 +580.5,580.98,580.16,580.67 +580.67,580.95,580.33,580.77 +580.63,580.97,579.48,580.97 +580.97,581.01,579.49,580.38 +580.38,580.74,578.78,580.64 +580.64,581.07,580.58,581.06 +581.05,582.0,577.2,579.25 +579.01,579.34,574.0,574.0 +574.01,576.99,574.01,576.09 +576.07,577.9,575.26,577.35 +577.33,577.5,577.12,577.48 +577.32,577.49,574.0,575.69 +575.74,578.1,575.68,577.5 +577.69,578.71,576.97,578.17 +578.18,578.89,576.0,576.99 +577.0,578.04,576.45,577.99 +577.84,578.94,577.56,578.66 +578.62,579.24,576.41,577.81 +577.81,580.0,576.2,579.79 +579.8,579.99,577.98,577.98 +578.13,578.74,577.12,577.84 +577.98,578.24,577.5,577.51 +576.89,577.52,575.0,575.81 +575.8,576.96,573.5,575.94 +575.92,577.45,574.73,577.45 +577.25,578.32,576.37,578.28 +578.29,578.95,578.0,578.95 +578.94,578.99,578.1,578.97 +578.97,579.88,578.62,579.49 +578.215,579.5,576.3,577.46 +577.46,578.67,577.19,578.44 +578.44,578.78,576.4,578.78 +578.78,578.99,577.16,577.6 +577.6,578.03,576.21,577.52 +577.66,578.37,577.5,577.93 +577.89,578.0,577.69,577.82 +578.0,578.97,577.79,578.96 +578.96,579.88,578.0,578.88 +578.88,581.0,575.0,580.62 +580.62,580.96,579.29,580.0 +579.99,580.12,576.67,579.85 +579.85,580.96,577.18,580.42 +580.51,581.99,580.47,581.5 +581.5,583.0,581.49,583.0 +583.0,586.12,582.99,585.88 +585.88,586.0,583.74,585.62 +585.61,585.86,585.26,585.63 +585.65,585.84,584.68,585.14 +585.14,585.89,583.0,585.43 +585.43,586.42,585.16,586.42 +586.42,586.99,585.56,585.91 +585.91,587.74,585.91,586.19 +586.19,587.78,585.95,586.08 +585.735,587.0,584.93,585.35 +585.28,587.21,584.95,587.2 +587.19,587.64,586.94,586.94 +586.95,587.34,586.57,587.0 +586.97,588.0,586.23,586.76 +586.75,587.99,585.57,587.98 +587.89,588.0,586.18,586.89 +587.37,588.22,586.5,587.7 +587.7,587.81,585.87,586.51 +586.68,587.33,586.35,586.46 +586.46,587.07,586.0,586.48 +586.66,590.01,586.46,590.01 +590.01,610.0,589.99,605.01 +605.0,628.0,605.0,623.28 +623.0,625.0,614.83,622.17 +623.1,625.0,620.79,624.52 +624.0,637.38,624.0,635.92 +635.99,639.0,629.96,636.6 +636.6,637.0,632.21,636.81 +636.8,636.88,625.79,628.33 +628.32,630.95,626.55,629.77 +629.66,632.5,628.04,632.49 +632.49,637.17,632.19,636.66 +638.23,644.0,635.84,643.98 +643.97,644.98,636.28,643.88 +643.87,649.0,636.92,648.9 +648.95,650.0,637.62,642.31 +642.3,647.99,641.59,645.7 +645.57,650.0,644.48,648.8 +648.81,658.84,646.8,657.0 +657.0,657.35,645.32,646.99 +646.99,649.0,645.38,648.6 +648.38,654.87,646.32,654.86 +654.87,678.13,651.8,673.6 +673.07,679.0,662.0,671.45 +671.37,687.71,664.34,680.0 +681.32,681.86,670.0,675.69 +675.76,677.0,663.55,673.63 +673.61,677.0,669.64,675.96 +675.89,682.0,674.15,679.47 +679.6,682.0,679.6,681.01 +681.01,689.86,678.89,689.86 +688.24,694.66,673.68,693.65 +692.72,697.43,670.0,681.8 +682.44,690.8,679.95,688.61 +688.66,700.0,688.65,697.99 +698.0,699.0,691.44,695.51 +695.5,699.0,690.32,698.12 +698.06,707.0,693.73,704.28 +704.28,710.0,702.2,705.0 +705.0,708.0,700.02,707.0 +707.0,720.0,706.33,715.0 +717.32,717.33,677.0,691.52 +691.52,696.0,689.0,691.81 +692.02,696.05,684.5,694.37 +694.36,694.75,690.0,692.57 +692.32,694.12,684.4,693.04 +693.01,693.4,686.22,690.22 +699.0,704.99,690.22,704.99 +704.99,714.26,703.49,704.83 +704.97,706.45,704.97,706.4 +699.815,706.44,694.01,694.01 +694.66,699.29,691.86,692.0 +692.0,697.2,681.86,695.69 +695.69,695.99,682.86,694.44 +694.34,694.34,690.56,691.42 +691.24,695.99,689.5,691.38 +691.38,691.93,683.68,690.79 +690.8,693.45,688.97,693.45 +693.45,695.19,690.68,693.19 +693.19,693.36,688.11,688.13 +688.12,691.18,683.41,689.49 +689.5,690.81,682.2,688.5 +688.62,691.95,684.3,689.29 +689.79,690.88,687.0,687.6 +687.6,688.5,680.01,680.02 +680.02,681.29,660.01,666.47 +665.84,675.0,650.02,662.7 +662.81,686.0,662.81,672.12 +671.45,683.74,677.04,681.54 +680.09,681.99,675.75,681.83 +681.85,689.52,681.82,688.78 +688.81,688.9,682.06,686.1 +686.04,688.0,681.73,685.0 +685.0,685.52,683.87,684.03 +684.2,684.8,681.18,683.17 +683.15,683.57,678.23,679.55 +679.09,684.69,677.09,682.91 +682.82,683.99,682.34,683.99 +683.99,684.87,680.51,681.66 +681.74,684.19,678.27,681.43 +680.79,682.15,679.72,681.11 +681.1,683.0,679.99,682.05 +681.8,682.44,675.28,676.5 +676.25,678.22,673.59,673.6 +673.6,676.53,673.0,674.25 +673.96,684.36,673.05,684.12 +684.11,684.31,679.39,680.66 +680.95,684.88,680.23,684.88 +684.88,689.99,680.7,684.87 +684.94,689.95,684.07,689.94 +689.94,692.64,687.82,690.87 +690.88,696.03,689.38,694.86 +694.81,696.0,692.37,692.37 +693.04,695.48,692.0,695.48 +695.48,695.97,693.19,695.1 +695.04,695.85,691.11,692.73 +692.73,695.47,690.55,694.38 +694.32,710.11,693.1,709.9 +709.91,721.0,700.02,719.85 +720.25,741.0,718.21,727.0 +727.0,737.69,723.01,733.81 +733.89,734.53,730.67,732.92 +732.91,732.99,722.3,730.0 +729.0,731.77,725.83,730.95 +731.03,739.0,729.13,733.1 +733.09,738.0,732.28,737.6 +737.61,739.59,736.72,737.63 +737.63,739.55,735.37,739.11 +739.12,742.94,739.03,742.39 +741.82,750.0,730.17,736.61 +736.6,738.61,733.59,738.61 +738.57,738.92,735.96,738.35 +738.36,745.0,737.93,744.92 +744.93,748.0,741.44,742.42 +742.41,745.75,742.41,745.34 +745.22,752.69,745.22,751.76 +751.69,763.52,741.01,762.47 +762.47,772.93,761.76,763.98 +763.78,770.3,762.5,768.75 +768.75,777.23,767.28,770.25 +770.26,777.68,770.25,770.48 +770.45,772.43,767.5,770.51 +770.17,773.98,768.07,773.0 +773.31,776.95,770.66,776.95 +776.95,778.5,772.07,774.48 +774.49,776.91,772.41,773.41 +774.52,774.52,771.0,771.03 +771.03,771.58,731.17,736.7 +735.82,744.3,709.01,716.22 +715.45,744.95,714.44,744.43 +744.93,745.99,740.76,742.03 +742.09,745.15,731.05,736.78 +736.89,739.67,731.21,738.38 +738.22,746.3,735.98,745.6 +745.45,753.88,744.37,753.52 +753.68,757.0,752.9,753.63 +754.78,755.35,741.6,744.99 +744.95,750.71,735.01,739.04 +739.23,750.34,739.0,750.34 +750.73,758.57,748.68,754.94 +754.94,762.73,753.5,761.22 +761.34,764.75,757.73,762.49 +762.48,763.02,756.85,763.02 +763.01,764.98,740.0,741.0 +740.96,749.74,740.0,748.0 +747.9,754.37,747.9,753.82 +753.81,754.8,737.0,748.61 +748.61,748.61,734.8,743.5 +743.48,745.35,740.12,744.04 +744.64,745.99,740.99,741.24 +741.26,749.56,741.08,747.78 +747.79,750.71,747.79,748.82 +748.81,749.06,742.03,747.88 +748.61,749.74,746.67,748.46 +748.46,759.0,748.45,757.76 +757.77,758.65,754.48,755.43 +755.43,757.72,752.32,754.16 +754.15,757.42,754.06,755.39 +755.58,760.91,754.43,756.95 +756.95,759.62,751.21,752.27 +752.26,757.38,750.29,757.09 +757.09,759.94,755.3,759.94 +759.94,778.99,759.94,776.82 +776.68,779.59,773.15,776.81 +776.93,779.85,772.6,775.55 +775.55,784.85,772.64,784.81 +784.72,785.15,742.72,751.0 +751.52,755.99,751.25,753.19 +753.25,760.73,751.64,758.53 +758.52,760.73,757.51,758.99 +759.0,760.17,757.0,759.63 +759.63,759.63,755.31,755.83 +755.73,755.74,752.44,753.12 +753.09,754.32,748.0,749.0 +749.8,754.0,744.77,747.59 +747.59,752.18,747.5,748.74 +748.39,758.09,748.15,756.55 +756.8,757.51,754.15,755.6949999999999 +755.81,756.4,754.82,754.84 +754.84,756.8,754.79,756.27 +756.27,768.16,751.04,764.9 +765.05,765.06,746.53,757.45 +757.44,762.6,757.44,762.51 +762.5,762.52,758.74,760.57 +760.7,771.92,760.7,764.01 +764.02,770.0,752.88,753.82 +753.91,765.76,753.91,761.66 +761.45,765.28,755.14,764.33 +764.32,764.32,756.72,761.86 +761.86,764.22,759.01,761.84 +761.62,766.2,760.79,766.01 +766.01,767.75,764.44,767.28 +767.28,767.99,765.21,766.83 +766.83,768.99,765.7,767.79 +767.79,767.79,764.99,766.18 +766.21,766.64,755.75,760.33 +760.33,763.93,756.59,762.6 +762.51,764.53,761.24,762.0 +761.76,762.0,760.46,761.67 +761.65,763.78,757.41,763.0 +763.13,763.81,759.35,763.35 +763.34,764.02,763.15,763.3 +763.31,765.0,763.24,764.97 +764.97,765.0,763.5,764.43 +764.44,764.53,756.2,758.11 +758.39,759.97,746.64,749.26 +749.92,752.93,745.0,752.53 +752.95,757.74,750.5,750.6 +750.6,751.35,702.0,732.41 +732.41,746.58,702.77,741.52 +741.57,745.0,734.7,738.0 +738.13,743.63,738.02,742.95 +742.52,743.9,737.84,737.84 +738.74,741.22,720.0,735.75 +735.74,745.0,731.32,744.52 +744.52,746.42,734.51,736.25 +736.25,738.5,715.0,730.0 +730.0,732.0,703.0,714.0 +714.0,717.22,657.13,694.87 +694.85,700.0,650.0,693.33 +693.38,696.11,666.0,674.97 +670.88,714.68,670.0,714.67 +714.67,718.26,680.0,700.75 +700.45,707.1,690.01,697.12 +696.71,710.63,693.37,709.65 +709.36,712.65,707.53,708.87 +709.31,712.86,709.31,712.01 +712.0,712.01,707.03,707.08 +708.0,708.56,685.0,688.5 +688.51,688.51,660.26,660.26 +662.04,679.24,656.0,665.92 +665.25,670.0,628.6,662.76 +660.95,674.35,629.0,671.99 +671.96,676.98,662.18,674.97 +675.01,681.88,674.36,680.0 +680.0,680.54,661.28,665.0 +665.63,667.23,635.11,656.77 +656.78,666.95,630.0,666.95 +667.11,669.99,647.12,659.78 +658.73,664.0,650.0,658.62 +658.55,663.88,652.0,661.03 +661.03,671.51,657.89,670.91 +670.99,679.99,669.91,675.35 +675.67,679.99,667.86,669.22 +669.25,675.0,669.25,670.82 +670.74,673.99,658.1,665.62 +665.5799999999999,673.11,652.1,660.42 +660.42,671.5,660.41,670.01 +670.01,671.5,666.0,666.76 +667.72,675.38,666.5,672.95 +673.92,678.63,672.68,677.4 +677.42,678.64,671.5,673.99 +674.22,675.1,666.0,671.53 +671.54,673.54,662.72,666.8 +666.79,670.19,665.28,667.05 +667.05,667.77,660.52,664.21 +664.22,670.58,662.16,667.62 +667.64,669.99,646.01,653.0 +653.0,656.99,616.16,637.51 +637.96,642.83,610.0,614.85 +611.01,640.0,605.01,633.49 +632.72,632.75,617.71,620.25 +622.15,624.42,610.22,610.63 +612.52,634.0,612.52,623.22 +623.21,624.64,596.42,606.05 +606.01,608.8,568.11,599.28 +599.17,600.0,588.89,590.36 +591.03,592.0,544.13,575.0 +575.02,599.68,562.86,592.9 +592.9,612.12,590.0,591.02 +591.02,598.99,586.26,586.26 +586.26,589.69,575.0,584.58 +584.58,601.54,575.1,595.51 +595.5,601.0,590.91,594.06 +594.07,599.2,592.93,594.41 +594.42,601.0,585.0,599.05 +599.56,599.56,585.73,592.55 +594.45,599.26,590.59,594.07 +594.26,594.8,585.0,585.02 +585.01,586.45,573.16,585.51 +585.5,588.31,572.25,572.62 +572.61,576.95,565.28,571.11 +571.46,635.0,570.09,609.0 +607.03,629.99,607.03,614.98 +614.85,637.89,614.85,628.28 +628.99,635.0,608.18,608.31 +609.95,624.99,608.31,620.19 +620.39,628.37,614.11,622.86 +622.7,633.33,619.15,628.95 +631.22,632.96,627.76,631.98 +631.98,639.95,631.01,639.95 +639.94,649.96,636.77,646.99 +645.83,700.0,645.83,682.0 +679.01,685.0,655.0,675.0 +675.0,688.88,674.7,688.85 +688.5,694.0,683.01,691.88 +691.88,693.98,652.0,677.99 +677.99,690.0,667.62,677.76 +678.76,689.97,660.0,668.97 +668.97,678.94,666.03,678.94 +679.08,684.96,670.74,684.96 +684.27,686.5,671.13,677.0 +677.0,683.2,670.0,675.0 +674.79,675.0,660.07,660.8 +660.8,675.0,655.65,660.0 +659.99,664.0,641.0,656.99 +656.97,657.53,648.69,655.3 +655.31,658.0,648.5,658.0 +658.0,669.0,657.99,669.0 +668.99,670.46,656.93,657.19 +657.19,662.64,655.03,659.57 +659.5,667.52,656.0,666.51 +666.51,669.42,660.75,667.56 +667.56,670.0,666.74,670.0 +670.0,670.94,667.67,670.19 +670.19,699.0,670.19,697.7 +697.7,697.75,687.78,695.29 +695.36,697.75,693.0,694.48 +694.54,696.12,692.0,692.6 +692.01,692.38,678.0,681.01 +681.0,689.71,678.45,683.25 +683.94,694.0,682.21,692.4 +692.4,693.7,685.0,685.82 +685.64,688.95,683.55,687.96 +684.065,688.84,678.81,682.29 +682.49,686.94,682.1,686.84 +686.79,687.0,684.89,686.91 +686.9,690.99,686.5,688.22 +688.26,690.41,685.15,688.08 +688.08,688.57,682.56,684.0 +684.0,687.76,655.0,665.28 +666.15,668.5,650.0,665.9 +665.88,668.18,658.1,666.34 +667.2,669.82,662.0,667.09 +666.49,668.5,662.09,668.5 +668.68,671.1,668.11,671.1 +671.1,678.0,671.07,677.87 +677.87,678.99,670.15,673.5 +673.49,674.0,669.16,673.32 +672.14,675.19,669.81,670.43 +670.26,671.85,667.51,668.41 +668.41,670.15,666.25,668.84 +668.91,669.46,660.0,662.26 +662.19,664.0,659.45,659.63 +659.63,663.99,658.0,662.17 +662.16,669.0,657.76,668.47 +668.0,668.0,664.63,665.34 +665.51,666.27,661.11,661.14 +661.29,666.29,655.04,659.4 +659.46,663.75,659.46,642.23 +663.73,663.99,625.01,625.06 +628.55,645.26,626.0,639.83 +639.82,639.83,630.76,632.81 +632.89,638.8,627.0,627.02 +627.98,638.8,626.61,636.45 +636.45,644.79,634.06,643.01 +643.05,646.87,640.32,644.65 +644.65,644.86,633.7,639.51 +639.51,645.0,639.51,643.86 +643.85,643.85,638.0,642.57 +642.64,643.99,641.0,641.01 +641.01,642.03,635.01,638.01 +637.85,639.79,630.0,639.49 +639.49,659.98,635.16,659.47 +659.39,659.5,650.0,652.36 +652.37,657.84,652.37,653.87 +653.76,654.0,647.7,647.7 +648.96,655.64,648.96,654.01 +654.06,658.22,652.11,658.0 +654.05,658.18,653.0,656.0450000000001 +654.04,655.5,653.84,654.09 +654.25,658.0,654.25,657.52 +657.57,657.97,647.25,649.46 +649.26,649.94,639.06,644.49 +644.24,644.99,640.01,641.92 +642.69,644.7,635.36,636.64 +636.79,641.24,636.7,637.0 +637.78,640.0,632.79,639.5 +639.36,647.77,636.93,647.71 +647.24,648.22,642.52,643.91 +644.0,645.38,643.0,643.57 +643.7,645.3,642.46,645.25 +645.25,649.88,645.23,647.99 +647.99,649.48,646.27,648.76 +648.63,654.66,648.55,651.56 +652.0,659.94,646.69,658.92 +658.93,663.53,658.49,660.06 +660.05,660.51,657.49,658.0 +658.0,660.99,654.65,657.59 +657.6,660.0,656.08,657.42 +657.01,658.57,651.59,654.395 +652.83,654.48,647.6,651.37 +651.96,655.11,651.66,652.72 +652.72,653.04,647.61,652.63 +652.69,654.95,651.76,653.81 +653.78,654.28,653.0,653.71 +653.62,654.16,650.04,654.16 +654.14,656.16,652.31,654.24 +654.16,654.99,648.95,650.99 +650.31,650.99,647.89,649.55 +649.54,650.0,638.0,642.99 +642.99,649.0,642.99,648.46 +648.45,650.99,647.43,649.82 +649.86,650.84,648.67,649.69 +649.75,650.0,646.74,647.87 +647.79,648.79,644.17,644.52 +644.52,649.0,644.11,649.0 +648.76,649.5,646.73,649.5 +649.5,652.3,645.34,648.83 +648.56,649.01,640.0,642.79 +642.79,645.67,642.78,644.8 +644.8,647.39,636.03,636.5 +636.51,639.59,630.02,639.29 +639.21,641.96,633.41,641.25 +641.47,641.57,634.0,637.45 +637.44,639.99,634.0,638.02 +637.77,639.99,635.52,637.03 +637.01,639.99,636.51,639.74 +638.4549999999999,639.98,638.46,639.69 +639.9,639.97,635.77,636.345 +637.0,637.47,632.57,633.0 +633.0,638.98,633.0,637.01 +637.0,637.26,634.75,635.6 +635.58,636.75,633.0,634.01 +634.1,636.75,633.76,636.31 +636.34,636.74,633.41,636.48 +636.49,639.05,636.48,639.05 +639.05,642.51,639.0,641.46 +641.46,642.5,639.09,639.99 +640.0,640.0,637.21,639.51 +639.76,642.51,637.9,638.79 +639.06,639.84,635.03,637.5 +637.67,640.0,636.5,640.0 +640.0,640.38,637.76,640.38 +640.38,642.0,638.1,641.51 +641.51,641.51,635.14,638.73 +638.47,640.0,635.14,635.32 +635.29,637.82,635.14,637.15 +637.2,637.86,636.69,637.26 +637.26,638.73,636.09,638.33 +638.33,639.99,637.0,639.99 +639.95,640.0,639.44,639.59 +639.56,639.58,637.76,639.37 +639.37,651.24,639.36,651.24 +651.24,653.99,646.14,651.97 +651.97,652.57,651.22,651.22 +651.29,664.49,650.55,663.84 +663.5,675.0,662.71,668.7 +669.07,669.07,663.2,664.85 +664.94,669.79,663.54,668.88 +668.29,673.99,666.49,673.49 +673.47,673.5,668.31,673.36 +673.31,673.49,666.42,669.1 +668.52,671.35,661.66,670.71 +670.71,670.71,665.71,665.89 +665.9,670.0,664.0,668.69 +668.7,672.91,667.8,672.89 +672.9,673.5,672.0,672.37 +672.38,672.38,667.0,670.5 +669.8,675.0,669.8,672.94 +672.93,683.21,672.25,682.59 +682.58,686.0,677.8,686.0 +685.8,688.99,681.33,684.47 +684.5,686.11,682.51,684.7 +684.71,684.71,672.01,679.87 +679.86,679.86,669.05,677.605 +678.48,679.48,674.39,675.34 +675.35,682.53,675.35,680.92 +680.45,683.04,679.06,681.85 +681.85,684.69,680.54,680.465 +680.63,681.76,677.07,679.08 +679.08,680.79,677.07,678.74 +678.5,679.0,670.0,672.05 +672.07,675.14,670.87,675.0 +675.0,676.0,674.97,676.0 +675.99,685.01,675.64,680.35 +680.36,680.99,673.5,677.0 +677.0,677.49,675.0,677.37 +677.49,679.0,674.3,678.66 +678.74,680.0,677.96,678.44 +678.44,683.0,678.01,682.05 +682.01,683.0,676.92,677.1 +677.1,679.45,677.09,678.01 +678.01,682.44,678.0,681.27 +681.27,682.44,679.55,679.98 +679.98,681.18,678.28,680.82 +680.82,681.5,678.03,680.25 +681.31,681.52,679.38,680.265 +680.63,681.66,679.14,680.28 +680.27,681.81,679.92,680.53 +680.54,680.71,679.92,679.92 +679.92,689.99,679.9,689.82 +689.93,698.0,689.22,696.8 +696.77,696.77,692.11,693.07 +693.1,696.86,692.71,696.68 +696.68,697.08,694.02,695.63 +695.62,695.62,688.45,691.05 +691.05,692.04,688.98,692.01 +692.02,696.0,692.01,694.94 +695.0,695.25,694.25,694.92 +694.69,696.99,694.25,696.67 +696.68,696.9,694.4,696.79 +696.8,697.94,696.78,697.87 +697.88,700.0,697.61,700.0 +699.99,701.85,694.0,701.19 +700.94,705.25,699.95,704.79 +703.63,705.24,701.01,702.97 +702.81,703.83,702.47,703.79 +703.79,703.82,683.67,686.21 +686.22,700.0,685.99,691.6 +691.59,695.0,691.59,692.44 +693.08,696.91,692.34,696.9 +696.86,696.86,690.0,690.58 +690.58,690.58,680.0,685.23 +685.22,685.32,667.71,673.6 +673.6,674.86,669.04,671.9 +671.71,681.0,670.84,680.49 +680.48,680.79,679.8,679.81 +679.8,679.8,672.68,674.38 +674.38,682.25,674.15,682.01 +682.01,682.01,655.0,656.6 +657.08,671.68,652.0,657.83 +658.38,663.46,651.0,655.0 +655.09,667.83,654.83,664.29 +664.29,666.79,660.11,660.78 +660.84,673.49,660.84,666.44 +667.0,674.85,664.0,667.61 +667.61,668.14,664.5,667.17 +666.85,669.15,666.69,667.97 +667.11,670.13,659.34,662.05 +662.05,662.82,658.27,662.73 +662.17,668.5,653.16,668.2 +668.08,675.99,667.01,669.9 +670.0,678.99,669.78,678.99 +678.99,679.31,676.14,676.4449999999999 +676.44,678.52,669.99,673.9 +673.9,678.82,673.5,675.355 +678.73,678.78,673.59,676.81 +677.5450000000001,676.6,673.83,676.35 +676.36,676.36,670.0,672.22 +674.01,675.11,671.31,672.38 +671.66,672.72,670.6,672.54 +672.54,672.76,670.95,671.86 +671.86,683.69,671.86,683.61 +683.53,683.53,679.12,679.22 +679.78,681.86,670.35,670.35 +670.11,673.85,668.87,673.5 +673.26,674.4,671.87,673.64 +673.65,674.49,669.45,673.93 +674.17,677.7,673.09,677.39 +677.48,678.72,675.61,678.46 +678.46,678.49,677.78,678.49 +678.49,678.99,677.53,678.46 +678.46,682.0,678.37,681.71 +681.72,682.37,679.64,681.76 +681.76,681.76,677.17,680.36 +680.54,680.73,679.51,680.32 +680.32,680.73,679.51,680.72 +680.65,680.65,678.0,678.31 +678.64,678.76,674.9,676.54 +676.19,676.2,672.11,673.11 +673.11,674.61,671.99,673.45 +673.44,677.9,671.01,677.82 +677.82,678.02,670.0,673.7750000000001 +672.68,674.07,669.69,669.73 +669.7,675.83,669.7,675.02 +675.04,675.63,672.57,673.0 +673.0,675.88,670.5,672.26 +672.26,673.23,662.51,665.94 +666.0,672.23,664.63,668.96 +668.97,672.48,668.97,672.08 +671.96,672.0,670.29,670.84 +670.74,671.0,669.92,669.92 +670.23,672.0,669.69,670.46 +670.46,671.99,668.86,671.8 +671.72,671.99,668.01,670.96 +671.0,671.0,667.4,669.36 +669.02,670.0,667.85,669.99 +669.99,670.0,669.18,669.98 +669.98,678.99,665.0,676.5 +676.5,677.31,665.0,677.31 +677.33,680.66,677.33,680.36 +680.32,680.79,678.83,680.69 +680.74,680.79,674.06,674.87 +675.29,677.5,673.65,673.83 +673.83,674.49,670.79,675.415 +672.6,677.0,672.53,677.0 +677.06,677.69,671.8,671.8 +671.8,671.8,665.69,667.38 +666.97,672.71,666.97,672.7 +672.7,673.24,671.04,672.45 +672.75,673.5,670.85,672.33 +672.05,673.5,671.7,672.98 +672.99,676.78,671.35,676.78 +675.2,675.2,672.74,674.19 +674.18,676.18,672.44,675.39 +675.39,676.47,673.81,674.8 +675.45,676.0,672.82,675.05 +675.86,675.98,671.0,674.76 +675.25,676.0,672.0,676.0 +676.0,678.09,675.53,676.35 +676.32,679.59,676.19,678.02 +678.06,678.51,677.01,677.77 +677.76,683.44,677.03,680.27 +679.59,679.81,675.56,675.6 +675.58,677.37,672.52,673.84 +673.63,674.42,641.85,645.55 +644.08,654.71,643.54,650.94 +650.56,650.56,642.0,646.13 +646.13,646.5,642.0,643.41 +642.9,648.74,640.33,648.47 +648.46,649.66,644.14,647.36 +647.57,648.33,643.48,644.18 +644.17,651.66,644.12,648.7 +648.6,649.45,640.89,642.76 +642.57,646.33,642.14,643.31 +643.75,644.51,639.06,640.72 +640.98,642.02,639.03,639.13 +639.12,640.0,611.96,618.51 +619.17,627.79,617.68,621.03 +621.28,624.22,621.0,623.04 +623.04,624.15,621.04,624.15 +624.15,624.15,619.17,622.49 +622.51,629.62,611.94,628.9 +628.88,642.69,628.0,640.25 +640.32,645.0,639.72,645.0 +645.0,647.99,642.65,647.67 +647.6,647.99,645.15,647.0999999999999 +645.39,649.71,645.05,646.53 +646.49,647.59,640.0,642.98 +643.14,645.56,640.2,641.09 +641.03,644.99,638.04,642.1 +642.41,644.84,640.25,642.42 +642.24,646.88,641.07,642.04 +642.05,645.4,641.04,642.73 +642.17,644.38,640.65,642.3 +642.29,644.46,641.16,642.77 +642.64,645.95,641.75,645.92 +645.92,649.97,644.23,649.79 +649.7,655.66,646.9,650.63 +651.62,652.56,650.67,650.815 +651.99,652.0,649.21,651.0 +651.0,657.02,650.99,652.995 +652.995,657.09,654.04,654.99 +654.99,657.08,654.06,656.2 +655.73,657.94,655.87,659.37 +656.47,663.01,656.39,662.54 +662.54,663.74,658.95,661.17 +661.16,663.9,659.59,663.9 +663.69,667.33,663.69,665.0 +665.42,665.77,661.88,662.19 +662.17,664.25,657.02,663.34 +663.07,663.58,653.6,658.41 +660.2650000000001,658.85,654.09,657.29 +657.46,658.38,654.33,655.9 +658.655,661.82,655.9,659.86 +659.85,659.99,657.4,659.45 +659.58,659.58,656.46,658.48 +658.3,658.49,647.49,647.9 +647.89,651.63,647.89,650.04 +650.04,654.63,648.14,654.01 +654.03,654.03,651.05,652.65 +652.63,653.44,646.01,649.09 +651.935,653.41,649.09,651.23 +651.24,664.47,649.79,661.84 +661.84,661.84,658.17,660.98 +660.96,663.7,608.0,644.29 +656.1266666666667,646.98,637.25,640.43 +651.2933333333334,646.46,639.19,646.33 +646.46,646.65,642.01,644.61 +644.62,649.36,644.01,649.34 +649.0366666666666,658.64,649.36,657.0 +653.4533333333334,662.13,655.26,657.85 +657.87,660.03,655.52,656.33 +656.69,656.75,649.96,655.66 +655.57,655.74,647.39,651.53 +653.625,652.15,649.08,651.6 +651.68,652.67,650.73,652.65 +651.275,652.75,648.94,651.7 +650.87,650.97,650.3,650.75 +650.77,651.34,650.0,650.0 +650.48,653.0,650.0,650.37 +650.47,651.71,649.52,649.89 +649.58,654.53,649.48,649.625 +652.95,654.97,646.44,649.36 +650.938,651.0,648.78,651.0 +648.926,651.0,649.86,650.02 +646.914,650.9,646.94,649.04 +644.902,649.21,641.0,642.9 +642.89,649.64,642.89,649.64 +649.02,651.14,649.02,649.425 +650.79,650.94,646.67,649.21 +649.21,649.78,648.98,650.51 +650.6812500000001,651.99,648.97,651.81 +652.1525,651.99,651.75,651.94 +653.62375,652.55,651.95,652.09 +655.095,652.07,651.43,652.2650000000001 +656.5662500000001,652.73,651.47,652.44 +658.0375,652.8,651.51,652.75 +659.50875,661.24,652.8,660.62 +660.98,664.27,658.7,660.6133333333333 +660.8533333333334,661.74,658.71,660.6066666666667 +660.7266666666667,661.15,659.62,660.6 +660.6,662.35,660.28,657.7266666666667 +661.16,661.16,649.35,654.8533333333334 +656.5699999999999,653.67,651.18,651.98 +651.98,652.19,648.93,650.6800000000001 +650.5799999999999,650.39,648.83,649.38 +649.18,651.93,648.33,651.01 +650.96,651.31,648.93,649.7 +649.7,653.7,648.11,651.13 +651.12,653.46,650.91,650.5699999999999 +651.55,651.63,650.01,650.01 +650.59,650.99,648.65,650.0550000000001 +650.9933333333333,650.42,649.0,650.1 +651.3966666666666,652.0,649.64,651.7 +651.8,652.0,650.53,650.53 +650.53,651.0,649.64,650.9 +650.94,651.28,650.1,651.335 +651.3,651.91,650.76,651.77 +651.77,651.99,648.97,651.3 +651.73,651.98,650.27,650.66 +650.95,652.0,650.25,651.37 +651.33,652.99,651.32,652.01 +651.68,652.45,650.51,651.83 +651.94,652.84,650.29,651.78 +651.79,652.0,649.0,650.25 +650.26,651.48,649.5,650.7 +650.7,651.41,649.45,649.62 +649.59,650.68,648.6,650.37 +650.1,652.29,649.1,652.29 +651.93,658.06,651.25,655.8 +655.89,657.55,654.54,656.49 +656.49,656.49,652.47,655.43 +655.25,657.01,653.52,656.19 +656.26,656.92,655.1,655.75 +655.75,659.71,653.87,659.51 +659.54,661.66,658.6,661.66 +665.655,673.99,661.66,671.33 +671.77,672.59,670.1,670.6 +671.53,672.0,670.39,671.98 +671.93,671.95,667.28,669.76 +672.1949999999999,669.85,668.72,669.765 +672.46,670.11,667.72,669.77 +672.725,672.99,669.33,672.99 +672.99,675.5,664.0,664.58 +664.83,665.98,664.83,665.45 +666.3199999999999,668.84,665.13,667.19 +667.81,668.43,664.58,666.8 +667.28,668.25,663.61,664.69 +664.12,665.93,662.63,664.8 +664.54,668.08,663.6,667.81 +667.48,668.27,664.72,666.93 +667.05,668.41,666.02,666.73 +667.19,671.45,665.73,670.83 +670.78,671.23,668.4,669.03 +669.02,669.61,665.53,667.22 +667.28,668.39,666.36,667.12 +667.11,669.6,666.0,666.0 +666.01,666.01,658.69,662.45 +661.99,662.45,657.95,659.98 +659.98,665.46,658.18,664.73 +664.53,665.12,661.72,662.59 +662.57,664.5,662.11,662.67 +662.11,663.01,659.75,660.4 +660.24,662.65,658.0,660.41 +661.5,662.74,657.78,662.09 +661.46,662.98,658.5,660.08 +660.09,661.94,657.5,661.9 +661.82,662.96,651.0,654.82 +654.81,657.9,654.78,656.95 +657.08,657.31,653.27,654.74 +654.66,656.78,654.0,656.07 +655.9,656.16,640.0,655.03 +654.45,654.88,653.5,654.77 +654.77,658.02,654.53,657.55 +657.61,657.97,655.04,656.36 +656.32,656.51,655.23,655.23 +655.24,655.86,655.23,655.46 +655.47,656.64,655.16,656.64 +656.63,658.13,655.7,658.12 +658.12,661.96,658.12,661.0 +660.99,662.34,660.54,662.29 +662.25,662.99,660.77,662.7 +662.71,663.0,662.14,662.63 +662.45,662.98,660.53,662.32 +662.34,663.99,661.9,663.93 +663.93,663.99,663.1,663.72 +663.7,663.99,661.3,661.3 +661.31,662.23,659.64,661.86 +661.87,662.5,660.46,660.84 +661.02,663.23,660.27,663.14 +663.13,663.49,660.67,661.58 +661.56,661.67,660.54,661.65 +661.41,663.79,660.89,663.77 +663.77,663.99,663.13,663.84 +663.83,663.84,662.12,663.23 +663.22,665.6,661.0,664.37 +664.33,666.41,664.33,666.41 +666.1,666.38,663.72,664.37 +664.34,665.52,664.23,665.29 +665.29,665.6,664.23,665.58 +665.58,667.7,665.57,666.92 +666.92,666.92,665.85,666.7149999999999 +666.75,666.87,664.81,666.51 +666.51,666.58,664.71,665.71 +665.72,666.04,665.15,665.95 +665.91,666.45,664.0,664.15 +664.15,664.79,663.11,663.69 +663.65,664.99,663.65,664.73 +664.74,666.97,664.66,665.54 +665.53,665.99,664.52,665.99 +665.99,665.99,664.77,665.02 +665.21,665.99,665.01,665.91 +665.91,669.98,665.59,667.66 +668.66,669.74,667.23,668.02 +667.98,669.1,666.34,667.29 +666.96,668.7,666.12,667.39 +667.39,669.2,667.39,669.2 +669.2,669.99,669.2,669.68 +669.69,669.99,668.76,669.83 +669.66,669.91,668.5,669.17 +669.17,669.51,668.66,669.48 +669.47,669.63,668.75,669.17 +669.17,669.5,668.17,669.29 +669.29,669.3,665.96,667.48 +667.14,667.95,667.14,667.84 +667.85,668.7,667.71,667.85 +667.975,669.0,667.19,667.86 +668.1,668.23,667.59,667.88 +667.9,667.99,662.03,663.94 +663.77,663.96,662.01,663.03 +663.2,663.95,662.7,663.45 +663.07,664.08,662.4,664.06 +664.04,665.49,663.14,665.27 +665.31,666.06,664.99,665.19 +665.53,666.22,665.01,665.57 +665.98,666.39,665.46,666.11 +666.39,666.6,666.0,666.6 +666.6,666.88,666.23,666.66 +666.69,667.05,665.8,666.32 +666.31,666.75,665.8,666.42 +666.68,667.0,666.06,666.91 +666.75,666.98,665.95,666.94 +666.93,668.53,665.95,668.53 +668.53,669.56,668.31,668.69 +668.65,669.29,668.12,668.51 +668.52,669.49,668.52,669.11 +669.17,669.99,668.52,669.71 +669.71,669.99,669.58,669.3900000000001 +669.95,669.99,669.07,669.07 +669.26,669.75,669.07,669.07 +669.24,669.22,668.6,669.22 +669.22,669.65,669.13,669.65 +669.65,669.99,669.45,669.98 +669.99,670.0,669.7,669.98 +669.99,670.81,669.81,670.09 +670.19,670.99,669.76,670.98 +670.99,680.0,670.84,680.0 +680.0,680.97,679.99,680.33 +680.32,680.79,679.9,680.79 +680.69,680.69,677.22,679.45 +679.43,680.66,679.43,680.21 +680.21,680.99,680.2,680.94 +680.94,680.99,677.63,678.31 +678.3,680.62,677.23,680.62 +680.62,680.99,680.12,680.73 +680.72,681.07,680.14,680.74 +680.74,684.84,680.73,684.76 +684.76,684.94,683.79,684.33 +684.33,684.55,681.71,681.71 +682.21,682.43,680.13,681.24 +681.24,681.74,680.98,681.59 +681.59,681.94,681.14,681.74 +681.29,681.97,680.49,681.26 +680.99,681.27,679.84,679.96 +680.22,680.55,679.21,679.39 +679.39,680.7,679.38,680.25 +680.24,680.61,677.68,677.69 +677.7,678.13,676.57,677.64 +677.64,680.0,677.49,679.96 +679.95,683.25,679.62,679.8 +679.8,679.8,673.82,676.0 +676.0,677.5,676.0,676.88 +677.27,677.27,670.05,673.0 +672.99,673.5,670.0,671.38 +671.6,673.0,671.27,672.08 +672.39,675.0,671.35,674.85 +674.99,676.29,674.99,675.54 +675.99,676.48,675.21,675.33 +675.31,676.87,674.72,676.44 +676.43,676.65,675.44,675.89 +675.88,676.69,675.3,675.31 +675.47,676.54,675.29,676.49 +676.39,676.5,674.61,675.19 +675.4,675.99,674.71,675.97 +675.97,676.38,675.31,676.08 +675.79,676.52,675.31,676.24 +676.12,676.19,674.26,674.49 +674.42,674.43,672.0,672.35 +672.33,672.73,671.91,672.58 +672.925,674.13,672.55,673.53 +673.52,675.71,673.52,673.65 +673.64,674.0,672.5,672.52 +672.58,674.57,672.51,673.47 +673.63,673.63,668.7,669.78 +669.79,670.8,666.17,666.17 +666.69,669.31,666.69,668.76 +669.02,671.34,668.7,670.8 +671.11,672.16,670.16,670.6 +670.54,671.99,670.23,671.89 +671.88,671.99,671.48,671.99 +671.96,673.0,671.64,673.0 +673.0,674.38,673.0,674.0 +674.24,674.98,674.03,674.96 +674.88,674.99,673.78,674.98 +674.98,674.99,674.36,674.88 +674.88,674.98,674.2,674.9 +674.88,674.97,673.71,674.63 +674.2,674.94,673.63,674.04 +673.34,674.04,672.0,672.51 +672.48,673.1,672.06,672.505 +672.495,673.42,672.09,672.5 +672.51,672.96,671.43,671.9 +671.91,673.0,671.64,672.99 +672.97,673.06,672.05,672.89 +672.69,672.95,671.83,672.57 +672.57,672.57,671.1,671.1 +671.24,671.9,670.65,670.65 +670.65,670.66,664.6,666.64 +666.63,667.87,665.93,666.2 +666.33,668.0,665.81,667.22 +667.21,667.62,664.85,666.9 +666.93,666.95,664.91,665.97 +666.18,666.88,666.13,666.32 +666.55,667.5,666.32,666.99 +666.91,667.5,666.52,667.41 +667.41,667.99,666.48,667.26 +667.26,667.74,665.12,666.45 +666.45,666.74,665.39,665.75 +665.67,665.72,661.19,662.88 +662.86,663.38,662.07,663.22 +663.36,663.84,662.96,663.79 +663.76,663.95,663.26,663.77 +663.83,665.11,663.74,665.11 +665.11,665.71,664.22,664.9549999999999 +664.17,665.26,663.77,664.8 +664.75,664.89,664.19,664.59 +664.58,664.78,664.02,664.51 +664.42,664.82,664.15,664.5 +664.49,665.47,664.03,665.26 +665.26,665.3,665.04,665.29 +665.29,665.3,664.81,665.29 +665.29,665.99,665.0,665.94 +665.94,667.98,665.78,667.9 +667.87,668.4,666.68,667.03 +667.16,667.99,666.02,666.4 +666.83,667.87,666.01,667.5 +667.51,667.51,666.63,666.98 +666.97,667.51,666.63,667.19 +667.02,667.51,666.31,667.39 +667.08,667.99,666.69,666.97 +666.81,668.99,665.9,668.99 +668.98,669.25,668.49,669.17 +669.08,669.5,668.5,669.08 +669.15,669.72,668.55,669.2 +669.43,669.48,668.07,668.61 +668.61,669.54,668.48,669.24 +669.43,669.94,668.72,668.975 +668.78,668.79,668.0,668.71 +668.71,668.79,667.8,667.81 +667.8,667.87,666.04,667.86 +667.87,667.97,666.29,667.01 +667.0,667.19,662.89,663.57 +663.63,663.89,655.0,656.26 +656.26,658.08,651.68,655.0 +655.34,657.29,654.81,656.17 +656.16,656.33,653.05,654.89 +654.79,659.81,653.7,659.75 +659.7,660.99,658.96,660.99 +660.93,661.1,658.94,660.99 +660.82,661.12,658.0,659.74 +659.71,660.68,658.2,658.58 +658.59,658.59,656.36,657.07 +657.05,657.07,647.59,650.66 +650.65,655.4,650.65,654.81 +654.82,657.66,653.92,656.79 +656.94,657.79,654.4,657.7 +657.72,660.99,656.9,660.31 +660.66,661.37,659.64,661.35 +661.08,662.35,660.32,661.94 +661.93,661.94,660.77,661.01 +661.01,661.08,657.01,657.33 +657.66,658.25,656.93,657.37 +657.37,660.73,656.87,660.66 +660.65,660.83,655.1,658.91 +659.645,659.24,656.58,658.62 +658.64,659.75,658.34,659.35 +659.35,660.58,659.14,659.92 +659.91,661.48,659.81,661.47 +661.47,661.48,658.1,658.79 +658.79,659.99,658.12,658.57 +658.69,658.87,656.02,656.59 +656.6,658.99,656.13,658.98 +658.98,658.99,657.88,658.96 +658.97,658.99,656.01,656.82 +656.96,658.49,656.01,656.27 +656.27,658.99,656.09,658.8 +658.69,658.97,657.12,657.67 +657.88,658.81,657.5,657.77 +657.76,658.98,657.1,657.72 +657.76,658.56,655.38,655.62 +655.6,657.51,655.01,656.685 +657.26,658.06,657.25,657.75 +657.71,657.73,656.5,657.62 +657.62,657.64,656.81,657.44 +657.06,657.5,655.9,657.5 +657.31,658.99,657.22,658.06 +658.06,658.06,657.03,657.98 +657.69,658.0,656.6,658.4466666666667 +657.6800000000001,657.89,655.26,658.9133333333333 +657.67,659.94,657.12,659.38 +659.38,659.95,659.38,659.79 +659.8,659.89,659.1,659.89 +659.8633333333333,659.99,658.1,659.99 +659.9266666666666,659.99,659.98,661.715 +659.99,663.46,659.76,663.44 +663.45,666.37,662.88,664.79 +664.75,664.75,662.88,663.31 +662.89,664.0,662.35,663.09 +663.37,664.46,661.1,661.9 +661.9,662.63,660.93,661.2 +661.43,662.48,660.54,660.54 +660.8,661.11,660.0,660.795 +660.89,662.12,660.49,661.05 +660.98,661.16,660.04,661.4649999999999 +661.4300000000001,661.88,660.5,661.88 +661.88,663.26,661.88,663.26 +663.26,664.13,660.6,660.71 +661.15,661.26,660.0,660.36 +660.03,660.52,655.8,656.09 +656.18,656.2,655.8,655.91 +655.91,656.54,655.8,656.53 +656.53,657.31,655.8,655.85 +655.87,656.22,655.0,655.01 +655.01,655.02,653.9,654.05 +654.05,655.65,653.77,654.89 +654.97,655.78,654.9,655.51 +655.19,658.5,654.96,658.5 +658.53,659.99,657.4,657.57 +658.3,659.37,657.22,657.83 +657.81,657.81,655.19,655.98 +655.98,658.03,655.51,658.03 +658.03,658.62,656.39,657.99 +657.99,658.07,655.5,656.36 +656.63,657.96,656.27,657.82 +657.64,658.21,657.0,657.85 +657.59,657.99,657.0,657.99 +657.99,657.99,657.26,657.99 +657.96,658.16,657.34,657.35 +657.38,658.55,657.01,658.02 +658.01,658.06,656.88,657.48 +657.33,658.68,656.4,657.74 +657.74,658.13,650.0,650.78 +650.0,651.02,645.0,646.55 +646.4,649.03,646.21,648.07 +648.07,649.74,648.07,649.4 +649.36,650.02,647.72,650.02 +649.94,652.24,648.15,650.44 +650.44,651.77,649.21,649.64 +649.69,651.81,649.26,651.81 +651.81,656.05,651.12,656.01 +656.0,657.1,653.48,654.7 +654.82,656.09,654.07,655.99 +655.98,656.99,655.02,656.99 +656.84,656.99,655.66,656.14 +656.56,657.99,656.1,657.9 +657.89,657.99,656.43,657.78 +657.73,657.99,657.49,657.98 +657.99,658.38,657.47,657.89 +658.17,658.99,656.51,658.98 +658.85,658.99,653.21,653.34 +653.34,654.02,651.26,651.3 +651.32,651.39,647.58,650.11 +650.5,655.05,650.37,652.47 +652.69,655.53,651.48,652.12 +652.65,652.82,646.56,647.22 +647.23,656.42,647.01,655.19 +655.49,658.0,654.07,654.07 +654.08,656.92,653.96,653.96 +653.97,654.65,653.49,653.86 +653.86,653.9,652.75,653.49 +653.23,653.49,651.98,652.41 +652.32,653.64,652.32,653.64 +653.2,653.9,652.28,653.64 +653.39,654.34,652.13,654.22 +654.43,655.21,653.44,654.11 +653.81,658.0,653.81,657.99 +658.0,658.81,656.71,656.96 +656.89,658.79,656.06,656.81 +656.82,658.99,655.79,657.31 +657.25,658.65,656.6,656.64 +656.94,657.48,656.5,657.16 +657.16,658.16,656.31,656.85 +656.65,657.37,655.43,657.35 +657.2,657.35,655.17,656.95 +657.06,657.37,656.02,657.1 +657.1,657.53,656.56,656.84 +656.91,657.92,656.01,656.57 +656.28,657.57,656.01,657.45 +657.3,658.0,656.74,657.29 +657.39,657.51,656.09,656.98 +657.2,657.83,656.82,657.1800000000001 +657.22,657.42,657.0,657.38 +657.24,657.87,654.1,657.58 +657.6,657.88,656.1,656.73 +656.94,657.1,654.52,655.89 +655.85,657.72,655.7,657.03 +656.94,657.2,655.95,657.0 +656.94,658.49,656.8,658.02 +658.02,659.76,658.01,659.68 +659.77,659.97,656.5,658.9 +658.9,659.52,657.0,657.97 +657.97,657.99,657.0,657.34 +657.33,657.49,656.3,656.58 +656.53,657.46,656.26,657.28 +657.28,657.43,655.81,657.31 +657.29,657.48,656.44,656.95 +656.61,657.42,656.4,656.99 +656.79,657.48,656.55,657.29 +657.04,657.48,656.03,657.47 +657.42,657.49,656.95,656.99 +657.09,657.98,655.71,657.88 +657.88,658.23,654.61,658.03 +658.04,659.0,657.86,658.94 +658.95,659.0,657.5,657.7 +658.0,658.89,657.25,657.57 +657.57,657.94,656.64,657.8 +657.8,657.94,657.0,657.52 +657.29,657.89,656.58,657.4 +657.4,657.59,654.85,656.82 +656.68,656.86,655.42,656.33 +656.33,657.6,655.11,656.39 +655.91,657.75,655.01,656.4 +656.4,657.99,656.4,656.71 +656.99,657.5,655.99,656.67 +656.77,657.07,655.48,656.58 +656.41,657.25,652.34,657.25 +657.25,657.5,655.84,656.01 +656.59,657.0,651.0,656.56 +656.77,657.98,656.1,657.07 +657.08,657.99,656.86,657.8 +657.57,657.93,656.78,657.36 +657.82,657.82,656.58,657.67 +657.45,658.0,657.23,658.0 +658.0,658.55,657.56,658.21 +658.23,658.73,657.54,658.47 +658.62,658.98,658.13,658.74 +658.74,658.98,657.78,658.51 +658.57,658.98,658.16,658.61 +658.6,658.98,657.4,657.57 +657.57,657.84,657.21,657.46 +657.49,658.25,657.24,658.085 +658.2,658.74,657.73,658.71 +658.72,658.75,656.5,656.97 +657.03,657.69,653.3,654.51 +654.51,657.03,654.09,655.91 +655.72,655.95,652.95,653.43 +653.36,657.55,653.36,657.55 +657.54,658.58,657.25,658.45 +658.42,658.49,657.01,657.39 +657.39,657.94,656.22,656.7 +657.14,657.97,656.26,656.28 +656.28,656.36,654.38,655.24 +655.24,656.99,654.66,656.41 +656.41,656.8,654.21,656.54 +656.08,656.97,656.06,656.49 +656.42,656.52,654.69,656.52 +656.52,656.99,655.1,656.83 +656.67,657.0,655.65,656.42 +656.44,656.44,639.01,641.99 +641.99,642.0,636.52,637.0 +636.99,637.0,627.81,633.88 +633.87,636.09,633.05,635.3 +635.89,648.0,635.24,641.99 +641.99,642.43,641.19,641.47 +641.76,645.78,638.15,638.15 +638.15,640.04,637.87,638.6 +638.61,639.86,634.31,636.43 +636.43,637.55,631.52,637.54 +637.55,639.88,636.38,637.56 +637.17,638.67,636.99,638.2 +638.46,639.14,631.56,636.54 +636.54,640.21,634.7,638.48 +638.49,638.49,634.68,637.64 +637.64,638.39,635.71,636.14 +636.18,638.11,634.61,635.81 +635.71,636.0,632.0,633.59 +633.59,634.73,632.86,634.71 +634.41,636.95,634.2,636.29 +636.3,637.0,633.01,633.88 +633.76,634.1,621.37,627.31 +627.32,628.29,621.14,624.35 +624.24,624.46,615.02,622.1 +621.56,621.56,616.7,619.85 +622.664,621.19,619.7,621.18 +623.768,629.34,621.19,622.74 +624.872,628.0,615.16,624.3 +625.976,627.85,623.43,626.85 +627.08,628.1,623.73,625.53 +624.95,625.2,622.98,623.87 +623.87,625.64,623.76,624.38 +624.3,627.21,622.5,624.825 +626.4,626.41,622.84,625.27 +625.54,627.6,624.6,627.6 +627.24,627.45,625.0,625.47 +625.13,625.48,621.01,622.5 +622.34,622.99,621.0,621.59 +621.37,621.99,619.63,620.78 +620.33,620.85,616.51,617.03 +617.02,617.02,611.08,614.96 +614.99,615.0,612.06,613.0 +613.35,614.24,611.43,613.7 +613.9,615.5,613.0,615.2 +615.2,615.7,605.23,605.72 +606.53,606.7,599.0,605.01 +607.7933333333333,612.0,605.46,607.665 +609.0566666666667,613.38,608.49,610.32 +610.32,610.68,607.58,608.47 +608.77,609.0,590.0,590.0 +590.76,599.57,586.01,598.7 +598.7,605.27,594.33,604.62 +604.64,607.27,601.23,603.88 +603.87,606.9,603.83,606.77 +606.89,606.9,604.45,605.59 +605.37,606.61,602.45,604.14 +603.56,603.56,598.15,601.25 +601.78,607.06,598.13,605.18 +605.24,610.0,605.12,609.5 +609.72,609.99,606.71,606.71 +607.29,608.96,603.6,603.6 +603.73,604.0,595.5,602.71 +602.72,603.6,597.89,599.38 +599.99,605.0,599.27,602.41 +602.4,603.04,570.0,577.67 +577.58,581.99,556.31,571.335 +568.08,572.21,565.0,565.0 +565.39,565.64,550.0,550.0 +551.0,551.0,483.0,493.15 +493.16,569.0,493.16,538.38 +537.52,548.2,520.34,533.97 +536.13,565.14,533.12,551.0 +550.97,551.0,541.98,548.99 +548.99,551.0,543.0,549.27 +549.28,550.98,534.2,543.68 +543.69,549.84,540.0,549.79 +549.78,549.79,541.19,543.65 +543.8,549.79,541.77,547.26 +547.3,549.79,540.0,544.12 +540.54,546.92,540.01,541.45 +541.44,542.75,540.0,542.75 +542.75,553.64,541.01,552.7 +552.37,556.97,547.81,556.94 +556.94,570.96,519.3,567.26 +567.68,568.44,544.17,551.72 +551.94,561.85,550.02,556.4 +556.4,566.5,555.2,562.49 +562.5,565.99,559.26,565.74 +565.69,572.99,562.15,570.8 +570.75,573.28,563.4,570.05 +571.75,574.99,570.98,574.8 +574.8,575.83,571.73,573.98 +573.84,574.49,573.0,574.59 +574.52,576.0,570.11,575.2 +575.2,578.4,573.61,578.06 +578.48,584.99,578.42,584.99 +584.99,599.95,584.99,597.29 +597.22,599.32,593.0,597.71 +597.69,597.99,581.62,585.37 +585.37,596.83,584.97,591.05 +591.04,591.05,581.0,583.09 +583.09,583.12,581.0,582.99 +582.99,584.18,578.41,578.41 +578.41,582.99,574.93,580.2 +580.49,581.84,574.92,577.8 +577.78,579.32,575.22,579.32 +579.3,587.49,578.18,586.05 +586.05,587.21,582.02,584.46 +584.5,584.74,579.34,580.46 +580.46,582.05,575.73,576.21 +576.02,577.7,574.56,575.04 +575.26,580.0,572.9,573.29 +573.3,576.41,566.45,574.23 +574.24,574.24,562.11,568.16 +568.16,574.54,568.16,574.28 +572.95,574.85,568.99,573.2 +573.2,592.87,573.2,587.58 +587.52,587.99,583.7,586.6 +587.0,590.5,586.65,589.99 +589.99,592.87,588.62,592.49 +592.0,592.47,584.88,587.04 +587.04,589.0,581.0,581.83 +581.3,582.0,577.35,579.36 +579.98,580.0,577.25,576.54 +577.99,578.5,572.5,573.72 +573.7,576.4,573.28,575.62 +575.62,576.84,573.88,576.05 +575.93,576.85,570.39,574.0 +573.92,577.31,573.92,576.47 +576.73,576.84,572.65,575.99 +575.87,576.65,572.72,576.65 +576.65,577.21,572.9,574.98 +575.3,576.61,573.21,575.25 +575.6,575.6,573.28,574.52 +574.54,576.3,574.3,576.3 +576.3,577.5,575.6,577.0 +577.0,578.99,577.0,578.99 +578.99,581.95,575.26,578.12 +577.9,579.66,575.05,579.5 +579.5,581.67,579.08,581.47 +581.46,582.33,580.54,582.33 +582.01,583.0,581.6,582.99 +582.99,582.99,579.44,582.02 +582.03,582.99,579.78,582.65 +582.64,583.33,582.02,583.33 +583.01,583.99,582.98,583.91 +583.94,583.97,580.0,582.12 +582.67,582.71,574.5,578.86 +578.84,579.14,576.89,577.09 +577.1,577.8,576.5,577.3 +577.3,577.5,575.85,576.92 +577.45,578.1,576.67,577.43 +577.44,578.1,576.91,578.1 +578.1,578.1,577.4,577.88 +577.88,578.18,577.44,578.13 +578.12,580.1,577.58,579.84 +579.84,579.84,576.88,576.88 +577.43,577.6,574.5,577.2 +577.45,588.1,576.46,587.11 +587.79,588.0,585.1,588.0 +588.0,589.9,587.99,588.86 +588.86,588.89,587.01,588.0 +588.0,588.99,587.11,588.29 +588.02,588.3,587.0,588.3 +588.3,589.9,587.99,589.41 +589.4,591.79,589.06,591.79 +591.39,595.1,591.23,594.98 +594.97,595.1,593.69,594.72 +594.71,595.1,592.11,593.44 +593.97,594.0,590.52,591.27 +591.5,592.84,591.13,592.79 +592.84,594.72,591.19,594.6 +594.6,594.88,593.05,593.96 +594.05,595.0,593.37,594.87 +594.65,594.9,594.33,595.4300000000001 +594.9,595.99,594.25,595.99 +595.99,596.09,592.89,596.09 +596.02,596.09,594.32,596.05 +596.28,596.99,594.22,596.01 +596.54,596.99,596.0,596.04 +596.56,598.1,595.43,598.1 +598.1,598.65,597.77,598.28 +598.29,598.3,588.0,588.01 +588.11,593.5,587.2,591.86 +591.86,592.41,589.25,590.52 +590.78,591.99,590.78,591.98 +591.98,594.97,591.7,594.94 +594.97,594.99,591.97,594.96 +594.96,595.99,594.11,595.84 +595.85,595.95,593.7,595.15 +595.15,595.95,594.14,595.94 +595.96,595.98,593.77,594.09 +594.09,594.5,593.05,594.16 +594.47,594.5,593.01,594.27 +594.3,595.48,593.48,594.28 +594.28,594.61,590.44,591.36 +592.7249999999999,591.63,591.01,591.17 +591.17,591.4,590.44,591.24 +591.24,591.24,590.12,591.265 +590.38,591.4,590.0,591.29 +591.3,592.56,590.0,592.55 +592.56,593.46,592.56,592.86 +593.09,594.15,592.87,593.99 +593.99,594.0,591.2,593.85 +593.85,594.14,593.0,594.0 +593.98,595.79,591.77,593.16 +593.26,594.31,592.58,593.51 +593.52,595.29,593.45,595.15 +595.16,595.99,592.89,594.68 +594.74,595.82,594.01,594.03 +594.36,594.42,592.68,593.51 +593.27,593.85,592.68,593.41 +593.43,593.43,591.93,592.1 +592.1,593.01,591.07,591.92 +591.94,592.43,590.0,591.21 +591.25,593.6,590.0,593.47 +593.47,594.04,589.8,592.91 +592.93,592.97,589.0,590.33 +590.28,590.52,588.0,589.11 +589.12,591.47,588.51,590.82 +590.65,590.83,588.6,589.14 +588.95,589.73,588.03,588.49 +588.51,589.15,588.01,588.14 +588.15,589.12,588.03,588.94 +588.93,590.34,587.23,589.89 +590.03,591.89,589.76,591.89 +591.48,591.99,590.32,591.14 +591.14,592.53,590.64,591.44 +591.41,591.99,590.59,590.92 +590.91,591.57,590.6,591.57 +591.33,592.49,590.0,590.68 +590.45,590.69,587.2,587.98 +587.95,587.99,586.0,586.45 +586.43,587.0,585.96,586.81 +587.0,587.1,586.0,586.95 +586.95,587.1,586.53,587.1 +586.97,588.67,586.75,588.33 +588.35,589.99,585.38,586.97 +587.37,587.99,586.75,587.99 +587.98,589.99,587.29,589.98 +589.94,590.23,588.7,589.47 +589.29,589.98,586.71,588.83 +588.83,589.37,583.47,586.86 +586.86,587.99,585.9,587.46 +587.47,589.0,583.79,587.96 +587.98,590.0,583.81,588.44 +587.64,590.99,583.29,584.0 +585.19,590.99,583.99,586.47 +586.63,594.1,583.99,587.64 +587.3399999999999,591.99,583.29,588.81 +588.05,589.96,588.04,589.96 +589.73,594.0,589.09,593.83 +593.82,601.09,593.65,599.77 +599.77,600.5,599.13,600.5 +600.5,600.54,600.0,600.54 +600.54,600.99,594.0,597.92 +597.91,599.72,597.12,599.72 +599.71,599.71,595.45,597.32 +597.28,597.96,596.32,597.37 +597.9,598.2,592.82,592.82 +593.8,596.18,592.85,593.98 +593.9,595.44,592.01,595.44 +595.43,598.25,595.42,598.1 +598.24,599.99,598.24,599.28 +599.94,599.94,597.74,598.07 +598.05,598.05,595.44,596.98 +596.98,597.5,592.85,594.12 +594.24,595.23,593.28,593.28 +593.79,594.14,591.74,593.42 +593.44,593.99,592.63,593.6 +593.6,594.4,593.59,594.38 +594.38,594.7,594.34,594.66 +594.66,595.45,594.39,595.04 +595.27,596.24,594.99,595.39 +595.64,597.31,595.3,597.08 +597.12,597.49,595.03,596.12 +596.13,597.01,595.42,595.81 +595.81,595.9,591.46,592.08 +592.08,592.08,589.02,591.3 +591.3,591.99,590.75,591.99 +591.9,591.99,588.33,589.43 +589.44,589.83,585.6,587.35 +587.22,588.69,585.74,588.12 +587.55,590.49,587.55,590.13 +590.36,590.69,589.0,589.0 +589.22,589.26,587.8,588.39 +588.4,589.2,587.26,587.74 +587.78,590.09,587.36,588.25 +588.64,588.87,585.66,586.0 +585.99,586.0,583.84,584.05 +584.05,584.93,583.75,584.42 +584.42,587.14,583.62,585.52 +585.52,588.33,585.51,587.94 +587.96,589.09,587.87,588.94 +588.52,589.1,589.02,589.09 +589.08,589.1,588.41,589.09 +588.99,589.1,588.3,589.09 +589.09,589.1,587.4,587.49 +587.46,588.48,586.91,588.26 +588.43,588.5,586.57,587.19 +587.19,588.49,584.84,588.35 +588.34,588.5,586.78,588.37 +588.24,588.5,587.0,588.23 +588.23,588.99,587.17,588.96 +588.95,588.96,586.42,587.1 +587.09,587.1,586.0,586.62 +586.64,588.1,586.1,587.66 +587.58,587.97,586.64,587.17 +586.91,587.98,586.71,587.88 +587.61,588.01,587.36,587.9 +587.75,588.1,587.26,587.8 +587.76,588.1,586.1,586.11 +586.11,587.88,586.0,587.48 +587.61,587.68,586.0,587.34 +587.36,588.35,587.2,588.35 +587.9200000000001,588.5,587.66,588.48 +588.48,588.49,588.14,588.49 +588.49,588.49,588.37,588.49 +588.49,588.49,588.48,588.48 +588.49,588.49,588.29,588.42 +588.46,588.5,588.23,588.48 +588.36,588.5,588.36,588.5 +588.4300000000001,588.5,588.49,588.49 +588.5,589.1,588.49,589.1 +589.1,589.47,589.09,589.15 +589.13,589.5,587.98,588.15 +587.98,589.12,587.25,588.37 +588.39,589.3,587.71,588.69 +588.69,588.69,586.5,588.1 +587.89,588.01,586.2,587.58 +587.51,587.75,586.1,586.2 +586.2,586.82,586.0,586.36 +586.35,586.37,586.0,586.1 +586.1,586.55,586.0,586.48 +586.47,586.48,585.51,586.06 +586.2,586.49,585.4,586.06 +586.05,586.16,585.0,585.04 +585.04,585.05,582.17,582.69 +582.68,583.6,582.27,583.6 +583.61,584.0,583.11,583.12 +583.12,584.11,582.28,582.65 +582.81,583.79,582.64,583.79 +583.8,584.25,583.33,583.6133333333333 +584.1099999999999,584.47,584.06,583.4366666666666 +584.42,584.44,583.26,583.26 +583.33,583.33,578.26,579.16 +579.12,579.12,577.01,577.12 +577.12,577.12,568.01,574.16 +574.16,575.84,572.9,575.52 +575.52,575.9,570.83,571.75 +571.78,572.17,569.94,571.49 +571.4,572.1,568.98,568.98 +569.81,570.27,565.19,567.37 +567.42,570.95,566.69,569.43 +570.08,573.47,570.08,573.08 +573.04,574.38,570.02,570.05 +570.04,570.91,568.23,570.91 +571.04,575.0,570.91,574.46 +574.17,574.85,573.72,573.81 +573.75,574.5,569.88,570.88 +570.68,571.99,569.42,571.98 +571.97,572.98,571.36,572.87 +572.88,572.99,571.83,572.81 +572.82,573.07,572.31,572.69 +572.69,572.69,571.54,572.43 +572.44,573.54,572.4,573.09 +573.08,573.6,572.71,573.54 +573.54,574.09,573.13,573.2 +573.17,573.77,572.3,572.54 +572.68,573.57,572.0,572.37 +572.36,572.36,568.97,569.8 +569.79,569.79,567.77,568.57 +568.3,569.46,565.0,567.24 +567.18,568.13,561.56,564.6 +564.08,565.99,562.9,565.61 +565.68,566.91,563.31,565.49 +565.49,565.93,563.93,565.79 +565.69,566.02,564.96,566.02 +566.01,568.96,566.01,568.01 +568.01,568.61,566.26,568.47 +568.34,568.96,567.63,568.28 +568.28,568.28,567.0,568.24 +568.24,569.98,568.24,569.98 +569.98,570.1,568.07,569.86 +569.91,570.8,568.86,569.52 +569.5,569.57,568.12,568.63 +568.59,569.09,567.2,567.2 +567.3,567.96,566.13,566.5 +566.56,567.67,566.09,567.23 +567.23,568.39,567.12,568.15 +568.34,569.1,568.04,569.08 +568.715,569.1,568.91,569.1 +569.09,569.92,568.56,568.5799999999999 +569.29,569.49,568.0,568.06 +568.06,569.99,568.03,569.99 +569.98,570.0,568.99,570.0 +569.85,574.72,569.46,574.72 +574.71,578.46,574.71,576.39 +576.38,577.99,575.71,577.88 +577.98,581.99,577.61,581.86 +581.72,581.98,580.85,580.86 +580.86,581.18,579.65,580.69 +580.56,581.7,579.3,580.14 +580.14,581.11,579.83,581.11 +581.1,581.98,580.76,581.83 +581.71,581.98,576.33,578.74 +578.73,581.01,578.55,581.01 +581.07,581.99,580.79,581.6 +581.68,581.95,580.12,580.55 +580.54,580.92,578.18,578.2 +578.2,579.29,577.2,579.11 +579.11,579.38,577.33,578.58 +578.54,579.4,577.89,578.89 +579.34,580.66,579.02,579.83 +579.83,580.1,579.28,580.3050000000001 +579.77,580.88,579.76,580.78 +580.8,581.21,580.45,580.51 +580.5,580.51,576.89,577.75 +577.69,577.8,573.06,575.37 +575.02,575.99,574.04,575.72 +575.48,575.93,572.8,573.79 +573.9,574.29,572.94,573.41 +573.41,573.77,570.13,570.29 +570.43,572.26,569.67,571.93 +571.85,572.87,570.6,571.7 +571.78,573.14,571.0,572.62 +572.9,573.3,572.47,573.25 +573.24,573.84,570.99,573.26 +573.11,574.81,572.89,574.74 +574.74,574.99,573.83,574.77 +574.75,575.1,573.72,575.1 +575.1,575.1,573.6,574.66 +574.67,574.8,573.73,574.7 +574.54,574.97,574.48,574.94 +574.92,574.99,573.41,573.68 +573.68,574.28,573.36,574.12 +573.99,574.42,573.48,574.35 +574.14,574.5,573.61,574.37 +574.37,574.99,574.16,574.92 +575.05,575.73,574.56,575.73 +575.73,576.0,575.52,575.72 +576.11,576.99,575.59,576.64 +576.49,576.53,575.47,575.95 +575.88,576.18,575.7,575.99 +575.98,575.99,575.0,575.46 +575.49,575.99,573.76,575.95 +575.98,576.39,575.22,575.75 +575.9,576.04,575.21,576.04 +576.06,576.31,575.29,576.3 +576.25,576.87,575.1,575.1 +575.13,575.56,574.15,575.05 +575.05,575.12,573.87,574.6 +574.6,575.56,573.0,574.17 +574.27,574.27,573.48,574.18 +574.02,574.81,573.42,574.81 +574.78,575.74,574.38,575.3 +575.48,575.49,573.77,574.99 +575.0,575.37,574.45,575.05 +575.04,575.34,574.29,574.93 +574.92,574.92,573.7,574.36 +574.35,574.36,572.68,573.61 +573.61,574.31,573.32,573.6 +573.59,574.46,573.25,574.32 +574.32,574.49,573.65,574.33 +574.33,575.06,574.32,574.97 +574.99,575.4,574.65,575.19 +575.19,575.82,574.66,575.28 +575.4,575.5,574.89,575.36 +575.43,576.55,575.04,576.55 +576.55,576.99,575.04,575.04 +575.29,575.45,574.76,575.26 +575.26,575.26,574.66,575.12 +575.12,575.29,574.66,575.29 +575.29,575.49,574.77,575.45 +575.45,575.5,574.67,575.49 +575.38,575.5,574.12,574.12 +574.13,575.33,573.89,575.21 +575.2,575.2,573.18,574.27 +574.27,574.61,573.48,573.69 +573.69,574.5,573.57,574.42 +574.41,574.58,574.07,574.55 +574.55,574.77,572.38,573.52 +573.52,574.34,573.51,573.9266666666666 +574.34,574.48,574.34,574.3333333333334 +574.505,574.75,574.46,574.74 +574.67,574.98,574.6,574.98 +574.98,576.67,573.68,576.66 +576.66,580.0,576.66,579.73 +579.72,580.0,579.44,580.0 +580.0,580.8,579.87,580.61 +580.61,581.07,579.9,580.35 +580.35,581.1,579.46,581.1 +581.05,581.4,579.05,579.75 +579.99,579.99,578.97,579.39 +579.38,579.99,579.38,579.99 +579.99,580.64,579.5,580.01 +580.15,581.72,580.15,581.66 +581.65,581.91,580.69,581.08 +580.85,581.99,580.62,581.85 +581.9,582.98,581.71,582.97 +582.95,582.98,582.09,582.9 +582.9,583.92,581.53,581.94 +581.93,581.99,579.89,581.35 +581.34,582.94,581.1,582.94 +582.88,582.99,582.33,582.97 +582.97,582.99,581.08,582.16 +582.2,582.37,581.4,582.23 +582.15,582.99,581.94,582.98 +582.99,583.99,582.98,583.91 +583.79,583.99,583.32,583.49 +583.49,583.64,583.09,583.09 +583.18,583.2,582.64,582.81 +582.305,582.82,581.3,582.3599999999999 +581.43,581.92,581.36,581.91 +581.7449999999999,582.3,581.5,582.07 +582.06,582.77,581.86,582.21 +582.3,582.43,580.58,581.82 +581.82,582.64,581.34,582.0 +581.99,582.0,581.1,581.56 +581.57,581.99,580.98,581.37 +581.22,581.22,580.27,580.68 +580.8,581.78,580.59,581.44 +581.45,581.99,580.83,581.67 +581.67,581.67,580.13,580.39 +580.44,581.01,579.34,579.97 +579.97,581.76,579.97,581.68 +581.69,581.99,580.98,581.45 +581.84,581.98,580.71,581.22 +581.0,581.55,580.71,581.52 +581.51,581.88,579.42,581.38 +581.38,581.64,579.22,580.83 +580.83,581.18,580.02,580.02 +580.12,580.57,580.0,580.54 +580.54,580.84,580.22,580.52 +580.42,581.02,580.08,580.43 +580.565,581.02,580.1,580.94 +580.71,581.17,580.3,580.62 +580.975,581.84,580.63,581.14 +581.24,581.82,580.7,581.59 +581.59,581.99,581.04,581.87 +581.87,582.99,581.67,582.99 +582.99,586.99,582.9,585.92 +585.92,586.15,584.07,585.61 +585.9,585.99,585.16,585.97 +585.98,585.99,584.83,585.0 +585.0,585.39,583.88,585.11 +585.11,585.99,585.11,585.98 +585.98,585.99,581.01,584.83 +584.82,584.98,583.79,584.8 +584.27,585.32,584.27,584.9 +584.94,585.49,584.2,584.63 +584.8,585.66,584.67,585.41 +585.28,585.75,584.05,585.23 +585.23,585.99,584.84,585.99 +585.99,585.99,585.53,585.92 +585.92,585.99,585.65,585.74 +585.74,585.99,585.31,585.98 +585.98,586.77,584.98,584.98 +584.99,584.99,580.6,582.63 +580.75,581.42,580.28,580.28 +580.28,582.18,579.22,582.1 +582.1,582.36,580.78,580.88 +580.96,583.68,580.55,583.1 +583.45,585.51,583.17,585.35 +585.37,585.74,583.11,584.36 +584.3,584.96,580.41,580.66 +580.66,583.04,580.38,581.69 +581.7,582.8,581.41,582.11 +581.99,582.01,577.47,578.75 +578.72,580.0,578.4,579.6 +579.86,580.68,579.22,580.63 +580.4,583.99,580.01,582.45 +582.54,582.6,581.52,582.19 +582.19,582.99,582.0,582.49 +582.49,582.49,580.55,582.33 +582.33,582.38,581.08,581.17 +581.17,581.58,580.97,581.03 +581.0,581.13,579.12,579.7 +579.65,579.71,578.82,579.13 +579.08,579.79,578.97,579.41 +579.5,579.6,578.59,578.66 +578.66,581.06,578.66,580.6 +580.62,581.39,580.44,581.34 +581.38,581.45,580.01,580.635 +580.51,580.64,578.68,579.93 +579.94,580.83,579.78,580.45 +580.45,581.16,579.55,579.95 +579.95,580.75,579.95,580.32 +580.31,580.63,578.0,578.58 +578.74,578.93,578.03,578.85 +578.75,579.99,578.66,579.52 +579.42,579.58,577.8,578.03 +578.18,579.26,578.06,579.19 +579.22,579.83,579.14,579.67 +579.69,579.72,576.37,576.37 +577.23,578.9,575.29,578.18 +578.18,579.34,578.18,579.12 +579.11,579.11,578.34,578.74 +578.74,579.0,577.88,578.83 +578.83,578.83,575.4,575.41 +575.41,577.54,575.2,577.54 +577.55,577.63,575.78,575.95 +575.89,576.06,575.2,575.4 +575.46,575.53,573.26,574.44 +574.905,574.92,573.89,574.35 +574.35,575.12,574.17,574.84 +574.86,575.3,573.89,574.26 +574.31,574.51,573.54,573.96 +573.85,574.52,573.8,574.32 +574.17,574.71,574.11,574.54 +574.4,574.84,574.02,574.61 +574.58,574.76,573.8,574.23 +574.23,575.18,574.08,574.94 +574.94,575.02,574.06,574.77 +574.75,574.99,573.12,574.98 +574.99,575.38,574.33,575.37 +575.37,576.0,574.14,575.62 +575.54,575.99,574.92,575.51 +575.51,576.25,575.08,575.97 +576.09,576.97,575.96,576.87 +576.88,576.99,574.92,575.88 +575.96,576.6,575.41,575.81 +575.8,576.42,575.34,575.64 +575.38,575.87,575.17,575.48 +575.65,575.98,574.85,575.38 +575.38,576.46,575.18,576.46 +576.44,576.66,576.01,576.66 +576.66,576.66,575.93,576.42 +576.41,576.43,575.99,576.24 +576.24,576.99,576.01,576.99 +577.06,577.88,576.91,577.87 +577.88,577.99,577.62,577.91 +577.91,578.53,577.64,578.53 +578.53,578.53,577.91,578.25 +578.23,578.99,578.05,578.9 +578.88,578.99,578.7,578.96 +578.96,578.99,578.4,578.41 +578.41,578.59,577.52,578.33 +578.34,578.99,577.95,578.57 +578.57,579.15,578.48,579.14 +579.15,579.22,578.35,578.64 +578.81,579.17,578.37,579.12 +579.1,579.86,578.72,578.85 +578.8,579.44,578.38,578.99 +578.98,578.99,578.59,578.89 +579.075,579.36,578.88,579.32 +579.17,579.45,578.53,579.25 +579.39,579.45,578.09,578.09 +578.1,578.1,576.87,577.38 +577.39,577.54,576.0,576.61 +576.8399999999999,577.11,576.02,576.28 +576.29,576.31,575.2,575.23 +575.23,576.02,575.22,575.7750000000001 +575.89,576.46,575.86,576.32 +576.28,576.4,575.62,575.62 +575.81,575.83,575.11,575.57 +575.59,575.93,575.14,575.91 +575.87,576.03,575.26,575.41 +575.41,575.43,575.0,575.38 +575.38,575.63,574.78,574.83 +574.89,574.98,571.91,571.91 +571.9,571.91,569.01,569.08 +569.0,570.17,568.98,570.02 +570.11,570.16,568.95,569.68 +569.71,571.29,569.7,570.63 +570.62,570.9,569.99,570.71 +570.8,570.9,570.25,570.62 +570.62,570.9,570.36,570.87 +570.88,570.9,570.05,570.48 +570.47,570.9,569.98,570.84 +570.83,570.99,570.17,570.54 +570.55,570.99,570.41,570.52 +570.52,570.99,569.65,570.96 +570.96,570.98,570.9,570.91 +570.91,570.98,570.91,570.95 +570.97,570.99,570.22,570.99 +570.99,571.61,570.66,571.6 +571.59,571.6,571.54,571.59 +571.59,571.69,571.3,571.79 +571.69,571.99,571.64,571.99 +571.99,571.99,571.9,571.99 +571.98,571.99,571.98,571.99 +571.99,573.99,571.98,573.98 +573.89,573.99,573.84,573.99 +573.99,574.12,571.66,573.0 +573.0,573.0,571.66,572.54 +572.54,572.94,572.06,572.94 +572.93,572.96,571.35,572.86 +572.91,572.99,572.7,572.95 +572.95,573.97,572.8,573.68 +573.69,573.84,573.01,573.59 +573.59,574.81,573.4,574.51 +574.67,574.99,574.11,574.98 +574.99,575.67,574.66,575.67 +575.67,575.99,575.0,575.49 +575.49,575.5,575.0,575.5 +575.5,576.99,575.08,576.98 +576.76,577.73,575.66,575.77 +575.94,576.43,573.15,575.27 +575.29,575.73,575.01,575.46 +575.44,575.48,573.02,574.82 +574.67,574.85,573.18,574.02 +573.99,574.47,573.89,574.34 +574.34,574.34,573.87,574.25 +574.19,574.21,573.0,573.55 +573.56,574.49,573.25,574.39 +574.35,574.96,573.67,574.46 +574.46,574.98,574.05,574.85 +574.73,574.88,572.86,573.1 +573.04,574.62,572.55,574.16 +574.34,574.47,571.58,571.71 +571.56,573.31,571.24,573.19 +573.07,574.12,572.48,573.51 +573.49,574.44,572.36,572.8 +572.57,573.38,572.49,573.05 +573.3,573.39,571.79,572.64 +572.8,573.53,572.61,573.43 +573.43,574.34,571.67,573.53 +573.56,573.69,572.81,573.66 +573.69,573.69,572.96,573.68 +573.68,573.77,572.55,573.19 +573.0,573.29,572.53,573.06 +573.3,573.69,572.58,573.19 +573.18,574.01,573.14,574.01 +573.9,575.99,573.89,575.99 +575.98,575.99,575.3,575.86 +575.86,575.93,573.51,575.55 +575.55,575.99,575.32,575.99 +575.98,575.99,575.94,575.95 +575.94,576.54,575.94,576.47 +576.39,576.83,576.13,576.64 +576.66,576.66,575.82,575.98 +575.95,575.99,575.07,575.57 +575.58,575.99,575.19,575.69 +575.69,575.69,573.96,575.69 +575.69,575.69,574.81,575.36 +575.37,575.99,574.63,575.11 +575.02,575.92,574.85,575.44 +575.44,575.99,574.56,574.84 +574.83,575.99,574.7,575.06 +575.05,575.65,574.68,575.27 +575.27,575.47,574.32,575.14 +574.67,575.15,574.12,575.01 +575.14,575.15,573.71,573.77 +573.7,573.71,572.02,572.6 +572.65,573.82,572.53,573.6 +573.61,573.61,572.79,573.03 +573.02,573.26,572.29,572.49 +572.32,573.19,572.0,572.7 +572.7,573.54,572.51,572.94 +572.95,573.25,572.94,573.04 +573.03,573.03,572.0,572.52 +572.42,572.7,572.0,572.51 +572.52,573.23,571.71,571.93 +571.88,572.74,571.88,572.25 +572.19,572.75,572.15,572.38 +572.24,572.75,571.55,571.94 +571.89,572.59,571.55,572.02 +572.02,573.35,570.75,571.44 +571.72,572.25,570.35,571.39 +571.64,572.02,570.21,571.85 +571.88,572.28,570.11,571.03 +570.77,572.94,570.64,571.62 +571.86,572.23,571.26,571.56 +571.79,571.79,569.21,570.54 +571.21,573.32,570.75,573.26 +573.25,573.31,571.0,571.73 +571.73,573.31,571.47,573.28 +573.31,573.31,571.98,573.3 +573.3,573.31,571.63,572.51 +572.72,573.08,570.08,573.08 +572.91,573.07,571.52,571.67 +571.68,573.2,571.23,572.64 +572.63,572.64,568.12,568.87 +568.87,570.26,568.67,570.2 +570.21,571.64,570.2,570.49 +570.5,571.11,570.41,570.64 +570.86,571.73,570.4,571.71 +571.7,572.08,570.92,570.95 +570.92,572.16,570.82,571.6 +571.6,572.24,570.29,571.37 +571.25,571.79,569.39,570.18 +570.16,570.5,568.5,570.03 +570.03,570.97,569.59,570.03 +569.92,572.27,569.45,571.91 +571.78,572.26,571.43,572.05 +572.05,572.35,571.43,571.98 +572.0,572.0,571.1,571.34 +571.61,572.0,571.07,571.88 +571.88,573.08,571.15,572.99 +572.99,572.99,571.53,572.11 +572.11,572.98,571.72,571.91 +571.9,571.99,570.85,571.39 +571.4,571.83,570.71,570.95 +570.95,571.02,570.0,570.87 +570.72,570.99,570.48,570.73 +570.73,570.99,570.35,570.99 +570.98,571.47,570.94,571.17 +571.415,571.99,571.14,571.86 +571.85,571.99,571.78,571.99 +571.99,572.87,571.98,572.87 +572.87,573.2,572.8,573.19 +573.2,574.68,573.19,574.68 +574.68,577.97,573.51,576.97 +576.7,576.99,575.97,575.98 +575.98,575.99,574.77,575.25 +575.25,575.79,574.27,575.21 +575.21,575.84,574.67,574.97 +574.99,575.14,572.8,574.0 +574.0,574.95,573.97,574.68 +574.65,575.97,574.63,575.36 +575.37,575.56,575.0,575.37 +575.34,575.39,575.28,575.39 +575.39,576.5,575.33,575.99 +575.99,576.37,575.6,576.05 +576.05,576.29,574.67,575.9 +575.9,576.17,574.91,576.17 +576.17,576.22,575.09,575.11 +575.12,575.21,574.85,575.2 +575.2,575.2,575.11,575.19 +575.19,575.68,575.07,575.68 +575.61,576.99,575.56,576.83 +576.96,576.99,575.94,576.07 +576.13,576.29,576.04,576.29 +576.29,576.84,576.28,576.82 +576.56,576.84,576.13,576.36 +576.33,576.92,576.27,576.85 +576.82,576.99,576.68,576.93 +576.86,577.38,576.62,577.15 +577.14,577.18,576.3,576.63 +576.74,577.22,576.32,577.02 +576.87,577.21,576.28,577.16 +577.16,578.0,577.03,577.99 +577.99,595.99,577.41,595.4 +595.4,596.99,595.39,596.99 +596.99,599.99,596.28,599.9 +599.89,600.99,599.3,600.72 +600.72,600.99,599.42,600.93 +600.74,600.99,600.0,600.01 +600.02,600.2,600.0,600.19 +600.19,600.2,598.29,598.76 +598.81,599.19,597.54,597.81 +597.8,599.2,597.52,599.17 +599.17,599.18,597.74,598.24 +597.96,598.95,597.89,598.62 +598.45,599.96,598.45,599.93 +599.94,601.46,599.61,601.33 +601.34,604.97,601.34,604.53 +604.52,605.0,603.43,604.69 +604.64,604.93,604.03,604.66 +604.65,610.01,604.65,610.01 +610.1,617.13,610.1,614.52 +614.52,614.63,612.0,612.95 +612.95,614.33,610.85,614.33 +614.33,616.47,614.33,615.99 +615.81,616.5,613.85,614.03 +613.86,615.99,613.8,615.41 +615.4,615.4,608.58,609.96 +609.97,611.97,608.91,611.97 +611.98,613.43,609.04,610.15 +610.14,611.92,610.13,611.63 +611.89,611.99,611.22,611.97 +611.98,611.99,609.25,609.75 +609.75,609.99,609.03,609.89 +609.89,609.98,609.16,609.85 +609.85,609.99,609.07,609.64 +609.13,609.99,609.13,609.61 +609.54,609.93,609.36,609.75 +609.74,609.93,609.08,609.38 +609.36,609.62,609.27,609.3 +609.53,609.62,608.92,608.93 +608.19,608.97,606.85,606.86 +606.85,606.85,604.85,605.19 +605.31,605.37,601.63,601.63 +602.32,604.28,602.06,603.98 +604.3,605.56,603.37,603.83 +603.5,606.06,603.5,606.02 +606.06,607.23,606.01,606.64 +606.62,606.62,604.01,605.31 +605.3,607.42,605.3,606.65 +606.58,606.97,605.4,605.98 +607.0450000000001,607.87,605.57,607.22 +607.51,608.96,606.38,608.86 +608.75,608.77,607.32,607.99 +607.82,608.99,607.82,608.71 +608.63,608.88,605.06,606.25 +606.25,609.41,606.24,608.39 +608.46,608.58,605.6,605.98 +605.94,607.53,605.63,606.73 +606.64,606.93,605.95,606.73 +606.49,607.13,606.08,606.73 +606.85,607.09,606.36,606.36 +606.6,607.08,606.41,607.0 +607.06,609.81,606.86,609.56 +609.61,609.61,607.05,607.18 +607.34,607.34,606.63,606.81 +606.96,607.05,605.9,606.61 +606.51,609.78,605.9,608.23 +609.81,609.99,609.75,609.85 +609.84,610.0,609.71,609.99 +609.99,611.85,609.56,610.36 +610.71,611.99,609.08,609.92 +609.92,609.92,607.69,609.46 +609.44,609.99,608.27,609.51 +609.27,609.99,608.16,609.98 +609.98,611.84,608.01,611.82 +611.84,611.99,610.9,611.99 +611.99,612.8,611.85,612.18 +612.18,612.19,611.32,612.14 +612.18,612.99,611.77,612.98 +612.99,612.99,610.95,612.49 +612.51,613.99,612.5,613.41 +613.41,613.99,612.78,613.42 +613.29,613.51,612.0,612.01 +612.01,612.2,611.25,612.04 +611.96,612.05,610.05,610.05 +610.14,610.9,610.01,610.81 +610.89,610.98,610.2,610.64 +610.66,611.41,610.48,611.28 +611.17,611.28,609.9,610.61 +610.6,610.94,609.21,610.94 +610.94,613.25,609.78,612.67 +612.65,614.88,612.64,614.78 +614.77,614.89,613.45,614.55 +614.56,614.57,613.0,614.02 +614.06,614.99,613.19,614.85 +614.7,614.99,614.02,614.77 +614.79,618.53,614.76,616.79 +616.78,616.99,615.0,615.88 +615.83,615.89,614.0,614.71 +614.83,615.5,613.63,614.38 +614.45,615.27,613.5,615.17 +615.08,615.5,613.26,614.68 +614.67,615.5,613.74,615.33 +615.32,615.5,614.47,615.19 +615.3,615.5,614.48,615.0 +615.0,615.91,614.16,615.42 +615.41,615.99,615.09,615.8 +615.79,615.99,615.24,615.96 +615.98,616.1,615.81,616.1 +616.1,616.1,613.43,615.07 +615.06,616.1,614.87,615.8 +615.85,625.0,615.84,624.98 +624.79,627.16,624.79,626.63 +626.63,628.28,625.5,628.28 +628.29,630.0,627.97,629.5 +629.6,631.3,627.8,628.71 +628.73,629.13,628.3,628.8 +628.8,628.95,628.0,628.78 +628.83,628.99,626.9,627.5 +627.22,628.99,626.31,628.59 +628.73,628.8,622.56,624.1 +624.09,626.24,624.08,625.51 +625.21,626.87,624.75,626.69 +626.66,626.72,625.86,626.72 +626.72,627.94,626.31,626.66 +626.67,628.16,626.0,628.16 +628.16,629.12,627.51,627.99 +627.94,628.69,627.51,628.06 +628.29,628.48,627.6,627.73 +627.6,627.79,626.3,627.71 +627.72,627.72,625.8,626.35 +626.34,626.64,624.54,626.63 +626.64,627.07,622.56,623.06 +623.06,623.62,620.61,620.61 +620.98,623.54,620.3,623.15 +622.96,623.08,622.28,622.64 +622.64,622.8,622.27,622.57 +622.61,622.61,620.3,620.43 +620.63,621.74,620.44,621.19 +621.19,622.58,621.17,621.95 +621.47,622.33,620.17,620.84 +620.7,621.98,620.59,621.8 +621.79,622.0,620.73,621.52 +621.55,621.98,620.46,621.24 +621.15,621.7,619.31,619.93 +620.15,620.31,618.32,619.71 +619.71,621.44,619.22,620.99 +621.01,623.57,618.25,621.12 +621.13,622.83,621.09,622.77 +622.77,622.85,621.16,622.28 +622.26,622.7,621.47,621.79 +622.37,622.81,620.59,621.91 +621.89,622.45,621.73,622.18 +622.19,622.4,621.26,621.77 +621.75,622.15,621.11,621.6 +621.55,622.31,621.46,622.28 +622.24,622.31,621.32,621.99 +621.98,622.31,621.77,621.99 +622.04,622.51,621.92,622.51 +622.5,622.83,622.46,622.83 +622.83,624.05,622.6,623.89 +623.89,624.12,623.76,623.87 +623.75,623.87,623.22,623.22 +623.2,624.43,623.17,624.43 +624.42,624.89,624.41,624.8 +624.8,624.86,621.44,623.22 +623.05,623.91,621.05,622.43 +622.41,624.26,621.96,624.26 +624.26,624.89,624.01,624.65 +624.57,624.69,624.17,624.68 +624.68,625.11,624.14,625.1 +625.11,625.89,625.09,625.72 +625.89,626.54,625.12,625.75 +625.75,625.75,624.48,624.72 +624.72,625.13,623.06,623.74 +623.83,624.28,623.69,623.86 +623.98,624.57,623.3,623.36 +623.54,623.93,623.21,623.51 +623.39,624.21,623.2,624.13 +624.14,624.14,621.4,622.79 +622.71,623.58,622.1,622.81 +622.76,623.71,622.56,623.71 +623.7,624.71,623.7,624.02 +624.13,624.13,622.91,622.93 +622.92,623.11,622.79,623.08 +622.94,625.95,622.94,625.37 +625.4,625.55,624.98,625.42 +625.39,625.73,625.37,625.69 +625.76,626.48,625.7,626.4 +626.41,626.47,625.65,625.91 +625.91,626.17,625.0,625.55 +625.49,626.03,624.9,625.05 +625.05,628.69,623.58,628.59 +628.67,630.0,628.31,630.0 +630.0,630.11,591.8,605.14 +605.14,605.14,599.31,602.21 +602.21,607.37,601.24,607.32 +607.32,607.95,604.92,607.43 +607.19,608.1,606.2,608.1 +608.09,608.1,607.7,608.04 +607.9,608.74,607.7,608.52 +608.52,609.45,608.11,608.82 +608.82,608.82,607.71,608.5 +608.51,608.99,607.75,608.87 +608.87,608.91,608.85,608.91 +608.91,608.91,608.64,608.77 +608.77,608.82,608.03,608.13 +608.17,608.17,607.49,607.49 +607.46,607.46,605.84,606.17 +606.08,606.2,604.0,606.2 +606.15,606.2,605.4,605.94 +606.16,606.61,605.44,606.59 +606.42,607.04,605.86,606.86 +606.84,607.16,606.0,606.65 +606.51,606.99,605.61,606.56 +606.49,606.49,603.0,605.5 +605.46,606.75,605.19,606.74 +606.4,606.75,604.79,606.47 +606.37,607.3,604.72,606.31 +606.37,607.34,605.79,607.26 +607.24,607.34,605.65,606.83 +607.11,607.34,605.84,606.41 +606.43,607.48,606.01,607.39 +607.19,607.46,606.14,606.84 +606.97,608.99,606.97,608.51 +608.87,608.99,607.22,608.89 +608.6,608.99,607.98,608.57 +608.6,608.9,607.98,608.15 +608.28,608.53,607.87,608.33 +608.33,608.33,607.43,608.0466666666667 +608.07,608.07,607.12,607.7633333333333 +607.12,607.71,607.11,607.48 +607.48,607.89,607.33,607.89 +607.64,607.87,606.06,607.52 +607.52,608.0,607.26,607.94 +607.68,608.84,607.37,608.68 +608.7,608.99,608.65,608.86 +608.86,609.1,608.37,608.37 +608.57,608.57,607.13,607.39 +607.4,607.51,605.71,606.39 +606.36,606.91,605.16,606.45 +606.7,609.0,605.56,608.98 +608.99,609.87,608.33,608.64 +608.64,609.54,607.61,609.36 +609.01,609.99,608.56,609.48 +609.48,609.48,606.05,607.8 +607.99,609.1,607.59,608.22 +608.35,609.1,608.0,608.7 +608.89,609.1,608.5,608.78 +608.79,609.1,608.79,608.9300000000001 +608.92,609.21,608.57,609.08 +609.05,609.35,608.89,609.35 +609.35,609.43,608.55,608.55 +608.75,609.22,608.31,608.51 +608.51,609.39,608.35,609.32 +609.17,609.39,608.66,608.91 +608.81,609.79,608.58,609.61 +609.57,609.96,609.39,609.96 +609.95,609.99,609.0,609.0 +609.0,610.0,609.0,610.0 +610.0,610.94,609.95,610.81 +610.8,611.99,610.05,610.88 +610.89,611.31,610.3,610.75 +610.75,611.67,609.52,610.23 +610.23,611.13,609.01,610.16 +610.16,610.38,608.25,610.07 +610.06,610.29,608.93,609.7 +609.7,609.99,609.16,609.91 +609.82,609.99,609.1,609.95 +609.95,609.95,608.83,608.89 +608.9,609.0,608.43,608.62 +608.62,608.73,608.12,608.69 +608.61,609.0,608.39,608.89 +608.97,608.99,607.81,608.5 +608.49,608.5,607.19,608.15 +608.15,608.26,607.44,608.26 +608.24,608.7,608.15,608.62 +608.49,608.63,607.1,608.48 +607.67,608.35,607.67,608.34 +608.145,608.66,608.34,608.61 +608.62,608.66,608.34,608.57 +608.56,608.65,608.08,608.34 +608.35,608.7,608.34,608.86 +608.69,609.39,608.36,609.38 +609.36,609.39,609.0,609.28 +609.29,609.47,609.0,609.19 +609.19,609.49,608.17,608.75 +608.75,608.75,603.85,606.6 +606.6,607.97,605.17,607.43 +607.43,607.65,605.5,606.96 +606.97,607.5,606.43,607.37 +607.38,607.47,606.51,607.07 +607.07,607.35,605.92,607.13 +607.14,607.48,606.17,607.48 +607.48,607.5,603.33,605.62 +605.62,607.09,605.56,607.05 +607.06,607.35,606.4,607.12 +607.12,607.49,606.71,607.09 +607.09,607.45,603.15,606.19 +606.21,606.99,605.65,606.97 +606.97,606.99,606.46,606.99 +606.97,606.98,606.0,606.88 +606.89,607.5,606.88,607.45 +607.44,607.52,606.08,606.17 +606.17,606.57,605.92,606.09 +606.08,606.17,604.91,606.17 +606.17,606.58,606.09,606.3 +606.3,607.99,606.09,607.7 +607.67,608.1,607.46,607.97 +607.97,607.98,606.16,606.48 +606.46,606.5,605.82,606.48 +606.49,606.58,605.34,606.48 +606.46,606.65,606.01,606.21 +606.22,607.49,606.21,607.47 +607.49,607.72,607.15,607.64 +607.63,607.68,606.51,606.77 +606.86,607.92,606.73,607.92 +607.91,607.95,607.3,607.95 +607.93,607.99,607.3,607.99 +607.96,608.86,607.79,608.32 +608.23,608.38,606.87,607.32 +607.3,607.33,607.01,607.32 +607.32,607.5,607.18,607.5 +607.48,608.21,607.48,608.01 +608.03,608.54,608.01,608.38 +608.38,608.89,608.02,608.12 +608.26,608.58,608.11,608.14 +608.14,608.32,608.1,608.32 +608.32,608.58,607.85,608.45 +608.44,608.58,607.73,607.73 +607.74,608.23,607.1,608.21 +608.23,608.27,604.0,606.19 +606.16,606.83,605.6,605.83 +605.8,605.87,605.27,605.48 +605.52,606.22,604.96,606.07 +606.08,606.2,605.62,606.0 +605.96,607.48,605.44,607.44 +607.43,607.67,607.04,607.67 +607.67,608.9,607.6,608.63 +608.64,608.99,608.17,608.96 +608.94,608.96,608.02,608.07 +608.08,608.25,608.02,608.24 +608.22,608.24,607.54,607.99 +607.98,608.0,607.58,607.58 +607.77,608.38,607.22,607.96 +607.95,608.07,607.53,607.71 +607.72,607.72,607.28,607.61 +607.59,607.72,607.59,607.72 +607.71,607.78,607.5,607.69 +607.69,607.69,607.41,607.61 +607.6,607.69,607.51,607.59 +607.59,607.71,607.22,607.84 +607.84,608.09,607.66,608.09 +608.09,609.03,607.77,609.03 +609.03,609.49,609.01,609.4 +609.48,609.6,609.38,609.6 +609.51,609.87,608.43,608.77 +608.73,609.44,608.6,609.44 +609.43,610.0,609.43,609.98 +609.98,610.45,609.95,610.42 +610.4,610.41,609.34,609.42 +609.49,609.99,609.35,609.99 +609.99,611.88,609.99,611.64 +611.63,611.93,610.98,611.48 +611.48,611.48,609.79,611.12 +611.11,611.21,610.8,610.89 +610.89,611.9,610.89,611.37 +611.36,611.51,610.85,611.31 +611.31,611.99,610.7,611.99 +611.98,611.99,611.43,611.81 +611.8025,612.1466666666666,611.3466666666666,611.63 +611.625,612.3033333333334,611.2633333333333,611.45 +611.4475,612.46,611.18,611.27 +611.27,611.38,610.29,610.58 +610.63,610.64,610.14,610.17 +610.17,610.73,609.92,610.72 +610.72,610.84,609.94,609.96 +610.325,609.99,609.76,609.96 +609.93,610.26,609.69,609.96 +609.76,610.07,609.51,609.96 +609.85,610.54,609.82,610.5 +610.49,610.51,609.55,609.64 +609.64,609.82,607.4,608.33 +608.36,608.86,608.3,608.86 +608.86,608.99,608.48,608.95 +608.93,608.99,607.51,608.86 +608.87,608.99,608.24,608.99 +608.97,609.59,608.75,608.75 +609.01,609.01,608.06,608.66 +608.66,609.63,608.24,609.43 +609.43,609.43,608.25,608.66 +608.66,608.96,608.36,608.71 +608.65,608.99,607.97,608.57 +608.7,608.99,608.49,608.9 +608.84,608.99,608.5,608.91 +608.88,609.32,608.79,608.97 +609.21,609.88,608.94,609.59 +609.58,609.87,609.12,609.6 +609.65,609.88,609.42,609.82 +609.86,609.87,609.37,609.46 +609.39,609.58,608.7,608.9 +608.9,609.38,608.19,608.91 +608.81,609.28,608.66,608.92 +608.92,609.35,608.85,608.86 +608.87,608.99,608.43,608.83 +608.83,609.09,608.38,608.72 +608.87,608.99,608.23,608.56 +608.56,608.73,607.61,607.99 +607.82,608.28,607.5,607.71 +607.71,608.46,607.15,607.88 +608.05,608.75,607.79,608.74 +608.62,608.99,608.45,608.78 +608.59,609.0,608.3,608.7 +608.93,608.96,608.53,608.6 +608.59,609.92,592.63,596.86 +596.7,605.0,596.7,599.31 +599.31,600.54,599.03,600.51 +600.51,601.47,598.28,598.72 +598.69,599.7,598.26,599.65 +599.11,599.11,598.26,598.72 +598.81,598.99,598.07,598.75 +598.72,599.58,598.16,599.35 +599.31,599.62,598.5,598.54 +598.55,598.55,598.17,598.25 +598.25,598.61,598.16,598.32 +598.3,598.64,597.83,598.07 +598.07,598.68,597.7,598.68 +598.65,599.7,597.77,599.69 +599.69,599.7,598.2,598.21 +598.21,598.74,597.24,597.84 +597.85,598.39,597.04,597.28 +597.27,597.65,593.95,595.54 +595.54,595.87,594.21,594.57 +594.67,595.99,593.54,595.91 +595.9,595.99,595.0,595.39 +595.37,595.8,595.21,595.53 +595.58,595.99,595.19,595.99 +595.98,595.99,595.78,595.99 +595.97,597.01,595.93,597.01 +597.01,598.54,597.0,598.52 +598.52,598.52,597.98,598.39 +598.3,598.47,597.49,598.34 +598.31,598.41,597.49,597.68 +597.87,597.99,596.55,596.93 +596.94,597.5,596.47,597.13 +597.12,597.47,596.86,597.1 +597.1,597.1,596.27,596.63 +596.78,597.1,596.46,596.79 +597.03,597.1,596.62,596.95 +596.95,597.28,596.35,597.12 +597.28,597.68,596.42,597.48 +597.59,598.0,596.98,597.62 +597.7,598.0,597.53,597.69 +597.72,597.72,596.86,597.12 +597.09,597.46,595.62,596.0 +596.0,596.19,595.0,595.67 +595.69,595.99,595.0,595.85 +595.69,596.88,595.0,596.32 +596.29,596.74,595.87,596.62 +596.62,596.99,596.15,596.98 +596.88,596.99,596.19,596.86 +596.92,596.92,594.99,595.24 +595.24,596.25,594.78,596.25 +596.13,596.23,595.14,595.96 +595.98,597.22,595.84,597.2 +597.07,597.54,596.68,597.53 +597.53,597.67,596.99,597.59 +597.57,597.65,596.84,596.91 +596.92,597.0,596.59,596.93 +596.92,597.0,596.51,596.83 +596.9,597.0,596.53,597.0 +597.0,597.99,596.84,597.72 +597.8,598.54,597.76,598.315 +598.54,598.99,598.29,598.91 +598.88,598.98,598.63,598.98 +598.98,598.99,598.59,598.99 +598.99,599.49,598.98,599.48 +599.47,599.69,599.19,599.69 +599.69,600.99,599.68,600.99 +600.99,602.14,600.98,601.97 +601.84,602.88,601.5,602.55 +602.55,603.3,600.63,601.22 +601.23,602.0,601.0,601.47 +601.32,602.41,601.16,602.23 +602.13,602.6,601.93,602.6 +602.6,602.97,602.39,602.69 +602.68,602.98,602.32,602.89 +602.86,602.99,602.56,602.99 +602.98,603.1,602.72,603.07 +603.01,603.99,602.9,603.97 +603.98,605.41,603.98,605.41 +605.41,605.81,605.38,605.59 +605.59,605.6,605.34,605.6 +605.6,605.94,604.78,604.78 +604.85,604.85,603.44,603.62 +603.65,603.73,603.22,603.42 +603.4,603.72,603.03,603.775 +603.74,604.34,603.34,604.13 +604.08,604.6,603.95,604.06 +604.09,605.13,603.99,604.84 +604.84,605.24,604.23,604.35 +604.35,604.47,601.08,601.08 +601.08,603.86,601.08,603.86 +603.84,604.2,603.16,603.16 +603.16,603.17,602.66,602.77 +602.85,603.81,602.72,603.56 +603.54,603.99,603.38,603.84 +603.82,603.99,603.62,603.99 +603.99,603.99,603.4,603.85 +603.85,603.85,603.52,603.68 +603.68,603.69,603.1,603.68 +603.69,603.77,603.18,603.38 +603.38,603.48,602.67,602.99 +602.99,603.49,602.66,602.99 +603.0,603.49,602.82,603.27 +603.22,603.4,602.48,602.72 +602.86,603.18,602.5,603.17 +603.17,603.39,602.83,603.08 +603.03,603.1,602.87,603.1 +603.1,603.49,603.1,603.46 +603.45,603.49,603.31,603.46 +603.49,603.97,603.04,603.97 +603.5600000000001,603.97,603.48,603.54 +603.63,603.96,603.49,603.7 +603.7,603.76,601.35,601.36 +601.36,601.41,600.11,600.42 +600.42,600.42,600.1,600.25 +600.24,600.4,599.7,600.17 +600.25,605.99,599.42,603.18 +603.17,603.17,601.0,601.09 +601.09,601.1,600.41,600.65 +600.64,601.57,600.46,601.15 +601.15,601.35,600.64,601.07 +601.06,601.35,600.81,601.19 +601.2,601.77,600.9,601.26 +601.26,601.83,601.26,601.74 +601.74,601.99,601.58,601.96 +601.97,601.99,600.02,601.95 +601.95,602.2,601.94,602.2 +602.19,602.45,602.0,602.45 +602.45,602.72,601.51,602.0 +602.1,602.16,601.04,601.4 +601.4,602.81,601.17,602.81 +602.71,607.58,602.6,607.26 +607.36,607.41,606.97,607.39 +607.4,607.77,607.1,607.77 +607.76,607.78,607.09,607.1800000000001 +607.19,607.11,606.2,606.59 +606.62,606.99,606.44,606.71 +606.72,607.47,606.62,607.24 +607.23,607.57,606.72,607.32 +607.31,607.98,606.76,607.91 +607.82,607.99,606.17,606.98 +606.98,606.99,605.33,606.35 +606.34,607.69,605.32,607.65 +607.68,607.68,606.15,606.74 +606.74,607.0,606.23,606.92 +606.69,606.99,605.9,606.05 +606.04,607.28,605.81,607.27 +607.27,607.54,606.49,606.84 +606.87,607.32,606.25,606.76 +606.79,606.95,605.13,605.34 +605.33,606.49,604.84,606.38 +606.37,606.38,605.53,606.22 +606.24,606.74,605.72,606.12 +606.12,606.42,605.57,606.32 +606.32,606.87,606.29,606.47 +606.48,606.6,606.08,606.27 +606.27,606.54,604.02,604.14 +604.14,604.51,602.76,604.08 +604.07,604.16,603.23,603.98 +604.01,604.32,603.38,604.18 +604.18,604.61,602.98,603.63 +603.63,604.14,603.18,603.78 +603.78,605.2,603.61,604.26 +604.28,605.0,603.64,604.75 +604.76,605.25,604.24,605.12 +605.12,606.0,604.7,605.42 +605.38,606.17,604.74,606.17 +606.16,606.99,601.38,602.67 +602.6,603.5,602.14,603.16 +602.98,604.23,602.72,604.21 +604.21,605.78,603.86,605.63 +605.68,606.0,605.33,605.63 +605.72,605.99,605.15,605.45 +605.45,605.56,604.41,605.43 +605.43,605.43,604.12,604.39 +604.4,605.0,604.37,604.37 +604.37,604.55,603.82,604.14 +604.04,604.11,603.49,603.63 +603.62,604.11,603.56,604.04 +604.05,605.0,604.05,604.86 +604.84,605.41,604.61,605.41 +605.41,605.47,604.44,604.9 +604.88,605.1,604.14,604.3 +604.28,605.21,604.14,605.08 +605.1,605.6,604.72,604.8 +604.95,605.45,604.72,604.97 +604.97,604.99,604.72,604.91 +604.94,604.99,604.01,604.48 +604.48,604.99,603.5,604.99 +604.98,604.99,603.18,604.86 +604.85,604.99,604.07,604.86 +604.86,604.93,604.0,604.45 +604.45,605.01,604.37,604.88 +604.86,605.76,604.38,604.99 +605.08,605.16,604.12,605.11 +605.11,605.32,604.56,604.98 +604.98,605.17,604.14,604.44 +604.45,605.25,604.32,604.97 +604.98,604.98,604.27,604.89 +604.88,604.99,604.88,604.98 +604.98,605.37,604.76,604.91 +604.91,605.99,604.91,605.68 +605.66,605.73,603.79,603.87 +603.9,606.0,603.9,606.0 +606.0,606.89,605.03,605.42 +605.42,605.42,603.56,604.72 +604.72,606.25,604.72,605.96 +605.87,606.13,604.86,605.475 +606.12,606.12,604.83,604.99 +604.98,605.73,604.87,605.73 +605.71,605.73,605.17,605.73 +605.73,605.99,605.6,605.68 +605.6,605.98,604.24,605.48 +605.49,605.99,604.87,605.71 +605.82,606.13,605.11,606.11 +606.1,606.84,605.98,606.71 +606.72,606.84,606.46,606.63 +606.63,606.79,606.25,606.4 +606.4,606.4,604.92,605.96 +605.95,605.98,605.24,605.71 +605.6,605.99,605.45,605.98 +605.98,606.83,605.72,606.83 +606.83,606.84,606.26,606.41 +606.41,606.51,605.42,605.59 +605.6,605.98,605.12,605.77 +605.78,606.41,605.78,606.28 +606.28,606.84,605.0,606.495 +606.78,606.79,606.12,606.71 +606.69,606.76,606.11,606.66 +606.64,606.8,606.0,606.09 +606.1,606.48,606.05,606.3 +606.4,606.62,606.1,606.62 +606.54,606.73,606.15,606.5 +606.5,606.5,606.0,606.17 +606.17,606.5,606.01,606.43 +606.41,606.5,606.0,606.0 +606.0,606.83,605.97,606.25 +606.25,606.25,605.58,605.87 +605.86,606.25,605.18,606.23 +606.23,606.25,605.5,605.94 +605.92,606.5,605.32,605.56 +605.52,606.95,605.0,606.94 +606.94,610.0,606.45,610.0 +610.0,611.95,609.99,611.89 +611.89,613.05,611.57,612.9 +612.96,613.6,611.52,611.72 +611.72,611.78,611.08,611.68 +611.68,612.61,611.64,612.57 +612.59,612.68,611.94,612.67 +612.67,612.68,612.26,612.67 +612.67,613.41,612.48,612.88 +612.96,613.26,612.59,612.81 +612.81,613.85,612.8,613.105 +613.83,613.87,612.66,613.4 +613.31,613.96,613.31,613.82 +613.87,613.96,613.21,613.29 +613.38,613.89,613.21,613.88 +613.89,614.91,613.75,614.84 +614.83,615.91,614.65,615.88 +615.76,616.7,615.67,616.47 +616.47,616.52,615.87,616.26 +616.27,616.52,614.63,616.52 +616.52,617.19,616.48,616.48 +616.48,616.68,616.28,616.57 +616.59,616.72,614.03,614.8 +614.73,615.96,614.57,615.26 +615.28,616.0,615.05,615.78 +615.7,615.9,615.08,615.52 +615.59,615.85,615.3,615.59 +615.62,615.84,615.19,615.64 +615.64,615.64,614.91,615.28 +615.26,615.73,615.25,615.71 +615.71,615.84,612.67,613.0 +613.0,613.83,612.91,613.82 +613.82,613.82,613.22,613.31 +613.38,613.91,613.36,613.76 +613.7,614.4,613.7,614.17 +614.26,614.28,613.07,613.14 +613.22,613.22,611.87,612.5 +612.5,612.53,611.82,611.93 +611.93,612.08,610.73,610.73 +610.75,611.0,610.58,610.82 +610.84,610.85,608.66,609.46 +609.47,611.07,609.47,610.24 +610.25,611.19,610.24,610.91 +610.91,611.1,610.45,611.1 +611.1,611.95,610.63,611.95 +611.95,611.95,611.43,611.62 +611.67,611.9,611.16,611.48 +611.5,612.08,611.38,611.98 +611.98,612.53,611.98,612.17 +612.17,612.35,611.77,612.34 +612.2,612.53,611.7,612.52 +612.53,614.63,612.52,614.37 +614.38,615.0,614.28,614.69 +614.76,614.86,613.7,613.9 +613.78,614.61,613.73,614.61 +614.61,615.24,614.4,614.92 +615.08,615.08,614.4,614.59 +614.54,614.67,614.4,614.4 +614.39,614.59,614.32,614.49 +614.58,614.62,614.23,614.29 +614.42,614.44,614.03,614.27 +614.24,614.48,614.11,614.25 +614.25,614.31,613.5,613.78 +613.81,613.93,613.02,613.03 +613.02,613.03,610.92,611.12 +611.13,612.67,610.7,611.96 +612.02,612.49,611.41,612.48 +612.45,613.26,611.78,612.26 +612.48,612.49,611.81,611.97 +611.87,612.82,611.83,612.82 +612.82,612.9,612.01,612.82 +612.81,612.99,612.65,612.82 +612.88,613.06,612.65,613.06 +613.05,613.06,612.65,612.9 +612.87,612.99,612.65,612.8 +612.81,613.23,612.75,612.82 +612.81,612.81,606.93,610.31 +610.33,610.85,609.48,610.49 +610.5,611.07,610.22,610.37 +610.35,610.68,610.14,610.54 +610.55,610.66,609.86,610.11 +610.06,610.7,609.92,610.33 +610.41,610.55,610.06,610.1 +610.12,610.43,609.9,610.32 +610.36,610.95,610.2,610.74 +610.73,611.59,610.72,611.32 +611.31,611.82,611.03,611.19 +611.0,611.86,610.9,611.14 +611.12,611.12,609.99,610.98 +610.88,610.99,610.31,610.9 +610.9,610.96,609.54,610.42 +610.4,610.4,609.14,609.55 +609.55,609.97,609.16,609.87 +609.87,610.36,609.21,609.69 +609.65,609.69,609.01,609.68 +609.55,609.69,609.13,609.46 +609.44,610.48,609.15,610.26 +610.12,611.0,609.92,610.29 +610.28,610.68,610.05,610.68 +610.66,610.69,609.89,610.4 +610.4,610.4,609.22,609.53 +609.53,609.75,609.29,609.55 +609.61,610.3,609.38,610.3 +610.3,610.69,610.07,610.68 +610.68,610.77,610.41,610.65 +610.71,610.99,610.59,610.98 +610.63,610.99,610.26,610.52 +610.55,610.99,610.32,610.99 +610.97,610.99,610.7,610.86 +610.97,614.14,610.93,613.87 +613.86,614.24,613.56,613.97 +614.0,614.24,613.08,613.37 +613.37,613.69,613.37,613.37 +613.5,613.68,612.04,612.18 +612.19,612.5,611.67,611.98 +611.88,612.08,611.28,611.76 +611.67,612.33,611.02,612.22 +612.22,612.99,611.98,612.87 +612.89,613.69,612.75,613.49 +613.43,613.6,612.79,612.93 +612.93,613.44,612.53,613.22 +613.1,613.22,612.49,612.8 +612.79,612.93,612.25,612.93 +612.94,612.99,612.43,612.98 +612.98,612.99,612.55,612.93 +612.8,612.99,612.07,612.55 +612.55,612.62,612.03,612.61 +612.7,612.9,612.45,612.89 +612.85,612.99,612.59,612.825 +612.87,612.97,612.7,612.76 +612.78,612.99,612.51,612.99 +612.99,613.24,612.4,612.72 +612.85,613.09,612.51,613.09 +613.08,613.08,612.52,613.03 +613.05,613.06,611.97,612.24 +612.21,613.39,611.79,613.11 +613.06,613.37,612.38,612.71 +612.64,612.99,612.08,612.64 +612.64,612.81,612.08,612.7 +612.72,612.92,612.14,612.52 +612.62,612.69,611.05,612.68 +612.68,612.69,610.3,611.38 +611.38,611.99,611.37,611.74 +611.68,611.98,611.3,611.98 +611.98,611.99,611.39,611.92 +611.91,611.96,610.98,611.53 +611.69,611.79,610.81,611.54 +611.51,611.99,611.37,611.99 +611.99,612.44,611.85,612.33 +612.33,612.5,612.02,612.33 +612.31,612.84,609.89,612.84 +612.84,613.44,612.83,613.44 +613.44,613.5,613.39,613.5 +613.49,615.0,613.49,615.0 +614.91,615.96,614.7,615.89 +615.89,616.16,615.13,616.04 +615.92,616.78,615.78,616.77 +616.78,618.7,616.78,617.99 +618.0,618.04,617.63,617.91 +617.81,617.88,616.33,616.5 +616.56,616.99,615.35,616.33 +616.12,616.3,613.73,615.18 +615.08,615.5,614.38,615.26 +615.26,615.95,614.96,615.69 +615.69,616.55,615.54,616.55 +616.44,617.61,616.38,617.25 +617.39,618.47,617.34,618.21 +618.33,618.58,617.89,618.24 +618.22,618.35,617.1,618.26 +618.25,618.68,618.01,618.37 +618.29,618.7,618.2,618.37 +618.4,618.7,617.77,618.65 +618.65,619.84,618.38,619.82 +619.78,619.88,619.54,619.73 +619.64,620.0,619.61,620.0 +620.0,620.0,619.5,619.51 +619.76,619.53,619.5,619.52 +619.52,619.62,619.5,619.55 +619.55,619.96,619.55,619.28 +619.76,619.77,618.71,619.01 +619.07,619.35,618.96,619.33 +619.26,619.38,618.95,618.83 +619.06,619.06,618.03,618.33 +618.35,618.93,617.55,617.83 +617.83,618.37,617.7,618.11 +618.04,618.75,617.65,617.98 +617.99,617.99,617.79,617.99 +617.99,618.63,617.98,618.47 +618.59,618.75,618.4,618.75 +618.74,618.99,618.71,618.99 +618.98,619.31,618.7,618.81 +618.83,619.59,618.74,619.53 +619.53,619.59,619.08,619.24 +619.23,619.59,619.15,619.52 +619.53,619.58,619.2,619.32 +619.31,619.33,618.53,618.57 +618.55,618.55,617.24,617.58 +617.55,617.88,617.46,617.88 +617.79,618.9,617.7,618.9 +618.89,618.92,618.22,618.39 +618.4,618.49,618.12,618.31 +618.33,618.37,617.97,618.31 +618.29,618.33,618.07,618.24 +618.24,618.32,617.65,618.13 +618.05,618.33,617.5,617.51 +617.51,618.33,617.35,618.33 +618.33,618.33,618.11,618.29 +618.29,618.33,618.02,618.25 +618.24,618.42,617.81,617.99 +617.93,618.08,617.65,618.08 +618.08,618.99,618.08,618.4 +618.35,618.88,618.3,618.84 +618.83,618.87,618.04,618.84 +618.78,618.83,618.23,618.51 +618.48,618.52,617.5,617.54 +617.55,617.63,617.0,617.35 +617.35,617.81,617.0,617.3 +617.38,617.69,617.21,617.68 +617.6,617.69,617.42,617.68 +617.69,617.99,617.21,617.99 +617.99,618.99,617.98,618.98 +618.99,618.99,618.95,618.97 +618.97,619.2,618.95,619.2 +619.19,619.2,619.07,619.13 +619.08,619.2,618.95,618.96 +618.95,618.96,617.63,618.11 +617.64,617.79,617.25,617.26 +617.26,618.0,617.16,617.25 +617.25,617.61,617.0,617.21 +617.21,617.85,617.16,617.29 +617.74,617.99,617.04,617.37 +617.37,617.99,615.6,615.61 +615.6,616.17,615.55,616.17 +616.16,616.8,615.71,615.83 +615.82,615.99,615.46,615.97 +615.96,615.99,615.7,615.97 +615.91,617.66,615.86,617.65 +617.65,618.29,617.45,618.04 +618.1,618.94,618.06,618.69 +618.68,618.97,617.76,617.79 +617.8,618.93,617.8,618.57 +618.59,618.98,618.13,618.98 +618.97,618.99,618.37,618.58 +618.49,618.73,618.29,618.73 +618.7,620.32,618.17,620.32 +620.42,637.63,620.42,629.74 +629.97,632.15,629.5,630.79 +630.54,631.35,628.43,631.19 +631.05,632.05,630.05,631.18 +631.19,632.99,631.05,632.9 +632.9,634.73,632.19,634.72 +634.72,635.0,632.74,633.34 +633.31,634.99,633.05,633.99 +633.98,635.0,633.48,633.95 +633.9,634.64,633.6,634.16 +634.15,634.79,633.83,634.02 +634.2,634.29,632.43,633.99 +633.99,634.5,632.48,634.45 +634.45,634.99,632.8,634.89 +634.88,635.99,633.51,635.99 +635.99,641.82,635.98,641.24 +641.16,641.44,633.5,637.61 +637.72,640.1,637.58,639.88 +640.11,642.46,639.88,642.46 +642.44,647.03,641.79,642.16 +642.2,643.58,641.55,642.24 +642.34,642.85,638.57,638.59 +638.85,641.14,638.85,641.14 +641.13,641.16,639.48,640.0 +640.0,640.02,638.5,638.5 +638.51,639.19,638.01,638.54 +638.55,640.01,638.37,639.67 +639.66,640.64,638.62,640.49 +640.48,640.89,640.12,640.66 +640.66,642.19,640.66,641.62 +641.04,641.63,640.51,641.28 +641.42,641.73,640.88,641.21 +641.19,641.6,640.63,640.94 +640.94,641.03,639.97,640.22 +640.21,640.97,639.26,640.14 +640.14,640.26,638.18,639.14 +639.12,639.94,638.1,639.35 +639.35,639.56,638.08,639.25 +639.29,639.58,638.63,639.13 +639.2,639.8,638.26,638.89 +638.9,638.91,632.28,632.72 +632.67,636.23,631.91,634.28 +634.28,637.49,632.9,636.81 +636.81,637.31,635.34,635.87 +635.87,636.35,633.89,634.86 +634.88,636.36,634.09,635.8 +635.84,639.8,635.81,639.4 +639.4,639.8,638.25,639.79 +639.69,639.85,637.82,639.2 +638.69,638.9,635.17,638.61 +638.61,638.87,637.47,637.91 +637.92,638.74,637.92,638.13 +638.12,638.15,636.43,636.74 +636.905,637.09,635.22,635.76 +635.69,636.8,635.36,635.61 +635.69,638.59,634.65,638.59 +638.6,638.65,632.0,632.82 +632.85,637.33,632.85,637.33 +637.35,638.89,634.58,637.76 +637.9,638.49,636.41,637.3 +637.0,637.19,635.6,636.94 +636.99,637.0,634.42,636.46 +636.5,637.0,635.0,635.58 +635.49,636.13,634.4,636.02 +635.9,636.42,634.51,635.99 +635.98,636.97,635.69,636.39 +636.39,636.92,636.04,636.61 +636.67,636.97,635.4,636.97 +636.97,636.97,636.74,636.97 +636.97,637.25,636.42,637.1 +637.16,638.1,636.67,637.75 +637.66,638.1,637.4,638.01 +638.02,638.02,624.08,634.8 +634.88,636.6,633.11,635.72 +635.67,636.47,624.5,635.12 +635.12,636.9,635.12,635.905 +636.81,637.1,635.61,636.69 +636.93,637.1,635.99,637.05 +637.05,637.93,624.5,633.66 +633.8,636.03,632.72,635.29 +635.17,638.3,633.22,633.27 +635.72,637.68,633.4,636.07 +636.27,637.89,634.72,637.39 +637.39,637.98,636.83,637.98 +637.98,638.84,637.01,638.69 +638.67,638.99,638.13,638.98 +638.98,639.99,638.82,639.81 +639.87,639.87,635.04,638.2 +638.2,638.45,638.19,638.1166666666667 +638.1166666666667,638.2,637.79,638.0333333333334 +638.0333333333334,637.98,637.92,637.95 +637.95,638.04,637.95,638.1600000000001 +637.995,638.04,638.03,638.37 +638.04,638.04,638.03,638.5799999999999 +638.3733333333333,638.79,638.04,638.79 +638.7066666666666,639.05,638.79,638.9666666666667 +639.04,639.1,639.03,639.1433333333333 +639.1757142857142,639.1,639.04,639.3199999999999 +639.3114285714286,639.05,639.02,639.4966666666667 +639.4471428571428,639.49,639.04,639.6733333333334 +639.5828571428572,639.85,639.4,639.85 +639.7185714285714,639.98,639.84,639.97 +639.8542857142858,639.99,639.97,639.975 +639.99,639.99,639.98,639.98 +639.9300000000001,639.99,639.0,639.87 +639.87,639.99,639.86,639.88 +639.9066666666666,639.99,639.86,639.89 +639.9433333333334,639.99,639.89,639.9 +639.98,639.99,639.95,639.91 +639.97,639.97,639.92,639.92 +639.7266666666667,639.94,639.93,639.93 +639.4833333333333,639.93,639.22,639.2099999999999 +639.24,639.31,637.98,638.49 +637.865,638.09,636.38,637.77 +636.49,637.05,636.0,637.05 +637.3225,638.16,637.05,637.9833333333333 +638.155,638.22,638.12,638.9166666666666 +638.9875000000001,639.85,637.87,639.85 +639.82,640.0,639.62,639.98 +639.98,640.99,639.98,640.99 +640.8,640.99,640.48,640.99 +640.93,641.49,640.73,641.3 +641.2,641.99,641.04,641.99 +641.475,641.99,641.66,641.75 +641.75,641.99,641.75,641.97 +641.9,642.42,641.82,642.21 +642.1800000000001,642.46,642.01,642.45 +642.46,642.99,642.46,642.75 +642.76,642.96,642.73,642.88 +642.89,642.99,642.73,642.89 +642.73,642.85,641.4,641.49 +641.59,642.2,641.3,641.51 +641.69,642.0,639.67,641.18 +641.18,642.99,641.06,642.84 +642.88,643.35,640.85,642.19 +642.19,643.91,642.18,642.9 +642.9,643.08,641.33,641.94 +641.94,643.65,641.94,643.1 +643.09,643.62,642.18,642.29 +642.32,642.53,641.72,641.93 +642.05,643.29,642.04,643.12 +643.28,643.47,642.01,642.5 +642.5,642.5,640.19,640.41 +640.49,640.49,638.5,639.13 +639.03,640.52,638.79,640.27 +640.24,640.5,639.63,640.0 +639.94,639.98,638.62,639.47 +639.38,640.86,638.79,640.79 +640.79,641.0,640.41,640.88 +640.87,641.24,640.69,641.0 +641.15,641.19,639.28,639.9 +639.89,640.12,638.79,639.98 +639.97,640.48,639.65,639.99 +640.16,640.77,640.09,640.39 +640.36,640.69,639.4,640.0 +640.0,640.0,639.03,639.62 +639.63,639.87,638.7,638.9 +638.89,638.99,638.51,638.94 +638.95,638.98,637.64,638.48 +638.37,638.99,638.0,638.0 +638.01,638.01,637.62,637.82 +637.93,638.45,636.27,637.5 +637.49,637.98,636.44,637.98 +637.99,639.8,637.94,639.8 +639.8,640.0,639.14,639.15 +639.14,639.15,638.39,638.99 +638.99,639.24,638.61,639.17 +639.13,639.75,639.02,639.71 +639.61,639.71,639.0,639.0 +639.06,639.06,638.41,638.51 +638.57,638.73,637.94,637.97 +638.09,639.05,637.67,638.95 +638.95,640.0,638.85,639.92 +639.92,639.97,639.24,639.96 +639.96,639.97,638.99,639.25 +639.26,639.89,639.07,639.76 +639.85,639.97,639.75,639.91 +639.93,639.97,638.48,638.57 +638.7,639.14,637.2,637.2 +637.29,637.72,635.73,636.5 +636.51,637.59,636.08,636.32 +636.32,636.55,635.56,635.65 +635.57,635.98,634.59,634.59 +634.59,634.63,632.15,632.15 +632.34,633.36,632.15,632.31 +632.33,635.23,632.15,634.86 +634.99,635.33,632.9,634.96 +634.99,635.29,634.18,635.29 +635.18,636.68,634.61,636.18 +636.25,636.5,635.6,636.22 +636.22,636.5,635.0,636.5 +636.3,636.95,635.42,636.8 +636.8,636.99,636.21,636.25 +636.32,636.98,635.24,636.82 +636.82,636.99,636.53,636.72 +636.72,636.99,636.52,636.855 +636.99,636.99,636.7,636.99 +636.98,636.99,636.41,636.75 +636.77,636.97,635.05,635.65 +635.58,635.75,633.06,634.07 +633.92,635.81,633.83,634.41 +634.41,634.41,626.29,628.27 +628.21,628.79,626.4,628.67 +628.65,629.58,627.13,628.28 +628.35,628.45,625.6,628.45 +628.45,628.5,626.74,628.1 +628.11,628.39,626.6,626.98 +627.01,628.73,625.77,626.41 +626.73,627.97,626.41,627.97 +627.97,628.99,627.95,628.99 +628.99,629.64,628.07,629.04 +629.14,629.91,629.04,629.75 +629.74,629.9,628.82,628.98 +628.92,629.5,628.73,629.01 +628.99,629.15,628.16,628.29 +628.3,628.41,627.4,628.08 +628.06,629.45,628.02,629.25 +629.24,629.3,628.59,628.87 +628.89,629.98,628.4,629.31 +629.94,629.99,629.47,629.75 +629.75,629.99,629.28,629.74 +629.74,629.99,629.17,629.54 +629.54,629.73,628.41,628.64 +628.61,629.38,628.37,628.98 +628.9,629.0,627.85,627.95 +627.96,628.95,627.78,628.84 +628.64,628.97,627.78,628.92 +628.76,629.76,628.11,628.44 +628.28,628.64,627.79,628.05 +628.2,628.63,626.12,626.45 +626.47,627.3,626.01,627.3 +627.3,627.9,627.17,627.86 +627.86,627.99,626.55,627.69 +627.69,628.0,627.08,627.64 +627.77,628.0,627.42,627.66 +627.66,628.59,627.57,628.48 +628.31,628.62,627.94,628.62 +628.61,628.69,627.5,628.64 +628.67,628.69,628.45,628.69 +628.69,628.99,628.68,628.98 +628.98,629.78,628.87,629.62 +629.62,629.98,629.23,629.98 +629.84,629.97,629.08,629.33 +629.33,629.45,629.04,629.38 +629.27,629.44,628.68,629.36 +629.36,629.65,629.3,629.43 +629.43,629.62,628.58,629.21 +628.96,629.2,628.63,628.99 +628.84,629.65,628.62,629.64 +629.64,629.99,629.6,629.93 +629.93,631.89,629.8,631.85 +631.86,632.98,630.86,632.91 +632.92,633.41,631.82,631.97 +631.97,631.98,631.37,631.65 +631.66,631.69,627.8,630.0 +629.98,630.21,629.71,630.21 +630.23,630.53,629.3,629.45 +629.34,629.84,629.12,629.84 +629.8,630.11,629.23,629.69 +629.69,630.9,629.28,630.9 +630.83,630.85,630.0,630.0 +630.09,630.1,629.51,630.19 +630.21,630.41,629.32,630.38 +630.33,630.87,630.33,630.8 +630.8,630.99,630.78,630.97 +630.95,630.99,630.74,630.99 +630.99,631.99,630.98,631.99 +631.99,632.99,631.98,632.99 +632.99,632.99,632.87,632.98 +632.99,634.4,632.98,634.4 +634.4,634.4,633.34,634.34 +634.32,634.95,634.19,634.91 +634.91,635.22,634.76,635.0 +635.09,635.95,633.6,635.8 +635.74,640.0,635.4,640.0 +639.99,647.25,639.99,647.25 +647.24,652.68,647.24,649.03 +649.04,654.0,649.04,654.0 +654.0,656.56,654.0,656.54 +656.56,658.0,653.03,653.68 +653.68,655.88,651.79,655.27 +655.21,655.27,650.51,653.94 +653.93,654.01,651.08,653.3 +653.28,655.0,650.52,653.99 +653.99,655.8,653.01,655.29 +655.17,655.39,654.14,655.14 +655.2,655.39,650.1,653.6 +653.65,653.65,646.12,647.8 +647.8,650.06,645.66,650.06 +650.05,654.4,649.95,652.36 +652.51,655.39,648.46,655.21 +655.21,655.39,653.11,653.9 +653.9,654.2,653.19,654.19 +654.2,654.63,651.96,653.25 +653.24,653.25,648.47,651.565 +650.87,650.87,648.08,649.88 +650.1,650.1,648.1,649.19 +649.38,649.96,648.26,649.96 +649.96,653.21,648.27,653.18 +653.08,655.03,651.84,654.59 +654.4,655.28,651.46,651.47 +651.47,654.19,651.27,653.97 +653.97,653.97,645.33,651.42 +651.37,653.92,651.37,653.56 +653.04,654.0,647.98,651.49 +651.5,653.25,649.99,652.03 +652.09,653.91,651.07,651.07 +651.7,652.74,648.8,652.18 +652.5,652.77,647.0,647.17 +647.96,649.41,646.73,649.0 +649.0,651.02,647.17,649.69 +649.62,652.93,649.09,651.03 +650.77,652.18,650.0,651.67 +651.63,651.82,649.47,651.11 +651.1,651.23,648.51,650.28 +650.44,650.63,645.88,648.01 +648.01,649.02,647.38,648.81 +648.37,648.97,647.45,648.41 +648.14,648.99,646.19,648.99 +648.99,648.99,646.85,647.47 +647.47,648.69,645.81,648.1 +648.67,651.06,647.48,651.05 +651.05,651.05,646.63,647.1 +647.1,651.46,646.35,650.86 +650.9,650.99,646.11,650.45 +650.48,650.7,648.79,650.26 +650.29,650.99,647.75,649.09 +648.87,649.9,647.88,649.16 +649.14,649.47,646.16,648.46 +647.69,649.1,647.03,649.09 +649.08,649.6,648.52,649.44 +649.38,650.05,648.99,649.0 +649.0,650.99,649.0,650.0 +650.0,652.99,650.0,652.99 +652.99,655.17,652.46,655.13 +655.13,655.36,654.35,654.79 +654.79,655.36,654.17,655.29 +655.29,655.3,654.54,654.98 +654.81,655.01,652.4,654.2 +654.18,654.41,652.4,653.15 +653.05,653.4,652.04,653.23 +653.22,654.51,650.64,651.31 +651.67,651.67,649.2,650.52 +650.57,651.98,650.22,651.97 +652.21,655.0,651.97,653.95 +653.85,655.28,651.99,654.55 +654.15,655.29,653.23,654.99 +654.66,655.2,653.0,654.44 +654.44,655.0,654.23,654.93 +654.69,654.99,654.0,654.54 +654.65,655.25,651.99,654.38 +654.38,655.0,653.38,655.0 +654.93,655.21,653.5,654.26 +654.28,654.98,654.25,654.98 +654.96,657.0,654.96,657.0 +657.0,657.5,649.0,654.42 +654.55,656.0,654.2,655.99 +656.0,657.5,654.71,657.43 +657.42,658.76,656.04,658.54 +658.56,659.53,656.24,658.77 +658.96,659.04,654.0,658.93 +658.82,658.93,656.69,657.94 +657.86,658.1,656.45,657.98 +657.92,658.01,654.03,654.64 +654.63,657.99,654.31,657.95 +657.94,657.99,656.85,657.99 +657.99,658.99,655.5,658.95 +658.99,658.99,657.85,658.86 +658.98,665.43,658.72,664.42 +664.38,666.0,664.35,665.82 +665.82,669.27,665.01,668.95 +668.77,669.81,668.01,668.82 +668.88,668.91,668.36,668.86 +668.85,676.25,668.75,675.69 +675.96,678.0,674.79,676.52 +676.53,677.98,670.99,674.75 +674.47,674.55,669.05,669.55 +669.99,674.0,669.46,671.47 +671.47,673.38,668.95,672.38 +672.37,677.76,671.59,674.0 +674.01,679.0,674.01,678.36 +678.77,686.92,678.77,686.73 +686.74,688.61,685.84,688.31 +688.61,690.82,688.25,689.68 +689.69,692.01,686.63,686.8 +686.79,688.69,686.73,688.69 +688.68,689.05,686.26,687.26 +687.29,687.83,686.21,687.0 +686.99,687.05,685.0,686.63 +685.01,686.26,684.74,686.26 +685.99,686.74,684.13,684.99 +684.99,684.99,682.99,683.17 +683.05,683.44,680.55,680.62 +680.62,682.0,679.22,681.52 +681.98,681.98,680.2,680.83 +680.84,680.98,679.68,680.11 +680.1,680.1,678.0,678.7 +678.34,678.99,678.0,678.95 +678.87,680.0,678.25,679.9 +679.88,681.99,679.48,681.45 +681.45,683.01,681.45,681.74 +681.75,681.75,678.69,679.25 +679.13,686.42,679.13,686.4 +686.38,692.41,684.75,688.45 +688.49,688.99,686.56,686.83 +686.99,688.96,685.92,686.5 +686.23,686.5,683.2,686.39 +686.39,687.2,685.38,687.02 +687.02,687.75,686.72,687.46 +687.47,687.73,686.03,686.38 +686.52,686.52,683.85,685.43 +685.25,687.59,685.25,686.98 +686.98,686.98,685.88,686.57 +686.53,687.69,686.53,687.62 +687.66,687.87,686.42,688.255 +687.48,688.89,686.96,688.89 +688.89,688.99,688.01,688.01 +688.39,688.8,687.48,687.98 +687.99,687.99,683.7,684.05 +684.06,687.99,684.06,687.99 +687.99,689.0,687.23,688.99 +688.98,688.99,686.31,688.19 +688.17,688.91,686.15,688.06 +688.06,688.97,687.51,688.78 +688.81,688.99,687.96,688.98 +688.85,689.34,688.01,688.99 +688.97,688.99,688.18,688.98 +688.98,689.99,688.5,689.99 +689.99,689.99,689.41,689.5 +689.52,698.98,689.39,698.98 +698.98,702.0,698.35,701.8 +701.89,702.0,700.51,701.5 +701.43,703.76,701.0,703.76 +703.76,704.73,703.6,704.1 +704.1,704.24,702.0,703.35 +702.22,702.6,702.02,702.6 +702.6,704.0,702.57,703.04 +703.55,703.72,702.83,703.48 +703.62,705.0,703.44,704.68 +704.43,705.22,703.23,705.13 +704.9,706.9,704.34,706.9 +706.9,714.94,706.73,714.84 +714.51,720.0,712.25,719.78 +719.77,725.64,712.07,715.22 +715.57,717.21,714.73,717.17 +717.16,718.68,716.14,718.48 +718.12,720.99,717.18,720.99 +720.98,723.99,718.01,720.25 +720.12,722.99,720.02,720.69 +720.69,721.0,710.0,717.45 +717.01,718.6,716.42,717.69 +717.88,718.41,713.13,713.45 +713.45,713.7,704.36,705.42 +705.54,706.49,692.04,698.4 +697.96,703.69,697.95,703.68 +703.68,709.7,702.24,709.38 +709.4,712.58,709.38,710.58 +710.7,710.92,708.56,709.25 +709.22,710.57,708.29,710.09 +710.02,711.44,710.02,711.23 +710.94,714.98,710.93,714.06 +714.19,714.31,712.45,713.52 +712.995,713.52,711.53,711.8 +711.8,712.05,710.57,711.08 +711.31,711.38,709.76,710.52 +710.05,710.5,702.87,703.03 +703.51,705.88,703.17,704.98 +705.17,710.9,704.0,710.23 +710.22,711.2,710.0,710.28 +710.58,711.04,706.28,709.47 +709.48,710.31,708.05,708.65 +708.64,708.92,704.9,705.42 +705.36,705.6,700.11,704.0 +704.19,704.2,700.6,701.84 +701.68,701.91,694.2,695.05 +695.04,701.01,693.57,696.41 +696.57,698.6,695.67,696.77 +696.78,697.08,681.01,687.79 +687.79,699.09,687.78,695.55 +695.57,696.98,691.89,696.55 +696.56,699.62,695.33,699.59 +699.6,699.99,697.42,699.99 +699.99,700.62,699.98,700.61 +700.61,701.01,698.82,699.21 +699.21,702.0,699.2,701.87 +701.86,701.96,699.68,700.21 +700.21,700.22,697.5,698.84 +698.03,698.76,696.64,698.79 +697.58,699.12,697.56,698.74 +698.83,704.77,698.5,704.76 +704.77,709.68,704.61,706.85 +706.79,707.46,704.55,704.55 +704.71,705.28,703.42,704.27 +704.73,704.74,700.51,701.96 +701.52,702.5,700.7,702.12 +702.11,704.12,701.49,702.6 +702.6,703.65,701.0,703.5 +703.05,704.34,702.45,702.98 +702.93,703.43,698.68,700.99 +700.93,700.96,696.42,697.07 +697.07,704.1,695.74,704.09 +704.09,707.62,704.09,705.23 +705.25,710.0,705.25,709.99 +710.0,711.67,709.63,710.55 +710.54,710.88,708.47,708.86 +709.1,709.66,707.54,709.66 +709.51,712.12,708.8,710.71 +710.81,720.4,710.81,720.08 +720.06,721.72,717.74,720.75 +720.86,723.27,720.75,722.73 +723.05,725.97,722.7,725.97 +725.77,735.0,724.77,734.05 +733.99,737.5,727.8,729.82 +729.81,733.0,728.0,730.35 +730.5,733.89,729.12,731.74 +726.265,731.71,721.07,722.03 +722.03,730.99,720.36,726.05 +726.04,730.0,724.66,728.88 +728.88,729.83,725.42,729.1 +729.07,730.0,727.66,728.18 +728.02,730.0,725.9,729.92 +730.0,734.13,728.81,732.87 +733.0,733.0,722.22,729.67 +730.03,731.51,729.68,730.76 +730.9,730.92,726.01,728.3 +728.0,728.26,725.0,725.1 +725.3,728.61,720.87,727.21 +726.83,727.37,724.5,726.27 +726.27,726.63,724.42,725.41 +725.35,726.14,723.51,725.68 +725.68,727.59,725.66,727.59 +727.59,728.95,726.03,726.98 +726.98,726.99,720.72,721.87 +721.86,723.41,721.43,722.64 +722.64,724.5,722.19,722.78 +722.88,723.77,720.0,722.38 +723.11,724.31,721.86,723.2 +723.22,724.01,722.5,723.51 +723.59,725.0,722.67,724.25 +724.25,724.91,722.5,724.9 +724.9,727.64,723.49,727.37 +726.92,727.46,725.14,726.72 +727.37,727.59,724.69,727.27 +727.43,728.99,726.71,728.99 +728.68,731.0,727.15,730.0 +730.0,731.98,729.24,731.25 +731.25,734.14,731.24,734.14 +734.13,745.0,733.33,744.41 +744.36,745.88,740.55,743.73 +743.73,745.65,741.61,744.12 +744.13,746.16,743.5,744.2 +744.2,744.46,742.0,742.73 +742.7,744.1,735.03,742.62 +742.65,745.26,740.75,742.23 +742.23,743.5,738.65,738.67 +738.66,739.13,728.03,735.22 +735.08,737.16,731.58,733.9 +736.205,737.92,732.47,737.61 +737.33,739.28,736.48,738.22 +738.74,741.88,738.11,738.67 +738.66,739.85,737.8,738.0 +738.12,738.12,728.09,733.12 +733.12,733.49,730.01,732.21 +732.37,732.59,705.71,719.85 +719.51,719.52,706.57,710.0 +709.99,715.0,707.81,710.16 +710.16,710.6,672.06,697.16 +697.3,714.97,694.52,711.18 +711.02,712.43,693.69,697.0 +697.0,701.22,686.83,696.43 +696.43,696.43,675.0,684.93 +684.24,690.32,684.24,689.47 +689.47,702.96,683.8,701.33 +701.33,704.51,699.64,703.96 +703.83,705.0,702.85,704.26 +704.27,704.5,702.92,703.99 +703.99,703.99,702.33,702.42 +703.12,705.0,702.43,704.45 +698.4100000000001,704.48,692.8,693.7 +693.7,704.49,692.83,703.82 +703.81,706.0,703.81,706.0 +705.99,706.87,705.07,706.665 +705.25,708.25,705.24,707.33 +707.39,708.33,705.5,706.97 +706.97,706.99,701.04,702.18 +702.93,706.99,702.93,706.31 +706.15,706.71,695.1,695.1 +695.31,699.26,688.85,699.26 +699.26,700.0,689.98,690.41 +690.89,693.79,689.96,693.08 +693.86,695.04,692.41,693.98 +694.0,699.54,691.23,698.39 +698.3,700.31,697.45,699.53 +699.21,699.97,696.42,697.37 +697.22,705.66,697.21,705.65 +705.65,706.47,704.29,706.47 +706.23,706.61,704.89,705.9 +705.9,705.9,703.07,704.9 +704.89,705.06,697.72,705.03 +705.03,705.69,703.41,704.12 +704.1,704.75,703.09,704.04 +704.04,704.77,703.04,703.04 +703.05,704.61,702.83,704.59 +704.43,704.61,703.3,704.42 +704.29,706.46,704.29,706.12 +706.12,706.47,704.56,706.47 +706.29,707.99,706.14,707.99 +707.99,707.99,704.0,705.39 +705.36,705.87,704.57,705.28 +705.28,705.57,701.0,702.44 +702.44,704.28,701.7,704.28 +704.27,706.16,703.56,705.59 +705.76,707.17,705.0,706.93 +706.9,707.67,705.37,707.34 +707.34,707.99,706.83,707.51 +707.52,707.52,706.06,706.76 +706.76,707.99,705.79,706.98 +706.99,706.99,706.65,706.99 +706.99,707.11,705.92,706.7 +706.79,707.0,706.79,707.0 +707.0,707.99,706.1,706.85 +706.84,707.99,706.84,707.98 +707.98,708.99,707.97,708.99 +708.99,716.86,708.97,716.7 +716.71,719.05,716.7,718.01 +718.07,719.32,717.87,719.1 +719.1,719.83,717.7,718.45 +718.47,719.0,716.84,717.09 +717.1,718.25,717.09,718.25 +718.01,718.7,716.42,716.42 +716.73,716.73,714.17,716.07 +716.04,717.89,715.84,715.3 +716.16,716.48,714.17,714.53 +714.53,714.53,710.43,712.57 +712.5,712.5,706.89,707.23 +707.21,708.62,705.86,705.87 +705.92,710.78,705.87,710.6 +710.36,712.0,708.21,710.49 +709.83,711.69,709.01,711.11 +711.07,712.47,709.88,711.99 +711.99,712.35,710.97,712.11 +712.07,715.0,711.08,715.0 +715.0,719.0,714.33,718.44 +718.44,718.44,712.13,714.12 +714.26,715.47,707.54,709.44 +709.59,709.69,705.06,708.72 +708.72,710.99,708.35,710.93 +710.52,710.97,708.41,708.47 +708.85,710.2,708.42,710.1 +709.95,710.99,709.31,709.58 +709.57,710.83,708.46,710.43 +710.41,711.42,710.41,711.07 +711.07,711.42,710.82,710.96 +710.97,710.99,705.5,705.99 +705.99,707.91,704.25,707.71 +707.71,707.71,705.8,706.22 +707.74,708.95,705.8,707.77 +707.77,707.84,701.35,702.35 +702.34,704.3,701.92,703.99 +704.28,706.0,702.56,706.0 +705.95,708.15,705.15,706.4 +706.19,708.9,705.87,707.32 +707.28,707.38,705.99,707.08 +707.12,707.81,705.97,707.81 +707.81,707.99,706.45,707.08 +707.09,707.95,705.93,707.42 +707.41,707.99,707.18,707.62 +707.28,707.6,706.0,706.29 +706.41,707.16,706.0,706.87 +706.99,707.99,706.91,707.98 +707.97,709.69,707.97,709.69 +709.69,711.64,707.99,709.52 +709.56,709.56,707.85,708.1 +707.97,708.63,706.84,707.18 +707.03,707.16,704.16,705.13 +705.27,706.06,704.33,704.59 +704.55,705.31,704.31,705.2 +705.29,706.58,704.51,705.47 +705.47,706.7,705.47,706.39 +706.33,706.39,705.62,706.2 +706.0,709.0,705.41,709.0 +709.0,710.0,708.92,709.95 +709.86,716.45,709.86,713.58 +713.57,713.64,711.53,711.87 +711.86,712.97,710.28,710.75 +710.92,711.21,710.1,710.44 +710.71,712.98,710.35,712.96 +712.96,712.97,710.38,710.92 +711.07,712.45,710.05,711.8 +711.49,712.6,711.49,712.05 +712.07,714.99,711.78,712.29 +712.29,713.11,710.5,711.87 +712.06,712.85,711.0,711.01 +711.01,711.02,710.05,710.99 +710.99,722.39,710.98,722.08 +722.02,732.99,722.01,729.87 +729.87,737.86,725.01,737.28 +737.28,745.68,736.51,745.68 +745.67,747.26,732.43,736.51 +736.5,743.9,736.36,742.78 +742.78,742.99,741.53,742.87 +742.88,742.99,737.69,739.85 +740.11,740.87,738.2,740.39 +740.33,740.66,736.75,737.16 +737.45,737.45,725.0,727.46 +727.73,728.67,722.0,724.24 +724.18,728.58,721.98,722.17 +722.11,724.2,721.42,724.2 +724.2,728.0,724.2,727.4 +727.4,727.98,723.69,725.1 +725.1,726.51,723.33,723.89 +723.6,724.6,722.41,724.24 +724.18,724.4,721.61,722.06 +722.03,722.06,715.8,716.46 +716.28,720.0,716.0,719.9 +719.89,722.0,719.8,721.99 +721.99,723.61,721.08,721.83 +721.85,721.99,716.0,720.98 +720.98,721.86,718.03,718.61 +718.45,720.72,718.45,719.24 +719.31,719.52,714.52,717.28 +717.65,718.08,715.8,718.08 +718.08,718.65,714.81,717.12 +716.89,718.0,715.61,718.0 +717.87,719.4,717.83,717.75 +718.55,718.93,717.39,717.5 +717.5,717.76,716.05,717.48 +717.61,718.57,717.32,717.96 +717.56,718.2,714.81,715.48 +715.34,716.08,713.11,713.12 +713.25,714.26,712.0,713.72 +713.85,715.24,712.64,713.19 +712.89,714.21,712.73,714.21 +714.22,714.44,710.2,710.41 +710.41,712.89,708.0,708.9 +708.53,710.25,707.18,708.17 +708.16,710.01,707.0,708.27 +708.28,710.0,705.84,710.0 +710.0,711.6,708.3,711.6 +711.64,713.0,711.13,713.0 +712.99,718.99,712.83,715.91 +715.97,716.56,714.74,715.85 +715.84,715.86,714.37,714.64 +714.64,715.69,712.55,712.6 +712.6,715.48,712.53,713.48 +713.71,713.74,712.5,712.53 +712.83,713.1,712.51,712.91 +713.05,715.15,712.88,715.06 +714.87,715.04,713.62,713.74 +713.74,715.69,713.63,715.42 +715.39,715.76,715.13,715.3 +715.31,715.92,714.49,715.92 +715.93,716.0,714.87,715.43 +715.4,716.99,715.4,716.96 +716.8,717.98,716.8,717.46 +717.46,717.46,713.09,713.93 +713.98,714.98,713.32,714.96 +714.97,716.96,714.01,714.01 +714.87,715.9,713.61,713.61 +713.72,715.96,713.5,715.45 +715.4,716.0,714.32,715.13 +715.13,715.5,714.01,715.5 +715.5,716.67,715.17,715.71 +716.26,716.97,714.06,716.75 +716.76,716.99,715.76,716.89 +716.95,716.99,716.49,716.72 +716.7,716.98,714.3,716.04 +715.93,716.87,715.56,715.94 +716.08,716.65,715.18,716.04 +716.05,716.06,714.14,715.13 +715.14,715.48,714.01,715.48 +715.48,715.79,714.51,714.92 +714.93,715.73,714.05,714.23 +714.21,714.48,706.2,706.21 +706.2,708.27,706.01,707.75 +707.78,709.74,707.45,709.5 +709.53,709.76,709.21,709.24 +709.24,709.24,706.4,706.91 +706.91,707.16,705.47,706.9 +706.91,708.76,706.13,706.72 +706.69,708.23,706.57,707.96 +707.96,708.52,704.96,706.67 +706.78,706.78,703.63,704.63 +704.59,705.9,703.01,705.9 +705.9,705.98,704.05,704.4 +704.37,704.99,702.42,704.99 +704.99,705.99,704.0,704.18 +704.18,705.22,703.47,704.98 +704.98,704.98,697.79,697.79 +697.81,698.0,693.39,696.55 +696.61,698.91,694.73,697.47 +697.46,697.52,693.49,694.38 +694.92,695.1,693.43,694.42 +694.41,694.42,691.5,691.93 +691.93,693.88,691.11,693.35 +692.95,694.42,692.51,694.26 +694.42,696.35,694.41,696.35 +696.22,696.22,693.67,694.4 +695.13,694.71,693.71,693.9 +694.04,695.0,694.04,694.99 +695.0,695.0,693.85,693.85 +693.86,694.04,690.0,690.47 +690.49,690.49,685.95,688.67 +688.16,698.83,685.7,697.84 +697.53,703.05,697.21,700.97 +700.96,701.0,699.87,700.99 +700.99,701.0,700.98,701.0 +701.0,702.5,700.62,702.23 +701.84,704.36,701.84,704.11 +704.04,705.94,702.84,704.71 +704.71,704.99,703.87,704.3 +704.29,704.3,703.26,704.09 +704.16,704.17,701.0,703.48 +703.35,704.31,703.09,704.0 +704.0,704.99,704.0,704.99 +704.99,705.28,704.62,705.28 +705.28,705.5,704.46,705.32 +705.27,705.49,703.93,705.22 +704.88,705.16,704.13,704.73 +704.79,705.19,704.21,705.03 +704.7,705.89,704.23,705.89 +705.89,705.99,704.65,705.99 +705.96,705.99,703.01,703.98 +703.75,703.85,701.08,701.08 +701.08,701.44,699.59,699.9 +700.09,700.09,695.61,696.51 +696.46,700.0,695.07,698.44 +697.92,701.46,697.5,700.92 +700.52,701.56,698.0,700.03 +700.02,702.68,699.3,700.33 +700.43,703.62,698.61,700.96 +700.89,701.48,700.27,701.48 +701.47,708.18,701.47,707.48 +707.48,708.0,706.12,706.96 +706.95,708.57,706.38,707.08 +707.28,708.64,671.23,704.19 +704.18,707.13,703.45,706.9 +706.9,708.89,706.24,707.73 +707.73,712.06,706.54,709.71 +710.23,711.99,709.8,710.8 +710.58,710.95,709.14,710.48 +710.48,711.54,707.55,710.24 +710.12,711.65,708.51,710.2 +710.75,712.33,709.83,710.54 +711.15,712.32,710.57,710.905 +711.76,712.24,709.73,711.27 +711.1,711.9,709.3,710.56 +710.65,711.64,709.35,709.48 +709.42,712.14,708.5,711.05 +711.05,712.0,709.48,710.42 +710.38,712.0,708.04,709.29 +708.63,711.1,708.28,710.96 +710.99,712.27,709.71,711.57 +711.46,713.48,710.92,713.48 +713.47,713.79,710.24,713.56 +712.77,714.5,712.51,714.5 +714.49,716.3,714.49,715.31 +715.25,715.26,709.33,712.25 +712.23,712.72,710.61,712.03 +712.05,714.11,711.2,712.37 +712.34,712.9,710.59,711.95 +711.95,712.9,711.01,712.6 +712.61,712.89,710.0,710.08 +710.07,712.19,710.07,711.36 +711.36,713.0,711.12,712.99 +712.99,713.99,711.02,711.46 +711.47,713.45,711.47,713.11 +713.26,714.5,713.17,714.42 +714.41,715.37,713.12,714.0 +713.85,714.97,712.81,713.64 +713.71,714.46,712.88,714.19 +714.14,714.14,710.76,712.35 +712.53,743.8,712.41,740.29 +740.29,740.4,729.05,734.44 +734.37,734.67,725.92,730.1 +730.1,730.32,717.55,728.73 +729.1,732.0,724.89,726.19 +726.19,730.74,725.02,729.99 +729.99,738.88,729.3,737.66 +736.44,740.5,731.7,736.73 +736.87,739.42,731.1,736.23 +736.23,739.0,735.01,738.25 +735.39,739.0,732.3,736.5 +736.51,740.0,729.01,738.59 +738.58,739.78,734.42,737.84 +737.84,739.8,735.02,739.38 +739.39,740.0,738.05,739.99 +739.99,741.48,739.73,741.48 +741.24,744.43,740.3,743.0 +742.91,749.0,742.87,748.8 +747.22,748.32,742.0,748.0899999999999 +744.87,749.0,744.58,747.38 +747.46,748.0,743.1,744.02 +744.02,750.01,744.02,749.98 +749.85,749.85,744.68,747.38 +747.33,747.34,739.13,746.665 +740.58,748.5,740.58,745.95 +746.11,748.0,744.05,746.08 +745.19,745.57,741.39,743.51 +743.56,745.99,742.0,745.09 +745.24,746.0,742.58,744.05 +744.5799999999999,744.39,743.33,741.2149999999999 +743.92,743.92,738.0,738.38 +738.38,742.88,738.37,742.41 +742.42,742.53,739.89,739.89 +739.9,739.9,739.0,739.01 +737.6825,739.3,736.18,737.45 +735.4649999999999,738.13,729.24,733.44 +733.2475,731.17,728.89,729.43 +731.03,735.61,730.73,734.03 +734.34,738.48,733.48,738.48 +737.91,738.83,734.79,738.83 +738.83,740.0,736.92,738.14 +738.99,740.0,736.68,740.0 +739.56,740.0,735.27,738.2 +738.27,740.0,738.14,740.0 +740.0,743.27,739.9,744.9549999999999 +743.27,749.99,743.26,749.91 +745.4649999999999,749.8,747.06,747.66 +747.66,749.09,745.28,748.58 +748.61,749.58,747.26,748.16 +749.37,751.0,748.52,750.66 +750.64,750.64,746.55,747.46 +747.46,749.23,745.3,745.32 +746.26,746.66,742.72,745.11 +745.07,746.94,739.1,740.55 +740.54,744.24,737.0,744.24 +744.24,744.99,742.02,743.93 +743.89,746.31,742.02,745.94 +745.95,746.73,741.03,741.64 +742.08,749.82,741.47,749.7 +749.69,749.69,743.99,748.26 +748.22,748.22,744.0,747.0 +746.84,748.3,746.07,747.67 +747.56,748.3,746.02,747.63 +747.63,748.3,746.84,748.24 +748.28,749.06,748.04,748.85 +748.6,748.85,748.02,748.83 +748.85,748.85,748.05,748.68 +748.68,751.26,748.68,751.26 +751.25,751.62,738.0,745.91 +745.9,747.44,744.73,747.24 +747.11,747.44,746.53,746.9 +746.85,747.44,746.61,747.44 +747.23,749.11,747.1,749.04 +748.81,749.96,748.45,749.14 +749.02,749.14,747.9,748.68 +748.69,750.12,747.56,749.99 +750.0,752.3,749.5,749.94 +749.94,752.0,748.01,751.59 +751.72,751.81,748.3,750.21 +750.16,751.71,747.1,751.0 +751.0,751.62,745.32,747.88 +747.88,750.6,747.43,750.55 +750.6,750.61,748.31,750.08 +750.08,750.98,749.32,750.87 +750.83,753.81,750.82,753.81 +753.81,753.81,751.5,752.42 +752.42,753.0,750.22,752.85 +752.85,753.0,750.74,751.93 +751.91,752.05,750.22,752.03 +751.84,752.99,749.51,750.5 +750.51,751.16,748.42,749.6 +749.59,751.67,748.21,750.73 +749.9,750.99,749.02,750.2033333333334 +750.81,751.0,748.92,749.6766666666666 +750.19,751.11,748.4,749.15 +749.595,749.82,748.4,749.0 +749.0,749.83,747.95,748.76 +748.76,748.97,733.65,738.71 +738.62,740.46,728.89,733.18 +733.18,734.55,727.34,729.92 +729.92,733.83,726.61,732.58 +732.58,732.58,725.0,725.2650000000001 +729.23,729.3,715.0,717.95 +717.95,730.5,715.26,728.62 +728.63,729.34,727.55,727.96 +727.96,728.0,725.6,728.0 +728.0,731.0,727.99,731.0 +731.0,733.33,730.33,733.33 +733.42,733.55,732.3,733.19 +732.84,732.87,730.71,732.51 +732.51,734.0,732.23,732.87 +732.87,732.87,731.25,732.24 +732.23,732.28,730.0,731.7 +731.38,732.45,730.47,731.55 +731.41,734.5,730.53,734.49 +734.5,735.51,733.8,733.83 +733.83,735.7,733.83,735.22 +735.23,735.69,734.53,735.41 +735.25,735.5,733.45,735.12 +735.11,735.11,732.26,733.07 +733.06,735.09,732.8,734.9 +734.75,737.36,734.55,736.81 +736.81,737.65,735.0,735.0 +735.0,735.98,734.13,735.98 +735.91,735.99,732.82,735.3 +735.21,737.94,734.74,737.41 +737.43,738.28,736.16,737.71 +737.7,738.47,736.51,737.08 +737.12,737.99,736.49,736.62 +736.62,737.99,735.11,736.89 +736.88,737.99,735.5,736.37 +736.02,736.68,735.03,736.26 +736.25,736.46,732.91,734.22 +734.22,735.42,727.85,729.07 +729.06,730.59,726.45,728.97 +729.0,731.88,726.38,731.88 +731.88,736.7,731.03,736.29 +736.21,736.61,733.95,735.28 +735.28,735.38,732.52,734.89 +734.41,737.48,734.41,737.03 +737.05,737.47,735.91,736.21 +736.21,737.24,734.55,737.19 +737.19,737.8,736.78,737.72 +737.72,737.94,737.06,737.89 +737.89,737.89,736.07,736.97 +736.88,737.27,735.84,737.19 +737.17,748.29,736.65,745.01 +745.01,747.77,744.0,746.99 +746.48,746.72,744.22,745.79 +745.79,746.0,740.0,743.0 +743.05,748.66,743.05,746.65 +746.57,747.59,742.87,747.3 +747.3,748.56,745.5,747.94 +747.9,748.11,745.99,746.91 +746.69,748.77,742.88,747.1 +746.91,747.12,746.13,747.05 +747.05,747.12,744.54,746.9 +747.04,747.11,745.61,746.62 +746.61,747.11,744.0,746.39 +746.39,746.75,742.55,745.77 +745.96,746.55,742.03,742.03 +742.24,744.51,741.0,744.08 +744.1,746.07,742.62,744.74 +744.73,745.58,743.27,745.49 +745.5,745.85,740.0,740.69 +740.69,740.75,739.5,739.92 +739.94,740.06,737.28,737.28 +737.28,740.27,737.0,740.14 +740.11,743.63,739.85,743.4 +743.56,744.03,743.02,743.63 +743.66,743.78,738.27,739.07 +739.28,741.26,739.0,741.26 +741.26,742.1,734.0,734.84 +734.84,742.0,734.84,738.84 +738.86,739.99,736.71,738.94 +738.84,739.33,737.19,739.24 +739.25,741.99,739.22,741.32 +741.32,741.99,738.46,740.44 +740.42,741.62,739.56,740.98 +740.97,741.99,740.97,741.95 +741.94,743.0,741.94,743.0 +743.0,743.99,742.99,743.26 +743.26,743.8,743.34,743.52 +743.52,743.76,741.1,741.73 +741.73,741.77,740.8,741.4 +741.39,741.39,740.19,740.7 +740.57,742.0,738.58,739.14 +738.87,739.89,738.86,738.88 +739.605,740.83,738.88,740.65 +740.34,740.65,736.01,737.09 +737.49,738.34,735.0,735.93 +735.81,739.31,733.51,737.7049999999999 +738.31,739.89,737.31,739.48 +739.37,739.73,739.0,739.58 +739.51,739.56,737.14,737.33 +737.32,738.5,730.0,731.37 +731.36,734.86,727.0,734.15 +734.65,735.22,734.33,734.94 +734.89,738.2,732.88,738.2 +738.09,738.58,734.88,737.0 +736.79,737.94,734.8,737.62 +737.39,737.86,735.34,736.25 +736.22,737.35,735.45,736.98 +736.84,738.08,736.83,737.81 +737.85,737.99,736.51,736.88 +737.67,738.97,735.59,735.88 +735.88,736.42,731.6,732.78 +732.77,733.35,730.56,730.56 +730.72,730.88,729.0,730.27 +730.27,732.96,730.27,732.5 +732.44,732.95,732.15,732.85 +732.91,733.86,732.16,732.36 +732.2,732.2,730.0,730.96 +730.96,731.7,730.95,731.49 +731.49,732.55,730.03,732.33 +732.51,732.67,731.82,732.53 +732.53,732.69,732.23,732.46 +732.46,734.65,732.05,734.4 +734.39,734.83,733.99,734.7 +734.7,734.83,733.19,733.55 +733.66,736.54,733.27,735.86 +735.55,736.25,733.92,735.41 +735.41,736.64,735.13,736.64 +736.64,736.81,735.95,736.34 +736.39,737.92,732.73,737.8 +737.8,738.98,737.54,738.82 +738.88,738.99,738.33,738.99 +738.98,739.99,738.42,739.05 +739.05,739.98,738.6,739.92 +739.95,739.98,736.01,737.47 +737.5,739.93,737.49,739.81 +739.93,739.93,738.0,739.11 +738.9,738.94,737.0,738.1 +738.24,739.45,737.68,739.34 +739.24,739.91,737.58,737.74 +738.04,738.04,737.03,737.83 +737.36,738.6,737.04,738.29 +738.3,738.75,730.0,730.01 +730.01,732.53,730.01,731.36 +731.36,732.93,732.52,732.71 +732.71,733.09,730.25,732.64 +732.78,732.83,731.3,731.46 +731.79,731.84,726.47,728.74 +728.38,729.24,726.0,727.89 +727.8,734.8,727.37,734.79 +734.79,736.3,734.06,734.17 +734.17,734.9,733.03,733.87 +733.47,734.0,733.05,733.89 +733.45,734.96,733.42,734.95 +734.83,735.91,733.17,735.74 +735.65,735.96,734.08,735.96 +735.96,735.96,734.65,735.64 +735.71,735.81,734.12,734.8 +734.76,734.76,731.04,731.8 +731.79,732.0,730.0,731.38 +731.89,731.99,729.0,729.13 +729.13,731.19,728.01,728.9 +728.89,731.93,728.63,731.31 +731.65,733.7,731.31,733.7 +733.69,734.56,733.29,734.0 +734.35,734.58,733.58,734.57 +734.3,734.34,733.32,733.91 +732.9549999999999,733.9,730.17,734.9 +731.61,737.0,731.23,735.89 +735.89,737.87,735.35,735.9549999999999 +737.14,737.95,735.95,736.02 +735.97,736.38,734.83,735.97 +735.79,736.05,734.64,735.55 +735.55,735.7,734.63,734.99 +734.99,735.87,734.98,735.33 +735.44,735.69,733.93,734.53 +734.15,735.27,733.23,733.24 +734.0,734.94,733.14,733.79 +733.78,733.99,733.0,733.0 +733.06,733.35,729.0,730.61 +730.61,731.04,728.74,730.21 +730.21,732.23,729.73,731.49 +731.51,736.44,730.18,735.53 +735.52,735.86,733.24,734.97 +734.63,735.13,731.88,731.91 +731.99,733.34,731.52,731.87 +731.52,731.77,731.01,731.32 +731.33,731.55,730.38,731.55 +731.54,734.08,731.15,732.17 +732.19,732.88,730.01,731.6800000000001 +731.16,731.93,730.58,731.19 +731.37,731.37,730.0,731.0 +731.0,733.22,731.0,731.81 +731.63,732.87,730.0,732.14 +732.26,732.8,730.0,730.01 +730.02,732.35,730.0,731.12 +731.54,732.48,730.73,732.48 +732.47,732.62,731.0,731.92 +731.9,734.1,731.01,731.57 +731.47,731.99,730.5,731.27 +731.27,731.98,729.46,731.11 +730.52,731.95,729.66,730.85 +730.85,731.43,729.5,730.1 +730.01,730.8,729.0,730.43 +729.93,730.6,729.01,730.05 +729.59,731.99,729.57,731.35 +731.14,731.99,730.8,731.99 +731.99,732.7,731.37,732.43 +732.3,732.93,730.42,731.41 +731.41,732.67,731.05,731.52 +731.48,732.29,730.37,730.82 +730.93,732.28,730.24,730.96 +730.66,731.86,730.5,731.58 +731.36,731.9,730.89,731.51 +731.51,731.85,731.03,731.31 +731.31,731.31,729.34,730.25 +730.1,731.91,729.34,729.36 +729.34,731.5,728.2,731.5 +731.51,731.98,731.12,731.93 +731.62,732.37,731.0,731.78 +731.75,733.99,731.27,733.62 +733.91,733.97,731.21,732.89 +732.76,733.99,732.5,733.64 +733.66,733.98,733.06,733.51 +733.36,733.99,732.89,733.75 +733.74,734.36,733.19,734.17 +734.09,734.27,730.0,730.43 +730.02,730.96,729.0,730.79 +730.79,732.7,730.51,732.08 +732.08,734.68,730.82,733.5 +733.5,734.56,732.09,733.39 +733.39,733.69,732.33,732.56 +732.56,733.02,732.2,732.68 +732.95,732.96,729.49,729.63 +729.9,730.88,729.5,730.26 +730.26,730.58,729.17,729.64 +729.67,734.95,729.64,734.92 +734.9,735.5,734.89,735.49 +735.49,736.89,735.48,736.64 +736.82,739.0,736.64,738.83 +738.83,741.53,738.83,741.23 +741.37,742.95,741.15,742.67 +742.68,742.85,741.45,741.45 +741.45,741.93,738.92,740.5 +740.5,741.46,739.24,741.18 +740.82,742.11,739.94,741.15 +741.18,743.26,740.77,743.19 +743.09,743.83,742.44,743.64 +743.62,744.0,742.58,744.0 +744.0,745.0,744.0,744.99 +744.99,745.0,742.51,743.5 +743.28,743.56,741.09,741.97 +741.53,742.85,741.53,742.84 +742.81,744.0,742.29,743.18 +743.05,743.56,741.88,742.71 +742.44,743.33,741.59,742.74 +742.78,744.8,742.06,744.71 +744.71,746.0,744.68,746.0 +745.99,746.8,745.7,746.63 +746.62,747.0,745.13,746.68 +746.68,747.12,745.32,747.1 +747.1,747.12,746.76,746.76 +746.98,747.12,746.76,747.12 +747.11,747.12,746.55,746.98 +746.97,748.28,746.52,748.11 +748.11,749.45,747.68,749.33 +749.33,750.0,748.47,749.41 +749.42,750.25,748.84,750.24 +750.23,751.56,749.54,750.5 +750.8,752.41,750.17,752.18 +751.82,753.0,751.23,752.05 +752.05,754.67,751.5,753.18 +753.27,754.9,753.06,754.74 +754.66,754.78,750.63,752.41 +752.46,753.98,751.68,752.98 +753.0,754.0,753.0,753.9 +753.7,754.0,753.26,753.99 +753.99,758.64,753.53,758.64 +758.63,762.9,757.67,761.87 +761.86,766.21,760.93,765.88 +765.88,767.35,764.35,766.37 +766.38,768.5,766.35,768.5 +768.5,773.0,765.6,766.78 +766.78,767.43,762.67,766.86 +766.86,767.24,765.82,767.24 +767.24,769.68,765.84,769.59 +769.59,772.5,769.59,770.73 +770.73,771.88,767.54,770.88 +770.9,772.08,767.04,768.44 +769.69,769.09,767.57,768.02 +768.48,773.62,768.48,773.62 +773.45,775.0,772.57,774.38 +774.78,780.0,768.19,768.61 +768.61,770.87,768.2,768.6 +769.34,772.49,768.02,771.78 +771.9,772.44,767.12,768.08 +768.02,768.42,765.97,768.31 +768.31,769.64,766.2,769.64 +769.63,775.0,768.63,774.51 +774.78,775.0,771.23,773.14 +773.14,773.95,768.89,769.27 +769.24,771.65,767.55,771.25 +771.18,771.92,766.56,769.41 +769.41,770.55,768.18,770.43 +770.49,771.11,768.85,769.89 +769.95,770.75,768.49,770.44 +770.44,770.44,762.3,763.65 +763.7,764.83,761.02,761.02 +761.11,761.11,759.39,759.75 +759.75,760.36,759.0,759.43 +759.42,759.64,759.0,759.64 +759.64,761.91,759.64,761.89 +761.78,765.9,761.58,765.9 +765.89,765.9,765.41,765.81 +765.81,767.32,765.74,767.04 +766.94,770.0,766.94,769.56 +769.53,769.53,763.69,764.54 +764.03,764.66,762.31,763.1 +763.1,765.76,763.0,765.76 +765.89,767.87,765.77,767.0 +767.01,768.0,766.29,767.16 +767.16,767.56,766.87,767.0 +767.01,767.01,766.0,766.55 +766.55,766.56,766.33,766.55 +766.52,766.99,766.0,766.97 +766.92,766.99,765.34,766.15 +766.15,766.69,765.67,766.5 +766.5,766.5,765.69,766.34 +766.34,766.41,765.25,766.41 +766.41,766.79,765.82,766.79 +766.78,767.22,766.06,766.06 +766.1,766.1,765.19,765.32 +765.32,765.7,763.52,764.16 +764.16,764.34,763.54,764.34 +764.35,765.62,764.27,764.31 +764.9766666666667,765.26,762.83,764.96 +765.6033333333334,767.34,764.96,766.16 +766.23,767.97,766.17,767.97 +767.97,769.76,767.65,769.76 +769.74,769.74,766.87,766.99 +766.97,768.35,766.97,768.13 +768.13,768.13,765.69,765.71 +765.71,765.99,765.7,765.99 +765.98,765.99,764.41,765.23 +765.23,765.49,764.78,765.49 +765.48,765.68,765.48,765.61 +765.62,765.62,764.71,764.99 +765.2,765.61,764.2,765.4 +765.4,767.99,765.39,767.98 +767.98,767.98,766.8,767.45 +767.45,767.61,761.46,762.08 +762.13,762.14,760.6,760.97 +760.97,761.23,760.0,760.13 +760.12,760.51,753.43,754.23 +754.27,757.11,752.21,755.84 +755.83,757.36,755.83,757.07 +756.99,758.13,755.95,757.45 +757.45,758.11,756.84,757.75 +757.65,757.93,754.26,757.92 +757.92,757.97,753.46,754.0 +754.0,754.66,749.57,752.52 +752.35,752.35,748.6,751.18 +751.18,753.3,751.15,751.58 +751.6,755.0,751.58,753.89 +753.88,754.07,752.38,753.99 +753.99,753.99,753.02,753.99 +753.98,754.99,753.45,753.62 +753.67,754.45,752.76,752.96 +752.84,753.95,752.0,753.45 +753.45,753.57,752.24,752.75 +752.83,753.99,752.13,753.95 +753.94,754.99,752.57,754.82 +754.79,754.99,752.0,752.95 +752.93,755.91,752.37,755.91 +755.91,756.97,754.4,756.58 +756.59,757.11,755.0,755.01 +755.01,757.15,755.01,756.41 +756.43,756.53,753.79,756.15 +756.15,756.25,755.0,755.39 +755.81,755.91,755.26,756.42 +755.91,756.18,755.9,757.45 +757.1949999999999,758.49,755.51,758.48 +758.48,760.09,758.48,760.09 +760.09,761.29,759.11,760.44 +760.42,761.26,760.25,760.5 +760.5,761.0,758.83,758.85 +759.04,760.0,756.99,759.77 +759.56,759.9,757.94,759.12 +759.12,761.58,758.64,760.38 +760.74,761.0,757.74,757.8 +757.79,757.8,754.64,755.42 +755.46,756.42,754.28,754.93 +754.9,758.25,754.46,757.01 +757.22,758.0,755.81,756.9 +756.9,759.15,756.5,757.29 +756.74,760.87,756.6,760.57 +760.58,760.63,759.28,760.0 +760.0,760.49,759.01,760.12 +760.12,760.99,759.89,760.99 +760.98,760.99,758.74,759.9 +759.91,760.49,758.51,759.19 +759.21,759.27,757.12,757.12 +757.13,757.13,755.1,756.12 +755.84,757.9,751.1,751.1 +751.29,754.59,750.26,753.96 +753.91,756.8,753.69,756.29 +755.96,760.99,755.92,760.81 +760.86,760.98,760.18,760.55 +760.19,761.18,760.18,761.18 +761.18,763.68,761.18,763.64 +763.65,765.0,763.1,764.92 +764.83,765.76,763.52,764.99 +764.99,765.89,763.44,765.18 +765.19,765.37,763.11,764.99 +764.99,764.99,762.21,763.66 +763.61,767.86,763.34,767.7 +767.69,768.49,767.38,768.25 +768.24,768.9,768.11,768.54 +768.49,768.61,765.58,765.58 +766.1,767.01,765.0,766.16 +766.16,766.82,763.34,764.02 +764.07,764.69,762.85,763.17 +762.93,763.8,761.83,762.88 +762.87,763.51,761.71,763.17 +763.17,763.99,763.04,763.77 +763.78,765.76,763.78,765.68 +765.68,766.01,763.66,763.87 +763.87,764.41,762.75,763.69 +763.55,766.01,763.53,765.53 +765.76,766.01,765.37,766.01 +766.01,767.59,766.0,767.28 +767.28,768.98,767.06,768.95 +768.95,771.55,768.95,771.14 +770.99,771.26,769.0,771.26 +771.04,772.53,770.34,772.52 +772.34,772.82,770.8,771.59 +771.59,772.74,770.75,772.43 +772.43,772.75,771.18,771.75 +772.0,772.2,769.75,769.87 +769.88,771.43,769.71,771.43 +771.3,772.44,770.11,771.5 +771.5,772.75,771.16,771.24 +771.4,771.51,770.24,771.35 +771.35,771.35,767.84,769.31 +769.31,769.6,765.83,768.09 +768.09,769.54,768.09,769.45 +769.51,769.56,769.11,769.48 +769.47,769.47,766.82,767.57 +767.6,768.55,766.94,768.55 +768.54,768.55,768.52,768.54 +768.55,768.93,766.83,767.48 +766.87,768.03,765.97,767.31 +767.22,770.1,767.22,770.05 +770.05,770.97,768.36,769.71 +769.71,771.99,769.67,771.99 +772.0,772.0,769.32,770.12 +770.13,771.36,769.24,770.51 +770.5,772.23,769.86,771.35 +771.3,772.87,771.1,772.02 +772.02,772.6,771.89,772.47 +772.46,772.5,769.51,769.67 +769.51,771.28,768.73,770.75 +770.75,771.58,770.11,771.2 +771.2,771.65,770.81,771.28 +771.25,771.62,768.92,769.47 +769.46,771.28,768.86,770.98 +770.98,771.95,769.97,771.88 +771.88,772.0,770.66,771.56 +771.56,773.4,771.51,773.33 +773.32,774.88,772.81,774.23 +774.05,774.9,773.57,774.64 +774.63,774.89,774.51,774.89 +774.89,774.99,774.81,774.98 +774.98,774.99,772.11,772.14 +772.12,774.0,772.0,773.8 +774.0,774.2,772.28,772.86 +772.86,773.36,770.0,772.7 +772.69,773.71,771.84,773.71 +773.65,773.98,772.58,772.8 +772.8,774.35,772.67,774.35 +774.35,774.88,774.34,774.4200000000001 +774.68,774.68,773.67,774.49 +774.49,774.97,773.7,774.78 +774.78,775.0,774.54,775.0 +774.99,775.99,774.81,775.75 +775.75,775.92,774.78,775.89 +775.89,776.99,775.67,776.51 +776.5,776.5,774.0,774.44 +774.45,775.89,774.03,775.89 +775.72,776.92,775.67,776.88 +776.88,776.88,775.58,776.49 +776.39,776.78,776.09,776.2 +776.2,776.24,775.54,775.55 +775.87,775.96,766.02,769.23 +769.29,770.78,769.01,770.06 +770.06,770.06,765.0,767.6 +767.6,768.44,766.76,768.33 +768.43,768.89,767.01,768.38 +768.38,768.83,767.36,767.44 +767.45,767.85,765.6,766.29 +766.44,767.05,766.44,767.05 +767.0,768.7,766.99,768.7 +768.7,770.22,768.7,769.27 +770.19,770.24,768.45,769.84 +769.84,770.02,768.98,769.64 +769.65,769.83,769.55,769.61 +769.61,769.86,768.77,768.96 +768.95,769.83,768.95,769.34 +769.33,769.8,768.16,769.4 +769.41,771.28,769.4,771.15 +771.14,771.53,771.01,771.53 +771.53,771.87,771.03,771.37 +771.37,771.39,770.98,771.39 +771.39,771.47,770.91,771.21 +771.1,771.46,770.75,770.99 +770.97,771.27,770.75,771.02 +771.02,771.18,770.76,771.09 +771.09,771.49,771.08,771.49 +771.48,771.67,771.45,771.65 +771.65,771.99,771.65,771.99 +771.99,772.47,771.88,772.28 +772.27,772.74,771.86,772.32 +772.34,772.46,771.86,772.33 +772.19,772.48,771.95,772.17 +772.21,773.18,772.04,773.11 +773.13,773.72,772.66,773.72 +773.68,775.0,773.68,775.0 +775.0,780.0,774.78,778.54 +778.55,780.0,777.93,779.71 +779.96,780.0,778.11,779.31 +779.49,780.0,778.23,779.37 +779.44,780.0,779.21,779.36 +779.37,779.78,779.36,779.68 +779.68,779.99,779.6,779.95 +779.95,782.0,779.6,780.63 +780.5,781.0,779.61,780.97 +780.97,780.97,780.0,780.24 +780.04,781.43,779.6,779.6 +779.6,780.11,778.78,779.67 +779.65,779.94,778.73,779.27 +779.27,779.48,777.32,778.81 +778.87,779.59,778.7,779.21 +779.2,788.46,778.7,788.46 +788.46,790.34,786.41,787.41 +787.38,788.24,772.76,778.22 +778.22,781.99,777.94,779.12 +779.06,779.6,778.51,778.78 +778.78,780.0,778.73,780.0 +780.0,780.0,779.14,779.18 +779.18,779.82,778.99,779.81 +779.81,780.07,779.49,779.98 +780.07,780.7,779.32,779.87 +779.88,782.64,779.87,782.61 +782.61,782.78,781.13,781.98 +781.39,781.95,780.3,780.38 +780.5,782.49,780.31,781.81 +781.93,784.09,781.62,783.98 +783.98,783.99,781.22,782.0 +782.0,782.0,778.15,780.06 +780.03,780.99,778.66,779.89 +779.78,779.78,777.0,778.14 +778.33,780.93,777.52,780.46 +780.44,782.05,780.12,781.94 +781.94,781.94,779.18,780.04 +779.81,780.16,775.0,776.79 +776.99,777.61,773.54,777.14 +777.15,778.16,774.01,775.7 +775.88,778.47,775.5,778.47 +778.47,779.99,778.31,779.99 +779.99,781.8,779.98,781.02 +781.02,781.02,778.76,780.47 +780.67,781.23,779.74,780.27 +780.16,781.48,779.63,780.98 +781.24,781.74,781.23,781.49 +781.49,781.5,780.63,780.64 +780.64,780.64,778.56,779.35 +780.665,780.92,778.47,780.78 +780.69,780.94,779.63,779.63 +779.85,780.5,778.57,778.94 +778.94,780.26,778.94,779.99 +779.98,780.0,773.82,775.99 +775.97,777.74,773.2,777.46 +777.5,777.99,776.92,777.79 +777.79,779.6,776.2,778.95 +778.94,779.99,778.5,778.97 +778.95,778.99,777.54,778.94 +778.93,779.75,777.61,778.81 +778.96,778.99,776.72,777.5 +777.16,778.6,776.6,778.48 +778.48,778.67,777.6,777.6 +777.6,778.31,777.04,778.14 +778.15,779.85,778.04,779.36 +779.36,779.99,778.05,778.8 +778.8,779.99,778.17,779.7 +779.71,779.99,779.09,779.66 +779.65,780.0,779.35,780.0 +780.0,780.0,779.15,779.77 +780.0,780.0,779.76,780.0 +779.99,780.0,778.56,779.46 +779.46,779.98,778.29,779.1 +779.13,780.0,777.84,778.25 +778.25,779.46,777.27,777.79 +777.79,778.65,777.62,778.28 +778.28,779.72,777.8,779.3 +779.2,779.7,778.53,778.6 +778.6,778.99,776.94,778.72 +778.81,779.99,777.5,777.98 +777.97,778.62,776.51,777.53 +777.52,778.35,776.22,778.25 +778.24,778.5,777.23,777.23 +777.22,777.5,775.34,775.8 +775.47,777.5,775.33,777.08 +777.06,777.13,775.0,776.28 +776.28,777.07,775.05,776.64 +776.64,777.5,775.02,777.5 +777.5,779.9,774.8,777.2 +777.21,779.48,776.95,778.77 +778.78,779.99,778.21,778.66 +778.68,781.71,777.44,781.71 +781.71,782.0,780.26,780.87 +780.79,780.99,780.23,780.42 +780.23,780.99,779.41,780.32 +780.49,780.97,779.03,780.06 +779.96,779.96,777.91,778.34 +778.34,780.99,777.97,780.99 +780.99,781.72,779.07,781.23 +781.05,781.34,778.36,780.64 +780.66,781.14,779.93,780.63 +780.85,781.57,779.75,781.3 +781.28,782.96,780.78,781.92 +781.52,782.99,780.43,780.46 +780.46,780.47,778.0,779.8 +779.79,779.99,778.5,779.69 +779.76,782.15,779.4,781.69 +781.69,782.79,780.16,781.28 +781.27,784.87,780.2,784.83 +784.66,785.0,780.03,781.46 +781.46,788.0,779.5,788.0 +787.98,788.0,785.48,786.63 +786.6,790.0,786.08,788.92 +789.27,790.53,786.35,787.62 +787.58,788.98,787.58,788.73 +788.72,788.98,787.13,788.98 +788.83,788.99,787.93,788.69 +788.69,789.5,788.28,789.5 +789.5,789.5,788.66,789.48 +789.5,789.5,787.96,788.62 +788.85,789.5,788.84,789.49 +789.5,789.99,787.96,788.53 +788.67,789.95,788.67,789.23 +788.9,789.7,788.34,788.91 +788.92,789.66,788.0,789.23 +789.39,789.79,789.04,789.41 +789.75,789.99,789.35,789.74 +789.98,790.98,789.64,790.41 +790.95,791.97,790.47,791.57 +791.83,791.83,790.55,790.99 +790.98,791.18,790.22,790.72 +790.72,790.99,790.16,790.99 +790.99,790.99,790.42,790.89 +790.89,790.99,787.7,789.9 +789.89,791.0,789.85,791.0 +790.97,791.5,790.62,791.4 +791.4,791.5,788.0,790.77 +790.77,791.68,790.44,790.63 +790.83,791.85,790.74,791.51 +791.76,791.96,790.27,790.28 +790.49,791.23,789.25,791.23 +791.23,791.23,790.6,790.98 +790.99,791.73,790.9,791.72 +791.72,791.72,791.32,791.72 +791.53,791.72,791.2,791.72 +791.38,791.72,791.03,791.72 +790.865,791.72,790.26,790.34 +790.35,790.6,788.96,788.97 +788.98,788.98,787.19,787.58 +787.58,789.97,787.58,789.1 +788.79,789.66,788.2,788.93 +788.9,790.34,788.64,789.89 +789.89,789.89,788.57,788.63 +788.63,788.89,787.81,788.58 +788.58,789.86,788.21,789.86 +789.85,790.7,789.46,790.46 +790.46,790.49,789.63,789.98 +789.99,790.96,789.85,790.95 +790.94,791.75,790.94,791.75 +791.75,794.19,791.75,793.66 +793.66,794.46,793.17,793.8 +793.68,794.31,793.46,794.31 +794.31,794.99,794.21,794.87 +794.69,794.99,794.6,794.97 +794.82,794.99,794.63,794.85 +794.9,794.99,794.56,794.87 +794.87,794.89,794.11,794.34 +794.31,794.64,794.0,794.39 +794.4,794.78,794.0,794.08 +794.26,794.63,794.0,794.15 +794.15,794.45,792.24,792.26 +792.27,792.65,791.06,791.17 +791.08,793.52,791.08,792.99 +792.99,793.0,790.89,791.92 +792.07,792.99,791.66,792.63 +792.63,792.63,790.67,790.99 +790.99,791.56,790.5,790.79 +790.79,791.11,790.01,790.51 +790.51,791.98,790.22,791.45 +791.33,791.76,790.17,790.55 +790.4,791.02,789.0,789.66 +789.67,791.3,789.01,791.18 +791.18,792.29,790.52,791.75 +791.75,792.0,790.0,790.49 +790.62,791.94,790.0,791.15 +791.1,791.14,790.0,791.07 +790.91,791.19,790.0,790.01 +790.0,790.09,789.0,790.04 +790.03,791.65,789.7,791.31 +791.5,791.65,789.2,790.905 +790.97,791.0,789.57,790.5 +790.5,791.0,789.59,790.94 +790.8,791.5,788.58,791.1 +791.07,792.0,789.51,791.4200000000001 +790.24,791.8,789.68,791.74 +791.75,792.92,789.67,791.57 +791.49,791.68,788.85,791.21 +791.03,791.68,789.66,791.22 +790.65,792.07,790.05,791.69 +791.4,792.66,790.07,792.62 +792.66,793.0,790.56,792.96 +792.96,792.99,789.88,790.3 +790.17,792.99,790.0,792.15 +792.03,793.85,791.71,793.45 +793.46,795.0,791.97,795.0 +794.99,799.21,794.99,799.02 +799.16,800.0,799.0,799.81 +799.81,803.15,799.79,802.68 +802.72,803.5,801.55,803.5 +803.5,808.5,803.27,808.5 +808.49,809.59,808.18,809.01 +809.07,809.18,808.0,808.88 +808.87,808.95,807.81,808.65 +808.65,811.47,808.55,810.5 +810.45,810.88,809.46,810.09 +809.92,810.14,809.2,809.63 +809.46,810.49,809.2,810.03 +810.08,810.4,809.19,810.39 +810.4,811.93,810.25,810.78 +810.79,817.0,810.74,816.92 +816.92,827.33,816.9,821.98 +821.74,829.46,821.16,829.0 +828.9,832.0,823.0,824.24 +824.25,825.24,822.5,823.5 +823.4,823.5,820.57,822.7 +822.7,823.9,822.0,823.58 +823.59,823.87,822.0,823.51 +823.51,825.5,822.6,825.5 +825.5,828.0,824.0,827.89 +827.24,836.32,826.23,833.12 +832.57,838.0,832.57,838.0 +838.0,838.92,835.9,836.4 +836.6,840.0,836.6,840.0 +839.99,844.99,839.99,842.0 +842.1,845.28,841.5,844.15 +844.15,845.92,843.94,843.94 +844.01,855.0,840.59,854.82 +854.81,863.39,853.53,861.29 +861.29,865.5,860.62,865.5 +865.5,875.75,865.49,872.26 +872.55,872.56,863.44,863.44 +863.44,863.44,849.01,859.17 +859.0,861.25,857.41,859.81 +859.81,863.41,859.81,862.87 +862.87,868.99,862.64,868.11 +868.11,868.11,862.97,863.79 +863.69,864.99,861.0,861.49 +861.36,864.99,861.28,862.9 +862.8,862.99,860.3,861.63 +861.58,861.98,860.0,860.33 +860.06,860.29,859.0,859.94 +859.93,862.24,859.41,860.03 +860.01,862.15,857.0,857.41 +857.4,859.16,853.6,856.68 +856.68,864.99,855.45,864.99 +864.97,889.4,864.19,887.9 +887.97,894.0,876.0,890.88 +890.88,912.88,890.02,909.15 +909.17,909.68,901.12,906.47 +906.44,908.55,891.62,895.62 +895.23,902.79,895.0,902.77 +902.77,909.76,902.77,907.88 +907.95,907.95,903.0,903.07 +903.04,904.85,902.0,904.66 +904.65,908.35,902.05,905.78 +905.73,906.94,901.27,906.14 +905.21,910.0,901.79,903.5 +904.6,907.16,901.2,904.0 +903.99,907.57,900.4,903.95 +903.9,904.0,881.11,881.11 +881.12,891.95,874.23,891.38 +891.96,897.32,888.12,896.75 +896.74,897.0,893.2,893.2 +893.46,898.65,885.42,896.93 +897.52,898.5,893.07,896.57 +896.63,907.1,896.63,904.74 +904.73,918.0,902.73,915.43 +915.44,918.5,912.84,917.33 +917.32,918.19,911.02,917.28 +917.28,917.99,911.02,914.05 +914.05,914.44,902.6,911.72 +911.72,912.04,906.0,907.25 +907.96,909.99,907.2,909.95 +909.95,913.0,909.94,912.7 +912.6,914.7,910.58,911.49 +911.5,913.74,910.55,911.15 +911.85,911.89,894.11,897.55 +898.1,906.0,898.1,902.54 +902.54,902.54,897.0,898.87 +899.41,902.51,894.47,894.48 +895.51,895.51,880.1,887.98 +887.2,891.9,882.5,883.01 +883.41,891.88,882.51,891.88 +891.88,899.96,885.0,885.7 +887.19,897.22,885.82,893.63 +893.61,899.97,891.25,898.39 +899.05,899.97,895.0,899.96 +899.68,905.75,898.86,905.39 +905.38,905.87,899.66,900.28 +900.22,900.3,883.0,886.58 +886.67,894.99,885.52,894.54 +894.51,894.59,884.16,889.3 +889.11,894.51,886.01,890.94 +891.5,891.54,886.0,887.45 +887.2,890.47,876.0,877.52 +877.52,879.98,862.62,868.47 +868.67,871.99,852.0,867.05 +867.36,878.21,865.94,873.93 +874.71,874.8,861.1,865.26 +865.26,865.26,858.42,860.51 +860.97,861.7,857.22,858.31 +858.13,858.14,851.11,854.04 +854.06,866.24,851.11,862.93 +863.1,863.1,858.56,860.21 +860.24,860.24,851.91,853.47 +853.41,864.65,852.34,864.65 +864.3,865.3,861.0,863.08 +862.59,877.0,860.71,877.0 +876.99,879.5,870.25,874.21 +874.2,876.54,868.16,873.07 +872.33,878.56,868.9,878.22 +878.24,889.66,877.59,889.48 +888.27,891.6,883.13,890.53 +891.59,897.09,886.01,888.36 +888.36,894.11,886.06,894.11 +894.11,897.4,892.86,896.69 +896.63,905.67,896.63,905.62 +905.61,908.24,900.45,905.2 +905.2,905.49,900.0,901.55 +901.5,902.29,896.0,899.92 +901.26,902.0,898.33,900.14 +900.28,902.99,895.01,902.99 +902.99,902.99,892.76,900.79 +900.35,902.74,895.01,901.32 +901.3,902.38,890.0,890.64 +890.64,896.84,890.0,891.82 +891.52,897.26,891.1,896.54 +896.48,896.5,891.9,894.03 +894.02,894.23,892.04,893.64 +893.45,901.7,892.03,901.36 +901.36,902.88,900.0,902.88 +902.88,902.95,899.35,902.25 +902.26,903.0,899.3,903.0 +902.99,903.0,902.4,902.99 +902.96,903.0,900.18,902.61 +902.74,903.0,899.9,902.71 +902.71,903.0,898.83,901.4 +900.37,902.07,895.0,895.0 +896.45,901.23,893.0,895.84 +900.27,903.0,894.51,902.19 +902.19,902.99,896.11,900.65 +901.78,902.19,898.15,900.17 +900.21,902.83,896.5,902.05 +901.96,902.05,898.58,900.0 +899.99,901.44,895.0,895.52 +896.73,899.0,895.02,899.0 +899.0,907.26,895.63,905.93 +906.0,911.93,904.99,911.93 +911.92,911.93,906.5,910.21 +909.78,911.37,904.06,910.25 +910.05,911.25,902.34,909.6 +909.44,914.72,905.0,914.72 +914.71,929.0,910.03,929.0 +928.99,930.43,927.1,928.99 +928.98,943.36,928.8,935.0 +935.0,938.19,929.3,932.97 +932.76,934.0,927.12,929.77 +931.0,935.99,928.8,933.06 +933.11,935.99,929.91,934.76 +934.76,935.89,931.25,932.17 +933.2,935.9,931.5,933.5 +934.44,935.99,920.4,928.16 +927.2,929.36,921.02,922.75 +923.06,930.24,921.01,925.5 +929.24,935.43,926.13,933.89 +934.77,938.0,930.02,936.03 +937.56,948.99,936.21,942.58 +943.42,944.0,923.95,938.76 +940.4,940.42,930.25,936.49 +935.63,944.46,929.15,942.49 +943.55,948.99,939.34,944.0 +944.18,948.99,940.89,947.34 +947.94,949.0,944.0,948.15 +948.03,950.0,944.0,947.21 +947.21,950.19,939.01,944.54 +946.58,950.93,943.0,943.75 +943.75,953.43,943.0,951.13 +951.13,964.71,949.88,964.7 +964.71,968.14,962.98,968.1 +968.11,968.5,945.15,949.7 +949.7,957.01,949.69,950.92 +952.52,955.0,950.1,953.16 +952.53,963.99,948.93,963.34 +963.35,967.0,961.43,964.64 +964.65,972.0,964.02,972.0 +972.0,973.0,964.0,972.62 +972.87,979.0,970.01,978.48 +978.5,983.46,978.0,978.0 +978.04,984.25,976.6,982.34 +982.35,988.88,982.34,984.85 +985.83,985.83,977.38,977.95 +977.96,979.38,974.98,975.7 +975.82,976.3,970.76,971.63 +971.51,982.56,970.76,980.77 +980.77,981.98,980.39,981.37 +981.43,982.72,980.0,980.0 +980.52,981.32,977.0,980.4 +980.4,981.32,974.28,979.86 +976.34,979.42,975.93,979.32 +979.31,980.99,977.02,980.03 +980.03,981.03,977.2,978.45 +978.2,979.95,968.4,968.69 +969.26,969.5,965.0,968.26 +968.26,970.77,961.74,965.48 +964.63,968.0,964.3,967.99 +967.98,968.52,952.6,954.02 +954.01,964.21,950.5,963.86 +963.31,963.31,955.3,960.41 +960.41,966.05,958.13,966.05 +966.05,970.0,963.03,969.91 +969.91,974.0,966.9,974.0 +974.17,978.77,965.87,969.07 +968.97,969.92,966.04,967.69 +967.26,969.89,966.68,968.37 +968.01,969.89,966.48,969.5 +969.51,969.51,954.28,955.49 +954.72,959.32,950.01,959.32 +959.25,959.37,949.0,953.3 +953.22,956.09,949.16,954.8 +954.81,957.54,949.25,949.25 +949.28,951.0,945.0,946.52 +946.17,950.05,933.33,933.96 +933.99,942.54,930.3,938.94 +939.31,951.0,938.42,951.0 +951.0,953.05,944.89,947.28 +947.28,956.83,944.1,953.04 +953.04,955.32,948.02,950.47 +950.5,961.72,949.3,961.55 +961.52,966.78,957.05,960.67 +960.95,965.11,959.76,963.76 +963.74,966.69,955.91,961.45 +961.45,964.72,958.0,959.13 +959.34,962.37,958.68,960.73 +960.55,960.99,951.15,955.05 +954.95,964.96,954.95,964.42 +964.41,964.54,960.34,961.88 +962.02,963.64,956.61,957.64 +957.64,958.45,952.03,954.0 +954.0,958.56,949.8,949.81 +949.81,955.88,949.0,954.67 +954.62,954.99,950.65,952.37 +953.27,955.49,952.1,953.83 +953.82,961.85,952.07,961.66 +961.67,962.62,958.65,961.61 +961.66,964.18,961.54,962.93 +963.51,964.1,956.97,960.0 +960.0,960.0,956.03,956.03 +956.03,956.13,952.09,952.94 +952.95,960.0,952.95,959.99 +960.0,960.1,957.02,958.93 +958.93,959.71,958.09,959.29 +959.3,963.5,959.29,962.0 +962.18,964.0,962.17,964.0 +964.0,967.49,963.99,966.4 +966.41,969.0,966.21,968.45 +968.67,968.87,963.85,963.85 +964.65,966.99,963.67,966.99 +966.99,968.9,966.81,968.35 +968.34,971.53,967.62,971.0 +971.0,973.4,967.62,973.38 +973.38,973.39,969.9,970.62 +970.57,972.0,968.21,971.14 +971.95,971.99,967.0,968.52 +968.53,969.47,967.25,967.99 +968.0,968.12,965.15,965.15 +965.12,967.0,964.37,966.53 +966.64,970.56,964.54,969.24 +969.69,970.23,968.48,968.96 +968.96,969.58,968.11,968.64 +968.76,971.55,968.76,971.55 +971.5,974.99,971.5,974.99 +974.98,975.0,974.98,975.0 +974.99,975.0,974.01,974.99 +974.51,977.99,974.51,977.99 +977.99,979.99,977.58,979.99 +979.99,980.62,979.01,980.62 +980.62,994.97,977.63,994.78 +994.78,994.8,993.0,994.6 +994.6,999.68,994.56,995.97 +995.55,996.5,993.7,996.03 +996.03,1000.0,995.83,999.9 +999.29,1000.0,990.0,992.02 +992.04,998.99,991.0,998.08 +998.1,998.74,986.86,992.99 +992.99,997.99,992.99,996.05 +996.41,997.99,990.52,997.98 +997.98,1006.05,997.39,1005.09 +1005.02,1011.78,1000.01,1008.15 +1007.17,1010.0,1005.43,1010.0 +1010.0,1012.0,1000.0,1004.5 +1003.6,1010.99,1003.56,1010.94 +1010.93,1012.99,1007.35,1012.97 +1012.97,1013.0,1005.7,1008.87 +1008.94,1015.0,1008.94,1015.0 +1014.99,1019.1,1010.65,1017.05 +1018.02,1024.95,1016.51,1024.76 +1024.77,1025.0,1021.7,1024.99 +1025.0,1025.0,1005.3,1015.67 +1015.68,1024.82,1014.78,1023.4 +1023.47,1028.0,1015.05,1027.5 +1027.5,1034.39,1023.2,1029.76 +1029.78,1029.98,1015.81,1026.63 +1026.63,1026.66,1018.0,1018.55 +1018.36,1019.41,997.2,998.01 +998.01,1014.45,991.69,1013.0 +1013.0,1017.79,1006.6,1014.65 +1013.78,1019.67,1011.31,1013.22 +1013.28,1019.99,1009.29,1010.03 +1010.82,1023.3,1010.12,1022.31 +1021.59,1022.29,1012.61,1022.645 +1022.1533333333333,1023.0,1012.9,1022.98 +1022.7166666666667,1029.85,1016.65,1022.95 +1023.28,1024.1,1017.42,1022.4 +1022.33,1027.93,1015.03,1022.21 +1022.66,1023.46,1007.77,1008.13 +1009.16,1019.79,1006.71,1018.21 +1018.21,1019.8,1010.0,1013.38 +1013.38,1019.3,1010.0,1013.44 +1013.22,1019.04,1009.08,1017.72 +1017.72,1023.95,1016.92,1020.0 +1020.0,1025.75,1017.0,1017.95 +1018.94,1020.0,1013.5,1014.63 +1015.94,1019.0,1012.73,1014.0 +1013.71,1019.78,1010.3,1016.79 +1016.79,1018.56,1015.78,1017.79 +1018.395,1020.0,1016.8,1019.99 +1020.0,1026.43,1019.91,1022.88 +1022.89,1024.0,1014.0,1022.93 +1022.92,1027.83,1019.07,1027.77 +1027.82,1028.51,1020.0,1024.49 +1024.42,1032.0,1022.86,1028.22 +1028.31,1036.99,1018.0,1023.21 +1023.21,1039.33,1022.53,1031.605 +1036.79,1040.0,1036.77,1040.0 +1040.0,1047.99,1039.41,1043.25 +1043.25,1047.82,1043.25,1046.95 +1046.95,1054.97,1045.98,1052.19 +1052.17,1065.0,1051.58,1061.22 +1061.05,1063.44,1055.65,1063.44 +1063.52,1065.0,1058.57,1061.75 +1061.59,1065.0,1057.85,1058.9 +1058.9,1070.0,1058.9,1070.0 +1069.99,1083.95,1069.99,1083.94 +1083.94,1090.0,1075.15,1081.24 +1081.21,1096.68,1081.21,1094.98 +1094.98,1095.66,1080.01,1090.0 +1090.0,1094.8,1065.0,1093.49 +1093.5,1094.49,1085.51,1091.77 +1091.74,1107.75,1090.33,1104.62 +1104.14,1140.0,1102.08,1137.82 +1139.98,1147.0,1131.09,1139.5 +1139.5,1139.5,1110.01,1135.95 +1136.0,1136.5,1067.0,1089.0 +1088.96,1110.0,1080.49,1090.64 +1090.64,1143.89,1090.64,1141.1 +1141.37,1142.3,1120.34,1129.93 +1131.1,1133.06,1080.0,1103.66 +1101.03,1125.0,1076.12,1122.0 +1121.99,1137.0,1110.0,1137.0 +1136.85,1141.66,1125.86,1141.66 +1141.66,1157.97,1141.65,1154.17 +1154.18,1175.0,1150.01,1157.44 +1158.43,1174.9,1150.0,1158.34 +1158.34,1172.13,1153.39,1166.32 +1164.29,1166.62,1130.3,1130.3 +1131.09,1133.53,1035.52,1081.75 +1081.7,1114.17,1077.68,1092.99 +1093.0,1116.4,1079.26,1095.0 +1089.91,1096.17,965.0,985.49 +976.12,1000.0,880.0,952.23 +952.23,969.92,940.06,951.94 +954.89,1004.93,953.93,991.0 +991.1,1008.9,946.51,970.99 +970.99,977.0,958.55,977.0 +977.0,999.0,977.0,988.43 +988.43,991.32,955.77,966.01 +966.01,980.71,961.87,974.89 +974.89,974.89,961.84,972.87 +972.86,1020.99,970.01,1020.74 +1020.99,1023.48,982.0,1005.0 +1004.99,1027.59,1004.99,1024.85 +1024.82,1033.85,1010.0,1016.11 +1016.09,1016.15,960.1,965.07 +965.07,986.98,965.07,972.465 +972.53,984.4,970.9,979.86 +979.99,988.5,972.58,983.13 +980.8,987.58,975.24,987.0 +985.75,988.5,964.0,964.0 +964.01,968.08,955.0,965.22 +965.28,969.14,904.71,929.5 +929.0,944.18,910.0,925.0 +925.0,929.04,875.01,882.88 +882.84,902.0,875.01,902.0 +902.0,913.07,885.87,902.27 +902.28,918.64,882.26,917.25 +917.27,922.79,910.01,918.99 +918.99,919.99,895.63,909.99 +909.99,917.24,905.0,907.0 +908.09,910.45,880.46,886.26 +887.16,908.03,881.61,885.0 +886.72,892.19,880.0,888.04 +888.04,911.14,887.39,898.64 +898.34,898.34,885.1,889.84 +889.84,898.0,881.0,897.52 +897.42,905.0,890.11,894.67 +894.67,905.21,874.29,874.29 +874.3,874.3,802.07,853.84 +853.84,857.26,815.36,842.59 +841.97,847.0,818.09,846.33 +846.35,868.09,831.36,846.58 +843.18,858.24,835.06,845.23 +845.22,853.07,835.21,838.08 +838.15,844.39,822.46,828.45 +828.42,900.0,825.86,881.13 +881.13,886.04,875.52,881.17 +884.07,893.22,876.0,892.0 +891.99,898.11,882.35,887.8 +887.9,887.9,860.21,876.94 +876.94,896.84,876.94,890.02 +890.1,898.25,889.0,898.25 +898.25,908.22,897.95,902.9 +902.89,906.99,900.08,906.99 +906.87,910.0,885.9,904.94 +904.01,904.99,895.0,896.26 +896.26,903.91,895.42,899.0 +899.0,900.83,895.0,898.08 +898.08,910.0,898.08,901.01 +901.01,909.0,899.16,908.55 +908.55,910.0,899.16,905.14 +905.0,905.99,902.01,905.99 +905.99,930.0,903.99,928.16 +927.52,932.23,920.07,932.18 +932.18,948.99,928.32,947.46 +947.35,953.8,931.65,943.53 +943.21,952.59,938.84,946.75 +946.99,948.2,914.57,929.95 +929.94,938.97,927.8,936.24 +935.03,943.26,934.38,937.17 +936.71,939.72,930.99,938.4 +938.39,940.05,913.18,918.98 +918.93,924.31,916.21,918.79 +918.79,943.84,918.01,925.15 +924.69,933.73,920.0,922.37 +922.39,922.51,906.5,914.69 +914.95,917.5,904.1,905.01 +905.0,914.7,899.5,914.7 +914.06,917.95,913.21,915.0 +914.96,914.96,908.99,913.01 +913.72,917.99,910.0,917.99 +917.98,923.84,915.01,916.23 +916.43,923.53,915.99,922.04 +922.45,923.58,911.0,919.15 +919.15,919.15,895.0,896.89 +896.89,908.43,887.8,890.57 +891.13,904.41,887.73,899.0 +899.0,899.0,894.47,898.98 +898.98,899.0,887.51,899.0 +898.99,901.22,896.66,900.5 +900.49,901.98,898.99,898.99 +898.99,898.99,889.0,891.63 +891.63,896.0,890.01,890.99 +894.24,894.24,886.42,890.35 +890.5,908.05,890.49,906.18 +906.19,908.04,903.9,906.03 +906.72,908.0,904.56,907.0 +907.0,907.96,901.0,902.52 +902.98,906.83,901.01,903.97 +903.99,904.0,901.02,901.34 +901.34,902.49,890.42,895.03 +895.03,896.0,892.59,894.09 +894.08,895.98,890.01,894.0 +894.0,898.0,892.96,898.0 +898.0,899.54,895.6,898.88 +898.89,902.0,897.88,901.97 +901.48,904.0,897.85,903.06 +903.06,906.96,894.41,902.01 +902.01,910.1,902.0,910.1 +910.1,913.99,908.0,910.2750000000001 +910.335,911.8,910.0,910.45 +910.57,912.0,903.15,907.38 +907.14,907.14,900.99,903.5 +903.79,905.7,900.01,902.24 +902.0,907.55,900.0,902.93 +902.43,906.96,900.81,906.11 +906.11,909.01,906.11,909.01 +908.99,915.0,908.98,914.99 +914.46,915.1,912.93,914.98 +914.98,915.1,904.02,908.6 +908.42,912.17,905.14,910.98 +910.99,913.13,906.28,907.94 +907.91,910.88,900.31,902.8 +902.8,904.85,900.35,903.99 +903.99,904.99,901.74,904.75 +904.48,904.9,899.4,904.72 +904.47,904.99,899.01,903.0 +903.81,905.2,901.26,902.68 +904.08,906.99,902.37,906.99 +906.99,912.0,906.71,910.11 +911.21,911.21,904.66,907.46 +907.6,910.17,902.1,906.53 +907.07,909.6,899.1,908.3 +908.73,912.0,906.32,911.77 +911.96,914.99,910.46,911.4 +911.4,912.54,909.59,912.32 +912.33,917.85,910.57,917.85 +917.85,921.95,917.84,921.32 +921.49,923.98,915.79,916.0 +916.0,917.58,914.0,916.42 +916.42,918.0,914.51,917.15 +916.96,916.96,850.0,872.23 +870.86,880.1,861.01,872.8 +872.9,874.97,828.0,831.89 +831.88,832.4,788.88,814.15 +814.24,828.0,792.58,810.0 +810.4,825.66,800.0,806.99 +807.0,824.64,802.8,806.92 +806.47,818.64,801.01,806.52 +807.65,807.66,765.0,778.2 +778.2,790.0,775.0,787.28 +787.11,813.0,785.0,811.09 +811.82,813.0,787.58,791.99 +791.98,802.23,787.0,797.89 +798.03,799.27,790.01,794.14 +792.07,804.35,787.4,795.68 +795.68,795.68,765.0,780.96 +780.96,789.92,763.48,787.38 +787.51,793.97,773.25,781.74 +781.75,790.0,770.0,788.9 +789.7,790.0,779.97,783.85 +783.86,786.99,770.0,771.83 +771.44,778.0,763.66,772.0 +772.01,772.01,734.64,760.9 +760.9,774.99,760.09,762.66 +762.66,769.15,761.35,767.55 +767.68,780.0,761.67,780.0 +779.86,782.93,765.79,781.0533333333333 +772.52,779.87,770.0,782.1066666666667 +777.8399999999999,784.18,777.34,783.16 +783.16,789.0,783.16,789.0 +788.9,806.92,788.9,802.75 +802.75,815.0,798.18,806.69 +806.69,810.62,804.99,808.87 +808.76,813.99,803.01,812.99 +815.675,825.0,811.34,822.58 +822.59,829.98,821.02,824.92 +824.92,836.54,824.92,836.54 +836.54,840.0,805.0,822.97 +822.92,825.0,806.71,810.25 +810.25,816.22,808.39,816.22 +813.19,818.29,813.59,815.38 +816.13,819.81,812.19,819.07 +819.07,819.07,800.01,800.01 +800.01,804.51,792.0,801.49 +801.49,801.49,782.85,791.7 +791.7,806.46,785.89,792.495 +792.2,795.24,784.96,793.29 +793.46,794.98,789.15,792.98 +792.98,807.59,791.02,803.37 +803.35,811.3,791.95,805.64 +803.715,814.5,800.45,804.08 +804.08,811.7,795.49,800.42 +800.42,813.48,798.01,806.19 +812.4849999999999,824.73,802.92,824.58 +824.55,835.01,815.8,825.33 +825.33,832.0,820.84,831.32 +826.2766666666666,831.48,818.12,825.74 +827.2233333333334,830.0,820.8,828.17 +828.17,834.99,820.0,825.01 +825.01,832.7,825.0,827.01 +827.01,830.5,826.22,828.99 +829.0,830.5,825.2,830.995 +831.0,833.0,828.23,833.0 +833.0,846.38,832.58,843.43 +841.59,847.52,835.54,847.52 +837.665,847.5,832.12,833.72 +833.74,839.57,831.71,832.58 +832.59,837.03,832.46,834.81 +829.05,837.42,822.34,825.51 +825.51,835.29,823.2,828.46 +828.46,831.69,824.44,831.41 +831.41,838.59,831.4,836.73 +836.74,838.99,830.13,835.87 +835.69,836.02,826.15,834.86 +834.9,838.22,832.68,836.1 +836.22,839.0,836.02,838.99 +838.99,839.0,827.5,835.5 +827.53,835.2,827.4,832.01 +832.265,838.15,830.24,837.0 +837.0,837.22,830.7,830.7 +831.68,836.28,829.91,836.28 +834.3299999999999,837.95,835.9,836.99 +836.98,837.39,832.16,835.89 +835.91,837.99,833.34,836.47 +836.48,837.98,825.0,829.81 +831.065,830.86,823.44,825.52 +825.65,830.0,825.41,828.68 +828.68,832.95,828.68,831.97 +831.95,832.0,825.8,831.2066666666667 +828.83,828.86,825.25,830.4433333333333 +828.13,829.69,826.0,829.68 +829.7,829.76,826.57,828.335 +828.2766666666666,827.85,826.57,826.99 +826.8533333333334,826.99,824.0,825.54 +825.43,825.52,824.0,824.09 +825.5466666666666,824.27,824.0,824.935 +825.6633333333333,825.78,824.32,825.78 +825.78,826.03,825.11,826.02 +826.01,826.02,824.0,824.14 +825.515,826.03,824.15,825.0799999999999 +825.02,826.06,824.08,826.02 +824.525,826.12,824.0,824.02 +824.03,825.09,824.0,823.76 +822.8933333333333,826.45,823.5,823.5 +821.7566666666667,824.05,820.06,820.62 +820.62,824.65,819.0,824.48 +824.48,825.4,824.38,825.39 +825.39,825.99,822.13,824.7 +824.7,829.15,824.0,828.13 +828.91,832.0,825.07,828.98 +828.99,835.0,828.98,834.1 +834.1,834.1,832.02,834.0 +834.0,835.0,832.74,835.0 +835.0,838.98,835.0,837.85 +836.99,838.98,837.79,838.98 +838.98,839.0,837.0,838.985 +838.6,838.6,834.09,838.99 +837.2,839.1,837.2,838.995 +838.1,839.97,838.99,839.0 +839.0,839.0,836.0,838.675 +838.26,840.0,837.4,838.35 +838.3,838.3,834.93,833.0350000000001 +832.4749999999999,835.5,826.2,827.72 +826.65,829.99,826.03,829.4266666666667 +828.7166666666667,835.67,829.47,831.1333333333333 +830.7833333333333,834.28,827.7,832.84 +832.85,834.99,832.84,834.4 +833.9,834.0,833.13,833.99 +833.99,834.0,830.89,831.68 +831.68,833.98,830.12,832.9649999999999 +832.72,834.25,832.72,834.25 +834.25,834.9,829.0,833.87 +833.87,833.93,829.02,833.935 +833.01,834.0,829.86,834.0 +834.01,835.0,830.02,833.88 +831.8,834.0,831.0,833.76 +833.76,833.99,831.93,838.905 +838.91,845.04,832.51,844.05 +844.06,858.0,841.83,857.55 +857.55,869.78,856.14,867.62 +867.63,868.5,860.36,865.9 +867.1600000000001,868.0,862.87,866.68 +866.69,894.62,866.69,891.2 +891.2,899.0,882.73,883.1 +883.11,891.27,883.1,886.81 +886.68,895.36,885.85,882.885 +888.87,890.45,877.52,878.96 +878.24,888.05,876.81,887.98 +887.97,888.04,880.0,884.36 +884.13,885.99,882.1,883.59 +883.83,884.97,880.0,884.5 +885.215,887.0,882.34,886.61 +886.6,908.96,886.6,899.16 +899.17,909.0,896.39,909.0 +909.0,909.0,900.61,908.05 +908.04,908.04,900.0,900.0 +900.0,903.09,893.2,900.1 +900.1,908.0,900.1,904.98 +904.98,908.0,902.9,907.84 +907.84,914.87,905.22,912.36 +912.96,916.7,892.0,896.75 +896.0,898.4,882.26,891.17 +891.24,896.05,890.1,896.5999999999999 +895.63,906.66,893.05,902.03 +900.02,908.69,901.99,904.41 +904.41,904.5,901.5,901.93 +902.1,904.29,895.1,897.12 +898.185,899.97,892.77,894.08 +894.27,901.01,890.0,898.3900000000001 +901.01,903.97,900.34,902.7 +902.53,905.03,902.53,886.2533333333333 +901.755,905.58,899.24,869.8066666666667 +900.98,900.99,850.0,853.36 +853.68,872.0,852.26,869.99 +869.95,880.63,869.95,870.315 +879.53,882.0,870.63,870.64 +870.64,881.68,867.44,878.0 +877.98,878.0,859.07,874.14 +874.06,874.06,867.87,871.53 +871.53,878.0,871.52,875.91 +875.91,876.0,875.57,876.0 +876.0,879.99,872.39,878.07 +885.5,895.0,878.07,895.0 +895.0,900.99,886.64,896.95 +896.95,897.97,884.06,888.89 +888.78,891.87,883.08,892.005 +892.365,899.73,891.16,895.12 +895.95,896.83,891.5,892.78 +892.84,892.85,889.47,893.77 +891.0,894.86,891.0,894.76 +893.495,896.0,891.32,896.0 +895.99,900.2,895.99,896.76 +896.76,899.5,892.87,894.44 +895.18,897.04,891.85,893.99 +893.99,896.87,893.55,893.99 +893.985,894.0,893.1,893.97 +893.98,894.0,891.71,893.39 +895.38,898.0,893.37,898.0 +896.78,899.04,895.5,898.11 +898.12,900.1,893.41,896.01 +896.0,906.99,895.99,906.55 +906.5,906.99,900.5,904.86 +904.87,905.0,901.04,903.68 +903.99,907.0,897.15,902.37 +905.0,907.0,902.33,906.01 +906.01,906.01,891.99,898.98 +898.99,902.99,897.0,901.345 +901.35,904.59,901.75,903.71 +903.71,904.0,898.77,903.7750000000001 +902.0633333333334,903.85,899.47,903.84 +900.4166666666666,903.89,898.47,898.7650000000001 +898.77,899.61,892.15,893.69 +893.65,897.65,893.65,897.65 +894.554,897.6,891.16,896.65 +895.458,899.39,896.64,898.04 +896.362,898.49,896.4,898.105 +897.266,898.49,897.26,898.17 +898.17,898.49,890.0,892.5 +892.49,892.5,892.35,892.5 +892.5,897.01,892.5,896.99 +896.99,898.34,895.97,897.9866666666667 +898.35,899.62,898.3,898.9833333333333 +899.48,900.0,898.97,899.98 +900.23,900.99,899.98,900.99 +900.98,901.12,900.53,900.8266666666667 +900.96,902.0,900.49,900.6633333333333 +900.72,900.78,900.49,900.5 +900.5,901.5,899.01,901.4 +901.16,901.16,897.77,899.36 +897.69,899.35,890.58,894.22 +894.22,895.03,893.38,895.03 +894.22,895.33,892.5,896.03 +894.22,897.03,891.28,897.03 +897.03,906.15,896.94,906.15 +906.15,930.0,900.82,924.99 +924.97,925.34,915.22,916.16 +915.63,918.71,913.02,915.87 +915.88,920.33,915.88,919.99 +919.99,920.49,916.56,919.625 +918.89,920.48,914.55,919.26 +919.26,923.99,919.26,923.8 +923.8,924.83,921.88,923.5 +923.47,927.29,919.94,923.99 +923.99,929.0,923.85,924.0799999999999 +928.1,929.37,918.37,924.17 +923.81,928.17,919.47,923.99 +923.99,924.0,921.0,924.0 +924.0,926.84,919.63,919.63 +919.69,925.35,918.99,924.7 +924.69,928.0,924.5,924.51 +924.51,925.43,921.56,923.0 +923.09,925.0,922.15,925.0 +925.0,927.0,924.78,926.97 +926.36,926.74,923.8,925.21 +925.22,925.5,923.26,924.96 +925.12,933.77,924.7,933.69 +933.69,937.0,931.92,935.37 +935.41,945.0,933.41,938.48 +938.5,942.8,935.0,942.0 +942.05,946.25,939.73,943.77 +944.88,946.22,937.18,938.75 +938.75,938.98,936.03,939.9566666666667 +939.79,942.86,935.0,941.1633333333333 +940.83,943.94,939.71,942.37 +942.07,943.0,934.05,934.82 +934.81,936.58,930.0,934.02 +934.03,938.9,922.68,926.17 +926.17,926.2,902.0,915.84 +915.84,916.81,902.11,902.59 +902.58,916.7,902.0,915.6 +915.1,925.1,915.1,920.5 +920.21,922.93,916.57,919.99 +919.9,923.0,918.06,922.93 +922.89,922.9,917.0,917.01 +917.01,919.98,916.71,919.96 +919.91,921.99,919.86,921.98 +921.98,923.0,921.98,923.0 +923.0,924.58,919.97,923.99 +924.14,931.33,923.98,930.7 +930.7,930.78,915.31,926.76 +926.77,926.77,920.79,922.96 +922.67,924.99,921.57,924.39 +924.98,928.59,922.67,924.5 +924.255,924.99,922.0,923.59 +923.53,924.89,922.0,922.32 +922.27,924.22,920.0,921.34 +921.01,924.89,920.01,922.6500000000001 +924.0,924.99,922.47,923.96 +923.5,924.99,922.01,922.8 +923.0,924.88,921.43,923.73 +923.73,924.99,922.45,924.22 +924.77,924.99,921.88,923.73 +923.72,926.14,923.2,923.41 +924.47,928.58,923.31,928.58 +928.58,929.34,922.15,923.07 +922.8,923.18,916.83,922.99 +922.99,924.99,918.0,923.17 +923.23,923.98,919.0,921.46 +921.32,924.98,918.17,921.6 +919.86,922.33,918.66,921.74 +920.55,921.75,918.61,921.53 +921.24,925.0,920.94,921.32 +921.32,924.7,903.48,903.77 +903.76,909.91,890.01,909.72 +909.7,911.0,905.32,906.13 +906.71,911.0,905.45,911.0 +910.98,923.0,910.87,922.83 +922.82,922.83,909.25,921.58 +921.07,923.0,916.0,917.43 +917.43,917.5,915.75,917.5 +917.5,918.0,914.47,918.0 +918.0,918.0,913.91,917.52 +917.52,917.98,915.48,912.26 +916.95,917.2,901.6,907.0 +907.19,910.0,896.71,906.71 +907.36,909.9,902.73,905.04 +904.99,907.41,901.8,904.32 +904.32,906.0,901.63,904.74 +904.96,904.99,902.94,904.36 +904.9,909.0,900.58,907.81 +907.04,911.74,907.04,909.57 +909.59,909.99,906.0,906.28 +907.45,908.71,902.82,905.2 +904.82,905.53,900.02,901.49 +901.49,904.51,900.0,900.78 +900.77,903.43,888.2,891.67 +891.39,895.64,880.0,887.07 +894.44,898.52,887.06,897.48 +897.49,899.99,895.92,898.24 +897.98,903.76,897.98,903.75 +903.75,903.98,896.33,899.99 +901.885,903.0,900.0,900.01 +900.02,901.79,897.79,900.79 +900.35,901.78,893.21,900.08 +898.84,900.07,897.0,899.18 +899.43,901.79,897.67,901.78 +901.79,903.0,897.57,898.71 +898.7,898.7,894.08,896.11 +896.11,901.88,895.67,901.18 +901.19,902.74,893.51,893.52 +893.52,895.25,890.56,890.59 +891.63,896.33,890.55,895.57 +895.01,895.57,890.5,893.73 +895.28,895.79,893.09,895.55 +895.55,896.11,890.65,896.11 +895.36,898.34,892.11,894.98 +894.98,896.6,892.42,893.98 +893.98,896.99,893.0,895.98 +895.98,897.99,895.02,897.97 +897.97,899.39,895.0,895.71 +895.54,898.0,895.25,897.4000000000001 +897.315,900.99,896.0,899.09 +899.09,903.0,899.02,902.62 +902.88,903.99,901.02,902.62 +902.97,905.0,902.69,904.88 +904.88,907.32,902.2,905.82 +905.83,906.67,898.17,903.89 +903.56,903.99,897.29,901.53 +901.02,901.91,899.03,901.1 +901.09,905.0,900.65,904.1 +904.09,905.99,904.04,905.85 +905.85,906.73,905.5,906.52 +906.58,908.71,906.22,906.82 +906.79,907.99,906.3,907.97 +907.97,911.99,907.94,911.7 +911.98,917.16,910.5,917.16 +917.12,921.95,917.12,919.39 +919.39,920.35,916.35,917.93 +917.94,917.95,912.33,916.4649999999999 +915.85,916.38,912.06,915.0 +914.86,918.0,914.0,917.84 +917.81,917.99,915.52,915.99 +915.98,916.35,914.43,916.01 +916.17,918.0,915.2,917.8 +917.8,917.99,916.01,917.04 +917.05,918.28,917.01,918.28 +918.28,920.0,917.69,919.99 +919.99,920.0,914.63,918.4 +918.4,919.38,915.01,915.865 +915.03,916.55,912.05,913.33 +914.04,918.0,911.0,914.75 +914.75,917.5,914.57,917.39 +917.56,920.75,917.56,919.64 +919.59,920.0,916.46,919.65 +920.165,920.75,919.58,920.74 +920.74,920.8,919.04,920.29 +920.47,921.77,918.59,921.49 +921.5,921.95,918.65,920.32 +920.31,921.0,919.52,920.06 +920.29,920.99,918.62,919.8 +919.79,922.0,918.87,921.41 +921.93,922.05,919.02,922.05 +922.06,923.0,922.01,923.0 +923.0,924.47,923.0,923.3 +923.23,923.23,919.75,922.0 +922.57,922.7,920.77,921.24 +922.53,923.54,921.17,921.95 +922.995,924.0,921.84,922.69 +923.46,923.65,921.5,923.375 +922.99,924.1,922.1,924.06 +923.97,924.07,923.26,923.96 +923.5,923.99,922.18,923.85 +923.98,923.99,923.5,923.93 +923.85,924.47,923.5,924.46 +924.45,924.47,924.01,924.46 +924.23,924.47,924.0,924.01 +924.01,924.07,924.0,924.06 +924.06,924.99,924.06,924.99 +924.99,924.99,924.34,924.5 +924.71,924.74,924.0,924.01 +924.05,924.27,924.0,924.495 +924.07,924.98,924.01,924.98 +924.98,925.0,923.0,923.74 +923.7,924.67,923.01,924.31 +924.36,924.94,922.9,923.09 +923.09,924.49,922.5,923.62 +922.735,923.98,922.01,922.38 +922.38,924.09,922.08,923.91 +923.9,924.59,921.81,923.35 +923.41,925.0,923.01,925.0 +925.0,925.5,924.0,925.14 +924.54,925.5,923.89,924.46 +924.08,924.99,924.02,924.98 +924.98,924.99,922.0,924.99 +924.99,925.5,924.14,925.49 +925.48,927.2,924.83,926.98 +927.2,927.47,922.77,924.59 +924.31,924.99,923.62,924.77 +924.63,924.99,924.23,924.95 +924.96,924.99,923.86,924.76 +924.77,924.98,923.92,924.98 +924.72,924.99,924.15,924.49 +924.67,924.99,924.46,924.97 +924.97,924.99,923.4,924.44 +924.43,924.94,924.01,924.36 +924.3499999999999,924.8,923.25,924.28 +924.27,924.28,922.98,922.99 +922.99,922.99,922.0,922.18 +922.18,922.7,921.58,922.0 +922.0,922.5,920.41,921.69 +921.99,922.48,919.29,919.6 +919.6,920.0,915.0,919.12 +916.35,919.0,916.34,918.64 +918.67,920.58,918.67,920.45 +920.45,920.45,919.74,920.1 +920.09,920.21,917.84,918.0 +918.0,918.2,916.0,916.47 +916.47,917.64,915.97,917.56 +916.725,917.5,914.69,916.89 +916.98,920.57,916.67,919.46 +919.46,920.58,918.25,919.955 +919.955,920.45,918.78,920.45 +920.45,920.51,919.4,920.48 +920.48,920.89,919.91,920.14 +920.15,920.7,918.9,920.7 +920.69,920.99,919.8,920.595 +920.16,920.66,918.9,920.49 +920.5,920.99,919.97,920.99 +920.99,920.99,919.1,919.4 +919.65,919.99,919.1,919.77 +919.97,920.0,919.06,920.0 +920.0,922.43,920.0,920.92 +920.63,922.99,920.0,921.28 +921.3,922.94,920.0,922.26 +922.52,922.62,918.26,919.78 +919.82,920.96,919.51,920.95 +920.42,921.99,919.56,921.99 +921.93,923.44,919.0,922.75 +922.75,923.95,922.03,923.115 +923.42,923.72,923.05,923.48 +923.65,923.7,922.1,923.47 +923.43,923.72,922.94,923.6 +923.71,923.97,923.28,923.39 +923.65,924.0,923.33,924.0 +923.99,924.99,923.82,924.425 +924.92,925.0,924.45,924.85 +924.85,925.0,924.6,924.98 +924.925,925.0,924.5,925.0 +925.0,935.0,925.0,934.73 +934.73,934.98,934.21,934.21 +934.22,935.0,934.15,934.84 +934.83,934.99,933.83,934.97 +934.92,944.99,934.88,944.99 +945.0,964.43,944.99,955.75 +955.69,959.18,953.01,956.36 +956.84,957.99,955.0,957.96 +957.97,965.5,957.97,965.5 +965.49,969.12,963.01,964.77 +964.29,964.56,952.0,956.98 +956.99,960.99,956.99,960.49 +960.09,960.82,950.92,956.15 +956.15,957.54,952.55,956.84 +956.59,962.89,954.75,962.89 +962.88,971.24,960.21,970.5 +970.48,972.3,969.98,969.98 +969.96,974.57,968.47,974.29 +974.16,979.52,973.0,976.11 +976.06,976.06,971.06,972.5 +972.84,974.29,971.06,971.35 +971.49,974.96,970.05,974.1 +974.07,975.0,972.66,974.87 +974.95,975.65,971.81,975.64 +975.6,979.44,975.11,978.95 +978.99,979.99,975.96,979.09 +979.97,979.99,969.05,969.05 +969.05,973.95,965.0,972.55 +972.55,972.56,968.04,970.34 +970.54,972.21,963.84,964.52 +964.34,971.72,964.34,971.67 +971.67,974.17,970.21,971.36 +971.39,974.45,970.27,974.0 +973.99,977.75,972.58,977.57 +977.17,978.27,976.65,977.27 +977.27,979.99,977.2,977.89 +977.9,979.84,977.9,978.78 +979.0,980.0,978.82,979.67 +979.6,980.9,979.4,980.78 +980.68,989.0,980.42,988.99 +988.99,993.72,988.05,993.66 +993.66,996.99,993.65,996.71 +996.71,996.74,991.52,993.52 +993.52,993.9,984.0,984.0 +984.0,986.2,978.74,986.07 +986.07,986.08,983.64,986.7950000000001 +985.88,988.93,985.07,987.52 +987.5,988.9,985.75,988.39 +988.51,988.99,985.98,988.95 +988.95,990.0,988.94,989.88 +989.99,992.0,989.85,991.97 +991.97,992.0,988.49,991.15 +991.15,992.0,991.15,991.99 +991.99,992.0,989.82,991.9 +991.81,993.24,991.48,993.14 +993.19,994.6,988.6,993.94 +994.03,997.0,992.57,997.0 +997.0,1005.04,997.0,1005.01 +1005.0,1005.1,1001.48,1001.49 +1001.48,1002.96,1000.0,1001.95 +1001.715,1002.0,1000.38,1001.95 +1001.95,1003.23,1001.21,1002.88 +1002.89,1008.99,1002.01,1008.99 +1008.99,1010.0,1005.3,1007.63 +1007.82,1009.99,1002.01,1009.24 +1009.24,1009.78,997.94,1004.52 +1004.3,1014.98,1003.94,1014.1 +1014.37,1019.0,1011.0,1017.605 +1018.31,1022.0,1017.18,1021.11 +1021.11,1021.96,1018.27,1021.24 +1021.22,1024.5,1017.08,1019.81 +1019.82,1023.23,994.34,1008.04 +1007.69,1018.9,1005.29,1014.49 +1014.49,1018.62,1010.13,1011.23 +1011.22,1017.09,1009.89,1017.09 +1016.77,1018.85,1007.01,1009.07 +1009.61,1010.58,1002.94,1008.07 +1009.17,1009.18,1000.0,1007.07 +1007.01,1013.71,1006.54,1010.7 +1010.685,1016.06,1010.0,1014.99 +1014.36,1017.92,1009.48,1016.93 +1016.93,1018.23,1015.24,1016.03 +1017.39,1018.99,1012.0,1018.99 +1018.98,1019.98,1016.0,1017.68 +1016.89,1017.69,1016.0,1015.69 +1015.2950000000001,1016.31,1010.0,1013.7 +1013.7,1016.08,1008.79,1008.8 +1008.81,1015.98,1008.81,1015.97 +1015.97,1019.75,1014.15,1018.5 +1018.49,1019.5,1016.5,1018.69 +1018.69,1019.5,1017.4,1019.47 +1019.47,1019.49,1012.6,1012.97 +1012.97,1014.65,1012.0,1012.98 +1013.015,1014.57,1011.11,1013.95 +1013.06,1014.01,1001.8,1002.69 +1002.68,1013.94,1002.51,1013.03 +1005.3033333333333,1015.0,1012.59,1014.71 +1007.9266666666666,1014.6,1010.5,1010.55 +1010.55,1010.78,1010.01,1010.78 +1010.78,1013.0,1009.01,1011.99 +1011.99,1012.54,1011.0,1011.65 +1011.65,1013.01,1010.41,1012.71 +1012.94,1018.0,1012.71,1015.88 +1015.88,1016.02,1010.22,1012.78 +1013.77,1014.84,1012.11,1013.59 +1013.57,1023.81,1012.0,1023.55 +1023.53,1039.9,1023.42,1039.9 +1039.9,1044.12,1030.07,1030.52 +1030.53,1039.79,1030.04,1039.24 +1038.9,1039.24,1031.21,1031.21 +1031.22,1031.22,1027.87,1029.76 +1029.76,1035.98,1029.76,1035.98 +1035.97,1036.3,1029.89,1036.29 +1036.2,1036.28,1029.89,1033.58 +1033.55,1035.98,1031.59,1033.19 +1032.71,1034.25,1031.65,1034.23 +1033.95,1034.64,1031.44,1031.55 +1031.59,1032.02,1029.22,1029.4 +1030.56,1030.0,1028.25,1029.43 +1029.53,1030.65,1028.21,1030.59 +1030.35,1030.59,1028.0,1028.75 +1028.74,1029.08,1025.7,1027.99 +1028.3,1028.31,1026.33,1027.37 +1024.385,1028.41,1020.46,1020.47 +1020.47,1025.31,1020.43,1021.64 +1021.56,1021.56,1019.02,1019.36 +1019.98,1020.43,1015.0,1020.43 +1020.43,1023.97,1019.0,1019.36 +1019.37,1020.45,1018.0,1018.0 +1018.01,1018.62,1015.0,1015.9 +1015.89,1015.92,1010.0,1010.76 +1010.76,1010.83,1003.02,1005.81 +1005.52,1014.26,1004.75,1012.37 +1012.65,1020.09,1010.17,1010.25 +1010.24,1015.54,1007.89,1012.89 +1014.75,1015.55,1011.38,1015.53 +1015.55,1020.0,1015.55,1016.72 +1016.7,1019.27,1015.36,1018.97 +1018.74,1020.0,1018.02,1019.55 +1019.57,1020.86,1014.64,1018.0 +1017.99,1020.85,1017.63,1018.39 +1018.39,1022.7,1017.36,1020.08 +1020.23,1020.47,1017.0,1019.01 +1019.0,1020.5,1017.8,1020.5 +1020.5,1021.0,1018.71,1021.0 +1021.0,1022.0,1020.52,1022.0 +1021.99,1027.0,1021.99,1027.0 +1027.0,1027.7,1026.18,1027.7 +1027.68,1027.7,1022.01,1025.02 +1024.27,1027.6,1024.27,1026.43 +1026.74,1026.84,1022.16,1023.99 +1023.53,1026.0,1022.24,1024.69 +1024.68,1026.32,1023.27,1023.75 +1023.99,1024.0,1021.99,1022.61 +1022.61,1023.11,1020.0,1021.8199999999999 +1020.96,1022.99,1020.03,1021.03 +1021.03,1022.99,1019.75,1022.61 +1022.53,1024.0,1022.4,1023.98 +1023.74,1025.99,1022.98,1024.92 +1024.95,1025.96,1022.95,1025.75 +1025.88,1025.9,1020.82,1023.45 +1023.44,1024.63,1022.18,1024.46 +1024.46,1025.98,1023.66,1025.71 +1025.72,1026.72,1025.31,1026.5 +1026.5,1029.81,1025.87,1029.81 +1029.67,1038.0,1029.67,1037.75 +1037.96,1040.0,1036.54,1038.3 +1037.09,1039.9,1034.06,1039.89 +1039.9,1048.89,1039.79,1046.17 +1046.15,1047.96,1045.65,1046.84 +1046.79,1046.79,1045.56,1046.31 +1045.6,1045.78,1040.86,1045.78 +1045.78,1049.5,1044.68,1048.93 +1048.89,1056.72,1048.88,1052.8 +1053.7,1056.57,1052.8,1056.26 +1055.7,1058.26,1053.0,1053.52 +1053.04,1053.99,1045.03,1047.16 +1047.84,1048.23,1045.0,1046.98 +1046.98,1049.99,1046.59,1048.92 +1048.92,1049.99,1047.01,1049.83 +1049.67,1050.0,1046.61,1048.98 +1048.95,1051.84,1047.5,1051.31 +1051.27,1053.25,1050.77,1053.21 +1053.22,1053.99,1051.01,1053.495 +1053.53,1053.98,1051.46,1053.78 +1053.84,1057.99,1053.84,1057.98 +1057.98,1064.23,1057.98,1062.1 +1062.37,1068.75,1060.08,1066.12 +1066.06,1069.66,1065.5,1069.49 +1069.08,1069.95,1065.58,1067.0 +1066.96,1068.2,1065.62,1067.11 +1067.605,1068.78,1067.02,1068.13 +1068.25,1068.78,1016.49,1020.22 +1023.61,1039.6,1020.07,1036.92 +1036.45,1036.94,1025.08,1031.63 +1031.69,1046.97,1029.0,1046.86 +1046.87,1046.9,1033.38,1035.86 +1035.16,1040.73,1031.64,1040.7 +1040.7,1041.81,1039.57,1040.03 +1040.03,1046.05,1040.03,1046.05 +1044.55,1052.31,1044.54,1052.0 +1052.0,1057.49,1052.0,1055.02 +1055.02,1060.0,1051.1,1060.0 +1060.0,1065.0,1058.88,1062.55 +1062.54,1063.99,1058.5,1063.93 +1063.94,1063.99,1053.03,1054.15 +1055.37,1061.93,1055.37,1059.5 +1059.42,1060.0,1055.05,1059.5 +1058.88,1059.79,1055.0,1056.95 +1056.95,1067.5,1055.0,1067.5 +1067.49,1067.49,1061.01,1061.99 +1062.0,1068.95,1061.8,1068.94 +1068.95,1074.5,1067.53,1074.49 +1074.5,1079.0,1069.27,1069.98 +1069.33,1078.48,1069.14,1070.36 +1069.75,1072.88,1062.0,1063.68 +1063.68,1066.31,1053.12,1063.5 +1063.96,1069.55,1063.92,1066.01 +1065.99,1065.99,1062.22,1064.48 +1064.48,1067.9,1057.23,1067.9 +1067.8,1067.98,1062.29,1064.43 +1064.43,1065.96,1036.0,1045.73 +1047.16,1051.28,925.0,996.07 +996.09,997.39,940.02,965.5 +965.5,993.0,955.0,990.25 +990.25,994.0,985.69,991.94 +991.94,994.2,973.34,986.28 +986.21,989.73,968.85,970.65 +971.61,972.6,946.0,962.33 +962.32,978.99,955.77,978.99 +978.99,979.98,972.67,977.96 +977.96,984.34,977.95,984.27 +984.12,994.25,977.81,993.69 +993.69,999.96,962.12,987.75 +986.06,986.81,971.37,978.97 +978.02,986.13,971.0,984.98 +984.69,993.71,978.2,985.98 +986.62,988.0,984.91,987.98 +987.99,996.65,984.0,988.51 +988.5,989.49,972.0,976.88 +977.0,987.0,974.5,978.68 +978.68,980.81,961.0,972.52 +971.41,984.35,966.34,977.61 +977.61,979.65,968.5,972.48 +971.84,989.62,968.39,984.42 +984.41,985.0,974.26,974.59 +975.86,976.88,968.78,969.9 +969.9,970.0,966.3,968.99 +969.0,978.99,968.99,978.99 +978.98,978.99,975.66,978.21 +978.47,981.42,974.28,981.42 +981.42,990.22,975.72,989.38 +989.41,989.5,986.0,989.5 +989.5,997.0,988.21,996.58 +996.73,1008.0,995.0,1001.38 +1000.85,1005.49,1000.03,1004.96 +1004.97,1004.99,999.0,1001.79 +1001.79,1004.98,999.99,1001.59 +1001.59,1003.94,1000.01,1002.79 +1002.81,1007.98,1002.78,1004.0 +1004.03,1007.89,995.49,1005.46 +1005.45,1016.39,1004.12,1013.62 +1013.62,1020.0,1013.5,1017.76 +1018.81,1019.38,1010.0,1013.72 +1013.22,1015.78,1011.0,1012.95 +1013.06,1017.01,1012.98,1017.0 +1017.01,1020.0,1017.0,1019.98 +1019.86,1020.0,1016.86,1019.0 +1018.57,1019.78,1007.0,1011.63 +1011.52,1013.0,1006.5,1012.56 +1012.78,1013.99,1010.4,1013.98 +1013.97,1014.99,1011.19,1014.96 +1014.98,1014.99,1011.68,1012.01 +1012.01,1014.86,1010.0,1013.63 +1013.89,1022.0,1013.02,1022.0 +1022.0,1023.89,1016.9,1020.14 +1020.12,1021.99,1014.11,1019.96 +1018.61,1020.0,1016.8,1018.76 +1018.7,1022.0,1017.11,1018.17 +1018.16,1018.54,1013.98,1018.23 +1017.33,1019.1,1017.33,1018.29 +1018.26,1018.26,1017.0,1017.63 +1017.61,1017.84,1014.11,1014.23 +1015.1800000000001,1014.97,1011.0,1011.66 +1012.75,1013.16,1010.43,1013.09 +1012.83,1013.16,1010.4,1010.5 +1011.41,1013.0,1010.5,1011.33 +1011.83,1014.0,1011.31,1013.96 +1013.94,1014.0,1011.3,1013.5 +1012.81,1013.5,1012.81,1013.04 +1013.04,1013.23,1012.79,1013.23 +1013.23,1014.0,1013.23,1013.99 +1013.615,1014.0,1013.98,1014.0 +1014.0,1014.0,1013.59,1013.59 +1013.8775,1014.0,1013.65,1013.5633333333334 +1013.755,1013.68,1013.5,1013.5366666666666 +1013.6324999999999,1013.59,1013.5,1013.51 +1013.51,1013.51,1013.49,1011.51 +1013.5,1013.5,1008.0,1009.51 +1009.51,1009.51,1008.76,1008.76 +1008.76,1008.76,1008.0,1008.6 +1008.8199999999999,1008.81,1008.59,1008.79 +1008.88,1008.81,1008.79,1008.81 +1008.94,1009.0,1008.8,1009.0 +1009.0,1010.0,1008.99,1010.44 +1010.0,1012.29,1009.99,1011.88 +1011.87,1013.68,1011.56,1013.65 +1013.68,1014.99,1013.67,1014.99 +1014.99,1016.0,1013.69,1015.79 +1015.3,1020.0,1015.05,1019.99 +1020.0,1021.5,1018.73,1018.75 +1018.74,1018.74,1016.11,1017.51 +1016.98,1017.0,1015.0,1016.27 +1015.43,1017.0,985.68,995.95 +995.3,999.99,994.46,999.99 +999.99,999.99,992.9,1001.745 +997.91,1007.83,997.9,1003.5 +997.665,1003.5,995.88,996.27 +997.42,1000.76,992.08,993.19 +992.97,994.6,991.75,994.43 +994.58,996.05,992.11,995.74 +995.03,1001.97,994.99,1001.86 +1001.85,1001.99,996.11,999.0 +999.0,1000.0,998.73,999.99 +999.94,1001.99,999.5,1001.51 +1001.54,1002.8,998.53,1001.53 +1000.96,1004.39,998.29,1004.12 +1004.12,1005.0,1000.95,1004.05 +1004.05,1004.47,1000.82,1001.99 +1001.99,1003.07,1000.0,1001.0 +1001.0,1001.78,996.0,1000.1 +1000.1,1004.0,997.8,1003.49 +1003.49,1004.0,1000.93,1002.0 +1002.0,1009.0,994.1,997.39 +1003.995,1006.48,992.27,1005.93 +1005.99,1006.69,1002.16,1006.67 +1006.68,1007.46,1003.1,1007.4 +1007.4,1018.92,1007.25,1016.97 +1016.97,1018.97,1015.7,1018.88 +1018.16,1018.97,1013.71,1014.49 +1015.06,1016.15,1000.0,1005.36 +1006.26,1013.45,1004.22,1008.69 +1009.81,1013.0,1009.23,1011.32 +1011.98,1012.99,1008.76,1011.12 +1011.18,1014.0,1008.35,1013.65 +1013.73,1014.0,1010.4,1010.72 +1012.57,1013.7,1010.09,1010.52 +1010.72,1011.1,1008.36,1008.38 +1008.76,1009.0,1003.51,1004.93 +1004.95,1009.97,1003.32,1007.97 +1008.74,1010.0,1007.86,1009.4 +1009.01,1013.24,1008.64,1012.29 +1012.3,1014.0,1010.51,1013.66 +1012.76,1014.4,1012.12,1013.75 +1014.33,1014.99,1012.35,1013.37 +1013.655,1014.98,1012.13,1012.99 +1012.98,1013.78,1007.66,1008.85 +1008.84,1013.45,1007.77,1012.97 +1012.95,1013.1,1010.33,1011.52 +1011.48,1011.48,1008.0,1008.26 +1008.06,1009.5,1008.06,1009.49 +1009.38,1011.24,1009.33,1011.17 +1011.16,1012.81,1009.37,1010.76 +1010.82,1011.29,1009.34,1010.87 +1010.89,1011.49,1010.19,1011.27 +1011.26,1012.99,1010.03,1012.84 +1012.83,1013.0,1011.67,1012.67 +1012.67,1013.99,1011.35,1012.74 +1013.99,1014.0,1010.0,1012.81 +1012.81,1014.86,1011.01,1012.06 +1012.37,1012.99,1010.01,1010.97 +1010.98,1013.5,1010.92,1013.1 +1013.1,1013.99,1012.21,1013.99 +1013.99,1014.99,1013.97,1014.69 +1014.75,1015.74,1013.0,1014.71 +1014.48,1016.0,1011.81,1014.5 +1014.48,1014.92,1013.02,1014.29 +1014.29,1014.99,1014.2,1014.97 +1014.97,1016.0,1014.97,1016.0 +1015.99,1022.0,1015.99,1022.0 +1022.0,1027.66,1020.29,1021.04 +1021.04,1024.12,1020.32,1023.485 +1023.34,1025.93,1022.75,1025.93 +1025.93,1028.67,1025.02,1026.33 +1026.33,1026.33,1021.96,1023.71 +1023.7,1024.48,1021.44,1024.19 +1024.2,1024.2,1023.68,1024.18 +1024.19,1024.99,1018.64,1021.82 +1022.25,1024.99,1021.85,1024.84 +1024.96,1025.28,1022.5,1025.28 +1025.27,1026.99,1023.63,1026.59 +1026.58,1033.69,1024.51,1032.72 +1033.0,1038.0,1032.59,1035.47 +1035.39,1038.72,1034.0,1037.46 +1037.46,1041.0,1033.13,1035.5 +1035.49,1041.88,1035.49,1040.86 +1040.89,1040.91,1037.5,1040.07 +1040.07,1040.99,1036.35,1039.45 +1038.7,1039.6,1035.0,1036.61 +1037.17,1038.89,1035.35,1036.0 +1035.99,1039.5,1035.31,1037.24 +1037.24,1042.8,1037.2,1042.8 +1042.8,1044.88,1041.98,1044.81 +1044.87,1044.88,1036.29,1039.99 +1039.99,1043.3,1038.06,1042.7 +1042.42,1044.3,1039.9,1044.2 +1044.2,1044.2,1040.6,1042.38 +1042.5,1043.27,1040.0,1040.85 +1040.85,1044.33,1040.85,1043.64 +1043.65,1044.88,1041.5,1043.99 +1043.58,1046.97,1043.26,1046.97 +1046.97,1049.95,1041.5,1042.4 +1041.94,1049.15,1040.8,1048.36 +1048.36,1048.46,1043.7,1045.85 +1045.85,1056.05,1045.85,1056.04 +1056.0,1064.6,1052.58,1060.14 +1060.14,1060.14,1052.51,1058.12 +1058.51,1059.99,1055.03,1059.5 +1059.5,1059.99,1055.84,1057.79 +1057.84,1057.9,1052.02,1053.09 +1053.08,1056.99,1050.15,1056.93 +1056.99,1059.69,1056.93,1059.64 +1059.69,1059.99,1057.57,1059.98 +1059.98,1062.27,1059.97,1060.03 +1060.46,1062.33,1057.0,1057.01 +1057.24,1061.81,1055.6,1055.97 +1055.97,1060.8,1055.97,1060.51 +1060.51,1061.77,1055.6,1060.55 +1060.55,1064.0,1060.55,1064.0 +1064.0,1069.0,1063.83,1068.99 +1069.0,1073.8,1067.01,1070.0 +1068.79,1070.98,1065.78,1067.78 +1067.78,1071.0,1067.0,1069.33 +1069.22,1073.14,1068.52,1069.8 +1069.81,1070.1,1067.8,1069.43 +1069.43,1069.69,1066.99,1068.0 +1068.01,1069.49,1065.5,1067.505 +1065.89,1067.78,1064.14,1067.01 +1067.01,1068.58,1064.02,1064.26 +1064.27,1065.99,1062.53,1063.8 +1063.8,1069.99,1062.26,1069.9 +1069.89,1069.99,1068.47,1069.16 +1069.16,1069.16,1067.08,1067.9 +1067.59,1070.11,1066.97,1069.0 +1069.0,1069.44,1062.82,1066.31 +1066.29,1067.88,1065.89,1067.64 +1067.65,1068.0,1066.79,1068.0 +1068.0,1068.5,1063.12,1064.77 +1064.75,1065.1,1059.9,1060.92 +1060.92,1062.13,1056.02,1056.9 +1057.29,1058.71,1055.1,1058.01 +1057.11,1061.5,1056.93,1058.68 +1058.68,1059.91,1056.21,1057.38 +1056.83,1060.0,1056.02,1060.0 +1059.98,1061.57,1056.84,1061.52 +1061.52,1065.45,1059.79,1064.34 +1065.45,1066.49,1064.49,1064.6 +1064.6,1065.98,1064.6,1065.84 +1065.85,1067.78,1065.85,1067.27 +1067.21,1067.38,1057.14,1065.02 +1065.03,1065.5,1058.09,1062.58 +1062.24,1063.99,1052.68,1056.84 +1056.84,1057.4,1051.26,1056.84 +1057.37,1059.94,1056.29,1058.79 +1058.0,1060.78,1056.22,1059.9 +1060.27,1060.31,1057.11,1057.42 +1058.39,1059.93,1057.02,1058.66 +1058.66,1058.96,1051.35,1051.39 +1051.38,1058.95,1051.35,1053.93 +1053.92,1056.42,1053.9,1056.39 +1056.4,1058.51,1056.27,1058.37 +1058.32,1060.0,1057.92,1059.94 +1059.95,1060.2,1058.55,1058.55 +1059.36,1059.36,1055.04,1056.23 +1056.22,1056.69,1054.39,1055.26 +1055.26,1056.8,1054.0,1054.01 +1054.01,1054.01,1051.36,1052.69 +1052.79,1055.41,1052.17,1055.12 +1055.13,1056.21,1054.85,1055.18 +1055.18,1057.52,1055.18,1056.49 +1058.0900000000001,1061.0,1056.06,1060.92 +1061.0,1066.61,1061.0,1065.07 +1065.75,1066.99,1065.19,1066.35 +1066.34,1066.97,1061.7,1063.58 +1064.27,1064.88,1060.5,1061.19 +1061.2,1064.99,1060.76,1063.82 +1063.82,1065.99,1063.82,1064.86 +1065.1,1065.68,1063.03,1064.49 +1064.45,1065.99,1063.43,1065.88 +1065.89,1066.49,1065.57,1066.43 +1066.43,1066.99,1065.67,1066.33 +1066.61,1066.98,1065.41,1065.59 +1065.66,1066.99,1065.0,1066.98 +1066.98,1067.82,1064.3,1066.01 +1066.2,1066.62,1064.05,1065.76 +1065.86,1066.67,1065.52,1066.67 +1066.66,1095.0,1066.66,1086.85 +1086.85,1088.0,1081.95,1087.98 +1087.99,1089.98,1085.5,1088.0 +1087.98,1088.0,1085.76,1086.82 +1086.82,1087.44,1086.5,1086.56 +1086.56,1090.0,1086.52,1089.49 +1089.44,1092.0,1087.33,1092.0 +1092.0,1103.4,1091.99,1103.02 +1103.02,1103.02,1093.0,1093.0 +1092.99,1104.0,1091.01,1096.31 +1096.33,1101.48,1096.01,1098.02 +1098.03,1104.13,1095.42,1103.22 +1102.92,1114.45,1102.42,1114.44 +1114.44,1118.0,1111.73,1114.72 +1114.72,1116.2,1110.95,1115.38 +1115.38,1117.99,1101.51,1106.87 +1106.89,1107.86,1098.05,1105.56 +1105.89,1105.99,1102.67,1103.69 +1103.41,1117.99,1102.66,1116.92 +1116.92,1119.07,1112.73,1115.56 +1115.92,1117.97,1113.15,1117.88 +1117.88,1118.99,1117.62,1118.99 +1118.99,1120.0,1116.06,1119.99 +1119.99,1130.88,1119.11,1127.93 +1127.93,1132.95,1126.82,1128.29 +1129.57,1129.6,1119.0,1126.16 +1126.16,1126.27,1120.0,1121.02 +1121.02,1123.98,1118.05,1121.74 +1121.73,1126.11,1120.01,1125.3 +1125.3,1126.66,1124.75,1124.75 +1124.75,1124.75,1104.9,1118.62 +1118.61,1121.69,1114.87,1117.5 +1117.5,1119.15,1114.28,1116.4 +1116.99,1118.46,1108.88,1112.49 +1112.5,1117.35,1110.51,1115.75 +1115.75,1118.63,1111.44,1117.88 +1117.88,1118.88,1114.32,1117.38 +1118.3,1120.99,1117.21,1119.63 +1120.97,1124.98,1120.0,1124.96 +1123.98,1128.81,1124.01,1126.99 +1126.99,1132.0,1126.06,1131.27 +1131.26,1131.67,1122.32,1124.29 +1124.29,1137.0,1120.47,1137.0 +1137.0,1140.0,1131.85,1136.96 +1136.98,1138.02,1132.01,1137.58 +1137.58,1139.99,1131.7,1133.2 +1133.18,1136.89,1126.33,1127.9 +1128.07,1131.42,1126.5,1128.48 +1128.47,1132.0,1128.17,1130.57 +1130.33,1136.34,1128.33,1135.11 +1135.56,1136.98,1132.58,1136.16 +1136.13,1138.89,1133.67,1138.53 +1138.53,1138.88,1128.22,1131.22 +1131.2,1133.36,1129.0,1132.76 +1132.35,1133.14,1130.5,1131.61 +1130.9,1133.49,1130.76,1132.32 +1132.32,1132.5,1128.97,1132.5 +1132.49,1142.0,1131.71,1141.99 +1141.99,1143.76,1135.74,1139.0 +1139.0,1143.63,1136.43,1143.63 +1143.63,1148.02,1142.0,1148.02 +1148.02,1149.98,1147.87,1149.98 +1149.97,1157.59,1149.97,1152.94 +1152.29,1155.0,1150.2,1154.99 +1155.0,1160.0,1154.65,1158.46 +1158.08,1159.0,1152.0,1155.7 +1156.07,1157.0,1153.51,1156.98 +1156.98,1170.0,1156.68,1167.85 +1167.48,1167.99,1162.7,1167.98 +1167.98,1173.1,1163.0,1164.78 +1164.6,1168.7,1163.76,1168.0 +1167.99,1182.04,1167.97,1180.0 +1180.01,1197.0,1165.25,1189.87 +1189.44,1196.0,1180.78,1184.0 +1183.76,1189.45,1178.01,1188.94 +1188.91,1195.0,1187.46,1195.0 +1195.0,1208.95,1194.98,1208.9 +1208.91,1221.93,1202.68,1209.94 +1209.86,1215.0,1206.38,1214.98 +1214.34,1215.0,1128.22,1149.84 +1149.84,1169.91,1103.32,1159.0 +1159.0,1190.0,1157.34,1190.0 +1189.95,1189.95,1158.35,1177.7 +1177.68,1181.41,1161.46,1176.49 +1176.49,1176.97,1137.5,1169.76 +1169.76,1182.49,1160.0,1182.0 +1181.06,1199.07,1175.43,1195.99 +1195.99,1203.99,1190.88,1199.99 +1200.0,1204.99,1186.0,1188.15 +1188.12,1200.99,1187.8,1192.9 +1192.86,1206.0,1189.97,1197.65 +1197.6,1197.66,1181.47,1181.47 +1186.3,1187.54,1180.0,1180.415 +1181.45,1182.93,1170.0,1179.36 +1178.58,1183.98,1175.01,1181.79 +1182.63,1187.7,1176.97,1186.71 +1186.68,1189.1,1182.41,1186.74 +1186.74,1189.11,1182.31,1188.49 +1188.49,1188.99,1185.12,1188.1 +1188.1,1189.0,1187.08,1188.6 +1188.6,1189.49,1188.0,1189.18 +1188.6,1189.47,1182.0,1182.24 +1182.24,1184.79,1171.01,1175.45 +1174.97,1178.39,1172.18,1177.22 +1177.45,1185.0,1176.93,1184.8 +1184.79,1185.97,1184.26,1185.97 +1185.96,1185.97,1184.5,1185.38 +1185.31,1185.59,1180.98,1185.45 +1185.0,1186.0,1183.83,1185.23 +1185.23,1186.0,1181.52,1182.09 +1182.09,1184.46,1177.0,1180.48 +1180.49,1184.0,1151.0,1165.65 +1165.66,1169.82,1155.37,1161.54 +1161.53,1161.53,1110.0,1135.07 +1135.18,1146.76,1131.72,1145.98 +1145.98,1159.61,1145.97,1153.41 +1153.44,1156.14,1150.77,1154.55 +1154.56,1160.75,1150.78,1153.73 +1153.24,1160.75,1146.01,1159.4 +1159.98,1162.02,1153.44,1156.92 +1156.89,1158.34,1152.31,1157.96 +1157.98,1158.98,1147.72,1147.72 +1147.52,1147.52,1133.11,1137.0 +1137.52,1143.14,1130.88,1138.85 +1138.84,1143.14,1138.3,1141.08 +1140.83,1154.85,1140.83,1152.01 +1152.22,1157.98,1152.0,1152.97 +1152.93,1157.11,1148.82,1154.02 +1154.02,1162.41,1152.65,1162.41 +1162.42,1163.98,1162.42,1163.32 +1163.32,1174.11,1163.04,1173.17 +1173.15,1175.0,1157.57,1161.38 +1161.38,1170.0,1161.38,1167.98 +1168.3,1171.5,1167.9,1167.9 +1167.99,1168.99,1167.9,1168.9 +1168.9,1169.99,1168.48,1169.98 +1169.98,1171.99,1169.83,1171.99 +1171.98,1187.33,1171.97,1182.35 +1181.94,1185.47,1170.0,1180.48 +1180.47,1180.64,1175.5,1175.92 +1175.92,1179.91,1175.9,1176.39 +1176.39,1176.95,1173.0,1175.38 +1175.81,1180.0,1175.75,1179.67 +1179.15,1183.0,1178.57,1182.24 +1182.0,1185.0,1181.69,1184.99 +1184.98,1195.52,1181.06,1194.17 +1193.98,1194.99,1193.9,1194.93 +1194.81,1194.95,1188.25,1190.04 +1190.04,1194.74,1189.59,1194.4 +1194.4,1194.99,1187.96,1191.34 +1190.78,1192.04,1176.0,1186.38 +1186.38,1186.39,1182.96,1184.42 +1184.41,1185.1,1182.97,1184.82 +1184.68,1185.1,1179.53,1183.5 +1183.5,1188.23,1181.03,1186.87 +1187.17,1187.47,1181.5,1184.53 +1184.76,1189.11,1183.62,1184.65 +1184.66,1184.68,1177.5,1184.0 +1184.08,1184.79,1181.12,1183.5 +1185.27,1187.37,1180.0,1185.81 +1186.46,1188.74,1180.51,1187.66 +1187.65,1198.63,1179.51,1198.41 +1198.62,1198.99,1192.84,1195.26 +1196.9499999999998,1197.97,1189.26,1195.31 +1195.28,1196.0,1191.0,1195.1 +1195.09,1195.27,1186.01,1194.835 +1193.97,1195.0,1189.14,1194.57 +1194.61,1195.99,1190.51,1191.81 +1191.81,1197.2,1189.52,1197.2 +1197.2,1207.18,1196.14,1203.935 +1206.48,1210.67,1204.5,1210.67 +1210.88,1214.0,1195.01,1213.04 +1213.48,1214.94,1179.64,1189.09 +1189.08,1200.92,1187.05,1199.95 +1199.91,1200.0,1192.53,1199.64 +1199.67,1200.92,1193.67,1196.7633333333333 +1196.125,1197.92,1191.08,1193.8866666666668 +1192.58,1194.97,1190.38,1191.01 +1193.91,1195.88,1182.0,1192.49 +1192.32,1192.93,1187.45,1191.49 +1191.49,1191.63,1187.77,1189.35 +1189.35,1190.81,1185.7,1186.36 +1186.1,1192.26,1186.1,1192.16 +1192.16,1192.93,1184.07,1191.67 +1191.65,1192.95,1188.57,1194.08 +1190.47,1197.96,1190.3,1196.49 +1195.97,1198.99,1193.03,1197.1950000000002 +1197.48,1200.0,1192.27,1197.9 +1197.5322222222223,1200.0,1194.5,1198.0785714285714 +1197.5844444444444,1199.91,1176.3683333333333,1198.257142857143 +1197.6366666666668,1199.82,1158.2366666666667,1198.4357142857143 +1197.6888888888889,1199.73,1140.105,1198.6142857142859 +1197.7411111111112,1199.64,1121.9733333333334,1198.7928571428572 +1197.7933333333333,1199.55,1103.8416666666667,1198.9714285714288 +1197.8455555555556,1199.46,1085.71,1199.15 +1197.8977777777777,1199.57,1197.08,1199.98 +1197.95,1204.49,1194.42,1200.81 +1200.78,1203.97,1197.28,1203.96 +1203.95,1204.14,1196.77,1196.77 +1197.32,1197.76,1191.01,1194.26 +1194.53,1195.96,1192.27,1195.21 +1195.18,1198.99,1192.99,1196.35 +1197.73,1198.0,1196.38,1197.49 +1197.5,1199.93,1195.48,1199.48 +1199.46,1202.1,1197.37,1202.1 +1202.09,1211.99,1201.92,1210.0 +1210.0,1225.0,1209.54,1221.94 +1221.95,1230.0,1218.0,1230.0 +1230.0,1230.0,1218.18,1221.82 +1221.83,1221.99,1218.94,1221.99 +1221.99,1226.0,1221.13,1224.67 +1225.07,1228.44,1221.1,1222.29 +1222.29,1227.5,1217.77,1226.76 +1227.42,1227.5,1221.51,1222.4 +1222.39,1226.99,1220.16,1226.75 +1226.75,1228.9,1225.27,1228.49 +1228.49,1234.0,1226.66,1233.76 +1233.8,1234.0,1227.49,1227.95 +1227.95,1233.08,1227.29,1232.98 +1232.98,1233.1,1230.34,1231.99 +1232.05,1232.4,1220.0,1220.1 +1220.1,1227.96,1220.09,1225.98 +1226.31,1226.31,1222.0,1225.97 +1225.67,1227.8,1222.68,1227.77 +1227.78,1228.8,1225.5,1228.8 +1228.8,1230.0,1226.5,1230.0 +1229.99,1232.5,1229.99,1231.09 +1231.87,1232.5,1228.35,1232.49 +1232.49,1233.1,1228.36,1233.1 +1233.1,1236.2,1230.29,1236.2 +1236.2,1239.0,1235.65,1238.7 +1239.0,1240.1,1237.01,1240.1 +1240.1,1260.99,1240.09,1260.99 +1260.98,1266.88,1255.84,1266.88 +1266.37,1298.61,1266.37,1295.02 +1295.01,1295.02,1265.0,1275.12 +1289.34,1292.005,1267.325,1276.56 +1283.67,1288.99,1269.65,1278.0 +1278.0,1279.89,1237.57,1261.42 +1261.42,1268.55,1260.0,1267.0 +1267.0,1271.97,1266.99,1270.0 +1270.0,1273.0,1269.99,1272.99 +1272.95,1279.5,1272.23,1272.98 +1273.27,1276.99,1272.22,1275.22 +1274.52,1279.99,1270.69,1278.99 +1278.85,1279.5,1267.0,1268.0 +1268.16,1273.0,1265.0,1269.77 +1269.98,1271.99,1255.61,1270.0 +1270.0,1275.5,1268.89,1273.0 +1273.0,1282.49,1272.99,1282.49 +1282.48,1285.0,1281.84,1285.0 +1284.99,1290.71,1277.17,1283.47 +1283.47,1290.0,1283.47,1288.79 +1289.52,1294.99,1288.0,1290.94 +1291.04,1294.02,1268.38,1279.69 +1279.72,1286.99,1275.44,1284.55 +1284.54,1286.99,1279.29,1279.77 +1279.78,1281.99,1278.03,1278.03 +1278.21,1279.99,1270.14,1275.01 +1276.9250000000002,1277.86,1270.82,1275.11 +1275.64,1276.53,1270.01,1276.26 +1276.26,1282.0,1275.35,1279.0 +1279.0,1283.84,1277.18,1282.79 +1282.97,1289.33,1280.19,1287.77 +1287.52,1294.97,1285.56,1292.81 +1292.86,1293.16,1285.0,1289.91 +1289.1149999999998,1290.04,1284.76,1285.76 +1285.37,1292.19,1284.01,1292.19 +1292.24,1294.48,1287.38,1289.0 +1289.0,1293.0,1287.28,1293.0 +1292.99,1294.48,1288.19,1290.8 +1292.79,1294.07,1289.05,1291.8400000000001 +1292.5900000000001,1293.5,1288.21,1292.88 +1292.39,1293.68,1286.34,1292.9 +1292.56,1293.79,1290.64,1292.535 +1292.09,1293.75,1287.45,1292.17 +1291.99,1292.5,1278.98,1282.58 +1282.5,1288.37,1277.11,1288.32 +1288.33,1291.8,1282.0,1286.76 +1286.01,1288.01,1270.0,1271.99 +1271.7,1274.99,1260.05,1263.42 +1263.4,1270.99,1226.41,1264.27 +1264.0,1270.99,1259.98,1261.51 +1261.5,1273.0,1260.78,1269.88 +1269.87,1271.87,1262.61,1271.39 +1271.38,1271.38,1264.39,1265.21 +1265.21,1268.8,1264.0,1267.92 +1267.93,1274.95,1265.95,1274.95 +1274.95,1274.99,1264.48,1271.1 +1271.04,1271.19,1266.24,1269.89 +1269.88,1270.19,1267.12,1270.0 +1269.99,1272.7,1268.32,1269.25 +1270.88,1273.0,1266.0,1266.62 +1266.62,1269.97,1265.2,1265.59 +1265.2,1266.2,1260.52,1264.68 +1264.38,1264.89,1260.01,1262.32 +1262.86,1263.04,1247.11,1257.57 +1256.82,1257.83,1249.28,1253.42 +1252.59,1257.78,1251.2,1257.77 +1257.78,1260.33,1254.06,1255.83 +1255.83,1261.02,1252.79,1260.13 +1260.13,1266.0,1260.09,1261.1 +1263.49,1266.0,1258.82,1266.0 +1265.73,1268.0,1264.74,1268.0 +1268.0,1271.19,1267.99,1270.72 +1270.48,1273.94,1269.47,1273.94 +1273.93,1275.0,1272.77,1274.76 +1274.87,1275.0,1268.26,1274.13 +1274.1,1275.0,1270.51,1274.51 +1274.51,1278.97,1271.86,1274.06 +1274.5,1278.14,1271.0,1277.56 +1277.53,1278.2,1274.51,1277.95 +1277.97,1278.99,1277.96,1278.8 +1278.79,1279.0,1278.5,1279.0 +1279.0,1284.99,1279.0,1284.98 +1284.98,1285.0,1279.36,1280.99 +1280.99,1281.95,1268.78,1269.72 +1269.72,1279.27,1269.72,1279.27 +1279.27,1281.0,1275.46,1278.1 +1278.1,1282.33,1277.09,1281.72 +1281.85,1282.33,1281.5,1282.0 +1281.99,1283.0,1281.99,1282.99 +1283.0,1283.99,1282.57,1282.87 +1282.93,1283.0,1281.99,1282.85 +1282.9,1284.0,1281.59,1282.94 +1282.94,1285.46,1282.11,1285.01 +1285.02,1288.0,1276.0,1281.67 +1282.58,1284.98,1282.25,1281.81 +1284.64,1285.0,1280.32,1281.95 +1283.01,1285.5,1275.6,1281.07 +1281.06,1281.99,1278.18,1280.31 +1280.5,1281.99,1277.36,1281.1399999999999 +1281.99,1284.0,1279.75,1281.97 +1281.98,1282.7,1278.15,1279.92 +1279.92,1282.4,1276.73,1279.21 +1279.19,1282.73,1278.0,1282.73 +1282.0,1285.0,1280.0,1283.0 +1282.81,1285.0,1282.14,1283.86 +1283.81,1285.0,1280.78,1285.0 +1284.99,1288.0,1283.52,1287.61 +1287.61,1287.98,1284.25,1285.2 +1285.2,1285.73,1277.0,1280.08 +1279.96,1279.97,1270.08,1273.23 +1276.23,1282.25,1273.76,1278.69 +1279.28,1280.75,1277.0,1280.39 +1280.39,1280.98,1276.25,1276.98 +1276.98,1276.99,1258.93,1264.15 +1269.15,1264.15,1244.0,1261.15 +1261.32,1262.16,1050.0,1210.79 +1211.25,1239.54,1202.31,1236.56 +1236.92,1250.5,1236.08,1245.98 +1245.98,1245.98,1231.2,1231.2 +1232.01,1235.0,1225.43,1233.4 +1233.39,1255.24,1231.0,1253.0 +1254.5,1259.99,1247.08,1254.28 +1253.75,1254.35,1225.99,1246.7 +1246.69,1252.38,1244.99,1251.12 +1251.06,1252.35,1237.07,1245.42 +1245.41,1249.5,1239.0,1248.37 +1248.37,1248.37,1230.0,1238.93 +1237.54,1242.4,1232.15,1237.0 +1237.01,1241.69,1234.13,1240.01 +1240.01,1246.0,1239.99,1243.1 +1243.11,1246.0,1235.11,1236.99 +1237.0,1237.09,1203.5,1205.06 +1205.06,1219.26,1163.91,1189.51 +1189.69,1195.95,1155.0,1185.01 +1185.01,1189.06,1167.5,1179.59 +1179.19,1188.09,1169.0,1178.42 +1178.63,1212.49,1178.63,1207.06 +1207.06,1214.02,1204.81,1213.69 +1213.95,1225.7,1207.39,1217.97 +1218.0,1222.34,1204.0,1205.34 +1205.33,1215.12,1200.0,1200.0 +1201.63,1213.55,1192.76,1203.0 +1195.535,1206.39,1183.85,1189.12 +1189.44,1190.0,1171.0,1182.78 +1181.72,1194.4,1181.02,1194.04 +1194.04,1197.51,1166.0,1190.9 +1190.82,1195.0,1182.0,1184.14 +1184.15,1189.32,1168.0,1169.36 +1169.37,1177.5,1155.0,1161.66 +1160.42,1175.49,1156.27,1162.03 +1162.03,1169.74,1153.0,1166.63 +1166.64,1168.15,1128.0,1151.6 +1152.99,1156.46,1131.11,1142.47 +1142.6,1154.25,1134.89,1146.21 +1154.25,1165.9,1145.57,1165.9 +1165.9,1168.15,1151.5,1157.05 +1157.05,1164.79,1151.6,1152.38 +1152.4,1161.85,1149.74,1161.85 +1161.92,1174.99,1161.65,1173.3 +1173.94,1174.99,1167.03,1174.98 +1174.98,1190.0,1174.98,1189.48 +1189.48,1189.48,1173.25,1176.13 +1176.44,1179.52,1170.0,1170.86 +1170.65,1173.31,1162.33,1173.15 +1173.15,1184.5,1172.72,1184.49 +1184.49,1184.49,1175.59,1178.18 +1177.99,1185.0,1175.95,1183.74 +1183.74,1196.99,1180.39,1192.99 +1192.99,1214.95,1192.98,1213.88 +1213.87,1213.99,1165.21,1203.27 +1202.78,1204.67,1200.0,1201.78 +1201.72,1205.5,1198.3,1200.25 +1200.25,1208.87,1194.94,1207.25 +1207.35,1208.88,1204.0,1208.15 +1208.16,1209.66,1195.0,1195.92 +1195.9,1199.28,1190.97,1198.3 +1198.3,1207.1,1198.3,1207.05 +1207.05,1207.1,1204.1,1206.79 +1207.07,1208.99,1205.88,1207.48 +1207.48,1207.99,1201.7,1204.09 +1204.0,1206.49,1201.68,1204.03 +1204.03,1207.87,1202.18,1206.42 +1206.41,1207.99,1194.0,1197.95 +1196.6,1203.07,1190.06,1196.99 +1197.0,1203.24,1195.5,1198.02 +1198.02,1207.88,1196.74,1202.0 +1202.0,1207.88,1197.17,1207.88 +1207.87,1215.37,1201.7,1212.43 +1212.56,1215.34,1206.49,1214.5 +1214.51,1360.0,1190.0,1274.74 +1272.47,1285.0,1224.32,1231.3 +1232.63,1253.84,1231.95,1236.41 +1238.31,1266.36,1232.0,1251.5 +1251.2,1265.0,1110.0,1260.79 +1260.77,1260.77,1242.81,1252.98 +1252.96,1278.0,1252.95,1275.0 +1273.52,1294.99,956.85,1014.91 +1014.99,1226.47,981.0,1107.23 +1107.46,1125.35,1080.2,1087.0 +1087.0,1117.77,1060.5,1113.83 +1113.97,1135.0,1113.82,1129.23 +1129.25,1165.0,1129.03,1163.48 +1161.55,1168.99,1131.7,1144.0 +1145.45,1159.95,1144.0,1159.86 +1158.97,1166.69,1153.76,1155.0 +1155.0,1169.98,1155.0,1166.19 +1166.19,1174.75,1162.8,1174.41 +1174.71,1199.0,1174.62,1189.99 +1188.97,1219.0,1188.97,1194.6 +1194.61,1215.69,1190.0,1194.24 +1192.16,1204.67,1185.5,1195.05 +1195.13,1203.68,1195.13,1197.69 +1197.74,1217.45,1197.43,1199.33 +1199.95,1213.91,1199.39,1211.47 +1210.58,1211.6,1193.61,1193.61 +1194.52,1199.73,1189.95,1191.18 +1191.16,1193.97,1189.0,1190.0 +1190.0,1194.0,1189.0,1189.12 +1189.58,1194.02,1175.01,1185.96 +1186.17,1192.15,1176.0,1176.1 +1176.58,1179.98,1167.32,1169.52 +1170.6,1178.83,1167.53,1178.4 +1178.83,1185.0,1177.05,1182.9 +1182.12,1189.99,1181.86,1189.99 +1189.99,1194.06,1150.0,1184.05 +1184.04,1191.0,1184.02,1187.6 +1188.09,1190.0,1176.01,1184.31 +1184.32,1187.27,1184.32,1185.94 +1185.95,1192.7,1185.83,1192.6 +1192.59,1193.45,1180.86,1184.0 +1184.0,1190.97,1183.99,1190.43 +1190.39,1190.91,1180.84,1186.06 +1186.25,1190.19,1184.21,1189.51 +1189.52,1192.0,1186.5,1190.59 +1190.59,1192.0,1184.44,1191.96 +1191.96,1192.1,1187.95,1191.59 +1191.52,1195.0,1187.95,1195.0 +1195.0,1198.98,1187.99,1198.0 +1197.91,1212.8,1195.27,1208.44 +1208.43,1223.16,1208.43,1223.0 +1222.99,1236.1,1222.99,1233.4 +1233.4,1237.99,1223.94,1232.65 +1233.18,1242.4,1227.14,1240.99 +1240.99,1244.0,1233.76,1236.07 +1236.06,1237.81,1229.0,1235.32 +1235.39,1242.0,1233.34,1242.0 +1242.0,1243.75,1238.02,1240.45 +1239.6,1240.45,1232.97,1233.4 +1233.14,1240.0,1231.5,1239.99 +1239.27,1239.27,1231.12,1233.45 +1233.45,1236.22,1227.03,1231.99 +1231.98,1245.0,1228.96,1245.0 +1244.99,1249.0,1240.19,1249.0 +1248.99,1249.0,1206.0,1231.6 +1231.61,1234.3,1220.0,1232.67 +1232.67,1232.69,1215.44,1224.5 +1224.5,1232.69,1220.0,1227.82 +1228.58,1234.1,1218.0,1226.53 +1227.43,1241.26,1226.96,1238.15 +1238.17,1243.24,1235.2,1238.89 +1238.48,1248.0,1236.57,1248.0 +1247.99,1249.0,1239.11,1242.28 +1241.96,1244.08,1230.0,1236.0 +1235.36,1246.0,1231.02,1239.72 +1239.71,1244.5,1231.0,1239.97 +1240.47,1245.98,1236.91,1242.03 +1242.03,1242.15,1237.1,1239.47 +1239.47,1241.95,1210.0,1238.26 +1240.39,1248.0,1236.79,1247.86 +1247.85,1247.9,1238.4,1245.91 +1244.98,1247.52,1238.0,1246.09 +1246.08,1248.0,1244.1,1246.5 +1246.5,1248.36,1244.7,1246.2 +1246.19,1249.5,1244.5,1249.5 +1249.49,1250.0,1246.63,1246.88 +1247.0,1249.65,1246.39,1247.92 +1247.7,1247.97,1240.0,1241.58 +1241.59,1246.92,1238.0,1239.15 +1239.13,1239.99,1231.8,1234.88 +1234.57,1234.57,1229.87,1232.99 +1232.99,1242.0,1232.99,1238.85 +1239.49,1240.45,1236.14,1237.0 +1236.99,1242.0,1235.36,1241.7 +1241.69,1247.99,1241.69,1247.0 +1247.47,1247.99,1241.7,1247.98 +1247.98,1250.0,1247.94,1250.0 +1250.0,1262.0,1249.99,1260.85 +1260.62,1260.71,1253.0,1255.0 +1254.79,1260.54,1251.18,1258.21 +1258.21,1260.51,1254.0,1259.14 +1259.14,1260.78,1213.55,1245.03 +1245.04,1252.02,1241.18,1251.56 +1251.49,1254.41,1248.66,1253.73 +1253.65,1254.42,1247.79,1248.56 +1248.56,1250.25,1241.26,1250.24 +1250.24,1250.25,1245.0,1248.62 +1248.615,1250.1,1245.85,1247.0 +1246.99,1251.13,1246.99,1250.31 +1249.54,1252.22,1249.2,1252.22 +1252.2,1254.12,1245.63,1246.46 +1246.49,1248.5,1245.21,1248.5 +1248.5,1251.99,1247.54,1251.11 +1251.93,1254.99,1251.3,1253.14 +1253.33,1255.0,1251.52,1254.95 +1254.94,1255.0,1253.93,1255.0 +1254.75,1254.98,1248.58,1249.55 +1249.41,1255.0,1248.0,1255.0 +1255.0,1255.0,1249.17,1254.84 +1254.62,1259.0,1253.93,1259.0 +1259.0,1259.81,1254.53,1255.4 +1256.33,1258.6,1255.0,1257.48 +1257.48,1257.5,1256.53,1255.67 +1255.63,1256.53,1246.16,1253.86 +1253.78,1254.0,1251.88,1254.0 +1253.99,1254.1,1251.52,1252.82 +1252.82,1253.83,1240.0,1251.43 +1251.87,1254.1,1251.62,1253.0 +1252.77,1256.7,1252.01,1256.42 +1256.44,1260.0,1252.36,1259.81 +1259.69,1264.55,1257.69,1262.11 +1262.02,1268.88,1258.7,1266.07 +1266.07,1277.27,1264.47,1264.7 +1264.58,1264.58,1255.0,1261.99 +1261.96,1261.99,1242.0,1249.19 +1249.19,1249.2,1240.06,1240.73 +1240.81,1243.92,1220.11,1232.0 +1232.88,1249.95,1232.88,1248.7 +1248.71,1250.0,1233.61,1236.16 +1236.16,1238.99,1229.2,1234.21 +1234.18,1234.23,1220.51,1225.65 +1225.65,1239.49,1225.65,1238.15 +1238.14,1239.25,1224.3,1232.71 +1232.71,1240.66,1220.0,1222.98 +1223.0,1226.0,1220.15,1221.0 +1220.72,1224.0,1219.0,1222.47 +1222.47,1222.47,1218.0,1218.71 +1218.72,1219.49,1216.64,1219.44 +1219.45,1220.0,1218.0,1219.99 +1219.99,1219.99,1204.42,1207.71 +1207.68,1207.69,1173.5,1182.07 +1182.08,1189.05,1138.0,1145.46 +1145.94,1178.77,1117.77,1148.99 +1145.13,1186.01,1145.13,1179.45 +1179.45,1190.76,1171.66,1171.84 +1171.8,1171.8,1157.0,1167.0 +1166.47,1168.0,1159.66,1165.01 +1165.01,1165.01,1125.1,1133.27 +1134.87,1137.0,1088.88,1122.0 +1122.02,1136.45,1093.31,1128.82 +1128.8,1139.46,1110.11,1129.71 +1133.37,1133.39,1088.88,1111.11 +1111.12,1130.14,1101.01,1106.53 +1106.43,1139.0,1101.0,1111.71 +1110.86,1123.72,1094.21,1116.64 +1116.24,1139.0,1112.26,1139.0 +1139.0,1151.99,1128.98,1151.98 +1151.78,1159.08,1142.95,1159.05 +1159.05,1160.0,1147.97,1150.88 +1150.9,1168.99,1150.9,1168.65 +1168.38,1170.0,1159.63,1160.19 +1160.19,1160.95,1151.8,1154.4 +1154.02,1154.02,1120.05,1124.08 +1123.08,1130.0,1110.0,1124.36 +1124.36,1127.53,1113.34,1118.71 +1118.71,1123.96,1108.01,1114.94 +1115.14,1115.14,1080.0,1087.37 +1088.43,1095.75,1071.0,1086.99 +1087.5,1092.5,1065.74,1076.16 +1075.79,1096.0,1069.53,1083.55 +1083.54,1096.0,1074.88,1078.49 +1078.61,1083.42,1057.01,1062.91 +1062.92,1063.0,1053.0,1059.9 +1059.8,1089.0,1058.1,1065.49 +1065.49,1072.57,1048.0,1065.08 +1065.97,1071.96,1054.64,1068.4 +1067.8,1080.94,1058.87,1068.65 +1068.65,1074.78,1063.48,1069.79 +1069.71,1089.97,1065.81,1088.5 +1088.49,1092.09,1085.0,1086.73 +1086.98,1086.98,1074.81,1081.98 +1081.95,1082.0,1062.0,1064.86 +1064.85,1064.85,1010.11,1018.15 +1018.14,1023.36,989.0,1007.47 +1007.46,1007.46,925.0,969.3 +965.37,1010.55,965.23,999.03 +999.04,1008.99,991.2,1008.97 +1008.87,1008.97,970.01,972.13 +972.02,992.58,970.03,981.93 +981.76,983.93,919.44,949.93 +949.93,980.0,932.32,970.69 +970.7,976.11,938.32,941.74 +941.6,978.0,938.0,978.0 +978.0,989.99,972.54,984.14 +984.19,1006.54,984.19,999.99 +999.99,1012.11,999.59,1010.75 +1010.74,1010.99,985.0,990.15 +990.08,1002.79,976.0,998.41 +997.29,1006.62,996.61,1001.38 +1001.19,1007.86,998.21,1007.8 +1007.79,1010.99,1003.3,1008.73 +1008.73,1010.99,1001.51,1007.21 +1007.87,1008.27,961.59,978.2 +978.31,993.71,975.1,990.3 +990.32,997.88,990.3,993.63 +996.45,1001.87,993.52,998.0 +998.0,998.0,985.79,991.71 +992.06,994.0,991.94,994.0 +994.0,1038.0,993.99,1035.92 +1035.91,1051.83,1031.0,1044.93 +1044.94,1044.97,1027.81,1038.05 +1039.36,1048.65,1033.8,1043.6 +1043.6,1062.92,1043.6,1053.22 +1052.52,1057.71,1045.0,1056.06 +1055.55,1057.0,1037.9,1038.42 +1039.72,1041.0,1021.1,1038.2 +1038.09,1038.09,1011.99,1019.19 +1019.39,1024.6,1011.0,1022.23 +1022.52,1030.98,1017.48,1030.71 +1029.97,1040.68,1027.61,1036.19 +1036.18,1043.7,1031.15,1038.38 +1037.83,1040.27,1030.4,1035.02 +1035.44,1039.51,1024.52,1025.9 +1026.09,1026.95,1015.0,1015.63 +1016.0,1027.11,1013.54,1024.37 +1024.37,1024.83,1011.02,1013.86 +1013.86,1033.64,1012.3,1033.64 +1032.07,1039.63,1030.0,1038.68 +1038.04,1044.47,1037.0,1044.46 +1044.47,1047.11,1040.0,1045.97 +1046.35,1051.97,1042.05,1046.68 +1046.69,1047.0,1036.99,1038.42 +1040.45,1045.0,1037.73,1044.9 +1044.77,1048.0,1041.01,1047.97 +1047.97,1047.97,1042.45,1046.92 +1047.56,1050.0,1040.72,1048.96 +1048.92,1048.98,1025.75,1035.25 +1035.25,1037.0,1026.0,1030.14 +1030.14,1045.8,1027.91,1043.84 +1044.21,1047.0,1040.21,1042.33 +1043.09,1047.0,1038.2,1046.61 +1046.72,1048.0,1042.68,1048.0 +1047.99,1053.55,1046.69,1053.51 +1053.34,1054.8,1047.29,1052.0 +1052.0,1067.41,1051.29,1067.41 +1066.07,1087.93,1059.5,1080.99 +1080.98,1087.65,1080.0,1085.26 +1085.26,1088.33,1073.21,1088.33 +1088.47,1090.0,1078.01,1078.25 +1078.07,1079.92,1075.3,1079.92 +1079.81,1082.47,1074.1,1076.95 +1076.92,1078.45,1069.56,1073.99 +1073.36,1091.67,1070.5,1091.62 +1091.61,1094.12,1087.44,1091.77 +1091.77,1093.15,1083.13,1089.97 +1089.98,1093.98,1088.44,1090.17 +1090.17,1093.97,1090.17,1091.98 +1091.97,1107.0,1073.0,1107.0 +1107.0,1120.0,1080.67,1112.2 +1112.08,1112.2,1105.67,1106.51 +1106.51,1114.07,1100.62,1114.07 +1114.0,1114.99,1085.05,1100.75 +1100.77,1108.0,1096.11,1105.88 +1106.29,1119.65,1104.05,1114.09 +1114.04,1115.0,1097.78,1110.31 +1110.11,1110.29,1085.05,1089.44 +1089.05,1101.22,1085.1,1094.61 +1094.64,1095.0,1078.39,1079.99 +1079.89,1085.85,1077.77,1082.79 +1082.79,1096.85,1082.16,1096.0 +1096.01,1098.84,1095.29,1097.65 +1095.94,1097.09,1088.11,1089.89 +1089.9,1091.38,1055.05,1064.05 +1063.7,1070.86,1050.0,1058.38 +1059.41,1067.72,1051.07,1060.66 +1060.75,1082.09,1058.18,1080.01 +1079.47,1079.47,1062.83,1062.84 +1064.5,1065.51,1051.07,1051.07 +1052.93,1059.96,1011.0,1024.42 +1024.41,1024.43,1000.05,1017.97 +1017.97,1019.01,998.6,1008.28 +1008.96,1029.36,1005.51,1018.35 +1018.37,1020.54,1007.25,1012.53 +1012.52,1012.88,985.17,991.11 +993.77,1021.5,992.1,1009.04 +1009.38,1012.52,999.0,1011.36 +1011.36,1021.72,1010.0,1011.96 +1011.96,1037.96,1011.25,1037.96 +1037.94,1041.28,1029.66,1036.26 +1036.68,1043.67,1029.0,1030.53 +1031.07,1031.53,1023.6,1025.5 +1025.5,1036.37,1025.5,1031.81 +1031.81,1036.0,1028.84,1033.32 +1033.31,1033.33,1020.5,1021.74 +1022.0,1022.0,1014.04,1018.31 +1018.31,1029.57,1015.72,1029.56 +1029.55,1038.37,1029.55,1035.61 +1035.86,1040.97,1031.5,1040.96 +1040.95,1040.96,1030.09,1032.2 +1032.19,1041.23,1030.01,1041.23 +1041.37,1057.41,1041.37,1046.62 +1046.64,1053.44,1045.67,1048.92 +1048.92,1050.99,1045.63,1046.95 +1046.29,1051.93,1044.0,1049.12 +1048.96,1050.0,1042.59,1045.53 +1045.39,1045.98,1031.5,1034.97 +1034.95,1043.99,1032.97,1039.69 +1041.37,1041.37,1034.99,1040.23 +1039.79,1040.0,1034.99,1038.03 +1038.94,1044.27,1036.16,1037.04 +1037.57,1039.59,1022.12,1031.52 +1026.01,1031.0,1013.0,1026.0 +1026.01,1026.26,1016.34,1023.96 +1024.36,1030.3,1015.17,1015.17 +1015.17,1024.96,1015.0,1015.07 +1015.06,1018.0,1015.06,1017.0 +1017.0,1019.0,1009.63,1011.11 +1010.97,1015.01,985.22,999.96 +999.97,1012.05,999.97,1011.98 +1011.99,1017.95,1004.44,1014.53 +1014.78,1017.99,1010.95,1012.7 +1012.7,1017.97,1005.32,1009.07 +1008.47,1009.44,1000.3,1001.12 +1001.02,1007.42,991.59,998.96 +998.47,1001.62,981.5,991.01 +990.09,994.38,967.58,980.2 +978.96,986.78,967.72,984.9 +984.9,995.9,982.91,993.0 +992.27,999.37,985.94,986.08 +986.02,990.86,961.6,986.33 +986.2,995.99,980.47,984.35 +984.45,985.99,973.48,976.82 +975.53,980.49,962.76,974.17 +973.54,973.55,950.0,950.0 +952.11,965.0,947.5,954.76 +954.76,954.76,930.31,936.0 +936.0,945.67,912.76,926.0 +926.0,944.1,925.39,935.01 +935.02,941.64,928.03,933.41 +933.41,937.01,922.44,933.44 +933.44,936.0,920.1,922.0 +922.0,922.0,898.25,908.9 +906.19,913.28,898.02,906.31 +906.28,906.89,898.22,900.49 +900.49,942.23,900.48,928.64 +927.07,933.61,890.05,904.41 +904.36,919.37,896.82,913.88 +913.76,918.78,905.96,906.96 +906.93,915.0,896.88,915.0 +914.99,922.85,907.32,920.56 +920.56,955.0,915.69,937.5 +938.82,945.44,925.6,944.2 +944.2,945.86,929.69,929.69 +929.77,931.25,920.31,930.32 +930.36,954.64,929.48,951.16 +951.09,951.16,943.71,947.94 +949.89,950.31,941.92,943.68 +943.1,950.91,931.03,949.55 +949.0,961.11,944.91,946.59 +946.17,958.99,945.5,958.99 +958.99,973.99,958.98,967.58 +967.61,968.18,958.72,962.18 +962.08,967.49,956.36,964.0 +963.31,967.99,958.89,967.98 +967.98,976.78,966.88,973.72 +973.2,974.18,961.05,969.99 +969.93,975.47,967.67,969.57 +969.51,971.37,965.54,965.55 +965.54,965.66,943.9,955.63 +955.42,962.48,949.32,962.47 +962.47,968.26,960.59,967.04 +967.52,974.29,966.04,974.28 +974.28,978.72,969.27,971.24 +971.1,984.0,971.1,981.95 +980.75,996.98,980.58,992.99 +992.99,995.96,982.07,992.76 +993.46,1005.0,993.46,1000.09 +1000.95,1000.98,990.0,990.4 +990.01,999.95,974.28,979.4 +978.62,992.06,976.41,978.36 +979.32,991.04,973.1,991.04 +991.04,991.05,976.39,986.5 +984.64,986.34,953.0,963.95 +963.46,971.55,953.0,961.26 +961.58,974.35,958.27,968.64 +968.63,969.16,961.1,967.3 +967.26,976.2,966.4,971.11 +971.11,978.97,970.12,970.74 +970.74,973.49,965.3,971.47 +971.49,973.0,968.6,973.0 +973.0,973.0,966.0,966.39 +966.65,982.23,966.0,982.0 +982.0,999.0,978.97,997.8 +997.81,999.0,985.47,989.56 +989.52,997.77,988.26,997.26 +996.98,997.9,983.1,988.78 +988.78,995.95,986.62,991.34 +991.35,1017.0,991.34,1017.0 +1017.0,1035.0,1010.91,1028.72 +1030.31,1034.79,1016.08,1023.9 +1023.63,1030.0,1015.72,1029.99 +1029.99,1030.0,1023.18,1026.47 +1026.47,1026.65,1019.91,1024.99 +1024.99,1028.38,1017.22,1019.56 +1019.81,1020.55,1015.0,1015.81 +1015.8,1027.74,1015.0,1026.0 +1025.99,1038.97,1025.0,1038.84 +1038.62,1045.9,1034.0,1040.98 +1040.97,1044.0,1038.3,1039.34 +1039.88,1043.56,1031.29,1035.0 +1034.78,1038.82,1028.05,1028.06 +1028.14,1040.97,1028.07,1040.97 +1040.96,1042.93,1035.8,1038.1 +1037.91,1038.0,1036.48,1037.99 +1037.98,1038.3,1026.13,1030.88 +1030.21,1039.52,1030.04,1038.95 +1038.94,1048.88,1038.94,1047.96 +1047.97,1051.93,1044.02,1051.11 +1051.12,1059.83,1050.4,1059.83 +1059.83,1061.76,1049.8,1056.22 +1054.99,1069.0,1048.91,1066.16 +1065.97,1066.81,1061.52,1066.38 +1066.21,1069.39,1056.0,1060.34 +1060.37,1060.73,1051.01,1051.37 +1051.07,1061.76,1050.02,1057.97 +1057.97,1059.98,1050.66,1053.99 +1053.99,1055.0,1034.41,1037.36 +1037.36,1048.97,1032.02,1036.29 +1035.4,1037.58,1016.25,1032.0 +1030.48,1033.0,1025.11,1032.08 +1032.09,1039.88,1029.11,1035.89 +1035.79,1045.0,1034.22,1043.7 +1044.89,1046.74,1040.0,1040.0 +1040.01,1040.01,1029.72,1033.57 +1033.57,1037.53,1026.95,1029.0 +1029.01,1029.01,1013.01,1015.51 +1015.51,1019.55,1005.77,1013.01 +1013.47,1026.82,1013.47,1025.6 +1025.61,1033.36,1022.96,1030.66 +1030.82,1031.26,1012.0,1015.78 +1013.83,1020.56,1012.49,1018.28 +1018.29,1039.2,1018.1,1035.5 +1035.7,1042.95,1031.86,1042.94 +1042.94,1048.0,1039.3,1039.3 +1039.3,1058.16,1037.67,1049.98 +1049.98,1054.27,1048.0,1053.97 +1053.75,1053.97,1040.0,1042.75 +1042.79,1049.36,1041.93,1049.36 +1049.2,1049.2,1039.47,1042.0 +1042.0,1049.96,1042.0,1043.83 +1043.8,1043.9,1031.98,1034.05 +1034.06,1039.08,1020.0,1033.99 +1034.19,1039.98,1031.82,1039.49 +1039.3,1040.75,1035.82,1039.12 +1038.62,1046.0,1038.35,1043.78 +1043.75,1044.92,1037.01,1039.74 +1039.74,1044.99,1038.01,1044.99 +1044.99,1052.94,1044.99,1052.07 +1050.45,1052.41,1042.42,1044.82 +1044.81,1050.0,1033.98,1046.5 +1046.5,1048.0,1037.23,1042.37 +1043.15,1050.0,1040.78,1044.79 +1044.84,1049.99,1044.6,1045.02 +1045.58,1046.35,1045.02,1046.0 +1046.0,1051.9,1046.0,1051.15 +1051.15,1051.99,1035.46,1041.5 +1041.5,1042.0,1023.0,1033.46 +1033.47,1038.99,1033.2,1038.99 +1038.88,1042.0,1034.7,1038.0 +1037.99,1038.0,1031.34,1036.12 +1036.67,1037.91,1022.0,1027.65 +1027.67,1031.99,1026.4,1030.01 +1030.01,1031.99,1028.01,1029.28 +1029.29,1036.97,1027.19,1034.15 +1034.53,1052.0,1030.92,1037.81 +1037.81,1038.0,1033.0,1035.39 +1035.32,1035.99,1030.97,1031.49 +1031.5,1036.99,1031.48,1036.58 +1036.82,1041.69,1035.12,1041.0 +1040.95,1040.95,1033.41,1036.9 +1036.92,1049.99,1034.34,1049.82 +1048.47,1050.0,1043.36,1048.46 +1048.46,1049.99,1048.45,1049.99 +1050.0,1059.0,1049.99,1056.98 +1056.98,1057.98,1053.26,1056.93 +1056.95,1059.0,1053.75,1058.05 +1058.04,1058.48,1050.0,1050.0 +1049.99,1053.97,1045.0,1053.02 +1053.01,1055.0,1050.31,1053.5 +1053.5,1054.97,1052.04,1053.92 +1053.94,1054.11,1046.07,1048.97 +1049.12,1055.32,1046.27,1050.0 +1050.01,1053.0,1047.28,1050.93 +1049.34,1054.93,1048.91,1049.4 +1050.31,1053.57,1048.52,1051.99 +1051.98,1066.02,1049.45,1064.84 +1064.01,1094.49,1060.85,1085.59 +1085.59,1088.88,1075.0,1077.25 +1077.25,1083.42,1063.67,1079.42 +1078.68,1086.0,1077.21,1082.26 +1082.23,1087.68,1081.98,1087.41 +1087.67,1087.67,1075.28,1075.55 +1075.56,1087.0,1074.9,1087.0 +1087.0,1091.0,1085.99,1089.38 +1089.09,1091.0,1084.87,1089.89 +1091.0,1096.89,1090.75,1093.0 +1093.46,1093.47,1084.6,1087.08 +1087.08,1088.61,1082.17,1083.89 +1083.87,1087.5,1081.69,1086.18 +1086.21,1088.91,1085.02,1088.5 +1088.45,1088.54,1080.5,1088.28 +1088.42,1089.0,1082.41,1088.06 +1087.53,1098.0,1086.39,1096.47 +1096.5,1099.0,1094.69,1099.0 +1098.99,1109.45,1098.99,1103.28 +1103.29,1110.57,1103.28,1109.56 +1109.85,1110.06,1095.45,1104.98 +1104.98,1110.95,1102.19,1104.83 +1104.78,1107.04,1095.0,1101.03 +1101.03,1101.03,1082.39,1083.98 +1083.98,1085.87,1071.45,1080.48 +1079.6,1086.0,1077.6,1083.01 +1082.96,1085.86,1079.0,1081.75 +1081.81,1086.5,1081.25,1084.85 +1084.75,1086.5,1079.0,1079.02 +1079.02,1080.74,1074.82,1079.78 +1079.78,1083.0,1079.47,1082.99 +1082.95,1085.74,1082.58,1085.52 +1085.52,1094.0,1085.52,1093.95 +1093.95,1093.99,1086.0,1086.09 +1086.06,1091.16,1085.95,1090.01 +1090.01,1090.01,1084.62,1086.4 +1085.99,1087.72,1081.0,1086.31 +1086.33,1086.36,1081.02,1084.26 +1084.39,1087.72,1081.28,1087.56 +1087.56,1091.0,1086.64,1091.0 +1091.0,1097.36,1091.0,1096.56 +1096.59,1097.34,1087.86,1090.02 +1089.97,1090.52,1086.0,1086.95 +1087.18,1096.72,1086.44,1095.85 +1095.85,1096.31,1085.7,1089.39 +1088.86,1088.86,1080.0,1085.69 +1085.58,1092.61,1084.82,1089.39 +1088.94,1094.0,1086.54,1093.99 +1093.99,1110.0,1091.56,1109.49 +1109.48,1109.5,1100.39,1100.98 +1100.97,1107.46,1097.75,1105.96 +1105.97,1110.32,1104.97,1109.98 +1109.97,1119.0,1107.36,1117.44 +1117.42,1119.0,1110.0,1110.85 +1110.82,1113.54,1106.0,1108.79 +1108.49,1114.23,1106.49,1113.92 +1113.94,1115.18,1108.94,1112.24 +1113.46,1155.0,1112.57,1141.32 +1141.3,1149.53,1133.49,1138.99 +1138.98,1145.1,1132.39,1145.1 +1145.1,1159.95,1142.04,1157.35 +1158.4,1159.1,1133.01,1133.99 +1133.99,1150.8,1132.53,1144.22 +1144.22,1147.71,1142.9,1145.37 +1145.37,1145.5,1140.0,1140.0 +1140.01,1142.0,1124.0,1131.86 +1130.0,1142.0,1128.0,1141.13 +1141.13,1141.13,1131.97,1137.89 +1138.0,1143.5,1137.99,1141.57 +1142.17,1143.87,1131.96,1133.13 +1132.12,1137.98,1131.0,1131.03 +1131.03,1142.67,1131.0,1142.07 +1141.91,1143.02,1138.24,1141.2 +1141.16,1143.45,1140.1,1140.96 +1140.94,1143.1,1137.0,1137.79 +1137.79,1143.0,1136.5,1143.0 +1143.0,1155.82,1143.0,1154.43 +1154.22,1156.0,1145.86,1155.89 +1155.9,1165.18,1155.0,1156.9 +1156.92,1168.72,1154.01,1156.95 +1156.95,1156.99,1138.33,1153.7 +1152.39,1161.45,1143.08,1154.01 +1154.01,1156.99,1142.07,1144.93 +1145.38,1151.0,1141.32,1149.53 +1149.3,1151.99,1147.2,1151.24 +1151.24,1155.85,1150.34,1151.99 +1151.88,1155.4,1146.02,1151.92 +1151.91,1155.4,1147.3,1155.4 +1155.4,1157.29,1155.21,1156.81 +1157.03,1164.14,1157.03,1161.5 +1161.54,1163.34,1153.59,1159.0 +1160.0,1163.5,1157.82,1161.9 +1161.9,1163.07,1145.0,1149.99 +1150.01,1152.0,1145.0,1145.53 +1145.53,1153.0,1140.2,1140.2 +1141.56,1147.0,1124.98,1129.71 +1129.8,1139.99,1125.6,1138.6 +1138.13,1139.97,1126.23,1130.99 +1130.98,1141.99,1130.58,1141.73 +1141.7,1144.98,1139.51,1141.31 +1141.33,1145.0,1134.41,1144.58 +1144.58,1145.0,1137.92,1142.2 +1141.79,1143.99,1137.09,1141.85 +1141.77,1142.57,1136.5,1141.32 +1141.84,1143.99,1141.84,1143.92 +1143.82,1144.99,1139.7,1143.78 +1143.88,1144.95,1142.39,1144.04 +1144.04,1144.04,1135.15,1136.31 +1137.78,1140.0,1132.0,1140.0 +1140.0,1141.85,1136.36,1137.45 +1137.41,1140.1,1137.4,1139.88 +1139.51,1139.9,1135.4,1135.43 +1135.47,1137.98,1126.23,1128.87 +1127.79,1127.79,1114.9,1123.34 +1123.19,1130.31,1120.02,1127.49 +1127.49,1136.28,1121.26,1131.74 +1131.73,1134.69,1128.09,1131.12 +1131.13,1135.89,1128.88,1131.75 +1131.74,1133.6,1124.46,1128.65 +1128.64,1128.64,1126.05,1127.47 +1127.48,1127.99,1121.97,1122.27 +1122.41,1126.0,1120.0,1125.11 +1125.52,1130.0,1120.85,1129.07 +1129.98,1133.88,1125.16,1128.0 +1128.0,1131.3,1125.26,1131.12 +1130.22,1131.18,1124.63,1125.97 +1125.97,1129.0,1124.22,1128.32 +1127.66,1128.43,1122.27,1128.43 +1128.43,1134.0,1128.43,1133.99 +1134.0,1149.99,1133.99,1144.23 +1144.23,1146.0,1141.74,1145.81 +1145.8,1151.21,1142.28,1150.89 +1150.58,1155.49,1147.38,1154.69 +1154.65,1162.95,1154.61,1155.2 +1155.19,1158.68,1150.44,1152.77 +1153.84,1165.0,1152.5,1155.63 +1156.09,1165.0,1155.14,1156.67 +1156.67,1160.0,1156.67,1160.0 +1160.0,1160.0,1156.49,1159.92 +1159.93,1170.0,1159.92,1170.0 +1170.0,1174.98,1165.0,1173.71 +1173.7,1175.0,1167.44,1170.38 +1171.22,1171.34,1160.78,1166.3 +1166.3,1170.59,1164.31,1169.51 +1169.54,1171.73,1165.66,1171.55 +1171.55,1176.17,1170.24,1172.85 +1172.85,1178.76,1171.81,1176.88 +1176.91,1190.0,1176.05,1183.82 +1183.81,1188.02,1175.88,1183.9 +1183.62,1200.0,1182.86,1200.0 +1200.0,1206.97,1187.62,1200.08 +1200.08,1200.75,1189.14,1197.77 +1197.81,1198.0,1183.84,1188.93 +1189.09,1195.0,1186.95,1186.95 +1186.96,1199.51,1186.95,1194.5 +1194.49,1199.74,1189.1,1189.11 +1189.1,1190.35,1175.68,1175.84 +1176.1,1190.2,1175.26,1187.84 +1187.83,1191.29,1179.24,1182.1 +1182.1,1188.0,1182.1,1185.99 +1185.98,1194.21,1185.98,1193.44 +1193.61,1197.9,1193.61,1194.18 +1194.18,1198.65,1193.4,1196.32 +1195.99,1196.19,1184.23,1194.33 +1194.76,1194.77,1188.55,1192.28 +1192.28,1192.51,1187.74,1192.2 +1192.2,1193.46,1189.59,1192.01 +1192.13,1194.98,1189.42,1193.89 +1193.49,1196.98,1190.32,1196.9 +1196.91,1196.99,1190.1,1194.66 +1194.99,1194.99,1189.58,1192.44 +1192.06,1194.99,1187.91,1194.99 +1194.98,1198.95,1193.66,1198.92 +1198.88,1203.0,1196.02,1199.33 +1199.33,1201.84,1190.74,1194.14 +1194.11,1195.41,1186.03,1189.99 +1189.73,1194.99,1185.5,1194.23 +1194.17,1194.17,1177.54,1180.76 +1180.47,1189.5,1179.8,1189.05 +1189.03,1192.0,1187.98,1191.0 +1191.0,1198.0,1191.0,1194.83 +1194.57,1196.5,1191.92,1194.11 +1194.16,1195.94,1192.91,1193.85 +1193.85,1194.29,1187.84,1189.77 +1189.78,1194.95,1189.78,1193.87 +1193.89,1196.01,1192.93,1194.61 +1194.43,1194.81,1190.18,1192.19 +1192.24,1192.24,1181.01,1186.0 +1185.99,1191.72,1183.38,1191.72 +1191.03,1191.45,1187.85,1190.92 +1190.92,1191.32,1188.74,1190.76 +1190.75,1191.91,1187.26,1187.55 +1187.55,1189.61,1184.85,1185.82 +1185.82,1191.0,1185.66,1190.75 +1190.75,1190.99,1188.39,1189.75 +1189.77,1190.35,1170.0,1175.92 +1176.41,1184.12,1174.57,1182.98 +1182.99,1183.0,1180.0,1181.0 +1181.0,1182.99,1180.99,1182.96 +1182.96,1182.98,1182.01,1182.36 +1182.36,1184.5,1181.67,1184.5 +1184.5,1189.0,1184.49,1187.0 +1186.95,1186.95,1182.9,1185.35 +1185.35,1185.5,1184.14,1185.27 +1185.25,1187.65,1185.17,1186.48 +1186.48,1187.69,1183.82,1185.92 +1186.24,1186.39,1182.69,1185.61 +1185.55,1186.23,1185.51,1186.22 +1186.22,1186.23,1185.05,1185.06 +1185.35,1185.89,1182.98,1183.0 +1183.0,1183.0,1182.68,1183.0 +1183.0,1183.0,1180.0,1180.62 +1180.63,1181.17,1175.8,1178.19 +1178.16,1188.0,1178.16,1185.9 +1186.07,1187.99,1185.47,1187.99 +1188.0,1191.99,1185.84,1191.99 +1191.99,1200.83,1191.99,1200.83 +1200.82,1221.0,1200.82,1211.0 +1210.57,1215.6,1207.84,1211.61 +1211.66,1212.31,1206.28,1208.01 +1207.92,1214.99,1207.28,1214.8 +1214.8,1215.44,1205.24,1206.52 +1206.6,1210.56,1206.04,1209.95 +1209.96,1213.0,1209.36,1211.74 +1211.74,1212.9,1209.34,1210.99 +1210.99,1212.99,1210.5,1212.75 +1212.76,1212.98,1210.58,1212.81 +1212.69,1219.78,1212.5,1216.09 +1216.45,1218.8,1215.9,1217.99 +1218.0,1218.0,1215.0,1215.43 +1215.29,1215.29,1213.22,1213.23 +1213.22,1213.35,1208.12,1210.62 +1210.6,1210.69,1208.0,1208.39 +1208.47,1215.1,1208.15,1214.41 +1214.4,1218.0,1213.51,1218.0 +1218.0,1218.0,1214.64,1217.66 +1217.62,1218.0,1214.63,1214.98 +1214.99,1215.35,1212.25,1214.24 +1214.18,1214.34,1211.68,1213.08 +1213.67,1214.35,1211.22,1213.73 +1213.67,1213.77,1209.45,1212.5 +1212.47,1212.99,1211.0,1212.74 +1212.64,1212.76,1211.78,1212.02 +1212.09,1212.21,1204.3,1209.0 +1208.61,1212.0,1206.25,1206.67 +1206.66,1206.94,1201.0,1202.91 +1202.9,1204.5,1201.02,1203.49 +1203.49,1209.9,1201.28,1209.01 +1209.12,1210.0,1206.5,1209.99 +1210.0,1214.39,1209.99,1214.26 +1214.2,1214.49,1212.79,1214.46 +1214.46,1214.47,1207.38,1208.34 +1208.32,1209.46,1201.28,1203.99 +1203.76,1203.85,1200.0,1203.1 +1203.11,1206.0,1201.5,1205.99 +1206.0,1208.96,1203.63,1208.83 +1208.82,1208.99,1203.06,1205.64 +1205.26,1208.5,1205.03,1208.01 +1208.11,1209.0,1200.6,1207.82 +1207.8,1211.0,1204.08,1211.0 +1211.0,1213.0,1208.31,1212.65 +1212.77,1213.78,1211.0,1213.71 +1213.71,1213.99,1212.35,1213.28 +1213.28,1215.05,1212.99,1215.05 +1215.04,1223.98,1213.33,1223.97 +1223.98,1234.0,1223.5,1230.75 +1230.75,1231.0,1225.0,1228.89 +1228.88,1228.99,1225.96,1226.61 +1226.61,1226.61,1221.17,1222.45 +1222.19,1228.0,1221.28,1228.0 +1228.0,1230.72,1226.71,1228.77 +1228.48,1228.5,1225.94,1226.98 +1226.98,1228.32,1222.7,1224.0 +1224.01,1227.86,1223.05,1226.45 +1226.45,1227.28,1224.01,1224.91 +1224.41,1227.86,1224.01,1225.96 +1226.0,1227.49,1224.67,1225.75 +1225.76,1226.85,1223.8,1223.81 +1223.81,1223.82,1216.62,1217.71 +1217.63,1218.08,1215.0,1217.09 +1217.42,1219.5,1215.17,1217.8 +1218.21,1225.25,1217.83,1222.69 +1222.72,1223.77,1219.13,1220.64 +1220.5,1220.5,1215.1,1217.39 +1216.68,1220.34,1216.57,1218.48 +1218.17,1219.2,1212.75,1214.16 +1213.96,1221.04,1211.62,1221.04 +1221.04,1221.75,1216.99,1220.95 +1220.96,1220.98,1215.52,1219.32 +1219.33,1219.33,1211.46,1217.13 +1217.22,1218.47,1214.68,1217.26 +1217.35,1220.8,1216.13,1220.8 +1216.6,1221.0,1214.08,1216.21 +1215.85,1218.67,1214.29,1214.49 +1214.04,1216.1,1210.0,1216.1 +1216.02,1216.18,1209.61,1212.44 +1213.16,1218.32,1211.36,1216.13 +1215.44,1218.12,1212.96,1218.12 +1218.12,1218.98,1217.4,1218.65 +1218.47,1219.49,1215.25,1215.94 +1215.95,1217.93,1210.37,1212.78 +1212.93,1216.74,1211.56,1216.0 +1215.42,1216.82,1168.51,1174.0 +1174.01,1189.94,1170.39,1184.66 +1185.0,1196.93,1184.09,1193.13 +1193.12,1193.19,1182.27,1189.46 +1189.46,1190.03,1183.64,1185.38 +1185.3,1194.96,1183.06,1194.74 +1194.79,1198.0,1194.09,1196.49 +1196.49,1197.53,1195.36,1197.47 +1197.12,1197.8,1185.1,1185.21 +1186.5,1190.95,1175.0,1179.5 +1179.49,1186.95,1168.3,1177.95 +1176.79,1179.39,1169.45,1171.12 +1170.35,1170.35,1148.98,1162.95 +1162.32,1166.92,1155.0,1163.98 +1163.99,1174.68,1163.98,1167.49 +1167.49,1169.99,1165.2,1169.95 +1169.98,1175.98,1165.0,1175.01 +1175.64,1177.5,1172.46,1174.92 +1174.91,1178.97,1169.55,1177.81 +1177.81,1178.0,1171.32,1177.56 +1177.79,1184.99,1177.5,1184.92 +1184.92,1184.93,1180.39,1182.5 +1182.01,1182.99,1178.73,1182.93 +1182.92,1185.24,1182.3,1185.1 +1184.99,1189.45,1184.99,1189.45 +1189.44,1195.95,1189.42,1195.9 +1195.89,1196.92,1185.87,1190.59 +1190.57,1192.28,1181.56,1181.56 +1181.57,1181.57,1170.14,1175.53 +1175.53,1177.69,1171.87,1176.94 +1176.91,1176.91,1173.31,1174.0 +1174.0,1179.53,1172.96,1177.9 +1177.33,1187.0,1174.13,1187.0 +1187.0,1189.49,1182.65,1186.98 +1186.99,1188.82,1179.96,1183.88 +1184.53,1188.77,1182.12,1188.77 +1188.81,1188.98,1183.12,1188.88 +1188.88,1188.9,1186.16,1186.62 +1187.58,1187.97,1178.01,1181.0 +1180.95,1184.66,1176.53,1181.17 +1180.84,1182.99,1176.01,1178.92 +1179.44,1179.5,1172.76,1175.38 +1175.97,1176.0,1170.26,1171.95 +1170.32,1174.86,1170.32,1173.33 +1173.33,1177.0,1171.6,1176.53 +1176.48,1177.43,1169.91,1175.97 +1175.86,1180.86,1172.77,1179.39 +1179.37,1182.14,1178.01,1182.14 +1181.88,1182.2,1177.2,1181.0 +1181.0,1182.99,1177.78,1181.39 +1181.39,1182.94,1173.78,1177.67 +1177.67,1181.51,1176.9,1179.98 +1179.93,1181.24,1176.02,1180.04 +1179.43,1182.82,1179.09,1181.58 +1181.54,1182.74,1179.89,1180.04 +1180.04,1182.46,1176.96,1182.41 +1182.41,1182.95,1180.98,1182.48 +1182.72,1187.0,1182.55,1187.0 +1186.99,1188.99,1185.53,1188.99 +1188.98,1189.99,1188.53,1189.99 +1189.99,1190.99,1180.65,1181.2 +1182.12,1186.0,1181.06,1182.99 +1182.98,1182.99,1182.98,1175.9975 +1175.9925,1184.1933333333334,788.6733333333334,1169.005 +1169.005,1185.3966666666665,394.3666666666667,1162.0125 +1162.0175,1186.6,0.06,1155.02 +1155.03,1183.65,1155.03,1177.79 +1177.7,1185.95,1176.06,1185.95 +1184.2,1186.37,1180.25,1182.0 +1182.09,1184.99,1182.09,1184.36 +1184.9,1187.99,1184.5,1187.93 +1187.56,1188.75,1180.2,1187.97 +1187.86,1189.84,1185.0,1189.32 +1189.34,1189.93,1187.0,1187.87 +1187.62,1189.2,1187.01,1188.39 +1188.39,1188.39,1182.63,1183.31 +1183.32,1186.4,1181.77,1186.37 +1186.31,1187.84,1185.49,1185.57 +1186.13,1186.98,1182.25,1182.33 +1182.25,1182.49,1179.0,1179.23 +1179.23,1179.9,1177.0,1178.14 +1178.14,1179.88,1171.7,1177.4 +1177.39,1183.3,1173.5,1179.26 +1178.55,1180.0,1178.55,1179.55 +1179.54,1180.0,1178.97,1179.97 +1179.97,1181.76,1179.01,1181.71 +1181.73,1181.79,1176.54,1181.46 +1180.84,1181.42,1177.08,1180.34 +1180.34,1180.81,1179.52,1180.8 +1180.68,1180.82,1178.04,1179.95 +1179.99,1180.82,1175.03,1177.64 +1176.97,1177.97,1173.56,1177.1 +1177.1,1177.1,1173.74,1174.84 +1174.84,1177.97,1172.0,1177.97 +1177.9,1178.99,1175.0,1177.96 +1177.96,1178.83,1171.49,1173.86 +1173.64,1176.2,1170.85,1174.51 +1174.93,1177.84,1171.05,1173.75 +1174.02,1174.99,1172.3,1174.86 +1174.86,1178.72,1174.01,1177.79 +1177.33,1178.4,1171.77,1177.49 +1177.49,1178.73,1171.79,1172.82 +1173.49,1174.67,1172.8,1174.01 +1174.03,1177.0,1171.77,1175.63 +1175.06,1177.0,1172.28,1174.45 +1174.42,1178.7,1172.2,1178.7 +1178.7,1187.1,1178.68,1186.94 +1186.92,1187.99,1181.0,1185.71 +1185.27,1187.9,1181.06,1184.26 +1184.36,1197.6,1181.29,1191.91 +1191.93,1194.9,1187.04,1194.0 +1193.86,1193.86,1187.56,1191.68 +1191.68,1192.0,1180.05,1184.47 +1186.56,1193.95,1184.4,1192.64 +1192.69,1194.0,1188.74,1191.06 +1191.07,1193.99,1190.0,1192.82 +1193.47,1194.0,1189.76,1194.0 +1193.97,1195.07,1192.09,1195.07 +1195.22,1197.0,1194.54,1196.95 +1196.95,1200.99,1196.95,1200.84 +1200.52,1200.98,1192.02,1195.24 +1195.23,1198.49,1193.76,1197.98 +1196.59,1198.69,1196.32,1197.91 +1197.24,1198.69,1197.14,1197.99 +1198.32,1198.69,1193.01,1193.01 +1195.66,1198.5,1194.0,1196.53 +1196.55,1201.0,1195.67,1201.0 +1201.0,1206.65,1200.99,1203.75 +1203.77,1204.67,1195.72,1196.17 +1196.99,1202.83,1192.32,1201.25 +1201.25,1201.76,1194.5,1201.75 +1201.35,1201.99,1198.0,1201.99 +1201.98,1204.0,1200.21,1204.0 +1203.99,1204.0,1201.5,1202.37 +1202.94,1203.67,1201.5,1202.0 +1202.04,1202.5,1197.68,1199.05 +1199.07,1201.66,1197.28,1201.0 +1201.0,1201.5,1198.5,1201.03 +1200.71,1203.1,1198.65,1201.29 +1201.19,1201.28,1198.0,1200.0 +1199.99,1204.63,1199.05,1201.27 +1201.44,1207.44,1197.11,1207.44 +1207.29,1207.29,1203.55,1205.45 +1205.5,1206.99,1203.25,1205.62 +1205.61,1206.0,1196.5,1198.38 +1199.12,1199.12,1194.11,1194.55 +1194.62,1195.44,1191.26,1195.09 +1195.09,1195.77,1191.09,1192.97 +1193.57,1199.17,1191.23,1198.19 +1197.84,1198.5,1196.5,1197.28 +1197.44,1200.19,1196.93,1199.0 +1199.27,1201.99,1197.55,1201.68 +1201.59,1201.99,1199.33,1200.02 +1200.02,1203.0,1198.52,1202.68 +1202.26,1202.99,1199.79,1202.41 +1202.08,1202.74,1201.25,1201.97 +1202.0,1202.99,1201.25,1202.43 +1202.45,1203.0,1201.5,1202.4 +1202.5,1206.3,1201.71,1204.09 +1204.26,1206.21,1200.01,1205.14 +1205.14,1206.5,1200.29,1202.0 +1202.01,1206.82,1201.51,1206.78 +1206.82,1216.78,1206.4,1216.26 +1216.22,1220.0,1216.22,1217.59 +1217.55,1218.99,1213.0,1213.33 +1213.29,1218.0,1212.01,1217.47 +1217.41,1218.69,1215.15,1217.04 +1217.08,1219.54,1215.5,1219.12 +1218.98,1219.98,1218.29,1219.38 +1219.38,1219.98,1218.71,1219.18 +1219.31,1222.02,1218.97,1222.02 +1222.02,1225.0,1221.56,1223.77 +1223.79,1224.89,1219.77,1224.11 +1224.12,1225.0,1222.16,1224.91 +1224.92,1224.95,1222.02,1222.02 +1222.02,1222.22,1220.0,1221.98 +1221.98,1223.0,1219.35,1222.63 +1222.98,1225.0,1221.48,1225.0 +1225.0,1230.0,1224.94,1229.99 +1230.0,1237.99,1226.2,1237.98 +1237.55,1240.6,1231.58,1235.24 +1235.24,1235.8,1230.0,1231.09 +1232.02,1237.0,1228.0,1235.88 +1235.9,1240.0,1235.04,1238.43 +1238.43,1238.43,1231.0,1231.1 +1231.16,1236.5,1231.1,1236.36 +1236.34,1238.0,1232.06,1237.99 +1238.0,1243.86,1238.0,1240.3 +1240.26,1244.97,1239.01,1244.97 +1244.96,1246.98,1243.78,1245.98 +1246.74,1247.0,1240.76,1241.61 +1241.46,1246.19,1241.02,1246.07 +1246.19,1247.0,1246.17,1246.41 +1246.58,1249.6,1246.56,1249.6 +1249.6,1249.88,1245.54,1247.73 +1247.89,1254.98,1247.89,1254.95 +1254.95,1256.29,1251.07,1256.03 +1255.01,1257.33,1254.0,1256.14 +1256.55,1258.77,1251.41,1256.0 +1255.29,1255.99,1246.99,1253.37 +1252.8,1253.68,1246.6,1246.61 +1246.91,1249.99,1242.08,1246.02 +1246.16,1247.35,1242.0,1245.7 +1245.71,1247.0,1244.0,1244.59 +1244.49,1247.09,1243.07,1244.03 +1244.25,1248.5,1243.03,1247.17 +1247.18,1248.79,1243.06,1247.34 +1247.34,1247.34,1245.2,1246.87 +1246.87,1249.5,1245.35,1246.36 +1246.34,1247.79,1244.46,1246.82 +1246.8,1250.73,1246.04,1249.91 +1249.98,1250.0,1247.58,1249.86 +1249.85,1249.99,1249.0,1249.99 +1249.99,1249.99,1248.66,1249.47 +1249.48,1250.0,1248.51,1249.7 +1249.69,1249.7,1245.69,1248.38 +1248.39,1248.48,1245.07,1246.9 +1247.11,1249.99,1246.5,1248.84 +1248.85,1249.61,1246.37,1248.15 +1248.15,1249.2,1244.0,1245.25 +1245.01,1247.26,1243.52,1244.57 +1244.58,1244.71,1243.06,1244.04 +1244.04,1244.24,1243.06,1244.24 +1243.66,1243.66,1238.4,1239.0 +1239.0,1239.61,1221.51,1229.46 +1230.0,1234.87,1229.51,1233.69 +1233.66,1241.26,1233.16,1241.25 +1241.25,1247.44,1241.1,1247.03 +1246.74,1246.74,1241.27,1242.47 +1242.19,1247.98,1241.4,1247.98 +1247.98,1249.99,1247.42,1248.92 +1248.84,1250.0,1246.35,1250.0 +1250.0,1253.0,1249.04,1251.7 +1251.74,1252.49,1247.06,1249.99 +1249.99,1250.0,1243.1,1246.98 +1246.98,1247.5,1242.5,1243.7 +1243.91,1245.41,1240.68,1245.01 +1245.1,1245.95,1241.74,1244.75 +1244.78,1244.78,1236.2,1237.82 +1237.93,1241.49,1236.79,1238.33 +1238.41,1243.0,1237.0,1242.99 +1242.99,1249.0,1242.8,1248.3 +1248.31,1249.98,1248.3,1249.35 +1249.5,1249.99,1246.6,1246.86 +1247.0,1247.0,1242.29,1246.5 +1246.5,1248.83,1244.64,1248.81 +1248.51,1248.8,1244.51,1247.21 +1247.21,1248.86,1245.01,1248.78 +1248.51,1250.0,1246.73,1247.99 +1247.98,1250.0,1247.32,1249.99 +1249.96,1251.99,1249.18,1251.63 +1251.72,1254.0,1251.0,1251.01 +1251.02,1251.09,1247.51,1249.13 +1249.32,1252.99,1248.73,1252.99 +1252.75,1252.99,1248.2,1249.57 +1248.76,1249.99,1246.11,1249.38 +1249.41,1250.0,1247.55,1249.34 +1249.47,1250.0,1247.56,1249.99 +1249.98,1252.49,1248.79,1250.51 +1250.7,1251.98,1246.31,1249.28 +1249.23,1251.99,1247.15,1249.91 +1249.95,1251.92,1249.1,1251.82 +1251.81,1254.45,1249.55,1253.01 +1253.0,1255.0,1248.51,1252.67 +1254.11,1255.0,1252.78,1253.85 +1253.82,1254.5,1253.5,1254.0 +1253.89,1253.89,1248.39,1249.0 +1249.0,1253.0,1247.18,1247.37 +1247.38,1249.18,1247.0,1248.92 +1249.04,1250.0,1247.0,1249.49 +1249.88,1251.99,1248.71,1251.26 +1250.82,1251.38,1248.17,1250.02 +1250.02,1251.2,1248.33,1251.08 +1251.15,1251.2,1248.66,1249.99 +1249.99,1250.99,1247.87,1250.99 +1250.99,1252.17,1250.84,1251.8 +1251.56,1259.99,1251.02,1255.68 +1255.6,1258.0,1254.83,1257.6 +1257.6,1260.0,1257.6,1259.5 +1259.49,1259.99,1257.59,1258.99 +1258.92,1260.0,1258.02,1260.0 +1259.99,1261.16,1258.0,1258.32 +1258.31,1260.47,1256.16,1258.04 +1257.68,1259.24,1256.53,1258.67 +1258.62,1261.94,1258.36,1260.97 +1260.23,1263.5,1259.27,1261.42 +1261.43,1267.14,1260.99,1266.58 +1266.54,1269.83,1265.04,1269.69 +1269.69,1270.13,1266.0,1266.97 +1266.96,1267.0,1266.59,1267.0 +1267.0,1268.89,1267.0,1268.89 +1268.89,1268.89,1267.81,1268.73 +1268.51,1269.78,1267.4,1269.77 +1269.76,1276.19,1268.64,1276.0 +1275.99,1280.0,1275.99,1280.0 +1279.93,1280.0,1270.0,1271.12 +1271.11,1279.0,1269.75,1273.31 +1273.31,1274.52,1272.58,1274.48 +1274.23,1280.84,1273.51,1280.84 +1280.82,1287.0,1278.53,1280.49 +1280.52,1286.0,1278.0,1283.52 +1283.51,1285.19,1276.96,1280.7 +1280.47,1284.99,1279.79,1283.34 +1283.79,1285.42,1283.0,1285.02 +1285.01,1285.02,1278.85,1282.94 +1282.77,1282.86,1279.31,1281.88 +1281.6,1282.19,1279.1,1281.33 +1281.33,1283.36,1279.53,1282.67 +1282.64,1282.91,1280.0,1280.82 +1280.88,1281.9,1279.5,1280.53 +1280.56,1284.96,1279.51,1284.32 +1284.32,1288.04,1284.31,1286.99 +1286.99,1289.75,1285.34,1289.75 +1289.06,1290.98,1288.78,1290.28 +1290.33,1290.5,1288.73,1289.1 +1289.1,1290.5,1288.83,1290.48 +1290.48,1290.5,1281.46,1282.77 +1282.4,1287.34,1282.31,1285.61 +1285.79,1290.5,1285.79,1290.08 +1290.26,1298.0,1290.26,1296.87 +1296.81,1299.0,1294.54,1298.99 +1298.99,1308.66,1298.61,1302.75 +1303.42,1314.75,1300.3,1314.26 +1314.26,1319.92,1314.1,1317.98 +1317.95,1320.0,1316.75,1319.16 +1319.96,1320.0,1309.11,1310.0 +1310.01,1310.47,1304.0,1304.0 +1304.01,1304.01,1289.22,1294.09 +1293.88,1300.0,1293.88,1298.9 +1299.86,1307.0,1297.36,1298.98 +1299.03,1301.13,1295.0,1297.69 +1297.35,1299.0,1295.39,1296.97 +1296.95,1301.0,1296.68,1300.99 +1300.99,1303.0,1300.57,1302.49 +1302.99,1306.89,1302.62,1306.87 +1306.85,1312.79,1302.9,1312.66 +1312.66,1316.95,1309.36,1316.21 +1316.21,1319.73,1315.82,1317.95 +1317.95,1318.86,1314.67,1315.66 +1315.8,1319.62,1313.24,1315.53 +1315.84,1318.94,1313.03,1313.06 +1313.06,1313.7,1307.55,1308.61 +1309.37,1318.0,1307.56,1318.0 +1318.0,1319.95,1308.68,1316.99 +1315.32,1331.59,1312.51,1330.43 +1330.5,1338.88,1330.07,1337.94 +1337.93,1346.71,1335.07,1339.17 +1339.31,1341.0,1336.0,1340.5 +1340.49,1340.5,1335.5,1338.53 +1338.27,1338.65,1332.81,1334.56 +1335.42,1340.47,1333.0,1340.25 +1340.11,1357.58,1340.09,1355.1 +1355.22,1360.0,1346.0,1355.99 +1355.0,1356.99,1348.5,1352.86 +1352.86,1355.49,1346.38,1350.0 +1348.79,1350.42,1336.19,1345.02 +1345.16,1358.12,1344.01,1356.14 +1356.41,1381.01,1355.0,1373.87 +1373.87,1377.56,1358.85,1360.32 +1360.32,1366.71,1355.02,1355.5 +1355.52,1360.07,1354.02,1359.06 +1359.07,1359.72,1343.0,1345.2 +1345.18,1358.91,1343.0,1347.05 +1347.05,1347.06,1343.01,1344.28 +1344.25,1345.92,1336.0,1343.98 +1343.93,1344.5,1333.0,1334.57 +1334.54,1336.5,1305.55,1325.47 +1325.48,1343.0,1322.88,1340.81 +1341.42,1348.01,1336.1,1343.64 +1345.28,1348.95,1325.43,1335.85 +1335.85,1344.03,1335.76,1342.93 +1342.93,1342.94,1321.71,1322.85 +1322.82,1328.28,1320.2,1324.0 +1324.01,1324.01,1305.0,1305.76 +1305.79,1320.35,1300.2,1320.35 +1320.35,1320.35,1305.41,1311.27 +1311.71,1326.72,1311.29,1326.57 +1326.58,1344.44,1326.58,1344.44 +1344.44,1359.12,1342.04,1352.82 +1353.2,1363.0,1348.61,1360.0 +1360.0,1360.0,1350.46,1354.15 +1354.13,1355.94,1348.02,1349.52 +1349.52,1356.99,1349.25,1356.95 +1356.95,1364.99,1356.91,1364.06 +1364.05,1364.88,1358.91,1359.03 +1359.04,1360.5,1352.5,1360.22 +1360.21,1361.54,1350.5,1361.26 +1360.13,1361.55,1351.28,1352.07 +1352.0,1365.0,1345.86,1363.04 +1363.45,1364.78,1353.25,1355.0 +1355.0,1355.01,1338.96,1339.99 +1339.98,1344.59,1335.64,1337.0 +1337.0,1349.4,1337.0,1348.84 +1348.85,1352.0,1345.01,1350.99 +1350.99,1354.0,1341.58,1353.45 +1350.91,1358.0,1346.88,1355.91 +1355.86,1363.0,1355.01,1357.64 +1359.46,1362.0,1357.0,1359.83 +1359.08,1365.0,1357.0,1363.51 +1363.14,1365.0,1359.0,1363.05 +1363.03,1368.99,1360.51,1367.77 +1367.77,1369.5,1357.48,1358.45 +1358.5,1367.42,1356.0,1364.83 +1364.93,1367.99,1355.0,1363.92 +1363.92,1364.5,1350.9,1359.03 +1359.02,1362.0,1353.5,1356.73 +1356.21,1358.39,1339.98,1341.97 +1341.57,1347.0,1334.02,1347.0 +1347.0,1352.33,1341.58,1346.86 +1346.68,1350.0,1342.8,1348.5 +1348.55,1350.86,1344.55,1348.13 +1348.14,1348.17,1340.1,1343.99 +1344.0,1345.5,1338.5,1343.5 +1343.5,1351.34,1339.99,1346.98 +1346.97,1347.0,1340.46,1341.65 +1341.66,1346.58,1336.07,1345.72 +1345.72,1347.0,1340.39,1344.57 +1344.51,1350.0,1343.18,1343.82 +1343.39,1348.24,1341.72,1343.02 +1343.02,1348.9,1340.25,1343.13 +1341.44,1349.9,1340.01,1346.92 +1346.92,1361.5,1343.1,1357.01 +1357.01,1359.13,1340.97,1359.02 +1359.02,1378.63,1358.99,1377.7 +1377.97,1394.51,1370.0,1378.88 +1378.88,1384.91,1373.16,1383.99 +1383.99,1391.99,1373.95,1382.03 +1382.03,1397.9,1370.98,1386.37 +1386.39,1396.0,1383.79,1390.88 +1390.05,1404.44,1387.63,1404.43 +1404.44,1427.34,1403.3,1412.22 +1412.23,1423.0,1410.0,1422.87 +1421.96,1428.01,1413.06,1420.48 +1421.43,1425.0,1415.0,1417.86 +1417.86,1418.0,1411.5,1413.0 +1413.0,1415.46,1401.27,1404.97 +1404.85,1405.01,1391.16,1398.15 +1398.14,1401.83,1395.16,1400.0 +1400.0,1400.88,1397.27,1400.49 +1400.73,1407.5,1400.73,1407.26 +1406.68,1423.5,1406.43,1423.05 +1423.21,1466.69,1420.63,1459.73 +1459.73,1462.57,1440.0,1447.25 +1447.07,1460.0,1445.0,1457.0 +1457.0,1463.0,1430.0,1441.22 +1442.93,1454.37,1440.0,1444.12 +1443.77,1457.22,1440.34,1455.5 +1455.49,1462.99,1446.61,1461.99 +1461.11,1465.09,1454.34,1455.97 +1455.97,1457.03,1450.0,1451.32 +1450.96,1453.96,1435.0,1435.01 +1435.01,1435.01,1426.51,1435.0 +1434.95,1443.0,1434.95,1443.0 +1443.0,1447.47,1442.9,1447.07 +1447.08,1447.45,1440.01,1444.41 +1444.42,1456.78,1444.42,1451.91 +1451.93,1467.83,1451.92,1459.29 +1459.3,1459.3,1448.5,1448.99 +1448.99,1449.0,1445.43,1448.98 +1448.81,1458.2,1448.42,1454.0 +1454.0,1467.3,1451.73,1467.3 +1467.3,1480.0,1465.03,1479.5 +1479.49,1490.84,1465.0,1490.06 +1488.88,1490.0,1471.51,1490.0 +1489.99,1492.93,1475.89,1479.87 +1479.88,1489.74,1466.03,1482.0 +1481.52,1489.32,1474.89,1476.07 +1476.16,1478.2,1474.17,1474.17 +1476.35,1478.98,1470.0,1470.97 +1470.97,1471.0,1441.11,1447.5 +1447.5,1463.18,1437.5,1452.05 +1452.04,1455.61,1444.0,1447.7 +1447.74,1454.0,1446.41,1449.76 +1449.52,1471.33,1448.92,1469.35 +1469.34,1473.49,1462.11,1473.49 +1473.5,1479.93,1473.32,1479.0 +1479.0,1482.29,1476.61,1477.99 +1477.99,1479.0,1466.0,1466.89 +1466.89,1476.57,1466.83,1473.25 +1473.25,1475.0,1471.0,1474.11 +1474.12,1474.17,1453.71,1455.59 +1455.6,1461.4,1453.68,1455.66 +1455.71,1459.5,1455.55,1457.85 +1457.94,1461.0,1456.39,1461.0 +1460.99,1473.47,1457.77,1467.995 +1471.59,1476.0,1460.79,1474.99 +1474.99,1480.0,1474.74,1479.5 +1479.49,1483.0,1477.5,1478.98 +1478.98,1479.58,1467.25,1471.04 +1470.22,1476.99,1464.54,1476.99 +1476.99,1481.25,1475.7,1478.29 +1478.29,1478.29,1465.6,1477.33 +1477.42,1497.99,1474.68,1495.0 +1494.99,1503.03,1490.0,1503.03 +1503.02,1517.11,1503.0,1506.01 +1506.13,1524.0,1506.12,1520.0 +1520.0,1520.0,1503.0,1514.0 +1514.0,1526.15,1510.7,1526.11 +1526.11,1535.0,1511.6,1534.9 +1534.89,1539.09,1533.03,1538.83 +1538.83,1546.32,1538.81,1542.47 +1542.31,1542.31,1525.21,1539.45 +1539.47,1558.32,1536.09,1558.32 +1558.23,1581.18,1557.17,1581.18 +1581.18,1585.0,1559.82,1571.92 +1571.97,1574.0,1547.95,1558.0 +1558.0,1579.69,1551.95,1579.5 +1579.5,1589.14,1575.06,1578.98 +1578.98,1579.5,1568.92,1572.57 +1572.6,1572.69,1561.51,1568.25 +1568.25,1578.35,1560.85,1576.98 +1576.98,1576.98,1569.02,1574.49 +1574.26,1596.5,1567.0,1596.16 +1596.5,1600.0,1587.62,1595.99 +1595.99,1624.35,1592.14,1617.66 +1618.28,1620.46,1611.0,1614.13 +1614.13,1651.0,1613.86,1650.5 +1650.5,1665.0,1633.45,1637.84 +1638.96,1638.98,1516.0,1545.71 +1545.71,1564.85,1482.06,1498.04 +1499.76,1557.12,1499.71,1557.11 +1557.0,1564.13,1533.35,1548.49 +1548.48,1566.1,1528.55,1566.1 +1566.1,1570.0,1553.38,1569.99 +1569.98,1597.94,1564.13,1590.0 +1590.0,1595.99,1575.16,1594.66 +1595.27,1597.99,1581.92,1596.97 +1596.92,1612.0,1592.0,1612.0 +1611.44,1624.99,1607.66,1624.5 +1624.07,1630.0,1621.11,1629.99 +1630.0,1630.0,1601.5,1613.01 +1613.41,1630.0,1606.62,1625.0 +1624.89,1624.94,1608.79,1615.79 +1615.79,1617.0,1608.74,1609.81 +1609.53,1623.1,1585.0,1621.4 +1621.38,1621.97,1605.77,1609.98 +1609.96,1618.0,1609.04,1617.77 +1617.76,1617.97,1595.66,1597.37 +1597.5,1599.5,1570.0,1577.29 +1576.7,1579.77,1535.11,1548.0 +1548.34,1592.73,1548.34,1587.0 +1586.99,1587.0,1573.16,1573.16 +1573.16,1576.34,1555.0,1556.9 +1556.9,1557.95,1540.0,1545.0 +1545.75,1568.44,1540.09,1567.0 +1567.0,1570.1,1560.49,1570.06 +1562.47,1570.05,1536.02,1557.16 +1557.94,1567.0,1555.03,1567.0 +1567.0,1579.99,1567.0,1579.94 +1579.95,1579.95,1573.64,1574.99 +1574.99,1579.0,1568.89,1579.0 +1579.0,1583.28,1574.22,1579.99 +1580.0,1582.43,1575.07,1579.29 +1579.28,1589.18,1574.05,1586.84 +1586.43,1591.0,1586.31,1590.99 +1590.99,1597.83,1590.16,1595.58 +1595.58,1595.59,1577.79,1583.94 +1583.95,1588.69,1560.0,1588.64 +1588.65,1594.23,1581.89,1593.01 +1592.42,1592.42,1581.85,1585.62 +1586.16,1598.89,1580.94,1598.89 +1598.88,1598.88,1586.01,1589.88 +1589.86,1590.0,1570.0,1575.86 +1575.16,1582.36,1572.49,1577.85 +1577.84,1585.88,1576.89,1585.87 +1585.7,1590.0,1585.01,1590.0 +1589.99,1590.47,1588.0,1590.24 +1590.24,1590.25,1585.78,1590.25 +1590.25,1590.25,1575.27,1585.17 +1584.72,1588.3,1580.01,1584.62 +1584.68,1588.93,1578.01,1585.11 +1585.71,1588.11,1581.67,1587.62 +1586.88,1589.79,1584.97,1589.22 +1589.03,1600.0,1588.03,1599.25 +1599.24,1602.91,1588.35,1602.69 +1602.38,1603.0,1598.85,1602.93 +1602.93,1603.69,1600.0,1603.32 +1603.31,1603.38,1596.52,1599.12 +1599.12,1599.24,1580.91,1582.97 +1582.04,1594.5,1582.02,1594.28 +1594.27,1594.81,1590.66,1593.07 +1593.06,1593.07,1585.42,1588.02 +1588.0,1589.69,1586.89,1589.39 +1589.46,1589.67,1570.39,1578.68 +1578.62,1579.0,1563.87,1573.54 +1573.54,1580.42,1570.8,1580.42 +1580.42,1580.42,1572.74,1579.4 +1579.4,1579.99,1575.06,1579.75 +1579.75,1581.99,1567.46,1581.98 +1581.97,1586.99,1569.45,1583.59 +1583.59,1599.0,1583.0,1599.0 +1599.0,1600.0,1590.0,1598.09 +1598.2,1600.83,1595.12,1599.39 +1599.39,1616.97,1599.37,1616.89 +1616.85,1618.31,1605.92,1609.98 +1609.97,1619.0,1608.19,1619.0 +1619.0,1629.05,1617.28,1623.0 +1623.0,1625.88,1612.67,1617.89 +1618.25,1624.0,1614.54,1623.99 +1623.97,1634.27,1619.93,1634.27 +1633.78,1656.64,1630.42,1656.28 +1656.28,1670.0,1646.45,1659.7 +1659.71,1659.98,1644.89,1647.48 +1647.48,1652.73,1633.69,1634.47 +1634.32,1637.5,1627.66,1627.66 +1627.66,1634.06,1614.55,1615.0 +1615.0,1626.98,1613.13,1626.0 +1625.99,1635.0,1624.76,1630.64 +1630.64,1637.35,1616.65,1630.77 +1630.57,1633.0,1621.14,1626.57 +1626.55,1636.2,1626.54,1632.96 +1632.95,1638.42,1628.0,1635.09 +1635.32,1646.99,1632.0,1645.98 +1645.98,1649.0,1644.55,1648.98 +1648.98,1651.99,1646.44,1651.99 +1651.99,1679.0,1651.97,1679.0 +1679.0,1680.0,1655.78,1661.41 +1661.53,1691.3,1660.21,1691.3 +1691.3,1713.0,1688.05,1706.7 +1705.94,1706.99,1636.5,1685.0 +1684.99,1692.94,1660.05,1692.87 +1692.87,1715.0,1688.54,1715.0 +1714.92,1714.97,1630.0,1686.69 +1686.67,1700.99,1679.81,1700.6 +1700.79,1707.99,1696.88,1702.7 +1702.7,1706.78,1699.33,1706.0 +1706.0,1718.88,1683.34,1716.62 +1716.64,1744.33,1702.2,1737.0 +1739.79,1744.44,1721.26,1729.5 +1729.46,1742.58,1725.81,1734.5 +1734.5,1760.0,1734.01,1755.0 +1755.07,1770.62,1729.55,1742.27 +1742.26,1752.6,1720.53,1751.63 +1751.63,1754.4,1735.59,1754.4 +1753.35,1758.48,1740.97,1742.99 +1742.99,1742.99,1736.82,1739.89 +1739.86,1779.0,1738.48,1779.0 +1778.99,1794.7,1767.85,1794.3 +1793.88,1794.68,1772.19,1773.08 +1773.09,1777.04,1681.03,1726.85 +1727.2,1730.86,1689.96,1718.68 +1720.51,1740.79,1720.51,1739.95 +1739.95,1740.94,1711.78,1719.17 +1718.42,1737.95,1707.43,1734.35 +1734.34,1742.57,1727.32,1735.7 +1735.7,1741.57,1733.33,1733.69 +1733.61,1735.95,1696.17,1701.71 +1701.71,1724.03,1691.3,1724.01 +1722.08,1740.0,1722.06,1730.81 +1730.81,1734.99,1720.66,1732.98 +1732.94,1745.0,1726.26,1744.92 +1744.47,1754.96,1737.92,1749.65 +1748.89,1753.27,1729.29,1730.83 +1731.08,1751.02,1730.94,1749.87 +1749.57,1759.91,1744.57,1758.46 +1757.66,1774.95,1757.66,1774.65 +1774.65,1783.0,1768.84,1776.99 +1776.99,1797.5,1772.04,1797.5 +1797.5,1799.99,1787.77,1792.07 +1792.13,1793.24,1782.89,1788.75 +1788.75,1788.9,1770.0,1773.49 +1775.39,1787.96,1770.6,1784.67 +1775.775,1787.68,1772.76,1772.76 +1776.16,1789.69,1760.62,1765.12 +1765.19,1785.07,1760.38,1784.85 +1784.77,1789.99,1778.98,1789.55 +1789.55,1795.9,1785.11,1793.83 +1793.73,1793.73,1770.95,1779.39 +1779.39,1786.97,1776.28,1786.56 +1786.35,1790.02,1779.31,1790.0 +1790.0,1796.69,1783.46,1796.69 +1796.69,1830.0,1796.68,1829.98 +1829.99,1845.0,1829.99,1834.61 +1834.93,1845.0,1828.98,1844.0 +1844.0,1885.5,1843.99,1873.69 +1876.74,1889.0,1852.0,1876.79 +1876.99,1887.9,1865.27,1871.96 +1872.78,1878.99,1860.01,1860.7 +1860.69,1869.24,1834.44,1867.62 +1867.24,1869.0,1839.96,1849.6 +1849.61,1854.0,1849.51,1852.0 +1851.87,1853.51,1851.0,1852.98 +1852.98,1860.0,1852.8,1859.82 +1859.97,1865.0,1858.94,1864.75 +1864.75,1864.75,1851.9,1857.49 +1857.49,1858.0,1827.01,1833.61 +1833.6,1847.0,1831.81,1841.88 +1841.83,1844.0,1800.0,1824.56 +1824.57,1839.51,1801.95,1837.71 +1837.7,1838.0,1830.0,1832.81 +1832.93,1838.05,1832.91,1837.52 +1837.95,1838.0,1826.58,1828.69 +1828.56,1832.24,1827.0,1829.0 +1828.99,1829.0,1816.11,1816.71 +1816.89,1816.99,1773.0,1795.95 +1796.0,1797.0,1749.17,1749.17 +1749.17,1786.85,1728.53,1786.18 +1786.18,1797.97,1782.34,1789.56 +1789.6,1791.64,1780.0,1787.99 +1787.94,1803.49,1780.0,1803.49 +1803.49,1825.0,1803.48,1825.0 +1824.92,1825.0,1807.64,1819.15 +1818.89,1820.0,1811.64,1818.34 +1817.13,1818.26,1780.0,1800.88 +1800.82,1801.0,1776.99,1781.37 +1781.37,1781.38,1775.1,1776.1 +1776.09,1780.0,1745.97,1752.88 +1752.89,1765.0,1747.0,1762.95 +1762.24,1762.78,1753.3,1758.84 +1758.84,1760.69,1732.05,1732.39 +1732.39,1732.5,1651.01,1718.35 +1718.29,1723.0,1673.05,1683.1 +1682.15,1719.67,1660.0,1706.24 +1706.33,1740.0,1706.0,1727.95 +1728.73,1728.82,1682.0,1687.7 +1687.74,1707.71,1677.79,1683.03 +1682.87,1691.0,1635.22,1635.22 +1639.11,1658.19,1610.0,1648.04 +1648.06,1666.36,1647.02,1656.99 +1656.52,1680.32,1637.26,1678.18 +1678.18,1726.0,1676.01,1724.84 +1724.13,1726.0,1686.03,1696.39 +1696.25,1700.0,1675.85,1695.86 +1695.84,1725.0,1692.96,1725.0 +1724.99,1729.99,1718.1,1729.93 +1729.92,1743.59,1725.21,1743.15 +1743.5,1743.97,1735.51,1741.97 +1741.95,1741.95,1726.1,1726.38 +1726.93,1734.25,1724.08,1732.48 +1732.49,1732.62,1671.14,1706.1 +1706.03,1713.99,1703.97,1706.23 +1705.58,1713.7,1705.0,1713.7 +1713.7,1732.98,1713.69,1732.93 +1732.92,1737.43,1726.54,1732.53 +1732.28,1735.35,1725.61,1735.35 +1735.35,1754.0,1735.35,1754.0 +1754.0,1782.65,1753.98,1774.96 +1774.94,1780.0,1767.5,1775.94 +1775.6,1792.96,1770.4,1792.47 +1792.47,1805.8,1788.12,1804.98 +1804.99,1814.61,1804.98,1807.45 +1808.09,1808.14,1770.38,1783.36 +1782.96,1808.0,1778.43,1804.37 +1803.56,1804.52,1781.66,1790.0 +1790.0,1804.89,1790.0,1798.27 +1798.27,1808.0,1796.28,1807.96 +1807.96,1824.1,1806.73,1823.3 +1822.71,1822.71,1812.99,1820.29 +1819.81,1827.5,1818.13,1825.79 +1826.52,1829.0,1790.04,1792.74 +1792.14,1812.0,1791.74,1796.02 +1795.93,1802.39,1792.3,1801.99 +1801.99,1806.71,1801.91,1803.74 +1803.83,1804.95,1798.95,1804.94 +1804.95,1804.95,1783.25,1791.79 +1792.0,1795.41,1763.33,1777.55 +1777.49,1790.9,1775.02,1778.19 +1778.19,1789.0,1777.83,1786.41 +1786.41,1786.41,1772.48,1785.42 +1785.18,1802.0,1785.06,1797.32 +1797.33,1798.99,1792.67,1798.98 +1798.97,1798.99,1796.5,1798.81 +1798.8,1802.99,1794.76,1802.96 +1802.94,1802.94,1798.0,1800.91 +1800.89,1800.93,1786.65,1793.9 +1793.85,1794.0,1782.89,1788.4 +1788.16,1797.69,1783.54,1784.94 +1784.79,1787.3,1758.0,1758.57 +1758.57,1774.68,1758.0,1767.19 +1768.69,1777.99,1764.78,1776.38 +1776.86,1776.87,1758.0,1758.98 +1758.98,1758.99,1725.8,1736.0 +1736.0,1759.0,1717.98,1758.99 +1759.0,1760.0,1743.06,1755.6 +1755.6,1767.34,1749.6,1761.62 +1761.6,1766.37,1746.7,1751.92 +1751.92,1756.05,1737.02,1749.55 +1749.1,1749.78,1707.49,1711.99 +1710.89,1729.19,1702.42,1726.16 +1726.15,1736.1,1720.05,1734.31 +1733.79,1743.98,1728.71,1732.67 +1733.98,1740.26,1715.01,1717.82 +1717.88,1724.0,1716.48,1717.57 +1717.5,1730.8,1715.01,1725.99 +1725.98,1749.0,1725.92,1744.0 +1744.0,1760.0,1743.99,1748.28 +1748.28,1751.61,1737.0,1748.22 +1748.2,1748.77,1721.09,1732.99 +1732.98,1741.5,1728.17,1739.58 +1739.56,1739.56,1721.09,1722.98 +1722.99,1727.36,1690.14,1700.4 +1700.59,1724.18,1697.55,1720.15 +1720.15,1721.25,1708.34,1714.05 +1714.05,1727.0,1711.5,1718.72 +1718.61,1719.23,1710.46,1715.93 +1715.92,1733.69,1714.27,1733.69 +1733.27,1741.52,1728.29,1730.12 +1728.88,1747.0,1724.24,1737.67 +1737.67,1745.9,1735.79,1737.1 +1736.22,1749.99,1736.22,1749.99 +1748.94,1753.07,1745.02,1753.04 +1753.05,1760.0,1752.72,1759.95 +1759.96,1769.88,1759.19,1768.0 +1768.01,1774.4,1765.0,1772.17 +1770.88,1776.79,1767.51,1768.82 +1768.31,1769.83,1759.45,1760.3 +1760.23,1768.18,1759.76,1768.18 +1768.18,1768.18,1765.0,1768.18 +1768.18,1771.15,1750.2,1762.17 +1762.17,1767.15,1758.0,1764.0 +1764.01,1778.0,1764.0,1777.88 +1777.45,1777.88,1767.33,1769.01 +1769.0,1770.89,1748.37,1750.56 +1748.48,1799.57,1745.05,1799.56 +1799.58,1814.4,1796.71,1813.38 +1813.37,1823.68,1811.74,1820.44 +1820.44,1833.69,1815.53,1833.0 +1833.0,1840.0,1825.39,1825.59 +1825.56,1831.05,1800.0,1828.75 +1827.05,1828.95,1813.51,1824.02 +1825.17,1839.0,1824.01,1834.24 +1834.25,1840.0,1832.3,1835.4 +1835.41,1837.0,1814.97,1819.31 +1819.39,1833.0,1815.26,1830.59 +1830.59,1838.69,1828.56,1838.11 +1838.09,1838.09,1828.95,1834.97 +1834.71,1837.6,1825.0,1832.97 +1834.55,1835.0,1827.21,1834.89 +1834.89,1836.99,1817.0,1817.55 +1817.53,1831.02,1812.1,1825.99 +1825.36,1826.34,1815.8,1822.82 +1822.8,1823.33,1800.0,1812.0 +1811.91,1816.46,1799.78,1799.91 +1801.39,1816.97,1801.39,1811.42 +1811.42,1816.6,1800.0,1812.3 +1812.31,1816.96,1802.0,1803.52 +1803.56,1816.0,1800.0,1810.18 +1808.1,1815.21,1806.01,1813.38 +1813.38,1816.0,1804.0,1812.07 +1811.34,1817.0,1805.44,1817.0 +1817.0,1819.99,1814.51,1816.42 +1816.43,1823.99,1815.0,1821.56 +1822.56,1825.0,1815.1,1824.49 +1824.49,1824.99,1804.42,1805.64 +1804.75,1810.08,1801.7,1807.39 +1807.95,1819.08,1805.91,1819.08 +1819.17,1820.0,1800.23,1819.7 +1819.7,1821.53,1814.33,1816.37 +1817.91,1829.99,1811.0,1829.93 +1829.93,1859.0,1828.0,1857.23 +1857.27,1862.0,1845.4,1858.31 +1858.3,1869.5,1856.36,1868.56 +1868.56,1868.99,1850.0,1865.0 +1865.0,1868.2,1856.29,1856.32 +1857.8,1868.99,1850.0,1868.99 +1868.99,1879.98,1867.94,1870.25 +1870.25,1883.5,1868.94,1883.49 +1883.49,1898.88,1883.0,1892.57 +1892.58,1900.0,1890.28,1899.45 +1899.45,1919.99,1899.44,1915.51 +1915.51,1915.51,1890.73,1906.57 +1906.45,1911.03,1900.0,1910.88 +1910.87,1923.74,1910.68,1923.69 +1923.13,1926.04,1912.27,1920.0 +1919.99,1939.87,1918.9,1925.49 +1926.4,1939.46,1922.74,1928.0 +1927.98,1932.92,1918.85,1927.46 +1927.63,1935.0,1918.96,1931.27 +1930.29,1940.0,1921.2,1940.0 +1940.0,1957.8,1939.99,1952.96 +1952.97,1963.63,1930.65,1948.57 +1948.53,1957.98,1942.02,1957.93 +1957.92,1960.0,1949.99,1957.98 +1957.19,1966.69,1954.1,1954.83 +1954.83,1960.54,1950.41,1954.98 +1953.94,1954.99,1931.78,1940.99 +1940.98,1942.0,1930.22,1935.1 +1935.1,1940.0,1912.02,1928.94 +1928.94,1940.0,1927.0,1938.96 +1938.95,1944.99,1932.0,1939.52 +1939.52,1973.23,1938.04,1969.38 +1969.38,1980.0,1962.74,1972.59 +1972.58,1978.0,1966.5,1971.99 +1971.99,1985.0,1970.61,1985.0 +1984.99,1989.99,1981.61,1989.95 +1989.95,1989.99,1982.95,1989.95 +1989.94,1990.0,1977.72,1987.81 +1987.81,1990.0,1980.51,1983.83 +1983.88,1995.0,1980.0,1991.9 +1991.96,1997.83,1985.58,1994.02 +1994.0,1996.0,1988.87,1995.99 +1996.0,1998.87,1991.53,1998.57 +1998.58,1998.58,1988.87,1992.73 +1992.65,1994.07,1975.05,1976.17 +1976.17,1985.79,1970.05,1985.79 +1985.79,1993.87,1984.85,1989.32 +1989.55,1995.5,1989.38,1995.5 +1995.5,1995.5,1985.3,1994.99 +1994.98,1995.99,1987.14,1991.51 +1991.51,1994.96,1988.26,1994.09 +1994.17,2009.99,1992.87,2009.99 +2009.99,2019.98,2009.38,2019.98 +2019.98,2035.0,2019.98,2034.99 +2034.28,2042.5,2031.12,2042.5 +2042.5,2050.99,2030.04,2050.96 +2050.6,2051.0,2044.12,2050.89 +2050.89,2059.0,2047.0,2057.41 +2057.44,2057.9,2045.01,2054.03 +2054.03,2057.23,2053.99,2056.7 +2056.68,2057.23,2045.0,2056.61 +2056.62,2081.43,2053.48,2080.03 +2080.73,2088.87,2058.13,2065.73 +2065.75,2074.35,2055.39,2065.68 +2065.69,2080.0,2062.99,2074.99 +2074.99,2080.16,2060.06,2062.76 +2062.73,2070.0,2060.17,2067.65 +2067.64,2068.98,2062.09,2062.41 +2062.4,2099.99,2062.32,2099.99 +2099.99,2102.68,2079.67,2086.05 +2086.03,2086.16,1988.6,2005.35 +2006.02,2051.0,2006.02,2050.76 +2050.76,2051.0,1995.3,2027.03 +2027.66,2039.71,2019.85,2039.7 +2039.7,2039.98,2006.4,2026.78 +2026.78,2040.41,2014.61,2040.41 +2035.99,2050.88,2035.96,2044.91 +2044.92,2051.0,2037.19,2045.0 +2045.0,2051.0,2035.0,2037.88 +2036.17,2049.96,2035.0,2049.5 +2048.27,2055.99,2041.19,2050.0 +2050.0,2060.0,2043.38,2044.99 +2044.97,2085.81,2043.05,2085.21 +2085.22,2086.48,2067.0,2085.11 +2084.01,2089.89,2068.6,2084.99 +2084.98,2121.21,2079.98,2120.82 +2120.82,2137.86,2113.44,2134.41 +2134.41,2184.62,2125.41,2170.38 +2170.49,2189.0,2162.16,2179.92 +2179.91,2195.0,2163.5,2183.99 +2183.97,2184.0,2134.54,2149.68 +2148.13,2171.85,2112.17,2170.76 +2165.73,2176.42,2153.88,2162.73 +2163.42,2195.0,2157.33,2194.97 +2194.5,2195.0,2181.41,2186.96 +2187.97,2194.0,2174.01,2193.99 +2193.99,2235.95,2193.99,2233.99 +2233.99,2277.0,2229.84,2271.13 +2271.13,2286.95,2241.15,2272.35 +2272.25,2285.0,2265.0,2284.32 +2284.32,2298.0,2275.93,2288.94 +2286.11,2287.99,2166.66,2215.88 +2215.88,2226.64,2105.1,2106.58 +2106.58,2169.51,2106.57,2139.88 +2139.87,2139.87,1975.0,2051.75 +2051.76,2131.75,2020.64,2130.0 +2129.99,2167.88,2123.0,2159.78 +2159.79,2187.98,2141.27,2143.92 +2143.92,2168.88,2100.86,2168.61 +2168.61,2170.0,2141.55,2170.0 +2170.0,2202.01,2169.87,2184.68 +2184.67,2210.39,2181.25,2199.95 +2199.95,2209.95,2161.06,2179.52 +2179.82,2198.55,2179.82,2191.55 +2191.66,2192.78,2165.0,2176.54 +2176.26,2200.0,2162.52,2199.99 +2199.96,2219.99,2181.57,2212.49 +2212.49,2253.09,2206.62,2237.0 +2236.99,2240.0,2226.72,2237.41 +2236.41,2265.0,2218.71,2265.0 +2264.38,2279.0,2260.6,2272.3 +2272.3,2283.0,2255.2,2263.28 +2263.49,2267.91,2166.0,2239.31 +2239.32,2249.18,2224.0,2241.84 +2239.18,2270.0,2238.23,2260.99 +2260.99,2270.98,2236.54,2249.01 +2249.55,2255.0,2230.0,2240.0 +2239.99,2244.99,2238.0,2244.92 +2244.98,2268.0,2244.98,2261.6 +2261.59,2275.0,2255.55,2274.99 +2274.99,2295.0,2274.01,2293.0 +2291.99,2326.0,2286.44,2308.37 +2308.37,2324.47,2282.24,2317.88 +2317.87,2317.97,2266.51,2315.5 +2315.76,2316.0,2290.0,2313.68 +2313.08,2313.08,2280.0,2298.53 +2299.2,2323.23,2299.07,2323.11 +2323.1,2329.0,2311.84,2329.0 +2328.98,2350.0,2317.13,2317.14 +2316.92,2335.0,2286.18,2333.66 +2333.64,2350.0,2325.0,2349.99 +2349.99,2386.79,2338.12,2386.78 +2386.61,2399.41,2367.01,2394.01 +2394.0,2399.0,2344.94,2359.97 +2359.97,2399.0,2331.43,2392.04 +2392.1,2417.0,2387.9,2402.87 +2403.26,2425.95,2400.0,2421.72 +2421.7,2431.0,2405.83,2415.48 +2415.48,2454.18,2415.48,2452.93 +2452.95,2474.69,2452.95,2472.29 +2472.62,2472.62,2418.81,2454.6 +2454.61,2468.47,2440.0,2465.03 +2465.02,2469.9,2380.0,2424.27 +2424.27,2445.22,2390.6,2432.78 +2432.78,2469.22,2432.0,2469.22 +2469.22,2523.52,2469.22,2519.47 +2519.48,2552.98,2506.36,2551.5 +2549.97,2592.94,2542.72,2590.95 +2590.95,2598.93,2540.0,2575.0 +2574.99,2625.0,2514.8,2624.98 +2625.0,2680.58,2624.43,2656.36 +2656.37,2684.77,2601.6,2666.82 +2666.82,2678.99,2644.56,2678.94 +2678.96,2724.24,2670.25,2724.24 +2723.16,2767.0,2711.19,2742.86 +2742.86,2770.0,2715.0,2769.94 +2769.91,2790.0,2754.58,2784.38 +2784.4,2786.6,2747.09,2757.0 +2761.95,2806.0,2761.94,2784.98 +2784.97,2784.99,2601.0,2695.5 +2695.0,2695.5,2440.0,2458.6 +2458.59,2502.73,2226.86,2459.35 +2459.35,2579.95,2366.08,2560.62 +2560.62,2562.73,2374.7,2508.54 +2505.0,2532.47,2480.0,2530.0 +2530.0,2592.51,2527.0,2570.74 +2570.73,2589.99,2480.01,2559.19 +2564.89,2564.97,2268.0,2417.95 +2400.19,2474.0,2371.0,2474.0 +2473.64,2524.0,2383.02,2447.83 +2447.85,2500.0,2424.69,2485.0 +2484.99,2499.99,2450.0,2455.83 +2455.55,2493.0,2436.0,2493.0 +2493.02,2623.0,2487.33,2574.8 +2574.8,2614.29,2525.01,2596.44 +2591.53,2606.79,2550.01,2598.1 +2598.09,2683.18,2566.05,2653.13 +2653.12,2668.99,2579.78,2603.56 +2603.57,2619.44,2557.14,2583.32 +2583.33,2607.78,2570.9,2572.67 +2572.68,2575.56,2455.0,2504.59 +2504.69,2509.9,2389.07,2398.79 +2392.38,2431.67,2351.33,2402.6 +2399.75,2449.68,2383.56,2449.68 +2449.68,2463.68,2351.0,2377.82 +2375.96,2388.0,2227.0,2298.04 +2298.04,2339.27,2179.61,2210.44 +2210.44,2361.44,2052.01,2354.67 +2360.5,2388.88,2251.07,2344.84 +2340.47,2345.0,2216.27,2216.42 +2216.43,2294.89,2199.69,2280.87 +2274.34,2331.52,2243.0,2249.0 +2249.0,2312.0,2247.22,2298.87 +2298.87,2353.35,2298.02,2309.96 +2309.9,2310.0,2200.0,2210.01 +2214.28,2267.93,2140.96,2251.06 +2249.09,2251.4,2185.31,2238.17 +2238.21,2250.0,2100.0,2100.47 +2100.49,2163.0,1990.0,2161.86 +2161.86,2173.0,2070.0,2143.12 +2143.14,2154.42,2032.98,2066.47 +2066.47,2071.67,1931.0,1935.54 +1933.17,2063.77,1913.19,1986.1 +1986.11,2118.15,1971.79,2108.86 +2108.38,2128.66,2049.29,2072.97 +2072.45,2076.81,2033.21,2058.07 +2058.49,2115.0,2037.05,2040.05 +2040.38,2128.0,2040.0,2122.83 +2123.08,2178.0,2110.96,2138.3 +2134.7,2163.22,2128.03,2158.27 +2160.0,2169.99,2102.96,2135.85 +2135.03,2170.0,2133.0,2160.71 +2160.56,2161.58,2035.0,2050.13 +2050.87,2082.46,2030.53,2051.11 +2051.11,2115.0,2051.11,2075.01 +2075.49,2118.84,2069.1,2109.44 +2108.8,2160.0,2104.08,2146.26 +2146.21,2157.94,2133.94,2141.08 +2141.08,2219.22,2140.17,2219.21 +2219.21,2237.58,2198.45,2232.98 +2233.0,2296.0,2228.01,2240.01 +2244.02,2251.2,2166.07,2223.14 +2223.14,2224.66,2169.49,2220.08 +2221.42,2327.54,2221.42,2323.13 +2323.15,2325.73,2235.84,2298.36 +2298.36,2342.99,2298.19,2314.21 +2310.36,2323.64,2257.99,2257.99 +2258.46,2303.48,2228.02,2285.0 +2284.99,2290.49,2259.53,2290.0 +2290.0,2301.0,2260.0,2265.53 +2268.0,2269.99,2181.27,2210.2 +2206.05,2209.99,2129.46,2181.6 +2180.01,2216.52,2155.07,2215.87 +2215.86,2239.99,2180.0,2213.65 +2213.13,2240.75,2200.0,2229.19 +2229.17,2232.82,2195.38,2196.76 +2197.85,2197.87,2179.0,2191.05 +2192.33,2225.3,2191.1,2225.2 +2225.3,2258.49,2222.94,2240.0 +2239.99,2255.0,2227.96,2240.0 +2240.0,2242.19,2233.84,2239.93 +2239.93,2245.0,2198.2,2216.99 +2216.15,2227.99,2155.0,2155.0 +2155.0,2214.49,2141.12,2190.0 +2189.02,2224.45,2158.28,2180.05 +2180.05,2215.0,2170.0,2209.18 +2210.58,2236.0,2204.0,2236.0 +2236.0,2243.83,2214.48,2230.81 +2230.81,2231.92,2218.78,2229.87 +2230.09,2250.0,2228.04,2239.95 +2239.64,2277.16,2239.25,2274.72 +2274.96,2278.0,2229.88,2234.87 +2234.87,2259.57,2232.75,2241.74 +2241.02,2247.26,2222.0,2230.38 +2230.39,2265.84,2230.38,2251.46 +2251.46,2264.99,2251.46,2264.98 +2264.97,2290.0,2260.01,2266.51 +2266.51,2281.14,2266.51,2278.67 +2278.66,2342.0,2278.66,2341.98 +2341.99,2349.62,2324.67,2330.16 +2330.13,2339.99,2325.19,2339.98 +2339.99,2357.86,2301.0,2330.75 +2330.78,2339.61,2262.01,2287.98 +2287.96,2304.03,2266.26,2273.56 +2273.56,2288.05,2200.0,2264.0 +2262.0,2274.75,2240.79,2254.23 +2252.55,2300.0,2250.0,2279.27 +2279.28,2321.0,2275.76,2320.23 +2320.39,2336.88,2306.46,2310.06 +2310.12,2328.15,2280.01,2319.06 +2319.06,2323.21,2287.04,2292.97 +2293.07,2298.51,2273.0,2290.51 +2290.35,2306.0,2261.81,2262.46 +2261.8,2302.0,2250.0,2299.83 +2298.45,2323.99,2293.98,2305.14 +2305.02,2320.0,2292.99,2310.0 +2310.0,2316.94,2287.5,2293.98 +2293.98,2302.96,2258.84,2270.74 +2270.38,2275.77,2225.0,2249.99 +2250.0,2258.0,2225.0,2247.27 +2247.27,2273.81,2246.7,2257.36 +2257.33,2262.06,2225.31,2254.75 +2254.75,2260.0,2227.76,2237.01 +2237.01,2252.27,2231.84,2240.94 +2240.06,2269.0,2235.01,2235.18 +2235.18,2245.62,2205.0,2213.45 +2213.39,2227.46,2112.31,2159.99 +2159.95,2198.0,2137.69,2190.0 +2190.0,2238.1,2188.0,2233.85 +2233.85,2233.85,2200.7,2216.93 +2216.72,2243.41,2183.06,2233.95 +2235.0,2244.0,2173.8,2207.34 +2207.17,2213.01,2175.0,2203.87 +2203.19,2238.54,2189.1,2237.39 +2238.04,2245.0,2221.04,2245.0 +2245.0,2259.94,2192.01,2234.45 +2227.2,2234.3,2198.67,2212.47 +2212.46,2227.58,2202.27,2227.58 +2227.58,2248.96,2227.57,2240.92 +2241.02,2253.35,2236.99,2239.96 +2239.05,2241.3,2200.0,2214.99 +2214.99,2237.57,2202.86,2237.56 +2237.5,2250.0,2218.31,2248.12 +2248.12,2304.98,2248.12,2304.98 +2304.03,2313.91,2289.98,2297.98 +2304.83,2338.91,2294.17,2330.39 +2330.33,2337.0,2304.43,2304.81 +2304.78,2309.81,2272.75,2296.23 +2297.04,2299.99,2284.0,2286.09 +2285.21,2297.91,2273.79,2294.35 +2294.34,2315.0,2293.0,2315.0 +2315.0,2316.91,2295.23,2309.97 +2309.93,2323.44,2302.1,2320.0 +2319.98,2386.99,2318.5,2386.03 +2386.04,2390.0,2340.0,2365.91 +2365.91,2389.99,2354.92,2379.16 +2379.51,2415.86,2370.17,2401.52 +2401.54,2410.0,2390.56,2401.22 +2401.22,2410.57,2392.01,2400.35 +2400.34,2430.42,2396.55,2423.32 +2423.28,2459.95,2423.27,2451.29 +2451.29,2459.44,2435.0,2445.96 +2445.0,2448.55,2426.18,2439.49 +2439.51,2478.56,2435.01,2477.55 +2477.55,2488.0,2449.16,2449.96 +2449.96,2478.73,2449.95,2474.99 +2474.7,2474.99,2385.97,2387.28 +2388.44,2439.27,2380.0,2399.24 +2399.24,2399.24,2350.1,2350.1 +2350.11,2381.84,2318.0,2380.0 +2379.98,2391.87,2360.88,2369.52 +2369.52,2399.99,2369.52,2399.99 +2399.99,2417.61,2394.57,2410.99 +2411.0,2419.98,2401.12,2409.78 +2409.77,2411.79,2378.0,2397.33 +2396.28,2420.54,2391.9,2420.54 +2420.53,2420.53,2393.77,2400.83 +2400.7,2415.73,2387.87,2414.8 +2414.8,2433.63,2404.91,2431.02 +2431.04,2445.0,2425.02,2436.98 +2435.82,2440.67,2420.1,2420.58 +2420.36,2438.7,2410.0,2417.74 +2417.75,2439.88,2412.09,2439.88 +2438.64,2449.8,2432.53,2436.25 +2436.19,2438.07,2420.69,2420.69 +2420.69,2444.32,2418.98,2439.17 +2438.64,2442.0,2422.08,2422.09 +2422.1,2432.99,2419.39,2432.99 +2432.99,2439.56,2422.89,2432.03 +2432.12,2432.12,2379.44,2395.48 +2395.45,2410.0,2380.0,2408.98 +2408.98,2426.0,2407.83,2422.93 +2422.9,2439.99,2416.07,2423.13 +2423.14,2430.86,2395.0,2422.7 +2424.91,2429.28,2402.83,2417.99 +2417.99,2419.77,2405.0,2416.58 +2416.79,2434.88,2416.04,2429.26 +2429.26,2439.5,2425.01,2439.48 +2439.49,2465.0,2434.93,2464.9 +2464.9,2483.46,2458.28,2483.45 +2483.4,2494.64,2481.94,2491.0 +2491.03,2491.71,2478.92,2489.08 +2489.99,2494.98,2487.36,2489.99 +2489.99,2499.0,2465.37,2477.22 +2477.23,2481.35,2457.57,2469.12 +2467.19,2475.5,2455.0,2458.81 +2458.79,2469.67,2448.0,2469.67 +2469.67,2489.89,2465.87,2488.43 +2488.35,2498.6,2485.0,2497.9 +2498.59,2500.0,2487.0,2500.0 +2500.0,2540.0,2493.52,2522.57 +2522.61,2534.99,2512.52,2532.01 +2532.01,2538.0,2517.4,2538.0 +2538.0,2540.0,2529.98,2532.86 +2532.86,2550.0,2530.5,2548.0 +2548.0,2574.69,2542.0,2572.02 +2574.06,2588.0,2554.0,2586.95 +2586.93,2599.0,2586.93,2589.99 +2591.92,2593.91,2560.0,2561.28 +2561.29,2583.0,2552.21,2572.01 +2572.01,2583.06,2544.0,2573.05 +2573.05,2573.05,2540.0,2554.99 +2554.98,2570.97,2554.98,2564.33 +2564.31,2564.33,2538.0,2549.5 +2548.71,2550.27,2477.5,2530.0 +2528.04,2529.63,2503.03,2508.75 +2508.75,2508.76,2480.42,2506.12 +2506.15,2511.4,2495.59,2498.9 +2499.0,2539.58,2495.01,2531.0 +2531.0,2541.0,2510.0,2510.79 +2510.8,2520.0,2495.02,2519.69 +2519.63,2524.58,2505.39,2524.58 +2524.58,2556.1,2524.58,2556.09 +2556.09,2556.1,2533.99,2536.25 +2536.25,2540.0,2510.97,2539.94 +2539.95,2543.76,2535.0,2543.75 +2543.75,2544.78,2529.75,2531.23 +2531.23,2534.0,2503.23,2507.13 +2507.13,2530.0,2502.0,2521.9 +2518.96,2521.9,2498.74,2510.08 +2510.02,2529.0,2505.2,2527.0 +2525.98,2528.0,2511.36,2515.87 +2515.78,2525.33,2513.19,2515.0 +2514.99,2514.99,2469.98,2470.0 +2470.0,2507.0,2470.0,2506.99 +2507.01,2519.5,2500.36,2501.88 +2501.89,2524.0,2499.01,2521.24 +2521.21,2538.46,2511.39,2521.0 +2521.0,2600.0,2521.0,2557.13 +2557.06,2570.0,2552.55,2565.0 +2565.0,2567.1,2554.0,2567.1 +2567.1,2589.01,2567.09,2587.57 +2587.55,2592.0,2576.69,2583.87 +2581.82,2584.65,2560.0,2565.07 +2566.89,2585.1,2560.28,2585.1 +2585.1,2589.95,2573.06,2578.0 +2577.03,2580.0,2570.89,2571.04 +2572.96,2584.72,2565.21,2583.1 +2584.68,2599.23,2583.03,2594.75 +2594.69,2595.1,2583.82,2585.53 +2587.74,2592.78,2570.0,2587.25 +2585.31,2590.0,2579.52,2589.01 +2589.88,2624.44,2582.49,2612.67 +2611.83,2620.1,2607.02,2608.79 +2608.72,2614.08,2587.15,2613.96 +2613.66,2629.76,2610.15,2619.96 +2619.93,2630.0,2616.04,2629.99 +2630.0,2655.93,2626.01,2655.85 +2655.86,2666.47,2644.13,2666.47 +2666.47,2689.0,2644.99,2663.2 +2663.2,2686.67,2663.2,2686.6 +2686.6,2699.0,2673.94,2696.0 +2696.0,2749.98,2695.98,2740.7 +2740.7,2763.26,2700.05,2763.26 +2760.01,2873.27,2760.0,2851.99 +2851.95,2860.0,2769.91,2835.0 +2834.5,2862.99,2824.7,2850.27 +2850.1,2857.66,2802.1,2825.07 +2830.0,2866.19,2827.76,2839.07 +2839.38,2850.97,2830.0,2836.97 +2837.84,2849.79,2834.36,2844.99 +2844.99,2879.0,2844.79,2873.0 +2873.0,2875.99,2839.89,2859.94 +2860.06,2879.21,2855.0,2877.95 +2877.94,2930.0,2861.0,2928.97 +2929.96,2938.55,2915.0,2917.99 +2916.0,2917.97,2817.68,2852.31 +2853.84,2863.09,2814.01,2815.0 +2814.99,2815.0,2674.69,2731.05 +2731.03,2799.99,2681.0,2798.1 +2797.99,2830.0,2797.0,2813.0 +2814.3,2868.0,2795.31,2849.51 +2849.51,2888.0,2825.42,2881.36 +2881.99,2889.12,2854.38,2879.83 +2879.83,2885.0,2851.32,2859.99 +2859.99,2885.0,2859.98,2885.0 +2884.99,2885.0,2803.21,2825.01 +2825.01,2868.99,2816.16,2852.86 +2853.99,2875.0,2853.99,2874.71 +2874.59,2880.0,2853.23,2874.62 +2874.62,2877.08,2858.22,2867.77 +2867.76,2873.75,2848.0,2852.35 +2851.67,2859.89,2780.26,2807.32 +2808.95,2841.44,2806.09,2830.0 +2834.96,2837.0,2811.18,2826.2 +2829.44,2853.0,2815.0,2853.0 +2853.0,2860.91,2833.0,2849.17 +2849.18,2852.96,2842.06,2852.0 +2852.0,2860.0,2850.0,2850.0 +2850.01,2852.0,2831.88,2835.6 +2835.6,2835.98,2805.94,2821.92 +2821.9,2821.93,2751.0,2785.45 +2785.45,2819.3,2780.14,2806.97 +2806.94,2825.4,2793.49,2794.99 +2794.95,2810.37,2779.92,2800.93 +2800.91,2804.95,2745.0,2749.98 +2749.97,2779.31,2712.78,2743.41 +2743.46,2745.67,2655.83,2667.12 +2667.11,2727.19,2598.7,2703.9 +2703.89,2721.85,2680.0,2687.0 +2687.0,2698.66,2611.41,2674.04 +2674.04,2716.27,2666.58,2714.99 +2714.93,2747.36,2696.6,2715.31 +2712.09,2745.91,2708.19,2742.04 +2742.04,2772.72,2742.03,2770.87 +2770.87,2792.51,2755.82,2791.39 +2791.81,2808.78,2781.63,2807.94 +2804.74,2808.78,2760.3,2776.59 +2776.58,2791.2,2775.97,2791.19 +2791.5,2793.84,2774.02,2789.99 +2789.99,2794.99,2776.86,2778.68 +2778.67,2781.49,2733.29,2743.51 +2743.51,2765.99,2734.1,2749.85 +2749.87,2750.15,2725.0,2748.97 +2748.99,2758.0,2710.5,2715.69 +2715.69,2738.54,2715.02,2734.99 +2735.0,2749.99,2726.52,2734.45 +2734.27,2734.27,2705.73,2729.45 +2729.45,2745.0,2720.66,2731.58 +2731.57,2755.0,2729.22,2754.99 +2754.99,2755.98,2740.01,2750.0 +2750.0,2777.99,2749.18,2773.9 +2773.59,2794.99,2761.11,2785.04 +2785.45,2799.99,2778.0,2799.97 +2799.96,2804.95,2795.36,2799.0 +2799.0,2844.2,2798.99,2844.11 +2844.1,2844.11,2818.32,2834.9 +2834.89,2834.99,2802.49,2816.28 +2815.07,2826.79,2802.17,2820.2 +2820.2,2820.21,2805.92,2809.94 +2809.91,2810.0,2800.0,2802.16 +2800.79,2809.11,2786.2,2809.11 +2809.11,2826.08,2809.1,2816.07 +2814.51,2816.09,2805.62,2806.6 +2805.68,2822.6,2801.86,2816.43 +2816.44,2817.96,2808.42,2813.77 +2813.78,2825.0,2809.93,2824.99 +2824.99,2839.0,2823.27,2838.5 +2838.5,2850.0,2836.4,2845.04 +2846.18,2861.58,2844.2,2855.29 +2855.3,2855.3,2831.0,2846.0 +2846.0,2858.27,2844.71,2850.01 +2849.99,2849.99,2815.22,2831.05 +2831.05,2840.99,2822.0,2839.08 +2839.08,2839.08,2828.04,2835.35 +2835.35,2838.14,2810.39,2816.6 +2817.49,2826.72,2810.0,2810.38 +2810.63,2814.0,2793.11,2814.0 +2814.0,2823.8,2805.12,2813.64 +2813.65,2833.07,2803.53,2825.49 +2826.36,2837.9,2821.17,2823.5 +2823.0,2834.01,2822.22,2825.14 +2825.01,2825.01,2809.0,2813.75 +2813.06,2818.0,2801.67,2813.99 +2811.34,2818.48,2801.25,2818.43 +2818.4,2829.3,2810.3,2818.89 +2819.15,2826.67,2808.12,2821.3 +2821.23,2825.54,2811.65,2823.5 +2821.64,2875.0,2821.09,2874.0 +2873.58,2886.0,2859.22,2885.99 +2885.98,2917.99,2883.14,2917.99 +2914.92,2926.0,2882.57,2913.64 +2913.62,2914.99,2883.48,2898.9 +2898.0,2898.72,2825.03,2876.13 +2876.14,2882.99,2853.76,2881.5 +2882.2,2920.0,2857.51,2861.97 +2861.21,2893.05,2840.11,2877.82 +2877.52,2900.0,2866.9,2899.86 +2899.53,2909.0,2809.5,2837.54 +2838.67,2873.06,2821.11,2858.26 +2857.7,2899.9,2845.01,2899.9 +2899.03,2942.04,2897.47,2929.6 +2929.42,2937.25,2896.86,2918.0 +2917.6,2926.91,2905.33,2915.5 +2915.5,2934.99,2915.5,2933.14 +2933.32,2934.95,2899.0,2909.73 +2909.5,2916.34,2892.54,2900.02 +2900.02,2903.96,2890.0,2903.78 +2903.62,2911.0,2890.1,2903.3 +2903.3,2903.54,2889.99,2893.84 +2893.59,2910.59,2881.0,2908.38 +2910.08,2914.16,2903.5,2913.36 +2913.34,2914.98,2904.75,2907.99 +2904.92,2910.0,2895.17,2900.58 +2900.74,2906.0,2892.96,2906.0 +2906.0,2920.0,2896.04,2901.31 +2901.31,2915.0,2896.17,2915.0 +2914.99,2990.0,2914.5,2984.99 +2984.98,2988.46,2942.51,2971.63 +2972.0,2979.99,2953.0,2964.97 +2964.97,2973.88,2953.0,2969.22 +2966.5,2972.99,2960.2,2967.43 +2966.63,2968.12,2950.0,2967.33 +2965.13,2979.97,2960.51,2971.89 +2971.89,2982.22,2971.74,2979.99 +2979.98,2998.99,2969.5,2979.0 +2979.0,2998.97,2978.97,2996.03 +2998.18,2999.98,2991.62,2999.6 +2998.96,2999.99,2969.0,2987.61 +2987.52,2989.89,2971.07,2989.87 +2989.88,2995.98,2989.6,2990.27 +2990.29,2994.19,2965.51,2965.54 +2965.54,2976.65,2949.93,2949.93 +2949.93,2960.98,2936.07,2960.91 +2960.8,2960.87,2918.52,2941.54 +2940.16,2948.0,2922.9,2936.69 +2936.7,2942.58,2730.03,2823.0 +2822.1,2850.0,2710.0,2803.78 +2803.78,2861.91,2794.01,2831.13 +2831.07,2849.0,2784.0,2836.78 +2839.56,2859.44,2822.3,2837.52 +2834.02,2840.0,2784.0,2798.0 +2798.32,2799.0,2640.0,2643.05 +2645.61,2676.97,2463.89,2573.19 +2571.8,2694.39,2550.0,2552.26 +2555.44,2606.74,2500.0,2590.97 +2588.84,2670.61,2574.41,2643.88 +2643.88,2705.0,2643.83,2663.1 +2663.1,2664.0,2600.0,2660.0 +2659.99,2700.76,2649.47,2674.97 +2669.11,2704.02,2669.11,2690.84 +2690.84,2710.0,2651.41,2681.99 +2681.92,2700.71,2661.24,2672.78 +2672.78,2682.99,2653.16,2677.02 +2677.02,2688.81,2660.18,2685.0 +2685.0,2724.65,2684.88,2722.72 +2724.33,2757.85,2720.39,2755.11 +2755.1,2757.99,2731.45,2752.93 +2752.44,2798.99,2734.1,2749.0 +2748.97,2760.19,2704.03,2736.58 +2736.76,2740.0,2700.0,2702.03 +2702.02,2721.78,2680.0,2715.74 +2715.52,2748.0,2706.66,2709.25 +2710.6,2737.45,2710.59,2732.8 +2732.76,2732.84,2699.38,2719.0 +2719.0,2734.61,2700.0,2733.13 +2733.14,2746.0,2731.71,2746.0 +2746.0,2748.5,2727.61,2728.02 +2728.02,2732.25,2700.0,2725.42 +2725.42,2731.08,2706.55,2716.83 +2716.86,2718.89,2680.0,2705.55 +2704.64,2729.25,2701.21,2713.62 +2713.74,2728.0,2695.12,2708.26 +2707.93,2714.58,2701.44,2709.46 +2709.92,2741.0,2703.77,2740.89 +2740.9,2791.6,2734.24,2778.48 +2777.32,2789.95,2770.02,2779.99 +2779.93,2787.0,2751.31,2769.21 +2769.23,2769.73,2760.0,2766.8 +2766.79,2822.0,2766.2,2819.66 +2816.83,2827.0,2791.23,2795.3 +2795.29,2798.02,2766.27,2769.48 +2768.1,2789.31,2750.0,2785.15 +2785.15,2787.89,2770.97,2770.97 +2770.99,2780.99,2763.41,2777.7 +2777.7,2780.89,2760.32,2769.98 +2769.98,2776.24,2728.93,2731.77 +2731.21,2731.21,2555.18,2620.72 +2620.04,2648.84,2527.59,2619.55 +2619.51,2648.27,2602.76,2605.94 +2605.0,2611.03,2518.33,2556.72 +2553.94,2575.0,2502.14,2567.7 +2567.7,2594.0,2567.7,2580.0 +2580.01,2583.2,2526.3,2543.89 +2541.97,2559.77,2525.0,2549.95 +2549.94,2554.98,2410.0,2466.56 +2455.83,2466.58,2330.0,2432.24 +2432.23,2443.22,2401.0,2401.0 +2401.7,2464.37,2355.0,2449.79 +2449.79,2525.0,2442.4,2498.85 +2499.99,2513.58,2462.73,2463.91 +2463.91,2485.68,2438.95,2482.01 +2482.01,2482.92,2402.23,2404.66 +2402.17,2408.95,2300.0,2311.0 +2311.01,2382.98,2210.0,2363.21 +2363.21,2446.57,2356.55,2429.57 +2429.56,2487.14,2429.17,2472.54 +2471.82,2479.13,2387.34,2416.28 +2416.28,2434.9,2281.45,2304.98 +2300.65,2313.06,2251.0,2296.92 +2297.59,2347.0,2250.0,2250.0 +2250.0,2250.8,2050.0,2106.26 +2106.26,2279.85,2102.54,2242.0 +2242.01,2270.53,2160.1,2243.25 +2245.8,2364.52,2240.29,2299.53 +2298.1,2335.37,2200.0,2239.41 +2239.2,2285.99,2207.77,2274.62 +2275.96,2330.0,2249.01,2328.0 +2325.01,2361.68,2294.28,2334.6 +2334.96,2399.33,2327.4,2371.01 +2371.01,2418.23,2346.0,2417.95 +2417.13,2421.1,2377.54,2401.7 +2401.44,2402.0,2330.0,2366.81 +2370.47,2396.81,2287.84,2305.85 +2305.97,2349.53,2300.51,2343.92 +2343.92,2389.99,2333.98,2389.7 +2389.71,2432.99,2389.7,2423.21 +2423.22,2430.01,2416.07,2426.9 +2426.99,2462.5,2424.0,2450.82 +2452.95,2471.23,2441.82,2460.94 +2461.0,2472.44,2458.24,2469.9 +2469.9,2498.01,2469.9,2498.01 +2498.01,2509.94,2495.0,2509.9 +2509.47,2524.65,2420.0,2464.72 +2464.75,2473.99,2391.4,2411.51 +2411.41,2445.0,2375.0,2444.81 +2444.82,2470.01,2417.58,2448.12 +2447.65,2453.65,2422.0,2448.08 +2447.76,2491.92,2445.14,2479.44 +2480.0,2498.0,2473.11,2485.45 +2485.45,2485.88,2442.74,2446.84 +2446.85,2498.0,2446.84,2492.0 +2492.0,2498.0,2455.36,2468.35 +2468.36,2482.23,2452.63,2465.18 +2465.17,2472.99,2424.69,2461.03 +2461.03,2489.77,2458.46,2464.46 +2464.5,2482.23,2448.44,2454.88 +2454.79,2461.82,2413.96,2425.73 +2425.73,2453.16,2422.07,2439.0 +2438.1,2479.9,2436.89,2468.64 +2471.65,2504.97,2469.57,2504.4 +2504.41,2504.42,2480.06,2493.75 +2492.29,2522.99,2487.01,2503.61 +2503.61,2510.1,2491.73,2495.04 +2495.09,2517.68,2495.09,2514.76 +2514.77,2545.0,2511.41,2539.04 +2539.04,2564.42,2539.04,2561.69 +2561.68,2572.97,2558.37,2562.18 +2562.25,2566.27,2540.0,2548.89 +2548.92,2555.99,2528.6,2547.28 +2547.51,2551.93,2529.04,2550.61 +2549.61,2586.21,2545.16,2572.53 +2572.53,2600.0,2560.74,2590.0 +2589.47,2645.0,2589.47,2639.99 +2639.73,2671.0,2639.71,2653.19 +2653.19,2661.99,2637.59,2655.7 +2655.62,2660.42,2631.0,2639.35 +2640.32,2660.0,2635.44,2658.09 +2657.17,2677.5,2656.2,2677.5 +2677.49,2679.24,2633.78,2647.32 +2646.56,2648.01,2615.0,2635.0 +2635.29,2655.77,2627.87,2654.57 +2654.57,2670.0,2651.42,2665.12 +2668.44,2670.0,2650.93,2652.75 +2652.75,2660.0,2629.27,2637.11 +2637.09,2655.97,2620.53,2634.84 +2634.85,2636.47,2584.27,2587.53 +2588.42,2588.42,2479.0,2497.71 +2497.71,2573.58,2480.01,2573.58 +2573.15,2573.33,2540.43,2554.25 +2554.12,2590.82,2551.8,2587.0 +2587.01,2590.87,2555.86,2588.56 +2586.04,2594.98,2580.89,2584.45 +2582.44,2582.44,2525.8,2545.0 +2542.07,2549.58,2508.08,2535.88 +2535.87,2558.14,2521.18,2558.14 +2558.14,2570.2,2545.04,2559.66 +2559.66,2564.85,2540.0,2540.57 +2540.07,2542.02,2508.0,2528.7 +2529.82,2538.4,2455.01,2477.07 +2477.07,2499.88,2455.1,2470.37 +2470.21,2497.3,2468.28,2469.73 +2469.73,2505.17,2456.98,2504.36 +2504.2,2520.0,2490.37,2513.53 +2513.52,2542.95,2510.19,2537.99 +2538.66,2539.49,2500.02,2515.57 +2515.57,2560.0,2511.34,2558.67 +2556.89,2568.78,2553.86,2560.0 +2560.2,2564.51,2554.0,2562.49 +2562.5,2574.69,2560.84,2567.07 +2565.4,2580.0,2553.67,2577.6 +2576.77,2577.92,2558.52,2559.39 +2559.39,2562.96,2551.04,2558.47 +2558.16,2558.16,2502.86,2523.75 +2522.22,2543.99,2516.81,2517.5 +2517.49,2519.14,2481.92,2510.28 +2510.3,2540.28,2509.4,2534.7 +2534.68,2566.28,2530.82,2566.25 +2566.03,2567.84,2550.0,2553.65 +2554.39,2556.53,2536.82,2541.0 +2540.85,2568.21,2539.23,2567.06 +2567.06,2591.59,2567.06,2588.28 +2588.28,2588.29,2572.0,2579.79 +2579.78,2579.97,2547.8,2559.05 +2559.01,2575.33,2550.64,2567.01 +2567.01,2576.62,2561.23,2572.19 +2572.19,2585.32,2569.88,2583.0 +2583.0,2599.65,2582.33,2598.89 +2598.9,2623.86,2598.82,2604.63 +2604.58,2620.0,2595.7,2615.23 +2615.06,2618.5,2596.57,2600.01 +2600.01,2613.55,2590.0,2599.99 +2599.95,2601.34,2590.77,2591.24 +2594.12,2608.63,2590.03,2601.29 +2601.28,2632.11,2600.93,2623.97 +2621.71,2632.07,2609.58,2618.82 +2618.73,2623.23,2585.42,2592.05 +2592.43,2608.21,2590.74,2599.38 +2599.61,2605.84,2589.5,2605.84 +2605.35,2622.71,2602.92,2620.77 +2620.71,2639.49,2620.08,2638.01 +2638.01,2642.0,2625.97,2641.93 +2641.89,2659.95,2635.99,2659.95 +2659.95,2662.0,2640.85,2640.86 +2640.51,2662.52,2638.0,2662.51 +2662.52,2715.17,2662.51,2710.67 +2711.29,2776.95,2709.02,2767.06 +2767.06,2775.0,2725.0,2742.79 +2741.04,2771.0,2736.4,2766.03 +2766.02,2773.0,2740.0,2761.28 +2761.28,2764.79,2716.58,2737.92 +2737.91,2742.66,2700.0,2700.02 +2700.17,2736.77,2686.0,2695.0 +2696.76,2715.8,2690.0,2708.37 +2708.37,2716.97,2705.24,2715.0 +2714.98,2739.53,2714.43,2738.24 +2738.24,2781.59,2738.12,2773.83 +2773.82,2773.83,2662.72,2686.0 +2686.0,2699.44,2640.82,2678.96 +2680.95,2724.0,2679.84,2720.98 +2720.98,2735.43,2719.99,2728.99 +2728.93,2729.0,2685.0,2685.0 +2685.0,2701.11,2678.0,2696.89 +2696.87,2739.47,2696.87,2730.5 +2730.51,2745.89,2725.27,2740.0 +2739.99,2740.0,2697.08,2718.0 +2718.0,2725.0,2651.17,2658.64 +2659.01,2690.87,2628.0,2676.38 +2676.37,2705.0,2659.1,2689.75 +2689.75,2689.75,2649.01,2666.89 +2666.87,2707.0,2663.19,2689.17 +2688.98,2704.64,2627.0,2652.6 +2644.57,2667.22,2640.0,2649.95 +2649.95,2700.0,2559.51,2598.86 +2595.82,2599.69,2565.12,2584.82 +2584.82,2650.0,2563.13,2650.0 +2650.0,2677.06,2649.0,2650.0 +2650.67,2658.77,2607.82,2628.84 +2628.93,2641.75,2610.0,2629.53 +2629.53,2649.18,2625.13,2642.0 +2641.99,2642.94,2598.0,2599.9 +2599.9,2627.0,2599.89,2615.02 +2615.02,2645.0,2615.02,2643.18 +2643.15,2647.65,2623.74,2647.62 +2647.63,2647.64,2625.19,2634.35 +2634.35,2666.88,2623.02,2666.87 +2666.88,2674.48,2663.47,2673.08 +2673.56,2673.56,2651.26,2665.8 +2665.79,2674.55,2653.36,2667.39 +2666.67,2690.98,2666.35,2688.54 +2688.19,2710.0,2685.0,2701.02 +2701.2,2724.69,2690.41,2722.99 +2722.99,2723.98,2700.3,2715.97 +2715.96,2719.64,2704.0,2704.01 +2704.09,2718.14,2697.53,2700.0 +2700.01,2704.46,2672.11,2696.4 +2696.4,2702.88,2664.0,2678.88 +2678.84,2685.75,2650.0,2680.64 +2680.64,2699.6,2676.77,2678.79 +2678.79,2689.71,2665.0,2687.0 +2686.99,2715.0,2678.19,2702.76 +2702.81,2739.84,2702.75,2734.37 +2734.34,2743.0,2715.98,2718.99 +2718.99,2723.61,2712.0,2720.75 +2720.75,2727.0,2720.45,2723.17 +2723.16,2727.67,2716.01,2720.12 +2720.03,2720.03,2695.03,2709.4 +2708.93,2713.96,2701.96,2703.74 +2704.11,2705.0,2665.0,2676.71 +2679.14,2686.82,2674.0,2682.2 +2682.2,2704.84,2681.86,2701.87 +2700.63,2701.27,2688.81,2696.19 +2696.18,2696.18,2683.1,2683.51 +2683.5,2706.1,2680.0,2700.36 +2700.36,2718.69,2700.0,2716.34 +2716.39,2720.0,2700.76,2711.0 +2711.0,2720.67,2700.0,2719.19 +2719.19,2720.99,2710.2,2713.45 +2713.45,2715.0,2702.5,2707.25 +2707.24,2712.0,2700.0,2710.86 +2710.86,2715.5,2702.6,2710.0 +2710.0,2710.0,2694.05,2706.5 +2706.5,2706.5,2695.96,2701.98 +2700.89,2702.0,2680.0,2694.15 +2694.26,2705.0,2693.37,2705.0 +2705.0,2709.0,2700.52,2705.67 +2704.9,2707.81,2704.13,2705.3 +2705.3,2706.97,2695.0,2699.78 +2699.55,2706.14,2695.09,2705.08 +2705.07,2715.99,2705.03,2715.99 +2715.99,2716.26,2705.03,2709.19 +2708.78,2710.65,2704.96,2707.49 +2707.53,2708.49,2704.85,2707.96 +2707.5,2707.61,2688.31,2706.08 +2706.77,2711.98,2704.23,2708.58 +2708.59,2716.57,2708.59,2710.03 +2710.03,2718.37,2699.26,2700.05 +2700.04,2700.05,2630.0,2655.79 +2655.83,2667.09,2623.03,2629.83 +2629.82,2659.09,2629.8,2655.71 +2655.71,2655.71,2620.0,2634.6 +2634.61,2641.49,2610.0,2610.01 +2610.0,2611.68,2541.4,2569.96 +2569.94,2571.83,2503.05,2504.99 +2504.26,2584.04,2504.22,2572.97 +2572.97,2597.96,2560.07,2586.12 +2586.12,2592.61,2552.87,2557.11 +2557.1,2586.02,2536.36,2565.93 +2565.85,2573.14,2540.0,2548.88 +2548.87,2550.2,2503.07,2532.83 +2532.83,2548.89,2508.99,2542.81 +2544.3,2548.84,2523.96,2546.96 +2546.96,2574.69,2544.61,2574.48 +2574.48,2586.02,2573.74,2584.36 +2584.38,2586.33,2574.7,2578.35 +2578.34,2581.79,2569.94,2569.94 +2569.8,2598.0,2569.8,2597.99 +2597.99,2614.89,2589.9,2601.97 +2602.08,2602.83,2578.57,2593.24 +2595.84,2625.0,2592.03,2621.45 +2621.34,2623.54,2601.77,2608.79 +2608.79,2608.79,2600.0,2607.96 +2607.96,2607.96,2558.37,2558.37 +2561.76,2571.86,2551.18,2567.01 +2567.2,2580.76,2562.78,2570.72 +2570.72,2595.22,2570.0,2580.2 +2580.79,2580.79,2517.65,2517.66 +2517.66,2525.71,2464.01,2479.12 +2480.61,2514.0,2450.11,2455.37 +2455.36,2483.97,2430.05,2472.8 +2470.57,2496.47,2447.0,2480.02 +2480.01,2509.99,2470.0,2498.0 +2497.99,2521.53,2487.76,2509.68 +2506.53,2553.78,2503.49,2548.57 +2548.57,2548.57,2525.97,2533.33 +2533.34,2552.45,2526.05,2551.99 +2551.98,2563.9,2503.51,2516.14 +2516.24,2529.33,2495.0,2495.0 +2495.56,2495.56,2475.0,2475.0 +2475.01,2504.6,2459.47,2495.0 +2494.99,2496.3,2446.98,2453.02 +2454.66,2524.69,2454.66,2521.0 +2521.0,2523.7,2487.96,2491.08 +2491.26,2491.54,2456.89,2456.9 +2456.9,2497.64,2456.89,2487.4 +2487.39,2497.22,2450.0,2462.02 +2462.22,2469.71,2395.94,2397.65 +2397.65,2399.99,2342.09,2379.71 +2379.71,2403.42,2355.0,2374.8199999999997 +2372.27,2373.0,2365.03,2369.93 +2369.93,2369.93,2258.34,2328.11 +2328.08,2348.2,2282.37,2296.3 +2296.26,2372.98,2281.6,2370.86 +2372.97,2415.14,2368.0,2394.37 +2394.36,2419.99,2356.0,2419.41 +2418.47,2439.99,2400.41,2407.84 +2409.97,2431.22,2386.3,2411.71 +2411.92,2439.78,2398.7,2438.0 +2438.0,2470.12,2438.0,2452.44 +2452.45,2461.77,2444.75,2450.1 +2450.1,2450.9,2407.34,2436.54 +2438.52,2456.37,2425.47,2447.1 +2447.3,2452.27,2386.1,2387.34 +2387.34,2396.16,2355.05,2385.8 +2384.79,2399.41,2350.05,2359.94 +2360.81,2400.0,2351.02,2393.99 +2393.99,2418.28,2390.33,2394.9 +2392.76,2392.77,2350.0,2359.86 +2363.0,2390.82,2342.67,2362.35 +2362.35,2367.09,2304.63,2304.65 +2304.65,2332.55,2275.05,2300.0 +2300.0,2324.69,2280.0,2324.6 +2324.63,2324.66,2264.0,2294.74 +2292.95,2346.84,2282.0,2340.1 +2340.09,2381.27,2316.23,2379.31 +2377.13,2420.37,2370.0,2410.04 +2410.79,2471.26,2410.79,2436.83 +2436.84,2466.89,2422.13,2446.2 +2446.31,2525.0,2446.2,2504.89 +2503.09,2581.47,2480.0,2549.0 +2547.39,2557.1,2503.56,2503.57 +2503.03,2526.99,2457.0,2495.6 +2495.6,2507.24,2468.38,2488.21 +2486.8,2549.69,2485.15,2525.04 +2525.05,2533.75,2478.44,2484.75 +2486.11,2498.59,2475.0,2491.06 +2491.08,2500.0,2480.9,2500.0 +2499.99,2520.0,2499.99,2519.68 +2519.27,2524.68,2468.37,2492.31 +2492.92,2526.02,2486.35,2526.0 +2526.01,2533.68,2507.82,2515.4 +2515.05,2530.0,2501.63,2529.99 +2529.99,2550.0,2529.59,2548.46 +2548.46,2580.0,2543.59,2558.37 +2556.6,2574.99,2540.98,2541.91 +2541.91,2568.2,2535.01,2550.46 +2550.46,2550.46,2515.51,2543.28 +2541.52,2562.5,2541.52,2553.98 +2553.98,2556.4,2540.0,2556.39 +2556.36,2573.0,2536.93,2570.99 +2569.3,2600.0,2562.56,2600.0 +2600.0,2605.0,2570.0,2576.46 +2576.46,2581.36,2534.07,2564.27 +2565.45,2577.23,2546.9,2548.02 +2548.02,2567.14,2545.0,2554.35 +2554.35,2566.34,2545.0,2546.71 +2546.71,2568.61,2546.69,2553.46 +2553.47,2571.54,2545.0,2571.54 +2571.76,2574.99,2556.65,2558.45 +2561.94,2564.94,2550.02,2555.78 +2555.56,2577.58,2548.28,2563.41 +2563.38,2574.35,2558.26,2572.96 +2572.96,2585.38,2567.66,2571.38 +2569.0,2583.55,2555.39,2556.36 +2556.54,2561.4,2532.2,2534.66 +2534.58,2548.15,2532.2,2540.2 +2540.21,2540.3,2506.1,2521.74 +2521.0,2544.3,2519.0,2537.9 +2537.89,2552.84,2536.07,2548.22 +2548.26,2558.08,2541.2,2557.0 +2554.72,2585.0,2554.02,2584.46 +2584.13,2591.98,2578.24,2587.13 +2587.29,2589.89,2560.02,2572.99 +2572.99,2575.99,2554.1,2565.33 +2565.39,2572.98,2550.0,2562.45 +2562.37,2570.03,2542.52,2552.0 +2552.0,2560.0,2541.49,2547.0 +2547.0,2558.0,2525.77,2542.54 +2542.54,2554.01,2533.91,2535.0 +2536.2,2548.09,2533.94,2539.53 +2539.56,2545.0,2512.0,2521.0 +2521.0,2527.8,2500.0,2513.13 +2512.26,2530.49,2510.12,2523.41 +2523.41,2523.99,2504.0,2513.76 +2513.81,2519.51,2512.16,2515.63 +2514.43,2521.94,2504.11,2521.76 +2520.68,2537.38,2512.15,2524.04 +2523.2,2531.58,2521.75,2526.32 +2526.59,2540.44,2514.8,2539.27 +2539.27,2549.69,2527.41,2527.6 +2527.9,2537.06,2510.0,2513.58 +2513.58,2523.43,2472.61,2484.04 +2482.28,2510.95,2476.54,2498.81 +2498.75,2529.55,2496.0,2511.13 +2511.11,2520.0,2511.1,2520.0 +2519.94,2528.2,2510.59,2528.2 +2528.1,2529.6,2520.0,2513.605 +2513.5550000000003,2521.02,2478.06,2499.01 +2499.01,2502.8,2490.01,2499.04 +2499.89,2503.66,2460.84,2469.63 +2469.64,2484.39,2446.2,2449.24 +2448.44,2460.0,2446.2,2459.54 +2459.99,2468.43,2455.79,2466.91 +2467.76,2469.33,2430.22,2430.26 +2430.26,2444.24,2428.03,2432.24 +2432.24,2445.15,2432.24,2436.1 +2436.1,2469.56,2430.8,2461.26 +2461.27,2471.68,2454.53,2464.21 +2464.21,2504.01,2464.21,2491.02 +2489.6,2511.59,2487.09,2506.53 +2508.08,2512.82,2489.23,2490.4 +2489.23,2515.0,2475.03,2492.97 +2492.97,2508.0,2486.33,2502.96 +2501.75,2513.38,2495.12,2506.7 +2506.69,2509.34,2481.09,2483.33 +2482.1,2486.81,2453.15,2464.2 +2464.01,2473.93,2450.0,2454.52 +2454.47,2475.0,2452.93,2467.19 +2467.22,2468.6,2450.0,2455.04 +2455.14,2458.2,2428.03,2454.12 +2454.13,2454.68,2414.0,2427.36 +2428.41,2438.65,2406.44,2438.65 +2438.65,2438.95,2404.61,2419.89 +2419.89,2420.0,2401.0,2418.6 +2418.59,2431.94,2400.0,2421.59 +2421.56,2430.0,2414.8,2425.71 +2425.7,2426.0,2385.0,2393.0 +2393.0,2419.9,2393.0,2401.17 +2398.26,2410.0,2385.52,2407.64 +2407.52,2409.89,2397.63,2404.01 +2403.49,2436.75,2401.77,2427.0 +2428.04,2439.99,2425.39,2439.99 +2439.34,2439.35,2415.19,2426.36 +2426.29,2450.0,2421.61,2449.97 +2449.99,2461.99,2432.75,2459.8 +2458.93,2461.99,2450.0,2456.18 +2456.18,2456.18,2427.76,2452.795 +2429.29,2450.0,2427.85,2449.41 +2449.4,2450.03,2431.65,2444.36 +2443.64,2450.35,2429.9,2437.12 +2436.12,2449.76,2425.43,2448.05 +2449.03,2469.98,2443.18,2469.94 +2469.94,2479.25,2468.31,2477.48 +2477.48,2510.0,2476.87,2510.0 +2510.0,2526.72,2478.43,2487.83 +2487.07,2506.11,2484.78,2499.98 +2499.21,2507.45,2488.01,2501.23 +2501.2,2525.0,2495.56,2523.54 +2523.54,2525.0,2506.0,2525.0 +2524.99,2545.0,2505.28,2506.51 +2507.56,2519.9,2499.2,2499.26 +2499.25,2501.0,2495.36,2501.0 +2500.99,2501.0,2490.32,2492.54 +2492.6,2495.35,2487.04,2489.01 +2489.02,2499.99,2487.04,2497.9 +2497.68,2499.76,2481.72,2493.85 +2493.85,2502.0,2490.56,2502.0 +2502.0,2502.0,2481.72,2488.79 +2488.67,2492.19,2481.73,2490.06 +2489.87,2493.77,2479.75,2491.24 +2490.08,2496.13,2480.11,2483.94 +2484.76,2502.3,2479.75,2502.3 +2502.3,2524.0,2502.29,2524.0 +2523.52,2570.0,2518.46,2559.75 +2560.76,2584.78,2539.37,2554.87 +2554.86,2576.45,2544.14,2570.14 +2570.13,2570.13,2554.91,2556.8 +2556.79,2561.19,2546.43,2546.43 +2546.43,2549.9,2526.83,2529.0 +2529.0,2548.02,2528.1,2547.2 +2547.2,2559.99,2547.2,2559.99 +2559.99,2563.0,2550.0,2563.0 +2563.0,2573.84,2550.32,2554.99 +2555.1,2557.1,2541.9,2543.75 +2543.74,2564.0,2543.62,2562.3 +2562.26,2570.0,2560.93,2567.1 +2567.12,2610.77,2566.0,2604.3 +2604.29,2625.0,2601.0,2607.39 +2607.39,2625.47,2606.23,2612.73 +2612.13,2636.04,2612.11,2615.91 +2616.9,2628.18,2615.0,2628.07 +2628.07,2636.1,2620.5,2621.92 +2621.26,2622.94,2593.86,2600.0 +2599.99,2609.99,2598.62,2601.39 +2601.39,2602.94,2581.12,2596.4 +2596.4,2617.0,2595.09,2616.9 +2616.91,2621.57,2609.03,2613.94 +2613.94,2626.0,2613.93,2615.01 +2615.01,2621.0,2610.0,2610.01 +2610.01,2610.01,2577.88,2583.46 +2585.48,2585.69,2560.0,2576.34 +2576.4,2595.89,2575.01,2585.96 +2585.96,2595.72,2579.56,2585.66 +2584.52,2588.24,2565.0,2566.55 +2566.99,2587.0,2563.02,2586.01 +2586.89,2590.05,2574.71,2585.64 +2585.65,2596.0,2583.1,2595.96 +2595.97,2611.45,2591.32,2600.01 +2600.01,2601.42,2577.51,2580.79 +2580.36,2593.51,2576.25,2582.32 +2582.31,2584.32,2571.36,2583.23 +2583.22,2587.64,2572.89,2577.2 +2577.33,2579.0,2559.01,2566.11 +2565.28,2572.47,2561.49,2570.78 +2570.72,2576.77,2555.34,2566.07 +2565.28,2567.07,2553.04,2559.66 +2559.66,2571.65,2552.37,2570.83 +2570.83,2574.57,2560.8,2568.32 +2568.32,2575.9,2568.32,2575.9 +2575.89,2578.93,2569.43,2571.99 +2571.99,2572.0,2554.65,2554.65 +2555.32,2576.99,2551.06,2568.12 +2568.12,2575.0,2556.68,2562.2 +2562.19,2581.75,2556.38,2578.95 +2578.91,2585.47,2575.02,2578.97 +2578.96,2598.0,2573.02,2595.25 +2595.42,2612.0,2595.42,2598.68 +2598.71,2624.0,2594.39,2619.44 +2619.42,2619.99,2604.1,2609.97 +2609.92,2619.55,2597.92,2616.56 +2616.56,2630.24,2610.0,2610.0 +2609.9,2620.0,2602.11,2617.18 +2616.54,2623.54,2608.93,2612.01 +2613.05,2615.84,2600.14,2603.5 +2603.02,2610.14,2603.01,2610.14 +2610.13,2617.0,2606.86,2616.97 +2616.98,2617.0,2606.22,2608.82 +2608.83,2608.83,2596.57,2602.36 +2601.0,2607.0,2599.42,2605.99 +2606.0,2609.1,2593.82,2608.08 +2608.09,2614.93,2601.22,2614.93 +2614.0,2614.72,2580.73,2591.28 +2587.33,2604.09,2586.44,2596.77 +2597.95,2603.0,2590.36,2601.14 +2601.54,2607.0,2597.44,2599.7 +2599.71,2599.94,2585.0,2594.59 +2595.0,2597.93,2580.77,2585.27 +2584.28,2590.0,2580.7,2580.7 +2580.71,2594.99,2580.69,2592.91 +2592.94,2598.96,2590.0,2593.05 +2593.23,2596.27,2590.95,2590.96 +2590.96,2601.95,2590.91,2601.95 +2601.95,2608.98,2593.2,2597.24 +2597.24,2600.0,2594.04,2599.94 +2599.94,2605.1,2590.76,2605.01 +2605.01,2605.5,2600.0,2602.19 +2604.34,2606.0,2600.26,2606.0 +2606.0,2606.52,2591.63,2605.11 +2605.1,2607.61,2589.0,2589.97 +2589.97,2597.75,2589.58,2597.71 +2597.22,2599.42,2589.0,2594.45 +2594.8,2597.88,2589.16,2596.96 +2597.0,2597.86,2574.07,2574.56 +2574.5,2575.72,2568.0,2570.86 +2570.85,2570.85,2567.52,2570.25 +2570.69,2575.95,2567.61,2575.61 +2575.94,2586.62,2572.09,2579.96 +2578.6,2578.6,2556.0,2556.38 +2557.78,2559.97,2532.62,2535.09 +2535.2,2539.0,2505.26,2524.91 +2524.91,2525.0,2510.88,2511.16 +2511.16,2526.0,2490.91,2517.96 +2517.98,2525.61,2515.0,2522.27 +2521.76,2534.09,2518.24,2534.09 +2534.09,2535.29,2501.1,2523.73 +2523.73,2529.95,2518.56,2526.0 +2526.0,2527.98,2513.39,2521.52 +2520.88,2521.79,2480.0,2490.0 +2490.0,2491.74,2473.12,2477.84 +2477.12,2503.02,2472.0,2502.37 +2502.37,2502.91,2485.98,2492.79 +2492.79,2492.79,2471.22,2485.62 +2485.77,2494.92,2478.22,2478.34 +2479.34,2503.0,2479.34,2502.79 +2502.76,2529.98,2502.76,2529.97 +2529.56,2529.99,2504.87,2516.0 +2517.08,2518.37,2491.19,2504.8 +2504.26,2523.95,2497.08,2501.81 +2501.75,2513.37,2492.29,2511.5 +2512.36,2518.64,2504.48,2508.85 +2508.94,2525.71,2506.45,2519.31 +2520.44,2520.77,2500.12,2517.71 +2517.25,2537.33,2517.25,2524.37 +2524.37,2529.44,2522.45,2524.93 +2524.94,2533.69,2521.48,2532.52 +2533.28,2533.31,2521.55,2531.83 +2531.88,2533.69,2514.87,2514.88 +2514.87,2517.82,2506.41,2510.91 +2510.72,2533.69,2510.15,2530.28 +2532.1,2549.0,2521.51,2547.35 +2548.16,2553.0,2540.23,2542.0 +2542.0,2547.48,2541.01,2547.0 +2546.99,2563.5,2541.07,2556.75 +2557.45,2564.95,2552.68,2564.18 +2564.35,2572.93,2560.0,2561.28 +2562.94,2565.5,2556.99,2560.46 +2561.47,2565.0,2555.01,2564.99 +2564.99,2569.98,2560.0,2569.88 +2569.9,2579.84,2569.06,2572.0 +2572.0,2572.01,2555.0,2556.21 +2556.1,2556.92,2548.5,2552.39 +2552.0,2557.0,2548.5,2548.5 +2548.51,2551.25,2548.5,2550.9 +2550.96,2556.28,2548.5,2553.27 +2552.6,2559.09,2550.02,2554.08 +2554.09,2559.46,2550.01,2553.28 +2553.28,2555.88,2548.5,2550.38 +2550.37,2557.24,2524.17,2553.0 +2553.0,2558.41,2551.06,2558.41 +2558.41,2567.43,2558.41,2560.32 +2559.96,2560.53,2553.62,2555.32 +2555.32,2555.32,2551.55,2554.34 +2553.79,2553.95,2538.29,2541.7 +2541.68,2545.0,2520.44,2543.73 +2543.73,2545.8,2536.28,2536.28 +2536.27,2537.06,2528.08,2528.82 +2528.83,2531.26,2512.37,2519.56 +2519.39,2522.44,2500.0,2512.72 +2513.01,2514.12,2495.5,2500.76 +2500.62,2517.0,2495.78,2515.12 +2515.12,2523.0,2510.01,2512.92 +2512.89,2513.35,2505.25,2505.31 +2506.02,2513.38,2499.3,2512.91 +2512.03,2517.3,2510.0,2516.0 +2516.0,2518.0,2509.63,2518.0 +2518.0,2520.99,2513.38,2515.0 +2514.99,2515.82,2513.38,2515.59 +2515.59,2520.79,2512.35,2519.3 +2519.3,2519.96,2508.25,2514.39 +2514.86,2515.14,2492.66,2495.4 +2493.4,2499.91,2460.0,2474.06 +2474.9,2481.23,2419.69,2438.26 +2439.52,2444.0,2376.0,2422.03 +2422.02,2422.02,2369.71,2416.43 +2415.52,2429.85,2401.0,2405.7 +2405.64,2426.77,2401.47,2415.1 +2415.64,2418.47,2390.0,2400.0 +2400.0,2419.41,2400.0,2407.56 +2407.48,2408.3,2365.0,2379.15 +2379.63,2379.66,2330.05,2350.02 +2350.02,2363.65,2315.0,2318.83 +2321.85,2348.98,2250.0,2336.3 +2336.3,2377.42,2332.49,2363.32 +2363.32,2381.04,2354.55,2375.49 +2375.49,2375.56,2325.52,2354.11 +2354.76,2356.65,2314.08,2314.11 +2314.1,2347.07,2290.94,2346.53 +2346.52,2352.14,2306.76,2307.04 +2307.05,2315.0,2265.0,2311.35 +2314.38,2350.0,2299.0,2339.0 +2338.98,2342.9,2322.34,2328.74 +2328.1,2371.97,2326.82,2365.13 +2364.8,2369.79,2342.85,2364.95 +2363.9,2374.99,2353.17,2365.87 +2365.87,2410.0,2360.0,2390.99 +2389.8,2400.0,2351.84,2371.48 +2370.3,2377.04,2335.0,2365.74 +2365.85,2373.46,2358.02,2358.08 +2359.1,2368.96,2356.02,2360.16 +2360.02,2365.8,2350.02,2351.22 +2351.31,2360.0,2338.69,2338.69 +2338.69,2338.82,2309.0,2318.45 +2318.42,2337.23,2309.01,2333.75 +2333.75,2343.99,2322.41,2323.56 +2323.62,2356.73,2323.6,2335.1 +2335.04,2342.5,2300.0,2308.51 +2308.52,2308.85,2262.73,2278.02 +2278.03,2293.24,2260.0,2261.97 +2261.18,2293.72,2250.0,2283.71 +2283.7,2284.97,2254.0,2269.44 +2269.66,2322.03,2269.66,2311.7 +2311.6,2313.46,2290.0,2295.11 +2295.13,2311.15,2293.5,2298.58 +2298.59,2309.99,2291.28,2302.2 +2300.74,2331.34,2298.79,2330.0 +2330.34,2344.69,2329.18,2342.38 +2342.43,2342.43,2321.54,2331.35 +2332.05,2365.49,2331.37,2352.99 +2352.77,2365.12,2340.0,2345.72 +2345.72,2345.72,2340.0,2344.61 +2343.66,2356.08,2343.06,2355.57 +2355.61,2380.0,2354.14,2375.0 +2375.0,2398.41,2367.05,2398.41 +2398.4,2415.0,2383.24,2399.01 +2399.01,2408.14,2386.19,2408.14 +2406.96,2410.0,2391.01,2399.64 +2399.64,2403.94,2361.69,2366.57 +2365.12,2375.0,2350.05,2373.32 +2373.33,2382.14,2358.35,2360.42 +2359.75,2387.8,2357.0,2386.35 +2386.48,2393.4,2375.01,2378.71 +2379.43,2393.4,2377.26,2393.4 +2393.39,2411.0,2393.39,2411.0 +2411.0,2416.79,2404.71,2408.71 +2408.74,2409.13,2385.03,2385.63 +2385.63,2393.7,2377.72,2385.01 +2385.01,2385.01,2382.16,2382.79 +2382.79,2382.97,2362.5,2363.62 +2363.62,2379.0,2363.36,2376.99 +2377.0,2377.99,2370.09,2370.33 +2370.33,2378.46,2367.04,2376.01 +2376.01,2385.79,2375.18,2384.42 +2384.42,2389.95,2377.75,2377.76 +2377.76,2377.76,2356.04,2362.99 +2362.99,2370.65,2350.05,2356.44 +2358.29,2358.35,2320.52,2331.75 +2331.75,2341.39,2330.5,2338.0 +2338.0,2339.19,2308.14,2316.25 +2316.18,2339.19,2308.18,2325.96 +2325.94,2337.0,2312.64,2337.0 +2337.02,2339.19,2323.71,2333.91 +2333.94,2339.99,2320.95,2339.99 +2339.98,2347.88,2324.6,2342.04 +2342.02,2351.15,2336.83,2342.17 +2346.26,2349.03,2329.16,2337.0 +2336.37,2336.52,2310.15,2311.85 +2311.85,2312.67,2301.0,2307.49 +2307.49,2316.01,2302.26,2308.5 +2308.5,2326.23,2308.49,2323.99 +2322.96,2329.73,2320.43,2325.08 +2325.08,2340.92,2325.08,2338.47 +2338.48,2349.28,2335.54,2335.54 +2335.54,2337.76,2327.67,2336.67 +2335.72,2340.01,2327.16,2327.95 +2330.32,2342.79,2327.01,2337.71 +2338.54,2340.42,2309.93,2312.0 +2312.48,2314.23,2268.91,2274.62 +2274.62,2287.6,2254.94,2254.96 +2254.96,2270.87,2250.0,2269.8 +2269.78,2281.1,2243.68,2256.35 +2256.36,2262.0,2178.92,2190.0 +2190.0,2207.0,2186.8,2189.8 +2190.8,2219.69,2180.0,2212.63 +2212.63,2212.63,2177.18,2179.86 +2179.86,2184.4,2150.0,2150.1 +2150.1,2188.0,2150.01,2179.99 +2179.05,2216.28,2166.33,2215.72 +2215.72,2228.14,2200.58,2222.55 +2222.55,2223.53,2200.0,2208.41 +2208.49,2217.14,2180.0,2180.0 +2180.44,2180.79,2135.0,2146.0 +2146.0,2162.77,2100.0,2100.01 +2100.01,2145.34,2095.01,2124.81 +2123.48,2137.52,2091.5,2093.98 +2093.98,2127.14,2091.53,2097.37 +2097.36,2097.36,2056.55,2066.01 +2066.01,2084.41,2047.29,2078.79 +2078.84,2100.0,2053.2,2084.45 +2084.45,2103.49,2074.86,2095.21 +2094.88,2095.4,2051.06,2051.47 +2051.47,2052.77,2015.1,2049.4 +2049.4,2070.19,2002.01,2002.19 +2002.01,2022.4,1975.01,2004.04 +2004.95,2043.88,1995.0,2030.0 +2030.32,2073.95,2021.82,2053.7 +2053.79,2110.06,2053.78,2090.48 +2090.53,2097.41,2065.5,2081.98 +2081.97,2094.98,2070.4,2079.48 +2079.48,2079.58,2001.03,2019.18 +2018.43,2053.52,2010.16,2027.55 +2027.55,2055.95,2025.02,2039.7 +2039.69,2039.7,1960.39,1975.09 +1975.11,1996.99,1933.96,1950.95 +1952.87,2004.36,1941.54,1993.23 +1993.23,2032.03,1993.22,2032.03 +2031.31,2043.94,2012.71,2021.47 +2021.47,2022.95,1991.28,2005.74 +2005.75,2017.23,1990.28,1996.25 +1995.25,1995.25,1948.63,1973.36 +1973.36,1978.36,1952.65,1966.18 +1966.36,1972.7,1947.2,1947.2 +1947.95,1954.61,1901.0,1901.0 +1901.01,1921.19,1897.23,1897.23 +1898.45,1898.45,1843.56,1856.37 +1856.22,1856.66,1758.2,1780.99 +1780.99,1928.03,1779.98,1893.98 +1893.98,1899.99,1852.0,1899.99 +1900.0,1919.99,1877.47,1892.61 +1893.34,1956.07,1887.96,1937.22 +1938.2,1948.0,1912.97,1925.01 +1925.01,1933.81,1891.73,1902.99 +1902.95,1902.95,1852.0,1874.08 +1874.0,1904.98,1852.06,1862.18 +1861.14,1898.0,1856.81,1877.54 +1876.01,1938.0,1872.27,1937.02 +1937.01,1937.01,1891.07,1922.53 +1922.5,1939.95,1909.58,1928.11 +1928.21,1979.19,1923.95,1964.77 +1966.76,1978.71,1939.07,1939.07 +1939.07,1959.12,1921.22,1959.11 +1959.11,1975.39,1956.17,1974.85 +1974.81,1989.99,1956.43,1989.99 +1989.99,2039.13,1989.98,2038.24 +2038.24,2078.81,2038.24,2052.47 +2052.45,2090.16,2052.45,2066.06 +2066.05,2086.95,2039.95,2061.27 +2060.72,2060.72,2025.47,2041.98 +2042.01,2050.69,1998.98,2001.39 +2001.32,2017.97,1976.0,2003.35 +2004.0,2021.0,1995.12,2009.99 +2009.99,2070.11,2009.99,2070.11 +2070.11,2079.0,2043.31,2059.79 +2059.79,2067.0,2044.55,2059.99 +2060.0,2145.2,2060.0,2133.29 +2133.29,2149.9,2116.94,2144.81 +2144.75,2146.0,2111.21,2137.99 +2137.99,2186.75,2137.99,2177.72 +2177.71,2189.8,2149.99,2170.0 +2170.0,2218.97,2163.47,2218.97 +2219.0,2238.07,2198.0,2223.4 +2223.4,2225.99,2173.0,2173.18 +2173.18,2199.99,2146.79,2188.06 +2186.72,2198.0,2170.3,2194.22 +2194.22,2194.22,2156.08,2165.0 +2165.0,2193.97,2134.37,2185.93 +2185.93,2231.0,2169.58,2229.48 +2229.47,2273.17,2220.01,2265.17 +2267.73,2276.76,2245.52,2245.52 +2246.06,2272.47,2216.02,2220.43 +2218.39,2254.37,2217.47,2249.04 +2249.05,2249.98,2215.76,2249.42 +2249.48,2305.65,2248.67,2280.46 +2280.46,2307.1,2280.45,2306.99 +2306.96,2328.14,2295.1,2326.33 +2326.34,2365.84,2315.72,2350.69 +2350.7,2359.44,2336.0,2338.11 +2338.86,2340.16,2278.0,2290.07 +2290.07,2335.72,2288.76,2329.95 +2329.94,2356.6,2328.68,2344.7 +2344.72,2374.0,2344.72,2348.44 +2349.94,2393.43,2349.65,2342.95 +2343.705,2365.23,2329.16,2337.46 +2337.47,2339.02,2256.23,2286.0 +2286.01,2317.0,2278.43,2303.72 +2303.91,2303.92,2244.69,2260.45 +2260.5,2298.0,2246.21,2280.0 +2280.02,2298.94,2255.08,2298.0 +2297.98,2349.1,2288.91,2331.43 +2331.8,2338.82,2297.06,2320.17 +2320.21,2351.0,2316.97,2351.0 +2350.99,2370.06,2337.0,2346.52 +2346.51,2388.99,2346.02,2380.94 +2380.18,2396.0,2362.14,2365.0 +2365.0,2370.47,2344.58,2367.04 +2367.04,2379.3,2356.28,2356.32 +2356.3,2365.09,2331.15,2336.98 +2336.66,2340.32,2302.0,2302.02 +2302.0,2327.99,2288.0,2309.99 +2309.96,2345.0,2307.02,2344.97 +2344.94,2347.98,2307.1,2320.24 +2320.24,2320.24,2275.0,2302.84 +2302.99,2308.82,2268.75,2270.66 +2270.06,2285.0,2264.01,2280.01 +2280.0,2282.15,2216.0,2242.48 +2242.48,2266.0,2219.64,2265.21 +2265.21,2282.0,2245.01,2260.93 +2261.04,2279.42,2256.06,2273.65 +2273.64,2279.0,2242.63,2275.12 +2275.1,2278.87,2268.8,2274.3 +2274.25,2317.56,2272.15,2304.01 +2304.0,2335.0,2296.06,2328.16 +2329.1,2329.11,2316.43,2325.34 +2325.34,2328.35,2316.5,2328.34 +2327.8,2344.74,2322.97,2338.01 +2338.0,2349.22,2316.0,2321.48 +2321.47,2323.39,2302.05,2319.84 +2319.8,2329.81,2309.12,2323.4 +2323.35,2330.0,2311.69,2326.57 +2327.3,2339.39,2327.06,2335.0 +2334.99,2469.0,2334.99,2448.48 +2448.48,2557.67,2448.38,2520.3 +2520.06,2618.0,2502.25,2610.01 +2610.01,2626.03,2552.79,2589.76 +2595.49,2661.24,2589.67,2639.81 +2631.44,2682.0,2584.11,2611.01 +2614.95,2637.99,2582.01,2586.09 +2583.67,2677.82,2565.0,2677.82 +2677.8,2682.5,2628.08,2651.03 +2651.39,2759.83,2651.02,2741.26 +2741.26,2777.0,2700.73,2760.28 +2762.06,2874.0,2755.92,2873.21 +2873.21,2957.0,2741.01,2813.58 +2813.58,2829.99,2681.0,2779.96 +2777.2,2811.94,2743.1,2794.96 +2794.96,2794.96,2680.0,2680.93 +2680.5,2734.4,2653.2,2722.01 +2721.52,2770.0,2678.42,2741.63 +2744.24,2797.0,2732.21,2785.76 +2785.77,2794.83,2745.5,2768.8 +2768.83,2773.01,2726.85,2770.94 +2770.94,2770.95,2700.49,2728.5 +2728.5,2758.98,2719.45,2719.6 +2719.45,2731.55,2690.06,2690.98 +2691.55,2772.26,2690.05,2772.02 +2771.5,2798.0,2752.63,2789.93 +2790.04,2797.42,2752.55,2770.0 +2769.99,2770.0,2735.0,2751.0 +2751.0,2753.0,2710.0,2710.0 +2710.0,2743.23,2708.01,2715.83 +2715.81,2715.81,2665.04,2675.16 +2674.91,2712.06,2630.04,2648.0 +2648.01,2648.01,2612.1,2624.34 +2624.42,2649.0,2608.27,2634.29 +2634.24,2646.27,2617.0,2625.27 +2633.08,2699.69,2625.0,2676.45 +2674.36,2675.37,2650.63,2653.78 +2652.34,2694.88,2646.95,2687.33 +2688.11,2719.12,2687.54,2690.97 +2690.98,2741.08,2690.98,2729.66 +2729.66,2731.51,2705.0,2707.4 +2707.39,2719.31,2698.01,2719.17 +2719.17,2743.5,2719.0,2737.81 +2738.1,2757.15,2736.52,2752.37 +2752.36,2770.0,2739.92,2765.0 +2765.29,2797.52,2761.52,2789.43 +2789.25,2810.0,2789.1,2809.87 +2806.15,2865.0,2795.0,2851.01 +2851.01,2869.88,2801.0,2801.0 +2801.0,2824.95,2790.0,2802.08 +2801.94,2801.94,2740.0,2773.89 +2773.89,2780.49,2757.3,2772.02 +2772.03,2800.0,2758.14,2790.01 +2790.01,2834.8,2790.0,2804.13 +2804.18,2841.73,2804.11,2829.32 +2829.31,2832.0,2785.0,2790.0 +2790.0,2818.82,2790.0,2817.1 +2817.1,2820.47,2788.47,2802.0 +2801.99,2826.5,2801.99,2815.79 +2815.82,2832.0,2813.0,2813.43 +2813.43,2830.75,2805.59,2829.06 +2829.04,2848.0,2823.43,2847.94 +2847.95,2847.98,2826.5,2830.34 +2830.34,2830.35,2805.0,2814.7 +2814.7,2835.0,2808.67,2826.99 +2826.98,2826.99,2750.0,2814.0 +2814.0,2825.0,2780.0,2799.94 +2800.0,2805.97,2778.76,2778.76 +2779.13,2782.74,2745.0,2755.34 +2755.23,2769.82,2736.0,2769.41 +2768.96,2781.0,2759.41,2761.79 +2761.78,2761.78,2715.17,2735.52 +2735.09,2735.09,2692.29,2696.86 +2696.86,2748.92,2691.0,2743.17 +2743.16,2772.19,2743.0,2772.17 +2772.18,2816.33,2772.17,2790.59 +2791.05,2800.0,2776.0,2794.41 +2793.99,2796.57,2765.05,2774.28 +2774.23,2805.0,2774.23,2789.74 +2789.74,2794.47,2770.0,2787.05 +2787.04,2788.49,2778.87,2782.01 +2782.01,2805.99,2775.7,2791.96 +2791.93,2791.96,2775.0,2776.78 +2776.79,2776.79,2720.0,2742.88 +2742.87,2762.92,2730.0,2734.18 +2732.88,2774.57,2732.41,2774.57 +2773.42,2774.33,2761.5,2765.99 +2766.0,2776.0,2764.14,2773.67 +2773.67,2775.24,2751.74,2758.05 +2758.05,2765.01,2758.05,2759.17 +2759.7,2759.7,2726.8,2731.17 +2731.17,2754.13,2727.04,2730.43 +2730.84,2759.82,2728.83,2743.47 +2743.48,2759.99,2732.75,2759.0 +2759.0,2772.99,2758.99,2764.99 +2764.99,2770.45,2756.96,2769.0 +2769.0,2779.0,2761.54,2765.0 +2765.0,2770.0,2745.5,2762.65 +2762.61,2794.95,2760.1,2793.84 +2793.84,2799.2,2768.73,2781.56 +2782.59,2783.2,2760.07,2765.0 +2765.0,2769.0,2757.41,2760.0 +2760.0,2760.0,2729.02,2739.71 +2739.71,2740.62,2728.01,2737.93 +2737.4,2774.69,2729.35,2766.95 +2766.94,2766.94,2758.6,2758.6 +2758.68,2759.1,2747.13,2748.87 +2748.87,2762.99,2748.0,2762.91 +2762.93,2767.16,2755.01,2766.2 +2766.2,2782.44,2762.34,2773.6 +2773.6,2773.99,2751.96,2761.1 +2761.74,2765.0,2752.0,2752.02 +2752.01,2755.0,2748.0,2754.0 +2754.01,2767.0,2751.19,2760.34 +2760.35,2769.98,2760.34,2767.41 +2768.84,2773.96,2650.0,2668.78 +2669.2,2690.64,2630.0,2690.61 +2690.62,2705.0,2651.22,2696.0 +2696.0,2696.01,2654.68,2668.46 +2668.48,2684.01,2563.68,2564.0 +2564.01,2590.1,2550.25,2550.26 +2550.27,2598.0,2516.0,2519.47 +2519.49,2569.98,2518.01,2554.99 +2554.99,2598.0,2554.98,2576.0 +2576.0,2590.0,2573.91,2577.85 +2577.89,2581.84,2526.88,2542.2 +2542.21,2561.39,2520.01,2544.97 +2545.19,2549.69,2474.69,2474.69 +2474.5,2499.9,2449.69,2472.15 +2471.02,2548.39,2450.0,2542.15 +2542.15,2577.0,2521.86,2529.18 +2529.18,2557.99,2526.98,2544.33 +2544.33,2590.0,2540.83,2589.99 +2590.0,2614.0,2572.0,2572.01 +2572.01,2580.1,2565.0,2565.83 +2565.0,2565.01,2477.0,2477.21 +2477.21,2530.0,2474.2,2512.69 +2513.37,2537.29,2467.93,2479.51 +2479.47,2496.84,2450.0,2457.22 +2457.21,2477.8,2441.21,2459.99 +2459.98,2493.5,2457.2,2485.69 +2485.69,2529.0,2476.48,2517.99 +2517.98,2518.37,2475.12,2497.05 +2497.05,2522.99,2496.0,2522.63 +2522.63,2551.47,2501.67,2546.02 +2545.98,2551.99,2507.01,2513.4 +2513.3,2513.74,2465.0,2478.19 +2478.19,2500.47,2461.05,2481.25 +2481.42,2486.0,2404.58,2412.86 +2412.83,2447.55,2403.0,2445.91 +2445.92,2484.5,2430.0,2484.5 +2484.5,2494.19,2465.83,2466.0 +2466.0,2484.8,2466.0,2479.96 +2479.96,2504.95,2477.21,2504.95 +2504.93,2505.0,2446.85,2461.88 +2461.88,2520.8,2461.88,2513.76 +2513.75,2535.75,2499.05,2533.31 +2533.32,2548.15,2514.1,2547.02 +2547.01,2554.46,2538.46,2542.91 +2542.92,2542.92,2521.29,2536.0 +2536.0,2553.2,2520.0,2551.51 +2551.81,2583.0,2551.81,2559.97 +2559.98,2567.11,2543.79,2564.0 +2564.0,2564.0,2549.0,2549.03 +2549.03,2549.1,2535.59,2536.92 +2536.93,2554.33,2536.21,2552.01 +2552.01,2573.33,2550.0,2573.33 +2573.33,2600.0,2573.33,2582.39 +2582.4,2584.0,2567.2,2571.96 +2571.99,2578.0,2558.36,2560.63 +2560.65,2576.19,2560.25,2569.99 +2569.99,2570.0,2545.0,2551.48 +2551.48,2559.98,2528.77,2545.36 +2544.98,2569.7,2526.82,2563.1 +2563.09,2578.0,2556.55,2576.27 +2576.28,2578.99,2560.44,2560.61 +2561.26,2571.0,2553.33,2568.21 +2568.21,2595.05,2552.22,2595.04 +2595.05,2655.2,2595.05,2640.0 +2640.0,2686.2,2635.97,2675.29 +2674.2,2680.0,2650.75,2680.0 +2680.0,2737.28,2667.4,2701.4 +2701.39,2714.59,2690.0,2697.58 +2697.57,2699.82,2670.0,2679.2 +2679.64,2683.19,2658.52,2676.0 +2676.3,2678.76,2655.55,2661.2 +2661.2,2689.0,2661.2,2689.0 +2688.99,2693.05,2681.06,2681.87 +2681.29,2741.34,2675.0,2739.2 +2739.2,2777.0,2722.33,2756.01 +2756.01,2764.78,2741.2,2764.77 +2764.76,2764.89,2731.0,2756.5 +2756.5,2825.11,2756.49,2809.13 +2809.22,2809.22,2772.44,2799.96 +2799.97,2800.0,2752.2,2776.2 +2776.65,2781.99,2747.21,2747.21 +2747.21,2750.07,2711.79,2732.2 +2731.99,2780.98,2730.47,2749.59 +2749.59,2779.84,2741.8,2759.86 +2759.86,2766.17,2752.0,2759.73 +2760.99,2767.91,2730.01,2736.0 +2736.01,2753.2,2725.75,2753.2 +2753.2,2794.21,2743.6,2789.21 +2789.22,2803.0,2770.28,2789.4049999999997 +2788.765,2798.0,2777.37,2789.6 +2788.31,2790.0,2774.15,2774.16 +2773.78,2777.05,2747.17,2747.17 +2747.17,2747.55,2712.0,2721.89 +2722.84,2740.99,2656.0,2665.85 +2665.74,2718.56,2660.08,2717.91 +2717.33,2730.0,2701.68,2716.99 +2716.85,2750.0,2716.85,2723.24 +2723.24,2743.75,2723.0,2736.2 +2736.2,2750.0,2729.02,2750.0 +2750.0,2760.67,2728.1,2735.84 +2735.83,2735.83,2688.0,2702.08 +2702.09,2709.18,2675.01,2688.19 +2688.2,2706.69,2688.2,2701.07 +2701.04,2709.14,2680.67,2689.81 +2689.47,2694.41,2682.82,2692.08 +2692.09,2723.95,2683.87,2703.65 +2703.66,2708.23,2697.99,2699.21 +2699.22,2744.0,2697.99,2732.33 +2732.33,2750.0,2720.75,2750.0 +2750.0,2753.93,2726.0,2729.0 +2729.02,2738.71,2711.22,2732.45 +2732.45,2733.76,2711.24,2712.51 +2712.5,2713.2,2689.05,2710.0 +2710.0,2719.38,2692.22,2715.97 +2715.98,2729.75,2700.0,2700.0 +2701.2,2716.98,2701.2,2708.51 +2708.26,2709.04,2697.16,2700.81 +2700.81,2710.17,2689.39,2701.24 +2701.24,2711.19,2697.81,2711.19 +2711.0,2713.19,2500.0,2630.38 +2630.37,2633.82,2569.81,2621.9 +2621.91,2644.49,2620.65,2640.0 +2640.0,2640.0,2623.62,2639.18 +2639.18,2659.2,2639.18,2644.2 +2644.2,2653.0,2631.0,2633.19 +2633.2,2680.0,2633.2,2679.93 +2679.88,2679.88,2662.23,2667.9 +2669.14,2678.65,2660.0,2673.79 +2672.57,2723.99,2670.0,2723.99 +2723.99,2730.0,2704.21,2709.19 +2710.2,2711.19,2700.0,2702.71 +2702.7,2714.0,2700.07,2712.4 +2712.39,2739.98,2706.0,2721.64 +2721.63,2739.05,2712.54,2717.16 +2717.16,2724.16,2713.6,2721.16 +2721.15,2729.2,2716.65,2726.04 +2726.03,2730.0,2718.01,2720.55 +2720.54,2731.99,2718.0,2731.99 +2731.98,2733.24,2700.0,2705.6 +2705.6,2709.09,2700.0,2700.05 +2701.96,2718.9,2700.06,2718.04 +2718.04,2721.9,2715.2,2718.0 +2718.0,2718.0,2710.0,2713.01 +2713.01,2729.99,2710.61,2729.98 +2729.99,2740.01,2716.64,2728.78 +2728.36,2749.0,2728.2,2745.0 +2745.0,2750.0,2739.06,2748.96 +2748.96,2749.0,2712.78,2730.53 +2730.53,2760.0,2730.53,2759.89 +2759.9,2785.83,2759.89,2784.33 +2784.33,2800.0,2780.99,2797.78 +2797.16,2800.0,2770.78,2780.81 +2780.98,2784.2,2756.24,2760.05 +2765.2,2777.75,2747.51,2773.36 +2772.01,2794.17,2765.96,2787.99 +2787.01,2790.89,2770.96,2790.89 +2790.89,2799.99,2780.18,2799.9 +2799.23,2869.99,2791.0,2868.36 +2868.92,2897.97,2846.84,2889.82 +2889.82,2900.0,2840.0,2863.51 +2866.05,2870.5,2841.0,2852.2 +2852.19,2867.68,2837.73,2850.0 +2850.01,2853.94,2816.01,2821.72 +2821.72,2856.69,2819.17,2840.01 +2840.0,2849.02,2831.82,2838.58 +2838.91,2863.89,2833.18,2855.4 +2855.41,2889.61,2827.86,2880.0 +2879.98,2925.0,2875.45,2903.1 +2901.57,2903.09,2860.86,2866.26 +2868.96,2879.75,2775.0,2806.3 +2808.0,2825.0,2689.8,2700.47 +2700.47,2783.15,2688.85,2752.18 +2752.18,2788.94,2750.04,2788.93 +2788.93,2832.0,2775.0,2831.99 +2831.99,2832.0,2703.89,2770.0 +2769.92,2790.0,2676.01,2743.06 +2743.06,2782.09,2740.73,2774.14 +2774.14,2776.22,2740.1,2775.4 +2775.4,2784.4,2750.0,2780.1 +2780.11,2790.81,2765.0,2770.2 +2770.2,2797.53,2750.0,2774.89 +2774.87,2780.66,2750.0,2779.21 +2779.2,2779.2,2735.0,2735.01 +2735.01,2750.0,2722.84,2723.76 +2723.38,2734.19,2705.02,2705.02 +2705.02,2738.02,2704.37,2733.0 +2732.2,2733.58,2700.0,2712.69 +2710.98,2724.9,2700.0,2723.9 +2723.9,2754.0,2723.89,2742.64 +2742.63,2742.64,2723.12,2731.26 +2731.26,2745.14,2731.26,2742.88 +2742.87,2757.52,2737.23,2745.09 +2745.09,2745.09,2732.21,2732.21 +2732.21,2733.81,2710.84,2710.85 +2710.85,2721.0,2710.1,2711.2 +2711.2,2738.99,2711.18,2729.44 +2729.44,2730.99,2712.44,2720.0 +2720.0,2758.06,2719.99,2756.19 +2756.19,2756.19,2727.37,2729.75 +2729.75,2732.09,2665.89,2693.76 +2693.72,2700.0,2676.21,2694.04 +2694.04,2702.48,2686.86,2700.0 +2700.0,2714.39,2695.2,2714.39 +2714.39,2715.0,2701.11,2704.0 +2704.01,2712.0,2703.6,2708.99 +2709.0,2713.6,2683.2,2686.2 +2686.2,2690.0,2661.44,2662.66 +2662.65,2685.19,2650.0,2660.8 +2660.81,2699.9,2660.81,2688.77 +2688.94,2699.9,2679.01,2699.9 +2699.89,2717.93,2699.89,2709.56 +2709.56,2717.0,2700.93,2711.56 +2711.93,2716.0,2705.54,2712.2 +2712.2,2720.0,2712.2,2720.0 +2719.99,2720.1,2708.4,2713.57 +2713.57,2716.83,2709.14,2713.64 +2713.64,2719.81,2709.49,2712.29 +2712.29,2719.93,2712.28,2717.82 +2718.88,2724.93,2714.2,2724.93 +2724.93,2744.0,2724.92,2743.0 +2743.0,2743.0,2735.75,2735.77 +2735.52,2736.0,2732.94,2735.01 +2735.01,2735.01,2720.2,2733.67 +2733.52,2740.95,2730.79,2734.64 +2734.64,2735.0,2729.4,2735.0 +2735.0,2761.7,2735.0,2761.2 +2761.2,2761.93,2752.64,2760.01 +2760.0,2764.36,2751.0,2752.6 +2752.6,2772.0,2752.59,2772.0 +2772.0,2797.86,2772.0,2797.86 +2797.87,2799.0,2777.06,2788.97 +2788.98,2789.28,2777.5,2782.49 +2782.48,2798.92,2781.46,2792.38 +2792.37,2792.9,2784.1,2789.98 +2789.97,2790.99,2784.71,2785.94 +2785.94,2789.16,2775.01,2781.31 +2781.31,2789.96,2775.0,2777.14 +2777.14,2786.55,2775.01,2780.24 +2780.21,2786.0,2768.75,2773.99 +2773.97,2785.0,2760.0,2782.2 +2782.2,2785.0,2779.06,2780.26 +2780.26,2817.24,2779.5,2814.42 +2814.42,2839.95,2798.54,2839.34 +2839.35,2851.55,2833.21,2843.45 +2843.45,2856.93,2830.51,2856.93 +2856.93,2869.87,2838.7,2842.5 +2842.04,2849.82,2839.99,2842.01 +2842.0,2853.99,2842.0,2848.28 +2848.28,2869.75,2848.0,2869.75 +2869.75,2877.79,2863.59,2871.52 +2871.52,2873.22,2841.81,2848.42 +2848.01,2857.13,2839.39,2851.51 +2851.51,2851.86,2833.96,2837.49 +2837.07,2837.41,2826.11,2829.98 +2829.98,2838.15,2829.97,2832.81 +2832.33,2840.0,2827.0,2839.0 +2839.0,2868.0,2838.99,2863.81 +2866.4,2868.12,2850.0,2867.88 +2866.29,2866.36,2858.08,2865.62 +2865.66,2883.54,2865.66,2874.32 +2874.32,2949.99,2874.32,2949.99 +2949.99,3195.0,2945.53,3100.0 +3100.01,3179.79,3050.01,3117.08 +3117.0,3131.0,3075.0,3107.03 +3107.03,3162.17,3100.03,3129.08 +3131.44,3133.43,3090.0,3099.75 +3099.74,3160.47,3095.55,3156.36 +3156.36,3200.0,3142.25,3157.09 +3157.09,3193.03,3147.32,3155.03 +3155.03,3155.11,3115.66,3127.39 +3127.71,3149.94,3127.71,3144.9 +3144.9,3169.96,3144.9,3158.4 +3158.14,3221.86,3157.88,3213.0 +3213.0,3213.6,3168.56,3199.99 +3199.99,3278.69,3197.11,3261.42 +3261.42,3335.0,3257.76,3313.02 +3313.01,3313.02,3243.08,3287.61 +3287.58,3289.0,3240.01,3276.86 +3276.88,3276.88,3202.01,3204.99 +3204.99,3228.07,3155.0,3228.07 +3228.08,3230.0,3200.0,3200.0 +3200.1,3249.0,3200.03,3248.92 +3248.35,3275.0,3232.07,3260.0 +3260.0,3270.0,3224.01,3241.4 +3241.4,3252.36,3188.0,3191.0 +3191.01,3204.0,3170.0,3204.0 +3205.3,3209.55,3185.0,3191.51 +3190.0,3197.49,3175.0,3197.0 +3196.99,3209.13,3195.0,3205.03 +3204.99,3204.99,3150.0,3160.0 +3160.0,3182.03,3150.01,3182.03 +3182.03,3196.69,3167.51,3179.24 +3178.87,3180.0,3151.09,3173.02 +3173.03,3186.5,3151.6,3181.84 +3174.52,3194.66,3170.0,3184.89 +3180.96,3189.92,3165.43,3174.73 +3174.87,3225.0,3174.55,3222.59 +3224.43,3228.97,3207.62,3224.99 +3224.99,3270.0,3220.0,3259.99 +3260.0,3270.1,3246.64,3257.5 +3259.23,3266.99,3250.0,3251.42 +3251.43,3269.0,3250.0,3260.0 +3260.0,3278.42,3250.0,3252.05 +3252.05,3265.0,3236.0,3264.99 +3264.99,3264.99,3245.0,3245.01 +3245.01,3245.01,3203.52,3228.0 +3228.0,3235.57,3210.0,3215.0 +3215.0,3220.37,3190.0,3209.14 +3209.14,3224.29,3207.44,3224.29 +3222.35,3234.03,3217.77,3234.03 +3234.03,3234.03,3214.37,3219.33 +3219.93,3238.58,3219.91,3237.32 +3236.92,3242.22,3230.42,3239.97 +3239.98,3240.0,3224.53,3249.4849999999997 +3230.52,3259.0,3230.51,3259.0 +3259.0,3274.96,3249.78,3269.99 +3270.0,3274.96,3263.53,3273.0 +3273.0,3368.88,3272.99,3363.12 +3363.12,3416.0,3346.05,3376.54 +3380.0,3405.0,3370.0,3379.99 +3380.01,3400.51,3353.54,3381.88 +3380.6,3390.89,3372.57,3380.11 +3380.1,3380.1,3355.0,3375.81 +3375.6,3375.6,3353.0,3353.11 +3353.12,3361.99,3328.0,3339.2 +3339.2,3359.69,3339.2,3358.5 +3358.5,3358.5,3339.53,3345.13 +3345.13,3371.07,3345.0,3367.58 +3367.53,3400.0,3362.65,3399.8 +3399.8,3409.15,3382.0,3391.88 +3391.92,3394.59,3366.0,3388.88 +3388.88,3395.71,3384.22,3395.71 +3395.71,3425.0,3395.7,3425.0 +3425.0,3455.18,3424.99,3437.67 +3437.67,3478.8,3433.06,3462.88 +3462.88,3466.67,3413.0,3420.0 +3420.0,3453.35,3414.11,3447.21 +3447.21,3478.85,3431.31,3478.85 +3478.85,3489.0,3469.81,3483.24 +3483.24,3483.24,3420.87,3444.54 +3445.38,3447.43,3408.33,3410.0 +3410.0,3461.45,3409.99,3461.43 +3461.44,3461.44,3437.0,3441.58 +3441.58,3441.58,3368.0,3399.85 +3398.47,3399.89,3369.0,3387.89 +3387.89,3401.0,3375.0,3375.0 +3375.01,3379.77,3349.91,3371.88 +3371.88,3395.0,3371.87,3391.33 +3391.33,3447.0,3367.95,3444.0 +3444.0,3447.0,3395.0,3440.19 +3440.2,3459.8,3440.19,3450.09 +3450.09,3450.93,3406.5,3434.64 +3434.64,3459.94,3432.15,3447.44 +3447.44,3461.97,3414.0,3425.16 +3425.16,3428.29,3380.0,3398.29 +3398.3,3410.0,3359.99,3371.35 +3371.35,3409.29,3350.0,3402.93 +3402.52,3410.0,3370.01,3384.22 +3384.0,3395.93,3354.0,3358.08 +3359.79,3386.44,3358.48,3386.44 +3387.0,3404.27,3387.0,3403.46 +3403.46,3410.0,3385.02,3409.98 +3409.98,3409.98,3377.0,3383.86 +3383.0,3383.01,3350.02,3350.02 +3350.03,3350.03,3260.0,3311.0 +3311.0,3318.99,3257.13,3318.99 +3318.99,3326.93,3288.0,3312.67 +3311.38,3313.05,3270.0,3270.49 +3270.61,3275.11,3232.62,3275.0 +3271.08,3297.8,3269.28,3284.15 +3284.15,3318.19,3276.07,3309.73 +3309.73,3324.12,3303.0,3322.01 +3322.01,3322.01,3313.23,3320.49 +3320.48,3336.6,3315.27,3336.08 +3336.09,3375.0,3336.09,3359.99 +3359.68,3360.0,3351.08,3353.78 +3353.79,3359.84,3300.01,3316.01 +3316.0,3359.85,3315.01,3348.14 +3348.14,3352.89,3329.28,3344.26 +3346.64,3359.86,3345.01,3354.81 +3354.81,3354.81,3331.65,3337.54 +3337.54,3337.54,3317.0,3327.22 +3327.22,3341.03,3325.07,3340.89 +3340.89,3371.94,3336.01,3366.87 +3366.87,3370.0,3361.29,3365.0 +3365.0,3394.93,3364.99,3394.93 +3394.93,3402.03,3383.28,3402.03 +3402.03,3423.0,3402.03,3411.62 +3410.13,3410.8,3389.02,3397.88 +3397.88,3412.67,3397.5,3399.46 +3399.39,3399.48,3387.0,3398.0 +3398.0,3413.76,3393.2,3412.7 +3412.7,3446.99,3412.7,3445.55 +3445.56,3446.0,3430.0,3443.09 +3443.02,3445.91,3425.41,3426.82 +3426.81,3427.44,3411.99,3421.01 +3421.01,3421.74,3402.6,3415.01 +3415.4,3426.4,3402.18,3405.56 +3405.55,3428.3,3401.5,3424.99 +3424.99,3441.1,3424.49,3427.91 +3427.91,3441.13,3408.0,3441.13 +3441.13,3448.39,3433.1,3448.18 +3448.17,3448.18,3423.99,3430.0 +3430.0,3439.68,3416.86,3436.01 +3436.01,3450.0,3436.0,3449.19 +3446.68,3453.1,3440.01,3450.47 +3450.47,3456.0,3450.0,3456.0 +3455.99,3490.0,3455.99,3488.09 +3488.09,3488.87,3467.95,3475.73 +3475.73,3498.0,3474.17,3488.15 +3489.82,3498.0,3481.53,3497.97 +3497.97,3499.0,3493.65,3498.97 +3498.94,3498.95,3485.42,3488.96 +3488.96,3516.47,3488.96,3509.04 +3509.04,3550.0,3505.95,3550.0 +3550.0,3552.5,3528.01,3552.07 +3552.07,3555.0,3537.0,3543.78 +3542.36,3551.28,3542.17,3545.62 +3545.62,3546.74,3525.0,3526.01 +3526.01,3542.3,3519.26,3541.98 +3541.98,3543.89,3538.0,3543.01 +3543.01,3545.0,3531.54,3545.0 +3545.0,3585.77,3544.99,3585.05 +3585.05,3642.81,3585.05,3602.84 +3602.84,3719.99,3602.84,3719.73 +3719.72,3725.0,3641.55,3662.13 +3666.52,3687.86,3650.0,3659.78 +3660.57,3660.59,3622.87,3626.31 +3626.31,3656.66,3625.36,3650.23 +3650.23,3675.0,3649.2,3674.86 +3674.85,3736.0,3674.8,3725.17 +3725.17,3727.8,3700.11,3727.07 +3727.07,3796.64,3727.0,3787.86 +3787.86,3829.0,3750.0,3803.3 +3803.3,3803.3,3746.1,3789.0 +3786.98,3828.5,3766.83,3820.01 +3820.01,3839.49,3801.99,3802.89 +3802.88,3840.61,3802.88,3835.0 +3835.0,3835.01,3774.26,3796.99 +3797.0,3802.29,3786.06,3800.0 +3800.0,3819.5,3797.01,3819.5 +3819.5,3899.0,3819.49,3875.01 +3875.01,3974.0,3850.0,3881.2 +3881.2,3916.9,3831.0,3861.01 +3861.01,3934.36,3860.2,3896.52 +3896.52,3910.0,3875.01,3884.89 +3884.89,3885.62,3736.03,3818.55 +3819.0,3845.0,3776.24,3829.15 +3829.15,3851.8,3809.89,3844.27 +3844.28,3892.17,3831.98,3884.03 +3884.79,3975.0,3884.79,3975.0 +3975.0,4080.0,3946.72,3981.18 +3983.0,4117.87,3980.0,4115.67 +4115.67,4126.7,4028.0,4053.23 +4053.24,4096.0,3975.31,3991.02 +3991.02,4037.22,3942.31,4029.55 +4029.55,4172.01,4029.55,4136.9 +4136.9,4185.0,4120.0,4185.0 +4185.0,4200.0,4108.19,4196.99 +4196.99,4199.99,4072.98,4094.13 +4098.34,4120.0,4005.0,4080.26 +4080.26,4108.67,3946.21,3976.0 +3979.85,3989.0,3850.0,3859.01 +3863.95,4020.0,3863.27,3986.0 +3987.06,3996.87,3950.02,3981.97 +3983.02,4060.0,3976.37,4017.09 +4017.09,4094.99,4017.09,4058.11 +4058.11,4070.0,3980.93,4033.99 +4032.89,4075.46,4005.38,4052.57 +4052.28,4052.28,3962.07,4000.0 +4000.0,4040.02,3999.41,4027.46 +4027.46,4125.78,4018.04,4104.57 +4104.57,4125.76,4070.01,4074.99 +4074.99,4084.9,4050.01,4084.9 +4084.9,4113.88,4062.03,4088.97 +4088.96,4099.98,4075.0,4091.96 +4091.97,4099.99,4060.0,4076.95 +4076.95,4076.95,3985.01,4015.68 +4015.68,4049.96,4015.21,4036.29 +4037.09,4059.2,4024.58,4036.17 +4036.17,4082.06,4036.15,4082.06 +4082.06,4094.34,4070.03,4082.0 +4082.0,4142.7,4082.0,4137.64 +4137.64,4215.0,4133.5,4215.0 +4215.0,4216.0,4156.04,4198.04 +4198.04,4207.9,4131.04,4148.06 +4149.12,4209.0,4149.12,4194.26 +4200.3,4275.0,4199.01,4258.41 +4258.41,4297.41,4245.0,4266.0 +4266.0,4309.97,4200.0,4239.56 +4238.48,4299.99,4235.0,4299.99 +4299.99,4328.0,4257.0,4302.23 +4302.23,4302.23,4268.01,4268.01 +4268.01,4271.19,4216.03,4232.7 +4232.7,4272.0,4232.69,4272.0 +4272.0,4291.0,4267.77,4276.0 +4276.0,4276.0,4205.01,4255.01 +4255.01,4328.99,4250.86,4328.99 +4328.99,4369.69,4322.26,4354.89 +4354.89,4389.43,4325.62,4389.43 +4389.43,4420.0,4363.05,4394.7 +4394.7,4434.42,4384.78,4401.71 +4401.71,4428.44,4344.01,4382.49 +4382.49,4391.66,4362.0,4362.01 +4362.01,4362.01,4203.04,4264.88 +4264.88,4315.0,4235.61,4314.99 +4314.98,4333.97,4210.0,4211.09 +4211.09,4258.59,4068.36,4109.36 +4111.16,4123.61,3944.65,4068.01 +4068.01,4160.52,4014.38,4084.78 +4083.4,4108.22,4032.68,4085.48 +4085.48,4086.99,3894.32,3900.87 +3902.09,3955.0,3807.14,3902.67 +3902.86,4054.97,3901.03,3999.99 +4000.0,4099.5,3999.13,4098.22 +4099.5,4152.0,4057.56,4150.01 +4150.96,4182.69,4035.49,4087.73 +4087.78,4104.98,4036.78,4049.19 +4049.19,4074.86,3985.0,4072.3 +4072.3,4175.0,4057.6,4174.99 +4174.99,4212.0,4150.0,4185.0 +4184.01,4187.98,4142.08,4184.99 +4185.0,4200.36,4115.02,4115.05 +4115.05,4167.49,4056.87,4145.0 +4145.0,4152.06,4029.35,4066.82 +4066.82,4094.98,4052.06,4070.0 +4070.02,4072.81,4033.97,4049.01 +4049.01,4049.01,3943.51,3950.54 +3950.53,4086.0,3928.82,4085.99 +4086.0,4114.9,4059.16,4092.01 +4092.01,4169.95,4053.3,4154.89 +4154.9,4160.75,4117.89,4155.0 +4155.0,4155.0,4066.37,4090.03 +4090.03,4102.4,4061.71,4072.09 +4072.07,4131.59,4040.01,4112.86 +4112.9,4130.38,4102.48,4123.98 +4123.98,4149.0,4099.26,4149.0 +4149.0,4370.0,4148.99,4340.01 +4340.01,4373.99,4275.0,4296.66 +4296.98,4320.0,4272.77,4290.52 +4290.52,4310.09,4254.0,4295.0 +4295.01,4329.01,4279.0,4329.0 +4328.99,4349.0,4310.01,4347.01 +4347.01,4349.98,4289.96,4289.96 +4289.97,4327.0,4282.98,4321.8 +4321.8,4385.5,4320.54,4378.77 +4378.77,4397.0,4334.02,4353.77 +4353.76,4374.05,4305.6,4316.0 +4316.0,4336.99,4302.84,4320.41 +4320.3,4320.3,4232.44,4257.51 +4257.51,4320.0,4238.01,4319.96 +4319.96,4325.88,4273.32,4316.53 +4316.28,4326.97,4300.0,4316.83 +4317.99,4344.13,4286.0,4344.13 +4344.13,4360.0,4338.7,4354.01 +4354.01,4440.0,4354.01,4428.0 +4428.01,4458.81,4415.67,4448.05 +4448.05,4469.0,4411.3,4430.62 +4433.0,4435.0,4405.52,4430.09 +4431.57,4467.99,4425.0,4453.27 +4453.27,4469.0,4437.65,4451.08 +4451.92,4457.01,4301.0,4301.01 +4301.0,4350.0,4254.1,4319.99 +4319.99,4350.96,4227.74,4227.77 +4227.77,4288.0,4180.0,4228.71 +4228.71,4319.99,4228.1,4283.01 +4283.0,4336.0,4246.93,4329.9 +4329.75,4360.32,4313.16,4327.0 +4326.99,4339.02,4295.01,4325.94 +4325.99,4342.25,4275.01,4284.53 +4284.53,4322.14,4255.0,4260.02 +4260.02,4260.54,4200.35,4253.33 +4253.32,4288.14,4250.0,4288.1 +4288.13,4297.0,4251.06,4258.06 +4258.56,4290.0,4240.79,4281.99 +4281.99,4319.0,4280.92,4312.14 +4312.14,4312.14,4266.08,4266.71 +4266.71,4304.28,4265.03,4301.99 +4302.0,4304.5,4259.99,4284.34 +4284.34,4305.0,4284.33,4305.0 +4305.0,4350.0,4304.99,4339.45 +4339.16,4345.42,4306.88,4330.0 +4330.0,4341.0,4293.79,4310.0 +4310.0,4310.0,4260.84,4270.0 +4270.0,4277.01,4227.97,4240.01 +4240.01,4249.5,4211.92,4240.8 +4240.8,4271.91,4228.6,4228.6 +4228.62,4244.99,4130.05,4182.0 +4182.01,4183.41,4077.4,4077.41 +4078.01,4121.69,4025.0,4091.01 +4091.0,4091.47,3960.47,3990.01 +3989.84,4092.68,3974.7,4087.15 +4087.16,4142.19,4068.0,4105.73 +4105.97,4111.14,4085.22,4110.35 +4110.35,4178.86,4106.97,4174.95 +4174.99,4183.39,4140.0,4140.0 +4139.95,4175.68,4137.58,4173.6 +4173.6,4173.9,4118.49,4147.72 +4147.72,4149.99,4112.01,4127.05 +4127.04,4127.05,4062.62,4087.01 +4087.01,4097.0,4000.0,4022.92 +4022.89,4091.26,4002.01,4091.0 +4091.01,4091.01,4029.0,4063.58 +4063.58,4122.0,4030.59,4096.9 +4096.9,4096.9,4029.0,4036.49 +4036.49,4042.88,4001.07,4042.51 +4034.01,4150.0,4008.26,4121.61 +4121.6,4138.34,4078.75,4078.76 +4078.76,4100.0,4068.35,4082.86 +4079.64,4088.72,4011.07,4071.0 +4071.01,4071.01,4015.0,4046.05 +4046.05,4081.95,4040.02,4078.52 +4078.53,4099.75,4078.52,4099.74 +4099.75,4100.0,4076.89,4100.0 +4100.0,4137.26,4086.22,4137.24 +4137.25,4154.8,4125.1,4125.32 +4125.32,4171.0,4125.31,4156.0 +4156.0,4186.1,4143.61,4143.62 +4143.62,4143.62,4072.0,4079.77 +4079.83,4100.43,4048.94,4100.43 +4104.01,4118.0,4090.03,4117.97 +4117.97,4118.41,4078.48,4099.01 +4099.01,4101.6,4096.57,4100.0 +4100.0,4124.99,4095.15,4098.0 +4100.0,4107.05,4092.36,4098.5 +4098.5,4137.99,4096.24,4135.0 +4135.0,4137.95,4125.34,4128.0 +4128.0,4128.0,4089.0,4120.0 +4120.0,4127.46,4085.99,4087.73 +4087.73,4091.65,4052.3,4085.55 +4085.55,4115.0,4074.92,4113.65 +4113.65,4113.65,4065.45,4082.81 +4080.76,4097.0,4070.8,4090.45 +4090.4,4101.5,4071.47,4100.0 +4101.13,4102.0,4080.0,4094.0 +4096.99,4114.28,4092.36,4105.57 +4103.6,4149.4,4097.33,4148.99 +4148.99,4190.21,4132.35,4132.36 +4132.36,4140.85,4110.51,4134.72 +4134.5,4148.0,4112.89,4147.99 +4148.0,4148.0,4130.64,4137.36 +4135.62,4135.62,4044.52,4069.32 +4069.31,4089.99,4069.31,4088.92 +4088.93,4089.57,4070.0,4081.26 +4081.24,4081.25,4045.0,4065.01 +4065.01,4069.28,4050.0,4065.98 +4065.98,4082.57,4051.14,4068.91 +4068.91,4069.53,3999.0,4012.85 +4012.87,4012.99,3950.88,3992.93 +3992.93,4021.33,3992.92,4019.23 +4019.24,4066.45,4010.51,4061.49 +4060.55,4074.99,4040.68,4050.19 +4050.19,4074.79,4050.18,4067.61 +4067.61,4070.61,4024.25,4033.3 +4034.06,4043.89,4025.97,4034.97 +4035.38,4036.05,3990.0,3990.0 +3989.01,4034.73,3972.24,4031.98 +4031.98,4032.73,3995.84,4002.95 +4002.88,4019.72,3995.0,4005.45 +4005.45,4009.99,3990.0,3996.67 +3996.67,4019.19,3980.0,4019.19 +4019.19,4020.0,4005.95,4015.85 +4014.55,4018.37,3994.89,3999.89 +3999.89,4048.9,3995.78,4009.24 +4009.25,4025.0,4006.08,4010.0 +4010.01,4010.01,3985.1,3990.01 +3990.01,3999.16,3875.02,3912.85 +3912.85,3914.0,3820.0,3856.19 +3856.18,3907.78,3856.18,3886.97 +3886.97,3894.5,3813.0,3813.0 +3813.01,3813.01,3583.46,3685.16 +3674.96,3835.36,3674.96,3833.0 +3833.0,3856.0,3765.01,3813.98 +3813.01,3828.0,3790.0,3828.0 +3828.0,3834.99,3812.0,3834.99 +3834.99,3960.62,3834.98,3917.78 +3917.78,3939.47,3900.0,3924.68 +3924.66,3936.72,3902.39,3936.09 +3936.09,4000.0,3930.93,3975.12 +3975.11,3975.12,3910.0,3917.99 +3917.99,3919.0,3867.78,3918.99 +3918.99,3934.1,3905.0,3910.0 +3910.0,3973.19,3898.37,3973.19 +3973.19,4014.98,3954.66,4013.0 +4013.0,4145.0,4013.0,4108.74 +4109.98,4141.0,4088.21,4096.16 +4096.17,4111.0,4057.36,4074.7 +4074.7,4101.0,4071.0,4100.01 +4100.01,4100.01,4021.59,4030.42 +4030.42,4099.91,4022.21,4084.48 +4083.68,4086.12,4070.0,4074.59 +4074.59,4125.11,4074.59,4110.54 +4110.54,4139.99,4058.26,4094.18 +4094.18,4126.0,4094.18,4096.5 +4096.51,4112.0,4080.0,4096.01 +4096.01,4101.97,4075.99,4085.01 +4085.01,4112.27,4083.05,4106.0 +4106.09,4117.0,4096.0,4116.37 +4116.37,4199.95,4108.0,4199.94 +4199.95,4244.96,4193.51,4244.96 +4244.76,4244.99,4206.59,4219.04 +4215.13,4235.0,4198.89,4235.0 +4235.0,4247.88,4205.53,4213.01 +4213.02,4213.02,4180.01,4202.87 +4202.87,4202.87,4179.38,4185.13 +4185.11,4210.0,4182.36,4209.01 +4209.01,4243.95,4209.0,4221.44 +4221.44,4221.44,4168.0,4187.8 +4187.8,4187.8,4160.04,4162.0 +4162.0,4162.0,4100.0,4100.23 +4100.23,4137.82,4080.0,4137.81 +4137.02,4142.35,4090.15,4097.7 +4097.69,4145.0,4095.0,4141.97 +4141.97,4158.99,4138.0,4157.29 +4157.0,4159.0,4132.37,4136.76 +4136.76,4218.0,4134.9,4174.82 +4176.82,4188.98,4145.59,4149.91 +4149.91,4157.08,4112.76,4131.0 +4131.0,4143.29,4121.01,4134.62 +4134.62,4160.97,4134.62,4160.1 +4160.1,4172.0,4156.99,4168.23 +4169.48,4190.0,4164.74,4186.49 +4186.45,4212.06,4185.95,4212.06 +4212.06,4213.0,4178.0,4178.01 +4178.01,4191.62,4164.37,4191.6 +4191.6,4195.0,4171.06,4183.13 +4184.76,4184.89,4150.0,4167.34 +4167.34,4196.48,4166.81,4196.48 +4196.48,4244.0,4193.99,4237.01 +4237.02,4237.02,4216.37,4234.41 +4234.41,4242.73,4217.0,4218.56 +4218.56,4218.56,4198.66,4198.66 +4200.5,4230.0,4186.05,4226.03 +4226.03,4231.0,4214.85,4226.87 +4226.86,4237.77,4220.08,4223.21 +4223.21,4239.4,4223.0,4238.41 +4238.41,4334.95,4234.22,4334.95 +4334.95,4349.99,4311.43,4322.0 +4322.0,4368.16,4320.01,4368.0 +4368.0,4368.99,4335.77,4350.21 +4350.27,4361.0,4330.33,4330.5 +4330.5,4350.0,4312.5,4348.49 +4348.49,4354.97,4314.65,4315.64 +4315.64,4329.89,4300.1,4312.7 +4312.71,4330.0,4302.0,4329.99 +4330.0,4348.49,4329.99,4345.03 +4344.35,4354.22,4314.54,4354.21 +4354.22,4361.28,4354.21,4360.01 +4360.01,4360.99,4342.99,4350.01 +4350.01,4355.62,4331.88,4350.0 +4350.0,4350.08,4337.19,4350.06 +4350.06,4350.71,4345.32,4350.71 +4350.71,4390.0,4350.71,4389.99 +4390.0,4449.99,4389.99,4432.0 +4432.0,4453.9,4430.0,4451.26 +4451.25,4451.26,4405.01,4430.0 +4429.99,4441.0,4425.0,4434.51 +4434.51,4435.83,4284.01,4309.75 +4309.75,4345.02,4295.0,4322.59 +4322.59,4360.0,4322.59,4327.98 +4327.98,4376.09,4327.98,4371.48 +4371.48,4371.48,4330.16,4364.95 +4364.95,4374.39,4361.43,4363.13 +4363.13,4363.13,4324.2,4329.01 +4329.01,4329.01,4260.01,4280.41 +4280.41,4319.76,4280.4,4310.0 +4310.0,4325.1,4307.0,4307.02 +4307.01,4321.2,4290.2,4315.0 +4315.0,4324.01,4313.87,4320.4 +4320.4,4350.0,4315.0,4342.03 +4342.03,4344.0,4327.77,4328.09 +4328.09,4328.1,4283.16,4308.65 +4308.65,4320.0,4305.69,4319.52 +4319.51,4319.99,4310.0,4310.01 +4310.01,4310.01,4265.0,4278.6 +4278.59,4296.84,4276.77,4281.69 +4281.69,4289.5,4275.0,4288.01 +4288.01,4299.89,4288.0,4294.59 +4295.29,4309.49,4290.63,4306.27 +4306.27,4307.95,4293.1,4302.29 +4302.29,4350.0,4295.59,4349.99 +4349.99,4353.0,4330.2,4337.64 +4337.64,4349.99,4334.26,4349.81 +4349.81,4349.81,4333.8,4335.0 +4335.0,4346.03,4331.85,4341.43 +4341.43,4349.84,4336.3,4343.12 +4343.12,4349.0,4335.75,4343.35 +4343.21,4392.0,4339.83,4384.27 +4383.63,4384.25,4354.0,4359.44 +4359.42,4359.46,4320.84,4345.39 +4345.39,4345.39,4320.0,4320.0 +4320.01,4336.97,4309.87,4334.59 +4334.59,4356.51,4334.59,4348.04 +4347.62,4352.26,4337.97,4342.4 +4342.4,4342.4,4320.99,4322.97 +4323.05,4339.21,4315.0,4315.74 +4316.59,4323.73,4315.02,4317.81 +4317.81,4344.0,4315.24,4334.5 +4334.5,4339.4,4315.0,4319.06 +4319.52,4338.09,4318.5,4325.56 +4325.56,4343.53,4325.28,4343.53 +4343.99,4349.12,4343.0,4345.76 +4345.76,4354.94,4340.22,4354.92 +4354.93,4356.55,4347.46,4356.55 +4356.55,4361.99,4345.0,4359.81 +4359.81,4370.0,4347.6,4369.99 +4370.0,4376.0,4355.0,4361.4 +4361.41,4370.0,4361.17,4365.01 +4365.01,4365.02,4352.33,4356.36 +4356.36,4357.0,4325.0,4325.0 +4325.01,4333.01,4301.37,4310.84 +4310.84,4319.96,4303.04,4310.0 +4310.0,4316.99,4308.63,4312.84 +4312.84,4316.11,4249.99,4265.0 +4265.0,4265.0,4200.0,4261.72 +4261.72,4261.72,4229.99,4247.0 +4247.0,4266.55,4246.99,4266.31 +4266.31,4306.0,4265.14,4304.03 +4304.03,4304.04,4292.0,4292.01 +4292.01,4305.69,4282.0,4301.62 +4301.6,4315.0,4295.23,4313.95 +4313.95,4319.99,4310.0,4314.2 +4314.2,4316.22,4291.05,4296.64 +4296.64,4324.0,4296.64,4318.8 +4318.8,4318.87,4303.75,4311.98 +4311.98,4311.99,4285.0,4299.95 +4299.95,4325.0,4299.01,4325.0 +4325.0,4348.99,4324.99,4340.08 +4340.08,4345.0,4327.89,4344.99 +4344.99,4344.99,4335.94,4341.55 +4341.55,4347.81,4332.58,4346.66 +4346.99,4396.0,4343.05,4395.99 +4395.99,4395.99,4358.5,4370.54 +4370.54,4389.79,4366.78,4385.9 +4385.9,4385.9,4363.04,4371.46 +4371.46,4384.44,4370.17,4378.23 +4378.08,4378.08,4352.61,4377.49 +4377.49,4399.0,4377.48,4384.95 +4384.95,4392.0,4378.45,4389.48 +4389.48,4390.0,4370.32,4370.33 +4370.33,4371.95,4370.32,4370.99 +4370.98,4370.98,4350.0,4360.62 +4360.62,4370.0,4358.72,4365.4 +4365.4,4366.69,4350.0,4355.29 +4355.27,4370.0,4350.0,4369.38 +4369.38,4396.93,4366.0,4386.0 +4385.99,4447.55,4368.82,4447.55 +4447.55,4649.85,4420.78,4570.96 +4570.96,4595.06,4555.01,4568.39 +4568.39,4615.0,4558.48,4580.0 +4580.0,4584.97,4540.0,4551.84 +4551.83,4559.99,4534.0,4559.99 +4559.99,4580.46,4558.47,4567.61 +4567.61,4594.0,4567.61,4593.98 +4593.97,4614.57,4588.63,4603.99 +4603.93,4643.92,4591.0,4593.02 +4592.91,4602.62,4586.96,4602.62 +4603.3,4611.49,4572.84,4576.85 +4576.84,4604.64,4576.5,4604.64 +4604.64,4632.09,4602.81,4619.2 +4619.2,4619.99,4597.0,4605.4 +4605.4,4614.1,4600.99,4608.16 +4608.16,4635.21,4597.77,4615.02 +4615.02,4628.49,4602.05,4621.31 +4621.31,4632.89,4615.01,4617.02 +4617.02,4617.02,4575.0,4579.29 +4579.29,4598.67,4579.28,4586.88 +4586.88,4587.27,4504.88,4514.99 +4514.43,4546.21,4500.55,4530.75 +4530.75,4564.33,4530.74,4552.59 +4552.59,4575.47,4550.0,4575.47 +4575.47,4575.47,4575.0,4575.01 +4575.01,4575.01,4551.72,4552.94 +4554.63,4574.45,4547.3,4574.44 +4574.0,4587.99,4574.0,4587.9 +4587.9,4587.99,4587.0,4587.99 +4587.99,4591.0,4574.9,4577.01 +4577.01,4577.01,4545.0,4546.76 +4546.59,4577.24,4545.0,4577.24 +4577.24,4580.88,4550.0,4580.88 +4580.88,4580.88,4570.0,4580.87 +4580.87,4591.0,4580.85,4586.31 +4586.36,4614.53,4582.14,4611.69 +4611.69,4629.16,4605.0,4606.97 +4606.97,4628.09,4600.0,4628.09 +4628.09,4635.21,4627.18,4630.7 +4630.87,4637.4,4629.05,4632.42 +4632.42,4638.0,4631.13,4638.0 +4638.0,4638.99,4610.26,4616.31 +4616.31,4634.99,4616.3,4634.99 +4634.99,4634.99,4616.65,4624.69 +4624.68,4631.96,4610.0,4631.96 +4631.96,4679.37,4631.95,4668.0 +4668.0,4706.0,4667.99,4706.0 +4706.0,4711.29,4682.49,4697.51 +4697.51,4729.98,4695.89,4725.46 +4725.46,4728.82,4686.02,4686.02 +4687.39,4735.0,4680.5,4734.99 +4735.0,4744.02,4729.37,4736.07 +4736.07,4739.37,4731.97,4738.11 +4739.37,4769.03,4735.1,4769.02 +4769.02,4769.02,4718.18,4725.09 +4725.09,4743.99,4725.09,4743.98 +4743.99,4743.99,4740.34,4740.35 +4740.35,4743.7,4740.34,4743.7 +4743.7,4744.45,4740.51,4744.16 +4744.16,4766.0,4744.0,4766.0 +4766.0,4781.96,4763.0,4763.01 +4763.01,4769.99,4760.04,4766.48 +4766.48,4773.5,4751.73,4755.49 +4755.49,4755.49,4715.79,4733.75 +4733.75,4746.34,4712.0,4712.01 +4712.01,4733.78,4706.0,4733.78 +4733.78,4755.45,4733.77,4755.45 +4755.46,4789.0,4755.45,4789.0 +4789.0,4795.25,4789.0,4794.99 +4794.98,4800.0,4771.96,4780.39 +4780.39,4822.0,4780.39,4822.0 +4821.99,4867.27,4821.0,4859.99 +4859.99,4874.99,4814.2,4814.3 +4814.3,4822.49,4790.0,4822.49 +4822.49,4839.95,4815.0,4839.88 +4839.88,4840.0,4830.0,4834.98 +4834.98,4844.99,4834.97,4844.32 +4844.32,4845.88,4835.56,4836.52 +4836.52,4890.0,4830.0,4889.99 +4889.99,4920.0,4853.37,4875.58 +4875.58,4887.59,4842.0,4875.46 +4875.46,4900.0,4875.45,4900.0 +4900.0,4950.0,4900.0,4950.0 +4950.0,4962.0,4929.07,4939.99 +4939.99,4974.81,4930.0,4966.68 +4966.68,4980.0,4885.14,4925.4 +4925.4,4925.4,4823.93,4861.02 +4861.02,4880.51,4829.93,4829.93 +4829.92,4829.93,4551.08,4683.01 +4683.01,4783.85,4630.18,4783.85 +4783.85,4824.51,4733.37,4765.02 +4765.02,4765.02,4672.89,4749.2 +4749.21,4749.21,4635.0,4712.31 +4710.82,4759.34,4650.0,4753.81 +4753.8,4764.79,4750.01,4758.48 +4758.48,4767.4,4651.01,4709.5 +4709.5,4723.91,4685.16,4691.01 +4691.01,4691.02,4500.0,4595.01 +4595.01,4650.94,4520.0,4648.56 +4649.94,4673.0,4610.0,4643.93 +4643.92,4690.0,4620.0,4658.43 +4658.42,4674.96,4615.0,4615.78 +4617.23,4660.0,4600.0,4621.54 +4622.16,4622.2,4551.51,4596.99 +4597.0,4610.91,4520.0,4569.98 +4569.97,4600.0,4550.01,4558.93 +4558.93,4674.95,4550.0,4674.93 +4674.91,4734.01,4654.32,4697.08 +4695.0,4749.99,4685.05,4699.94 +4699.93,4735.0,4670.82,4682.01 +4682.0,4718.04,4650.0,4706.33 +4708.33,4728.48,4683.86,4715.99 +4715.98,4742.87,4703.08,4729.98 +4729.98,4742.8,4650.07,4669.97 +4669.96,4690.0,4655.02,4676.96 +4676.95,4713.94,4668.34,4706.6 +4706.6,4706.6,4609.78,4638.34 +4638.34,4650.37,4625.0,4642.97 +4642.95,4657.73,4604.02,4635.14 +4635.15,4676.29,4611.0,4669.99 +4669.99,4669.99,4524.0,4564.01 +4568.97,4586.22,4526.0,4546.65 +4546.65,4612.37,4546.02,4610.42 +4612.32,4634.99,4610.3,4628.92 +4628.92,4650.09,4612.18,4619.95 +4619.95,4619.95,4555.01,4570.01 +4570.01,4620.0,4560.0,4596.0 +4596.0,4596.0,4569.65,4569.65 +4569.66,4609.99,4560.0,4609.99 +4609.99,4616.41,4600.0,4616.41 +4616.41,4650.0,4614.51,4627.85 +4627.85,4627.85,4585.24,4587.96 +4587.96,4591.4,4565.0,4571.9 +4571.9,4589.0,4571.9,4586.53 +4586.53,4586.53,4566.8,4579.99 +4579.99,4589.0,4570.02,4577.02 +4577.02,4588.98,4563.24,4570.89 +4570.89,4579.83,4559.14,4579.01 +4579.01,4579.01,4460.05,4479.99 +4478.42,4480.0,4370.05,4402.94 +4404.02,4501.21,4373.83,4481.43 +4483.57,4535.79,4461.83,4461.83 +4461.83,4495.62,4372.3,4399.99 +4399.91,4503.46,4357.0,4439.0 +4437.99,4541.1,4410.11,4480.88 +4480.87,4490.0,4300.0,4359.36 +4356.05,4372.24,4250.0,4349.97 +4348.42,4401.88,4298.15,4354.96 +4354.91,4359.0,4234.16,4296.99 +4291.98,4430.81,4274.78,4427.01 +4427.04,4555.0,4425.2,4480.0 +4480.0,4547.93,4430.0,4496.0 +4496.0,4581.84,4480.01,4552.79 +4552.79,4571.97,4471.01,4484.36 +4484.36,4511.99,4451.06,4455.96 +4455.96,4466.08,4378.4,4425.8 +4432.54,4448.0,4242.38,4269.99 +4269.99,4379.99,4269.98,4337.56 +4332.55,4352.0,4277.24,4297.25 +4294.19,4346.99,4243.44,4317.0 +4312.12,4326.75,4258.74,4278.93 +4278.93,4364.78,4250.04,4364.77 +4364.77,4431.0,4359.49,4429.04 +4428.55,4448.59,4356.87,4377.0 +4377.0,4405.5,4328.19,4366.0 +4365.99,4405.5,4352.71,4382.33 +4382.33,4455.0,4381.58,4454.99 +4454.99,4474.0,4388.47,4390.72 +4390.72,4458.97,4390.72,4427.08 +4435.97,4435.97,4369.0,4369.0 +4369.01,4399.74,4302.06,4312.0 +4312.0,4398.01,4303.61,4388.0 +4388.01,4439.0,4371.93,4394.66 +4394.66,4439.99,4387.85,4435.9 +4435.9,4503.2,4435.43,4468.11 +4468.11,4490.0,4445.0,4457.04 +4457.04,4457.21,4420.0,4448.96 +4448.97,4493.9,4436.43,4492.06 +4492.06,4514.95,4432.12,4434.7 +4434.7,4488.48,4434.51,4488.38 +4488.38,4525.76,4485.0,4525.6 +4525.6,4530.0,4489.53,4497.06 +4497.06,4529.48,4497.06,4516.0 +4516.0,4521.84,4431.0,4473.88 +4473.88,4494.9,4438.8,4487.04 +4487.04,4533.0,4465.0,4512.48 +4512.48,4595.98,4512.48,4595.98 +4595.98,4670.0,4575.68,4669.39 +4669.38,4692.0,4627.2,4659.01 +4659.01,4678.99,4632.03,4641.95 +4641.95,4686.27,4636.82,4679.98 +4679.98,4679.99,4624.0,4661.52 +4661.64,4661.64,4595.01,4599.96 +4599.96,4609.51,4598.0,4609.4 +4609.4,4674.9,4606.79,4672.92 +4670.0,4673.98,4603.77,4608.0 +4608.0,4656.0,4608.0,4655.99 +4655.01,4655.99,4613.71,4635.75 +4635.75,4642.71,4590.08,4620.51 +4620.51,4620.51,4549.85,4550.01 +4550.01,4594.03,4543.65,4589.83 +4589.83,4629.99,4561.35,4623.67 +4623.49,4623.49,4578.96,4602.04 +4602.04,4615.48,4557.13,4571.82 +4571.82,4577.96,4502.7,4511.99 +4512.0,4545.0,4502.13,4544.22 +4544.22,4559.31,4505.0,4517.78 +4517.78,4565.0,4517.77,4564.99 +4565.0,4574.99,4550.0,4550.0 +4550.01,4550.01,4512.76,4512.76 +4512.6,4514.8,4475.01,4493.2 +4493.2,4551.0,4493.2,4550.98 +4550.97,4596.2,4539.12,4596.14 +4596.13,4609.41,4580.63,4609.37 +4609.37,4628.0,4591.51,4619.91 +4619.87,4650.0,4599.0,4649.23 +4649.23,4660.0,4647.09,4660.0 +4660.0,4660.0,4640.0,4642.81 +4642.81,4656.0,4633.02,4655.99 +4655.99,4665.44,4621.3,4621.96 +4621.86,4625.0,4610.01,4624.92 +4624.92,4625.0,4601.0,4624.9 +4624.43,4624.51,4613.32,4617.0 +4617.0,4617.0,4573.93,4574.08 +4574.08,4614.32,4574.07,4614.32 +4614.32,4636.32,4614.32,4630.69 +4630.0,4636.96,4617.21,4619.84 +4619.86,4619.86,4601.0,4609.98 +4609.98,4609.99,4590.03,4609.01 +4609.01,4620.7,4605.0,4615.49 +4615.49,4620.0,4614.34,4620.0 +4620.0,4625.0,4584.97,4600.0 +4600.45,4612.0,4600.45,4611.99 +4611.71,4640.0,4611.7,4640.0 +4640.0,4645.0,4627.61,4645.0 +4645.0,4679.99,4644.99,4650.01 +4650.01,4664.98,4645.0,4659.93 +4659.93,4659.93,4630.0,4638.02 +4638.02,4643.06,4637.88,4637.89 +4637.89,4646.52,4635.71,4635.72 +4635.72,4638.93,4374.21,4374.28 +4374.29,4440.0,4260.0,4385.04 +4385.01,4451.72,4326.13,4425.48 +4425.48,4479.14,4413.13,4415.01 +4415.01,4425.55,4301.03,4360.12 +4361.19,4388.9,4315.02,4325.49 +4325.49,4348.98,4140.3,4140.42 +4140.42,4267.0,4140.0,4223.74 +4223.74,4248.44,4151.0,4247.14 +4242.0,4360.0,4240.0,4340.32 +4340.32,4398.86,4325.06,4340.0 +4340.01,4370.0,4294.7,4305.0650000000005 +4305.07,4400.0,4250.0,4270.13 +4270.13,4371.02,4253.71,4357.72 +4363.16,4372.99,4320.13,4320.22 +4320.2,4380.0,4299.45,4380.0 +4380.0,4437.13,4379.99,4420.97 +4420.97,4449.95,4420.96,4444.07 +4444.07,4444.1,4377.0,4403.99 +4404.0,4414.58,4364.01,4378.88 +4389.35,4419.0,4373.09,4418.98 +4419.0,4419.0,4390.0,4390.01 +4390.01,4395.01,4362.9,4380.39 +4380.39,4389.75,4341.85,4346.25 +4351.09,4351.4,4295.47,4311.09 +4311.09,4311.5,4270.62,4290.11 +4291.0,4309.99,4290.0,4301.0 +4301.0,4309.99,4289.01,4289.01 +4289.01,4289.01,4241.0,4257.01 +4257.01,4260.0,4180.0,4189.94 +4189.94,4309.98,4183.07,4301.0 +4301.0,4301.01,4280.06,4290.82 +4289.63,4293.0,4273.88,4280.01 +4280.01,4340.06,4280.01,4339.99 +4339.99,4350.0,4316.0,4319.98 +4319.98,4319.99,4300.47,4306.6 +4306.61,4309.98,4282.16,4288.64 +4285.55,4287.71,4238.14,4260.92 +4260.92,4274.98,4235.19,4266.54 +4266.54,4281.15,4235.0,4235.01 +4235.01,4238.62,4210.0,4213.03 +4213.02,4214.09,4150.0,4200.0 +4199.0,4235.0,4150.21,4215.73 +4213.32,4266.88,4201.0,4214.33 +4214.24,4220.0,4172.17,4199.16 +4197.01,4199.02,4150.12,4187.27 +4184.86,4260.0,4171.45,4250.0 +4250.0,4254.98,4215.15,4240.99 +4240.96,4244.24,4160.0,4169.53 +4169.53,4197.0,4139.0,4190.01 +4190.01,4197.77,4180.04,4192.18 +4192.17,4284.99,4177.64,4284.94 +4285.0,4349.99,4285.0,4336.75 +4336.75,4338.07,4301.26,4333.05 +4332.91,4332.91,4315.0,4319.01 +4320.39,4320.4,4271.22,4278.54 +4278.53,4288.21,4253.64,4273.49 +4273.49,4301.45,4273.49,4288.99 +4288.99,4289.0,4240.0,4252.01 +4252.0,4271.47,4220.0,4260.0 +4260.0,4320.99,4249.22,4314.4 +4314.4,4325.0,4301.32,4304.99 +4304.99,4365.0,4301.08,4306.13 +4305.59,4305.59,4156.0,4183.32 +4183.31,4220.98,4111.14,4137.57 +4137.56,4222.0,4133.34,4213.52 +4213.43,4213.52,4158.87,4182.15 +4182.15,4196.26,4132.13,4195.46 +4194.18,4212.0,4171.71,4177.29 +4175.71,4206.08,4174.5,4192.76 +4192.77,4204.96,4160.02,4193.81 +4193.8,4202.0,4185.0,4195.35 +4195.35,4298.0,4179.52,4265.0 +4265.6,4271.04,4236.45,4246.87 +4246.47,4246.47,4220.0,4240.0 +4240.0,4272.39,4240.0,4265.45 +4265.44,4271.24,4218.13,4225.0 +4225.0,4229.0,4205.0,4222.01 +4222.01,4222.01,4175.01,4192.81 +4192.81,4200.0,4175.0,4193.88 +4192.54,4208.59,4192.54,4208.59 +4208.59,4227.99,4208.58,4224.31 +4224.31,4224.32,4203.04,4215.99 +4216.0,4239.98,4216.0,4239.97 +4239.97,4243.95,4230.0,4232.69 +4235.0,4252.09,4220.0,4252.09 +4252.09,4293.99,4247.37,4293.36 +4293.36,4298.88,4256.0,4293.27 +4293.32,4300.0,4280.16,4299.99 +4299.99,4358.97,4299.99,4353.91 +4353.91,4375.0,4322.55,4358.92 +4358.91,4358.92,4258.36,4295.06 +4295.06,4330.0,4295.0,4318.57 +4318.57,4375.37,4289.79,4365.89 +4365.89,4365.89,4335.81,4344.49 +4344.49,4350.0,4284.88,4287.98 +4287.98,4296.36,4260.0,4277.57 +4277.57,4290.43,4261.89,4284.47 +4287.14,4293.33,4241.0,4248.5 +4248.5,4264.04,4241.38,4264.04 +4264.04,4264.99,4150.0,4169.44 +4161.1,4175.53,4080.0,4119.62 +4119.62,4174.0,4097.72,4151.97 +4152.01,4184.95,4125.0,4184.92 +4184.84,4207.89,4150.0,4184.1 +4186.2,4189.0,4151.51,4151.51 +4158.23,4177.9,4129.13,4164.52 +4164.52,4164.52,4100.02,4147.19 +4147.19,4147.19,4100.0,4100.01 +4100.01,4105.0,4015.11,4054.98 +4054.98,4059.14,3927.0,3928.01 +3928.01,4019.21,3904.0,3995.98 +3999.84,4020.99,3960.05,3995.01 +3995.01,4043.97,3981.99,4018.99 +4018.89,4022.42,3925.65,3927.93 +3927.93,3995.64,3921.0,3967.2 +3967.26,3987.14,3923.0,3935.87 +3931.86,3940.0,3850.0,3857.14 +3856.32,3858.46,3801.28,3816.0 +3815.97,3920.0,3776.37,3913.15 +3913.16,3915.83,3822.95,3832.78 +3832.78,3833.19,3726.0,3781.03 +3781.03,3874.9,3778.0,3815.01 +3815.01,3958.32,3807.62,3923.87 +3919.89,3959.99,3879.63,3894.0 +3894.01,3928.04,3851.39,3867.26 +3867.26,3883.54,3838.58,3839.11 +3840.0,3898.99,3840.0,3890.99 +3890.0,3895.0,3870.12,3894.99 +3895.0,3949.99,3894.99,3919.32 +3923.97,3927.38,3850.06,3860.9 +3860.9,3923.0,3860.9,3913.49 +3913.49,3914.99,3888.09,3911.5 +3911.5,3911.5,3854.0,3854.0 +3854.01,3854.01,3761.32,3761.33 +3761.33,3845.2,3761.32,3841.78 +3841.78,3849.99,3806.47,3813.1 +3810.33,3849.9,3808.67,3849.9 +3849.9,3896.84,3844.3,3893.73 +3893.73,3894.95,3830.0,3830.0 +3830.01,3830.58,3777.0,3788.29 +3788.29,3804.37,3700.05,3718.44 +3718.44,3718.44,3600.73,3657.89 +3651.81,3669.97,3426.0,3426.0 +3426.0,3588.15,3425.52,3509.67 +3509.68,3620.49,3474.01,3556.22 +3556.23,3590.7,3459.98,3510.0 +3509.84,3524.3,3437.0,3437.0 +3437.0,3437.01,3240.0,3250.0 +3260.37,3449.68,3245.53,3422.28 +3422.28,3490.0,3335.7,3374.99 +3374.99,3450.0,3361.0,3366.44 +3366.45,3371.09,3294.0,3294.9 +3294.9,3365.91,3280.0,3320.22 +3320.21,3320.22,3230.05,3278.68 +3284.4,3419.49,3234.98,3418.46 +3418.45,3431.0,3360.04,3401.14 +3403.86,3464.99,3375.54,3391.25 +3391.25,3399.99,3355.0,3365.36 +3365.36,3371.99,3275.0,3299.83 +3299.84,3350.0,3250.0,3350.0 +3350.0,3350.0,3130.0,3154.0 +3154.0,3157.45,3060.0,3088.27 +3088.27,3213.75,3065.01,3161.95 +3161.95,3161.95,3030.33,3050.0 +3050.0,3118.62,3022.3,3036.83 +3036.04,3075.0,2975.01,3035.0 +3035.0,3415.0,3035.0,3374.88 +3374.85,3525.0,3200.0,3508.9 +3501.28,3739.77,3499.97,3640.44 +3649.8,3894.48,3624.72,3870.1 +3871.15,3880.47,3560.53,3611.04 +3611.07,3637.64,3472.0,3596.08 +3592.48,3695.79,3570.38,3668.31 +3668.25,3799.0,3643.34,3689.99 +3689.99,3770.0,3660.0,3768.6 +3763.99,3839.46,3755.11,3820.61 +3820.61,3820.61,3700.0,3750.02 +3750.03,3750.03,3670.0,3722.66 +3722.66,3796.33,3720.82,3756.0 +3756.01,3810.0,3750.0,3810.0 +3809.99,3840.0,3766.1,3799.88 +3799.88,3826.35,3780.0,3826.34 +3826.33,3859.11,3816.0,3858.61 +3858.28,3964.64,3858.28,3913.53 +3913.51,3924.79,3813.04,3872.71 +3872.71,3945.0,3861.72,3921.73 +3925.79,3988.8,3921.25,3978.58 +3978.58,4034.0,3807.23,3853.86 +3851.44,3854.15,3675.0,3747.84 +3747.84,3868.24,3694.26,3794.96 +3794.97,3803.72,3700.0,3720.0 +3719.99,3796.98,3670.05,3755.0 +3755.0,3775.15,3705.0,3728.24 +3728.23,3759.68,3601.0,3635.99 +3631.34,3679.93,3600.0,3668.55 +3667.89,3686.84,3629.26,3686.84 +3686.83,3753.99,3686.83,3750.0 +3749.98,3749.98,3665.0,3728.15 +3728.02,3738.02,3668.77,3670.59 +3668.8,3728.97,3659.89,3718.01 +3718.01,3757.0,3718.0,3746.64 +3746.64,3750.0,3688.71,3711.0 +3710.98,3710.98,3660.0,3660.0 +3660.01,3660.01,3621.21,3626.01 +3626.01,3680.0,3621.21,3657.77 +3657.77,3657.77,3626.77,3635.01 +3635.01,3639.91,3571.05,3612.15 +3612.15,3619.17,3581.97,3583.09 +3583.1,3599.65,3551.0,3577.05 +3578.64,3584.8,3528.0,3528.01 +3528.01,3561.82,3475.64,3561.82 +3561.82,3635.41,3525.94,3622.65 +3622.65,3660.93,3568.41,3581.75 +3582.97,3618.95,3562.85,3582.31 +3582.3,3619.81,3582.28,3611.79 +3611.72,3713.99,3606.22,3713.99 +3713.99,3713.99,3644.86,3682.62 +3681.89,3720.0,3678.0,3719.82 +3719.82,3774.65,3719.82,3766.41 +3766.41,3841.0,3766.4,3841.0 +3841.0,3841.0,3760.0,3776.17 +3770.96,3807.85,3770.14,3789.58 +3789.58,3807.82,3747.02,3750.0 +3749.99,3770.06,3719.85,3760.58 +3762.04,3788.23,3741.0,3753.08 +3753.08,3756.99,3713.02,3755.77 +3754.0,3769.99,3735.0,3766.89 +3766.9,3805.19,3750.0,3792.84 +3792.84,3828.0,3789.43,3810.81 +3806.8,3813.45,3775.77,3799.69 +3799.69,3802.0,3774.41,3802.0 +3802.0,3888.88,3801.99,3877.7 +3877.7,3947.72,3859.74,3932.98 +3931.93,3984.71,3903.58,3948.7 +3949.99,3980.14,3932.47,3973.3 +3973.3,3990.0,3924.9,3943.91 +3949.13,3969.95,3884.83,3963.62 +3963.62,3988.0,3950.0,3960.92 +3960.92,4096.9,3960.91,4067.38 +4067.04,4130.0,4062.56,4094.91 +4094.91,4113.0,3986.0,4000.76 +4001.5,4066.64,4001.07,4021.01 +4021.01,4031.0,3986.24,3998.8 +3998.06,4028.21,3948.17,4019.23 +4019.23,4039.99,4001.0,4001.99 +4001.99,4032.06,3985.32,4019.42 +4019.96,4023.8,3995.0,4023.8 +4023.8,4123.11,4023.74,4122.4 +4122.4,4124.0,4057.52,4090.13 +4090.14,4110.0,4060.01,4100.01 +4100.01,4125.22,4001.21,4031.38 +4031.39,4031.39,3924.99,3964.0 +3964.0,4005.7,3938.33,3970.01 +3970.01,4015.0,3950.22,3975.01 +3975.01,3994.97,3894.53,3912.26 +3912.26,3927.55,3850.44,3923.99 +3924.0,3979.98,3889.86,3920.46 +3921.0,3958.85,3885.64,3913.78 +3914.0,3988.0,3914.0,3950.9 +3950.9,3978.99,3937.07,3976.25 +3976.25,4024.99,3970.0,4024.31 +4024.31,4024.31,3980.02,4006.34 +4006.34,4037.59,3990.46,3996.37 +3996.4,4000.0,3955.12,3960.25 +3960.06,3996.79,3951.8,3971.0 +3970.99,4022.96,3968.65,4001.03 +4001.03,4035.0,3998.74,4034.99 +4034.99,4049.0,3995.57,4007.64 +4007.45,4019.99,3981.9,3982.2 +3982.19,3982.19,3878.6,3883.54 +3883.54,3937.22,3874.29,3930.9 +3930.9,3943.04,3892.2,3900.0 +3900.01,3938.95,3891.31,3936.55 +3936.55,3941.23,3900.0,3900.01 +3900.01,3919.67,3898.66,3909.88 +3909.88,3918.59,3890.0,3911.73 +3911.73,3935.4,3893.67,3904.98 +3904.99,3905.03,3880.06,3880.06 +3880.07,3880.07,3850.03,3850.04 +3850.04,3914.59,3850.01,3890.17 +3888.19,3964.78,3875.99,3962.92 +3962.58,3965.35,3935.6,3948.94 +3948.93,3948.99,3927.0,3936.29 +3936.29,3950.87,3923.51,3927.05 +3924.86,3930.0,3900.85,3903.51 +3904.98,3925.0,3900.85,3912.26 +3912.26,3954.53,3912.26,3938.87 +3938.83,4012.0,3927.93,4000.98 +4000.98,4044.0,4000.01,4009.38 +4009.38,4009.75,3987.78,3990.0 +3990.0,4022.81,3989.0,4017.0 +4017.0,4017.0,3990.0,3991.02 +3991.02,3999.0,3972.03,3998.01 +3998.01,3998.01,3941.0,3959.89 +3959.9,3971.86,3949.2,3959.11 +3959.11,3971.88,3938.55,3960.0 +3959.99,3965.0,3945.37,3954.37 +3954.37,3955.42,3865.0,3885.01 +3885.0,3900.0,3811.0,3830.0 +3830.0,3885.52,3823.79,3877.73 +3877.73,3889.02,3870.46,3870.46 +3870.46,3870.5,3830.99,3833.35 +3833.35,3877.7,3820.0,3877.7 +3877.7,3879.9,3854.0,3879.89 +3879.9,3879.9,3861.56,3878.43 +3878.43,3903.57,3869.87,3901.54 +3902.54,3902.97,3854.29,3867.98 +3867.98,3870.4,3850.0,3860.35 +3860.35,3895.0,3859.0,3879.01 +3879.01,3879.01,3858.0,3866.82 +3866.54,3866.54,3848.79,3862.0 +3862.0,3876.94,3859.1,3867.61 +3867.61,3875.54,3771.43,3796.0 +3796.01,3796.01,3700.0,3717.01 +3717.0,3720.74,3641.93,3720.74 +3720.74,3739.43,3664.2,3675.01 +3675.01,3723.01,3675.0,3678.67 +3678.68,3678.68,3615.75,3621.05 +3621.04,3670.36,3571.0,3641.5 +3641.5,3707.88,3638.54,3676.24 +3676.24,3679.4,3622.89,3643.79 +3641.0,3645.81,3587.93,3614.14 +3614.14,3675.0,3614.13,3675.0 +3675.0,3680.0,3653.41,3655.09 +3655.09,3680.0,3631.01,3634.73 +3634.73,3707.14,3629.02,3700.26 +3703.82,3767.77,3703.81,3735.2 +3735.2,3753.47,3704.01,3735.03 +3735.03,3757.29,3718.87,3729.2 +3729.16,3729.16,3676.01,3679.02 +3679.02,3689.2,3640.0,3659.07 +3659.02,3666.0,3605.0,3605.14 +3605.14,3635.3,3590.0,3610.72 +3610.72,3624.94,3540.0,3558.0 +3558.0,3614.0,3554.17,3600.01 +3600.01,3600.01,3565.08,3577.3 +3577.31,3633.7,3577.31,3596.12 +3596.12,3610.0,3509.79,3539.01 +3540.02,3586.69,3540.01,3551.8 +3551.75,3570.67,3531.01,3563.88 +3563.88,3575.0,3550.0,3573.43 +3575.0,3595.0,3574.01,3589.99 +3589.99,3632.54,3589.99,3631.73 +3632.36,3649.52,3581.7,3646.07 +3646.15,3648.16,3605.01,3612.88 +3612.88,3640.0,3605.0,3624.57 +3624.57,3624.57,3580.0,3586.01 +3586.5,3603.1,3580.0,3603.1 +3603.1,3644.0,3598.68,3635.01 +3635.0,3635.01,3618.21,3635.01 +3635.01,3724.92,3635.0,3722.14 +3722.15,3725.39,3685.0,3700.0 +3700.0,3719.99,3700.0,3710.36 +3710.36,3710.36,3700.99,3701.1 +3701.1,3749.76,3701.09,3739.34 +3739.33,3739.89,3720.0,3725.57 +3725.57,3769.95,3725.56,3752.2 +3754.35,3818.89,3754.35,3812.65 +3810.27,3815.95,3735.55,3747.03 +3747.49,3798.93,3747.49,3798.93 +3798.93,3799.71,3766.69,3774.3 +3770.12,3773.96,3722.73,3740.99 +3740.98,3777.56,3731.0,3770.01 +3770.01,3776.11,3736.92,3760.7 +3760.7,3769.39,3748.1,3748.11 +3748.11,3779.99,3747.21,3773.08 +3773.08,3779.99,3772.0,3772.0 +3772.01,3772.01,3740.77,3746.0 +3746.0,3761.17,3746.0,3757.72 +3757.72,3789.99,3757.71,3787.86 +3787.86,3787.86,3759.0,3759.02 +3759.02,3783.79,3755.54,3768.85 +3768.01,3774.02,3760.18,3772.97 +3772.76,3786.69,3764.5,3765.23 +3764.51,3764.51,3655.0,3667.16 +3667.16,3703.25,3667.15,3699.54 +3699.54,3703.24,3630.01,3643.18 +3643.16,3662.98,3633.41,3662.82 +3662.82,3679.01,3662.31,3670.61 +3670.61,3677.44,3655.5,3663.11 +3663.2,3674.95,3645.01,3645.89 +3645.89,3688.86,3645.88,3677.01 +3677.3,3705.76,3677.3,3705.75 +3705.75,3736.0,3705.74,3728.77 +3728.69,3728.69,3699.0,3699.01 +3699.01,3720.0,3690.0,3707.71 +3707.67,3715.01,3695.61,3701.01 +3701.01,3701.01,3678.0,3678.4 +3678.4,3683.37,3656.5,3667.01 +3667.01,3692.99,3660.87,3682.81 +3682.81,3683.04,3660.09,3669.85 +3669.85,3684.88,3663.56,3670.12 +3670.12,3694.0,3667.87,3690.01 +3690.01,3690.14,3667.86,3672.98 +3672.98,3681.67,3672.98,3680.93 +3681.17,3691.98,3679.56,3689.07 +3689.07,3789.99,3689.07,3773.97 +3773.93,3782.19,3747.0,3777.9 +3777.9,3814.09,3777.89,3794.94 +3794.94,3799.99,3766.4,3774.02 +3774.02,3787.74,3760.01,3764.75 +3764.75,3776.85,3764.74,3775.13 +3775.13,3775.13,3775.13,3773.1225 +3773.1225,3775.1266666666666,3763.42,3771.115 +3771.115,3775.1233333333334,3751.71,3769.1075 +3769.1075,3775.12,3740.0,3767.1 +3767.1,3795.0,3760.0,3792.74 +3792.74,3793.0,3767.08,3777.28 +3777.28,3951.99,3777.27,3902.28 +3902.29,3950.0,3901.99,3950.0 +3950.0,3969.37,3860.0,3906.5 +3906.5,3907.9,3878.4,3886.93 +3886.93,3924.0,3886.93,3901.1 +3901.1,3930.0,3901.09,3929.24 +3929.24,3959.45,3915.79,3937.98 +3937.98,3958.51,3925.0,3957.0 +3957.0,3957.0,3913.86,3916.3 +3916.3,3929.01,3905.23,3929.01 +3929.01,3935.63,3902.57,3929.94 +3929.94,3937.99,3929.55,3937.6 +3937.6,3939.99,3927.91,3927.91 +3928.05,3928.05,3894.77,3894.84 +3894.84,3921.0,3894.83,3913.99 +3914.0,3914.43,3854.29,3865.92 +3865.92,3890.96,3865.0,3885.82 +3885.82,3924.5,3885.82,3915.51 +3915.51,3922.44,3899.98,3912.72 +3912.72,3929.0,3884.5,3927.44 +3927.44,3948.93,3927.26,3939.37 +3939.37,3950.0,3937.71,3949.99 +3950.0,3960.0,3950.0,3955.0 +3955.2,3956.95,3940.02,3944.77 +3944.77,3945.5,3926.61,3927.0 +3927.0,3935.04,3915.13,3924.92 +3924.91,3924.91,3888.0,3909.02 +3909.02,3922.91,3909.01,3914.54 +3914.54,3919.68,3910.0,3919.68 +3919.68,3919.68,3908.15,3913.86 +3913.86,3918.0,3905.0,3918.0 +3918.0,3919.98,3908.51,3912.04 +3912.04,3915.0,3888.0,3894.02 +3894.02,3896.28,3883.0,3883.01 +3883.01,3905.37,3880.36,3905.0 +3905.0,3915.0,3895.48,3898.33 +3898.33,3911.0,3898.33,3908.39 +3909.0,3946.0,3909.0,3940.0 +3940.0,3940.0,3931.01,3931.02 +3931.02,3943.78,3925.0,3943.78 +3943.78,3950.0,3930.68,3935.82 +3935.82,3946.82,3930.58,3940.0 +3940.0,3941.32,3927.74,3937.26 +3937.26,3957.01,3937.25,3957.01 +3957.01,4060.0,3957.01,4058.41 +4058.42,4080.0,4058.42,4070.97 +4070.98,4090.0,4070.97,4079.44 +4079.45,4079.45,4046.99,4055.3 +4055.3,4096.85,4055.29,4091.88 +4091.89,4092.0,4064.49,4077.08 +4077.08,4085.0,4077.07,4085.0 +4085.0,4089.93,4084.0,4089.92 +4089.92,4184.66,4089.91,4169.46 +4169.46,4185.42,4163.53,4177.61 +4177.61,4177.61,4150.0,4154.27 +4154.27,4198.14,4154.26,4198.13 +4198.13,4210.75,4180.0,4205.0 +4205.04,4228.39,4190.0,4203.04 +4203.04,4209.15,4168.15,4188.41 +4188.41,4192.0,4170.0,4180.51 +4180.51,4180.78,4150.56,4156.0 +4156.0,4198.0,4155.99,4197.99 +4197.99,4257.52,4193.6,4236.01 +4236.01,4253.0,4225.54,4226.7 +4226.7,4250.74,4222.69,4241.9 +4241.9,4243.61,4220.0,4238.91 +4238.91,4269.95,4238.9,4262.88 +4262.91,4266.45,4249.46,4255.0 +4255.0,4255.0,4167.91,4194.7 +4194.7,4213.0,4181.94,4188.47 +4188.44,4213.61,4180.7,4212.49 +4212.5,4212.96,4180.0,4180.01 +4180.01,4182.3,4127.75,4143.01 +4143.01,4149.0,4122.0,4149.0 +4148.99,4188.49,4146.17,4187.52 +4187.53,4199.67,4178.62,4178.63 +4178.63,4180.0,4149.37,4149.38 +4149.38,4160.09,4142.31,4150.0 +4150.01,4170.66,4149.99,4170.66 +4170.66,4194.48,4164.51,4190.02 +4190.0,4198.28,4175.92,4175.93 +4175.94,4191.99,4175.93,4189.42 +4189.42,4194.1,4185.0,4194.1 +4194.1,4196.92,4151.52,4152.39 +4152.39,4152.4,4064.57,4095.75 +4095.75,4117.34,4017.72,4096.6 +4093.44,4110.67,4051.03,4064.29 +4064.28,4069.37,4015.17,4032.3 +4032.3,4056.46,4031.99,4055.75 +4055.77,4100.0,4050.97,4097.15 +4097.15,4125.68,4079.0,4108.26 +4108.26,4119.01,4081.19,4100.01 +4100.01,4144.0,4100.0,4143.99 +4144.0,4200.0,4143.99,4178.96 +4178.96,4212.99,4178.95,4203.93 +4203.94,4203.94,4165.72,4171.62 +4171.62,4204.2,4171.61,4189.0 +4189.0,4196.16,4180.41,4189.41 +4189.41,4209.99,4189.4,4195.97 +4195.97,4201.99,4141.08,4160.01 +4160.01,4182.96,4151.0,4165.98 +4165.99,4169.99,4165.5,4165.5 +4165.51,4184.93,4158.02,4174.85 +4174.85,4180.0,4166.81,4179.56 +4179.76,4183.13,4147.36,4157.96 +4159.7,4160.3,4135.0,4153.53 +4153.52,4169.99,4143.52,4169.98 +4169.98,4200.99,4169.98,4200.98 +4200.99,4201.99,4200.98,4201.0 +4200.99,4201.0,4179.71,4196.86 +4196.86,4198.02,4189.7,4195.09 +4195.7,4225.0,4192.6,4225.0 +4225.0,4250.0,4224.99,4250.0 +4250.0,4280.1,4232.35,4272.28 +4272.29,4275.27,4245.49,4258.32 +4258.32,4259.24,4246.8,4255.2 +4255.2,4279.39,4255.2,4267.73 +4267.58,4274.0,4257.17,4257.61 +4257.24,4281.41,4257.13,4281.4 +4281.4,4284.88,4270.34,4279.99 +4279.99,4299.99,4279.98,4299.99 +4299.99,4330.99,4299.98,4330.99 +4330.99,4349.16,4290.01,4315.22 +4315.22,4320.1,4307.5,4319.71 +4319.75,4350.0,4318.87,4335.0 +4335.01,4340.28,4321.93,4340.28 +4340.28,4350.0,4335.01,4343.77 +4343.77,4356.28,4310.68,4324.01 +4324.01,4340.0,4320.0,4336.39 +4336.39,4342.0,4330.81,4342.0 +4342.0,4357.85,4315.13,4315.32 +4315.32,4324.0,4300.78,4318.51 +4318.51,4318.51,4256.92,4283.01 +4283.01,4307.48,4276.32,4304.52 +4304.52,4305.8,4293.99,4299.01 +4299.0,4309.37,4293.99,4306.0 +4306.0,4315.0,4306.0,4313.34 +4313.35,4325.14,4313.34,4325.14 +4325.14,4325.14,4303.05,4303.27 +4303.27,4310.81,4300.02,4303.55 +4303.55,4321.01,4303.55,4308.9 +4308.9,4311.93,4303.82,4303.82 +4303.83,4303.83,4270.38,4280.16 +4280.16,4280.16,4257.02,4271.61 +4271.61,4292.01,4271.61,4281.26 +4281.27,4308.14,4281.26,4305.32 +4305.31,4318.5,4304.24,4315.98 +4315.98,4315.98,4292.73,4300.0 +4300.0,4313.96,4299.99,4311.02 +4311.03,4320.87,4306.18,4316.44 +4316.44,4342.5,4311.69,4342.5 +4342.5,4346.5,4342.5,4346.01 +4346.01,4383.2,4346.01,4378.0 +4378.0,4396.99,4377.99,4394.79 +4394.79,4420.0,4388.11,4408.13 +4408.13,4424.95,4405.0,4410.01 +4410.01,4414.5,4384.32,4389.92 +4389.92,4410.0,4389.92,4410.0 +4410.0,4437.51,4410.0,4425.0 +4425.0,4449.0,4420.84,4448.01 +4448.02,4449.0,4440.08,4448.99 +4448.99,4455.55,4435.0,4435.01 +4435.01,4449.03,4435.0,4449.03 +4449.03,4470.0,4448.84,4461.01 +4461.01,4469.0,4450.27,4461.62 +4461.62,4461.62,4399.0,4406.2 +4406.2,4411.95,4378.22,4391.37 +4391.37,4414.98,4390.01,4408.65 +4408.65,4423.0,4404.33,4406.01 +4406.9,4414.76,4371.0,4378.16 +4378.17,4413.66,4378.16,4395.0 +4395.0,4399.58,4365.5,4365.51 +4365.51,4386.27,4361.99,4384.96 +4384.96,4407.25,4384.95,4404.96 +4404.96,4404.96,4357.25,4391.91 +4391.93,4399.0,4354.99,4375.81 +4375.81,4375.84,4364.36,4368.07 +4368.08,4394.2,4368.07,4385.73 +4385.73,4385.73,4375.33,4381.72 +4381.72,4415.0,4378.27,4412.99 +4412.99,4419.95,4409.0,4415.44 +4415.45,4417.98,4409.0,4417.01 +4417.01,4417.01,4412.43,4412.44 +4412.44,4412.44,4300.0,4320.0 +4320.0,4323.0,4275.73,4291.99 +4292.0,4314.0,4267.01,4282.46 +4282.46,4360.0,4282.45,4333.99 +4333.99,4333.99,4255.0,4259.1 +4259.1,4360.0,4259.09,4321.14 +4321.14,4321.14,4300.0,4300.06 +4300.06,4300.06,4246.0,4246.01 +4246.01,4277.19,4242.42,4246.16 +4246.17,4295.47,4243.26,4278.77 +4278.77,4311.41,4277.23,4309.51 +4309.51,4309.51,4273.0,4282.42 +4282.42,4285.0,4280.0,4285.0 +4285.0,4298.0,4284.99,4296.9 +4296.9,4296.9,4261.77,4272.01 +4272.0,4286.99,4265.0,4285.0 +4285.0,4291.86,4276.15,4281.5 +4281.49,4295.0,4281.49,4295.0 +4295.0,4309.31,4294.99,4308.99 +4308.99,4312.78,4283.94,4300.59 +4300.59,4300.59,4284.0,4291.77 +4291.77,4300.52,4290.7,4300.0 +4300.0,4309.04,4295.11,4309.04 +4309.04,4310.0,4301.11,4310.0 +4310.0,4344.0,4309.99,4343.53 +4343.53,4343.53,4328.0,4328.01 +4328.01,4340.0,4327.01,4327.01 +4327.01,4327.01,4260.0,4289.26 +4289.26,4289.26,4250.0,4250.01 +4250.01,4250.79,4225.58,4248.21 +4248.21,4259.9,4238.08,4259.9 +4259.9,4259.9,4179.99,4209.22 +4209.22,4227.98,4183.6,4215.02 +4215.02,4222.94,4201.17,4202.16 +4202.17,4224.95,4202.16,4218.75 +4218.75,4220.0,4195.71,4210.01 +4210.01,4214.81,4202.84,4204.76 +4204.77,4204.77,4185.0,4196.96 +4196.96,4209.89,4188.99,4198.48 +4198.5,4204.22,4195.01,4199.9 +4199.9,4215.0,4199.89,4207.01 +4207.01,4233.29,4207.01,4231.73 +4231.73,4232.0,4201.39,4214.84 +4214.84,4224.99,4210.32,4224.99 +4224.99,4241.15,4224.74,4230.01 +4230.0,4235.51,4229.99,4230.0 +4230.0,4230.95,4163.96,4163.96 +4163.97,4166.81,4151.0,4165.01 +4165.01,4165.01,4150.01,4154.88 +4154.88,4164.75,4154.87,4160.0 +4160.0,4164.69,4159.99,4163.56 +4163.64,4163.81,4151.0,4163.81 +4163.81,4218.0,4158.93,4218.0 +4218.0,4245.0,4217.99,4245.0 +4245.15,4268.0,4242.0,4268.0 +4268.0,4325.99,4268.0,4306.11 +4306.11,4331.33,4297.04,4313.72 +4313.72,4316.51,4288.82,4308.73 +4308.74,4334.3,4308.74,4310.89 +4310.89,4319.98,4305.86,4305.87 +4305.86,4305.86,4280.11,4300.0 +4300.0,4338.88,4299.99,4333.0 +4333.0,4364.59,4331.73,4344.01 +4344.59,4354.67,4341.0,4347.8 +4347.8,4349.77,4331.0,4331.02 +4331.02,4362.65,4331.01,4349.75 +4349.75,4349.99,4300.0,4320.01 +4320.01,4326.99,4299.99,4326.99 +4326.99,4329.99,4324.46,4325.0 +4325.0,4325.97,4318.57,4320.0 +4320.0,4326.18,4319.99,4325.99 +4325.99,4325.99,4318.58,4325.83 +4325.83,4386.36,4324.48,4373.96 +4373.97,4397.96,4373.96,4393.9 +4393.9,4400.0,4380.82,4393.72 +4393.72,4399.98,4388.34,4396.21 +4396.21,4407.0,4384.0,4407.0 +4406.99,4407.0,4386.31,4388.74 +4388.74,4398.02,4385.5,4396.58 +4396.58,4399.99,4359.0,4373.4 +4373.4,4373.4,4348.0,4356.27 +4356.27,4392.0,4356.26,4387.89 +4387.89,4389.0,4379.6,4379.61 +4379.61,4384.86,4361.01,4384.85 +4384.86,4395.0,4350.0,4354.01 +4354.01,4354.01,4328.19,4339.99 +4340.0,4350.72,4320.0,4350.71 +4350.72,4350.72,4337.7,4340.01 +4340.01,4345.0,4339.99,4340.0 +4340.0,4352.52,4339.96,4352.5 +4352.5,4374.6,4352.5,4364.32 +4363.52,4387.15,4360.0,4369.83 +4369.57,4369.99,4360.0,4366.47 +4366.47,4369.04,4350.03,4361.01 +4361.01,4369.04,4355.83,4369.0 +4369.0,4369.0,4363.11,4363.11 +4363.11,4370.0,4363.1,4370.0 +4370.0,4370.0,4345.0,4345.04 +4345.04,4345.04,4329.17,4332.19 +4332.18,4345.0,4332.18,4345.0 +4345.0,4346.64,4343.47,4343.48 +4343.48,4343.48,4320.0,4322.39 +4322.39,4331.53,4320.0,4325.01 +4325.01,4354.99,4325.0,4354.99 +4355.0,4357.99,4354.99,4357.99 +4357.99,4358.0,4340.0,4342.08 +4342.08,4348.58,4336.82,4346.0 +4346.0,4346.0,4328.7,4341.5 +4341.5,4356.25,4341.49,4356.25 +4356.25,4356.25,4350.0,4351.82 +4351.82,4351.84,4345.01,4347.32 +4347.32,4348.96,4326.28,4340.01 +4340.8,4347.0,4336.33,4344.04 +4344.03,4449.42,4344.03,4442.79 +4442.79,4449.0,4419.91,4434.02 +4434.02,4449.22,4432.21,4442.01 +4442.01,4446.49,4420.01,4421.74 +4421.74,4435.3,4421.73,4435.28 +4435.29,4443.0,4433.5,4443.0 +4443.0,4443.0,4421.04,4425.0 +4425.0,4438.09,4425.0,4437.85 +4437.85,4463.89,4437.75,4463.69 +4463.69,4463.69,4450.0,4450.01 +4450.01,4464.03,4450.0,4456.26 +4456.25,4460.0,4454.0,4460.0 +4460.0,4477.99,4459.99,4477.99 +4477.99,4477.99,4470.16,4470.16 +4470.16,4470.16,4460.01,4467.51 +4467.51,4525.28,4467.51,4518.02 +4518.02,4542.09,4518.01,4535.0 +4535.0,4569.99,4535.0,4569.99 +4569.99,4574.0,4547.52,4560.0 +4560.0,4570.0,4559.39,4569.01 +4569.01,4569.01,4539.76,4544.08 +4544.08,4590.0,4543.99,4590.0 +4590.0,4612.0,4568.16,4579.6 +4579.6,4590.24,4575.01,4586.46 +4586.46,4608.0,4586.46,4607.99 +4608.0,4608.99,4600.0,4603.51 +4603.51,4605.04,4572.03,4594.0 +4594.0,4609.01,4592.99,4608.98 +4608.99,4620.0,4599.99,4616.94 +4616.94,4633.7,4616.93,4633.51 +4633.51,4633.51,4580.19,4586.69 +4586.69,4616.37,4586.67,4586.69 +4586.69,4586.69,4561.0,4561.02 +4561.02,4581.78,4561.01,4580.51 +4580.51,4580.51,4567.09,4568.24 +4567.9,4580.1,4567.09,4580.08 +4580.09,4605.0,4580.0,4597.9 +4597.9,4609.28,4585.88,4590.71 +4590.71,4600.0,4580.75,4586.31 +4586.31,4614.0,4579.63,4606.63 +4606.63,4670.0,4606.62,4667.55 +4665.98,4665.98,4629.99,4645.67 +4645.51,4654.08,4639.18,4654.08 +4654.08,4738.07,4653.36,4738.07 +4738.07,4775.0,4685.05,4775.0 +4775.0,4875.39,4751.0,4751.0 +4751.08,4842.18,4751.01,4825.0 +4825.0,4828.99,4789.99,4823.17 +4823.95,4824.0,4735.12,4749.69 +4749.68,4805.61,4749.68,4782.0 +4782.0,4857.12,4781.99,4851.73 +4851.74,4851.74,4787.15,4791.46 +4792.0,4817.84,4790.88,4811.85 +4811.85,4811.86,4777.72,4799.98 +4799.98,4819.21,4781.73,4794.27 +4791.71,4816.0,4791.71,4816.0 +4816.0,4836.96,4815.99,4836.95 +4836.95,4838.0,4760.0,4760.01 +4760.01,4807.67,4760.0,4787.54 +4787.54,4797.77,4767.01,4769.95 +4769.96,4814.0,4760.0,4814.0 +4814.0,4819.67,4800.01,4812.16 +4812.16,4838.99,4803.56,4838.99 +4838.99,4839.0,4803.1,4821.4 +4821.4,4827.99,4788.85,4797.99 +4797.99,4802.1,4793.03,4801.53 +4801.54,4869.34,4799.5,4869.33 +4869.33,4899.0,4866.53,4899.0 +4899.0,4925.65,4853.78,4882.0 +4882.0,4882.0,4849.76,4877.03 +4877.03,4877.03,4861.0,4862.96 +4862.95,4862.95,4803.51,4809.28 +4809.28,4809.28,4706.0,4790.0 +4790.01,4790.01,4701.53,4766.91 +4766.91,4766.91,4720.21,4749.05 +4749.01,4763.87,4740.01,4759.87 +4759.87,4774.99,4759.86,4768.02 +4768.02,4768.02,4730.0,4737.42 +4737.42,4745.31,4725.1,4745.0 +4745.0,4764.32,4734.54,4764.32 +4764.32,4774.99,4764.1,4773.86 +4773.86,4804.99,4773.85,4804.99 +4804.99,4819.99,4804.35,4808.22 +4808.21,4823.77,4798.77,4823.77 +4823.77,4829.99,4803.63,4816.94 +4816.94,4824.42,4788.11,4798.13 +4798.13,4798.29,4757.48,4765.0 +4765.0,4775.0,4764.99,4767.0 +4767.0,4790.97,4767.0,4780.0 +4780.0,4849.9,4779.99,4849.9 +4849.9,4858.0,4834.34,4851.0 +4850.99,4856.1,4820.0,4820.0 +4821.87,4850.0,4815.0,4850.0 +4850.0,4869.97,4828.0,4841.99 +4842.72,4847.9,4824.89,4827.44 +4827.44,4827.44,4789.05,4789.99 +4789.99,4820.0,4789.99,4813.01 +4813.0,4819.0,4807.64,4818.99 +4818.99,4834.99,4809.68,4834.99 +4834.99,4839.5,4828.82,4835.01 +4835.01,4849.99,4835.01,4847.89 +4847.89,4848.78,4835.5,4847.94 +4847.93,4849.99,4832.22,4835.21 +4835.2,4889.0,4835.02,4889.0 +4889.0,4898.0,4883.0,4892.9 +4892.9,5000.0,4892.9,5000.0 +4999.99,5180.99,4999.99,5099.99 +5099.99,5187.75,5088.24,5139.91 +5139.92,5190.0,5090.0,5172.77 +5180.0,5230.0,5150.01,5180.0 +5180.0,5218.0,5175.0,5177.71 +5177.71,5205.13,5165.01,5180.0 +5180.0,5200.1,5174.99,5200.1 +5200.09,5298.11,5200.09,5285.0 +5285.0,5394.86,5285.0,5349.56 +5349.5,5349.65,5241.01,5253.0 +5253.01,5341.91,5216.29,5300.0 +5300.0,5318.9,5278.01,5309.0 +5309.0,5345.0,5308.0,5322.74 +5322.74,5337.0,5272.33,5296.01 +5296.01,5335.0,5280.0,5335.0 +5335.0,5440.92,5335.0,5413.71 +5413.71,5474.0,5390.0,5431.22 +5431.22,5588.9,5410.11,5586.99 +5586.99,5867.0,5559.0,5680.62 +5680.63,5739.95,5580.01,5730.0 +5730.0,5829.0,5700.14,5745.93 +5743.99,5746.93,5420.0,5454.87 +5454.87,5572.57,5433.85,5465.06 +5465.31,5629.95,5457.34,5599.7 +5599.7,5710.0,5599.69,5653.81 +5653.82,5715.58,5631.29,5694.23 +5693.81,5693.81,5580.02,5583.53 +5584.96,5663.71,5564.73,5631.95 +5631.94,5638.46,5519.11,5552.85 +5552.86,5729.0,5552.86,5720.01 +5720.0,5780.0,5670.8,5728.89 +5728.89,5728.89,5679.35,5714.95 +5714.94,5714.95,5640.0,5666.96 +5666.96,5713.33,5666.0,5672.97 +5672.97,5687.59,5627.0,5628.44 +5628.44,5637.0,5471.94,5563.04 +5563.03,5619.0,5535.32,5578.32 +5578.3,5601.0,5560.02,5565.73 +5565.73,5610.0,5535.0,5597.24 +5597.25,5625.0,5585.58,5624.71 +5624.71,5624.71,5581.32,5588.55 +5588.55,5615.0,5585.55,5609.11 +5609.12,5689.87,5609.11,5655.04 +5655.04,5679.99,5655.0,5676.03 +5676.03,5676.03,5605.53,5608.05 +5608.06,5629.92,5588.0,5596.69 +5596.7,5596.7,5567.86,5594.93 +5594.93,5614.0,5580.0,5580.01 +5580.01,5631.22,5580.0,5614.39 +5614.4,5614.4,5584.0,5603.81 +5603.81,5700.0,5585.0,5700.0 +5700.0,5715.7,5678.03,5692.83 +5692.97,5704.01,5655.32,5685.0 +5685.0,5707.0,5673.97,5689.02 +5689.02,5736.0,5680.86,5727.5 +5727.5,5739.8,5697.55,5720.2 +5720.2,5749.0,5720.19,5749.0 +5749.0,5762.3,5724.66,5748.11 +5748.01,5748.01,5668.06,5697.28 +5697.28,5700.0,5686.93,5699.98 +5697.21,5700.0,5683.66,5698.02 +5698.01,5735.0,5698.01,5735.0 +5735.0,5739.99,5725.01,5739.99 +5739.99,5839.8,5739.98,5816.11 +5816.11,5829.95,5802.0,5802.02 +5802.01,5833.0,5781.53,5827.55 +5827.55,5849.83,5825.03,5833.19 +5833.19,5839.04,5781.53,5803.69 +5803.69,5803.69,5737.0,5748.6 +5748.6,5759.99,5727.13,5759.98 +5759.98,5761.94,5730.0,5746.62 +5748.0,5765.0,5651.04,5651.04 +5651.04,5651.04,5465.02,5480.02 +5480.02,5569.3,5480.02,5550.63 +5550.63,5602.27,5537.16,5602.14 +5602.14,5602.31,5455.5,5478.32 +5478.32,5535.0,5475.0,5486.96 +5486.98,5566.27,5486.98,5564.93 +5564.8,5591.0,5527.84,5591.0 +5591.0,5597.99,5548.0,5555.99 +5555.72,5568.38,5480.0,5529.03 +5529.03,5535.0,5508.0,5529.87 +5529.87,5542.11,5501.01,5530.8 +5530.81,5544.0,5517.21,5529.14 +5529.13,5532.39,5490.0,5522.01 +5522.01,5648.99,5503.02,5639.37 +5646.04,5725.0,5619.69,5722.5 +5722.51,5729.95,5657.19,5695.0 +5695.38,5723.02,5672.96,5689.86 +5687.54,5699.69,5651.0,5671.55 +5671.55,5712.29,5671.53,5678.0 +5678.0,5700.0,5607.27,5634.14 +5634.14,5634.9,5608.0,5621.0 +5621.01,5671.0,5602.0,5645.39 +5639.94,5661.0,5619.93,5660.61 +5660.64,5661.0,5576.52,5638.78 +5637.93,5637.93,5580.0,5582.36 +5582.24,5654.0,5575.55,5648.38 +5648.34,5725.0,5643.51,5710.49 +5710.44,5753.0,5705.0,5753.0 +5753.0,5753.0,5710.0,5716.15 +5716.15,5716.15,5676.39,5687.99 +5688.0,5705.0,5679.24,5698.97 +5698.96,5699.99,5670.0,5693.41 +5693.41,5693.41,5643.45,5647.36 +5647.36,5700.57,5647.35,5697.16 +5697.17,5697.49,5679.0,5695.0 +5694.99,5724.99,5694.64,5724.99 +5724.99,5735.87,5681.6,5686.19 +5686.2,5719.97,5686.19,5709.94 +5709.94,5719.99,5707.0,5719.99 +5719.99,5785.3,5719.99,5769.26 +5769.26,5769.99,5749.57,5763.81 +5763.81,5765.99,5610.0,5647.01 +5645.4,5671.55,5620.2,5661.0 +5661.0,5663.0,5612.13,5658.09 +5658.1,5682.07,5651.02,5653.16 +5653.16,5657.62,5621.26,5624.48 +5624.48,5687.0,5624.48,5687.0 +5687.0,5687.0,5650.0,5659.36 +5659.36,5687.0,5659.36,5686.96 +5686.96,5686.96,5669.9,5674.27 +5674.27,5679.33,5647.92,5647.97 +5647.97,5653.34,5525.0,5533.63 +5533.61,5587.6,5528.07,5578.01 +5578.01,5600.0,5569.89,5600.0 +5600.0,5620.84,5580.47,5588.0 +5588.0,5590.0,5578.88,5588.91 +5588.92,5590.0,5556.8,5564.15 +5564.16,5633.0,5560.9,5620.32 +5620.32,5625.0,5606.0,5622.0 +5622.0,5630.0,5615.01,5628.16 +5628.16,5630.0,5555.0,5586.01 +5586.02,5597.59,5577.0,5584.63 +5584.58,5597.84,5568.01,5569.43 +5569.43,5605.88,5568.69,5571.0 +5571.0,5571.0,5501.11,5523.04 +5523.05,5524.57,5460.3,5465.27 +5465.28,5524.52,5465.27,5501.0 +5501.01,5519.91,5460.14,5503.65 +5503.66,5544.33,5503.65,5542.05 +5542.05,5544.79,5482.78,5482.79 +5482.79,5482.79,5335.01,5370.0 +5370.0,5387.57,5259.02,5279.21 +5279.26,5391.0,5275.91,5391.0 +5391.0,5411.68,5314.58,5324.98 +5324.99,5350.0,5264.2,5280.99 +5286.63,5342.95,5256.0,5323.32 +5323.32,5334.93,5261.6,5264.48 +5264.45,5285.81,5133.79,5156.34 +5156.34,5247.34,5102.0,5225.02 +5225.02,5391.74,5200.0,5350.0 +5350.0,5442.93,5349.99,5427.51 +5429.82,5440.49,5364.04,5380.01 +5380.01,5440.0,5380.0,5417.62 +5417.62,5417.62,5390.0,5400.0 +5400.0,5529.0,5399.99,5518.71 +5518.71,5548.99,5501.0,5519.99 +5519.99,5599.13,5510.0,5560.0 +5560.03,5600.0,5560.03,5566.92 +5566.93,5571.02,5529.44,5571.02 +5571.02,5645.0,5571.01,5624.99 +5625.0,5636.25,5571.01,5590.25 +5590.25,5638.0,5590.25,5638.0 +5638.11,5650.89,5617.53,5636.1 +5636.1,5649.56,5588.43,5619.48 +5620.83,5623.34,5539.99,5560.0 +5560.0,5614.1,5548.69,5597.17 +5597.17,5656.56,5597.17,5634.07 +5634.07,5690.0,5607.33,5687.98 +5687.32,5718.94,5671.91,5700.0 +5699.99,5710.21,5671.0,5694.06 +5694.06,5694.06,5635.0,5653.95 +5653.95,5750.0,5653.94,5736.24 +5736.24,5736.24,5702.5,5726.87 +5726.87,5726.87,5614.23,5657.53 +5657.54,5697.0,5655.0,5681.02 +5681.02,5681.02,5655.12,5666.99 +5667.0,5673.11,5655.12,5669.95 +5669.95,5669.95,5626.0,5638.74 +5638.74,5719.49,5636.78,5709.01 +5709.0,5729.98,5691.09,5729.98 +5729.97,5730.0,5689.97,5713.14 +5713.15,5724.99,5700.0,5705.49 +5705.49,5714.99,5705.48,5714.98 +5714.99,5714.99,5692.31,5701.88 +5701.87,5702.0,5658.01,5681.21 +5681.71,5694.99,5671.14,5682.38 +5682.39,5702.0,5682.38,5694.2 +5694.2,5694.2,5651.0,5676.06 +5676.06,5678.05,5630.0,5638.38 +5638.38,5657.3,5638.37,5653.66 +5653.66,5676.0,5650.82,5650.96 +5650.96,5654.37,5642.0,5654.37 +5654.37,5672.81,5654.36,5670.11 +5670.11,5678.57,5653.32,5665.34 +5664.05,5665.35,5653.0,5661.98 +5661.98,5714.99,5661.97,5714.99 +5714.99,5985.0,5714.98,5975.17 +5975.18,5997.0,5912.01,5945.0 +5945.0,5988.0,5944.99,5967.8 +5967.79,5967.8,5892.2,5948.99 +5949.0,5975.0,5948.99,5970.0 +5970.0,6063.99,5969.99,6043.51 +6043.51,6043.51,5940.65,5991.83 +5991.83,5991.83,5940.05,5974.99 +5975.0,5991.98,5950.8,5991.98 +5991.98,6019.0,5986.16,5993.03 +5993.03,5993.03,5956.0,5968.36 +5968.36,6071.0,5968.35,6057.01 +6057.01,6085.95,6049.99,6075.0 +6075.0,6115.0,6070.04,6114.0 +6114.01,6149.99,6029.0,6049.91 +6049.91,6084.42,6025.55,6075.49 +6075.49,6089.88,6057.12,6080.0 +6080.0,6120.0,6068.34,6070.17 +6070.17,6103.9,6070.16,6080.0 +6080.0,6099.01,6079.99,6099.01 +6099.01,6123.6,6080.95,6113.01 +6113.01,6143.36,6110.0,6143.36 +6143.37,6143.78,6089.0,6123.9 +6123.9,6135.0,6111.0,6135.0 +6135.0,6189.1,6121.01,6140.51 +6140.5,6172.73,6140.5,6165.91 +6165.91,6169.34,6050.0,6050.0 +6050.0,6050.01,5868.26,5980.84 +5981.74,6067.91,5961.76,6048.01 +6048.01,6055.11,6021.89,6055.11 +6055.11,6111.11,6055.1,6109.62 +6109.62,6115.37,6065.34,6071.2 +6071.2,6094.0,6063.89,6084.24 +6084.24,6087.9,6010.0,6046.48 +6046.48,6082.3,6011.0,6067.52 +6067.52,6073.36,6025.0,6025.0 +6025.0,6025.01,5950.0,5965.95 +5965.96,5994.96,5900.0,5900.02 +5900.02,5900.09,5775.0,5808.86 +5808.86,5920.01,5808.86,5856.02 +5856.02,5912.54,5810.11,5909.99 +5909.99,5968.0,5898.06,5926.4 +5926.4,5943.0,5902.96,5930.08 +5930.08,5930.81,5820.0,5864.22 +5864.36,5865.47,5789.02,5799.0 +5799.0,5835.51,5755.95,5813.43 +5813.43,5893.47,5770.01,5885.37 +5885.36,5885.37,5840.78,5875.62 +5875.62,5994.98,5855.7,5972.37 +5972.38,6042.13,5971.69,6000.01 +6000.01,6001.5,5950.0,5975.9 +5975.9,6002.0,5961.5,5984.82 +5984.74,5986.9,5897.0,5903.7 +5903.7,5930.55,5859.99,5905.7 +5909.71,5930.0,5856.08,5885.02 +5885.02,5929.42,5885.01,5929.42 +5929.43,5981.61,5929.43,5961.23 +5961.23,6030.0,5961.23,5984.0 +5983.17,5995.21,5949.99,5995.01 +5995.01,6050.0,5979.44,6034.45 +6034.45,6034.99,5977.21,5977.22 +5977.22,6003.15,5951.5,5999.99 +6000.0,6010.0,5979.61,6010.0 +6010.0,6057.02,5955.55,5955.56 +5955.56,5961.04,5884.01,5884.03 +5884.03,5948.68,5884.02,5910.01 +5910.01,5910.01,5819.0,5819.01 +5819.01,5883.07,5818.44,5883.07 +5883.07,5909.09,5864.61,5897.89 +5897.89,5927.27,5891.02,5899.11 +5899.11,5899.11,5785.0,5800.98 +5800.98,5800.98,5672.28,5754.53 +5754.49,5775.0,5650.98,5695.37 +5695.37,5824.98,5690.0,5750.06 +5750.06,5850.0,5730.0,5847.13 +5847.12,5883.99,5819.13,5863.85 +5863.84,5880.61,5774.84,5819.97 +5819.97,5950.0,5819.96,5945.5 +5945.51,5995.06,5905.0,5929.9 +5929.9,5929.9,5861.73,5888.82 +5888.82,5898.01,5822.0,5871.83 +5871.83,5932.71,5851.47,5862.01 +5862.01,5885.91,5731.0,5782.25 +5782.25,5840.01,5640.0,5676.01 +5676.22,5704.52,5560.0,5640.0 +5641.88,5698.99,5621.0,5660.0 +5660.0,5687.35,5600.0,5670.52 +5670.52,5745.0,5641.17,5744.87 +5744.87,5775.0,5719.99,5746.01 +5746.01,5754.77,5701.0,5754.77 +5754.77,5770.0,5707.78,5720.83 +5720.83,5729.95,5623.34,5689.02 +5689.02,5737.51,5681.87,5737.51 +5737.51,5739.99,5703.0,5730.01 +5730.01,5730.01,5641.54,5655.99 +5655.99,5700.0,5618.01,5681.15 +5681.15,5687.0,5632.07,5679.01 +5679.02,5719.0,5640.0,5719.0 +5719.0,5737.4,5702.0,5718.1 +5718.1,5725.85,5713.15,5719.89 +5720.25,5729.0,5673.99,5673.99 +5673.99,5680.0,5655.0,5673.87 +5673.87,5673.87,5567.59,5573.01 +5573.01,5574.5,5462.19,5533.63 +5533.63,5544.98,5485.1,5529.71 +5529.72,5544.98,5496.57,5516.87 +5516.87,5537.0,5507.01,5509.54 +5509.54,5511.9,5376.71,5409.7 +5409.7,5483.83,5380.0,5481.05 +5481.05,5571.61,5447.0,5560.0 +5564.83,5564.83,5527.0,5527.25 +5529.665,5575.0,5488.88,5494.5 +5494.5,5552.17,5487.49,5538.0 +5538.0,5594.89,5535.0,5584.4 +5583.01,5643.01,5583.01,5640.0 +5640.0,5643.99,5620.6,5639.9 +5639.9,5641.99,5570.0,5576.1 +5576.09,5576.09,5521.13,5538.04 +5538.04,5538.04,5480.0,5523.84 +5523.84,5566.0,5510.67,5529.92 +5529.92,5549.0,5451.21,5472.97 +5472.98,5492.33,5443.11,5484.01 +5484.01,5560.0,5483.0,5544.99 +5544.99,5552.47,5499.98,5532.02 +5532.02,5569.99,5532.02,5560.21 +5560.21,5661.99,5553.72,5641.55 +5641.54,5694.0,5641.53,5671.0 +5671.0,5718.0,5670.0,5680.1 +5680.01,5716.42,5651.0,5714.38 +5714.39,5765.0,5677.32,5739.72 +5739.72,5750.0,5716.82,5744.07 +5744.07,5768.0,5701.0,5720.01 +5720.01,5747.0,5720.01,5735.92 +5735.92,5795.0,5735.92,5766.39 +5766.39,5779.09,5750.0,5770.16 +5770.16,5775.75,5701.08,5701.09 +5701.09,5748.0,5701.08,5716.87 +5716.87,5749.0,5708.44,5738.86 +5738.86,5750.0,5722.78,5722.78 +5722.79,5770.0,5722.78,5766.95 +5766.95,5795.0,5751.99,5795.0 +5795.0,5898.0,5794.99,5898.0 +5898.0,5982.6,5891.01,5980.0 +5980.0,5985.0,5901.01,5915.82 +5915.82,5955.0,5915.0,5918.83 +5918.83,5967.0,5917.38,5958.92 +5958.92,5968.73,5930.01,5940.68 +5940.68,5967.35,5940.67,5956.01 +5956.01,5956.01,5811.79,5860.99 +5860.99,5917.01,5845.02,5908.4 +5908.4,5908.4,5826.95,5849.25 +5849.25,5854.26,5785.6,5815.18 +5815.63,5910.09,5815.63,5888.82 +5888.82,5919.99,5888.82,5895.36 +5897.59,5998.0,5873.49,5980.0 +5980.0,5984.0,5923.4,5939.0 +5939.01,5966.24,5936.01,5939.95 +5939.96,5939.96,5901.0,5929.9 +5929.9,5929.9,5895.0,5895.01 +5895.01,5907.45,5851.0,5851.01 +5851.01,5855.0,5805.0,5855.0 +5855.0,5894.0,5851.04,5894.0 +5894.0,5910.01,5865.02,5910.01 +5910.01,5928.0,5906.57,5917.39 +5917.39,5917.39,5833.38,5849.67 +5849.67,5858.4,5843.13,5850.9 +5850.91,5850.91,5760.28,5761.08 +5761.08,5771.59,5708.8,5771.59 +5771.58,5799.06,5723.48,5774.58 +5774.59,5774.59,5724.64,5756.38 +5756.38,5794.0,5756.37,5765.48 +5765.47,5780.0,5725.0,5725.01 +5725.01,5738.66,5710.0,5738.66 +5738.66,5781.0,5737.02,5751.75 +5751.75,5795.0,5725.0,5786.01 +5786.01,5790.0,5754.2,5764.87 +5764.87,5794.98,5759.78,5785.0 +5785.01,5814.3,5772.0,5814.3 +5814.3,5871.23,5814.29,5869.99 +5869.99,5894.0,5861.0,5861.1 +5861.1,5864.65,5778.35,5778.36 +5778.36,5794.2,5769.0,5769.01 +5769.01,5794.2,5769.0,5794.2 +5794.2,5818.69,5780.0,5818.69 +5818.69,5828.92,5818.68,5828.92 +5828.92,5829.0,5828.92,5829.0 +5829.0,5829.0,5783.19,5804.95 +5804.95,5816.38,5797.05,5797.05 +5797.05,5797.05,5749.73,5749.74 +5749.74,5749.74,5725.0,5725.0 +5725.0,5739.75,5720.0,5725.59 +5725.59,5749.74,5725.58,5749.74 +5749.74,5750.03,5725.0,5725.01 +5725.01,5725.01,5715.0,5715.01 +5715.01,5728.97,5715.0,5720.5 +5720.51,5769.84,5720.4,5766.66 +5766.65,5766.66,5744.57,5753.9 +5753.9,5810.0,5753.9,5780.0 +5780.0,5782.0,5740.21,5750.61 +5750.61,5754.99,5733.33,5740.0 +5740.0,5779.38,5739.99,5770.01 +5770.01,5778.59,5752.0,5752.01 +5752.01,5754.9,5739.99,5743.0 +5743.0,5760.89,5728.0,5744.675 +5744.67,5748.26,5729.99,5746.35 +5746.34,5764.03,5742.06,5761.04 +5761.04,5805.95,5761.04,5780.01 +5780.01,5795.99,5776.4,5786.77 +5786.77,5855.23,5784.99,5855.23 +5855.23,5859.0,5820.71,5832.0 +5832.0,5844.98,5825.05,5834.99 +5834.99,5834.99,5795.32,5816.39 +5816.38,5820.99,5816.38,5820.99 +5820.99,5845.09,5775.9,5810.24 +5810.24,5816.0,5754.99,5769.19 +5769.19,5795.0,5759.0,5794.99 +5794.99,5819.98,5794.99,5819.98 +5819.98,5984.0,5819.97,5970.59 +5970.59,5992.12,5930.05,5974.0 +5975.0,5976.0,5942.01,5942.65 +5942.65,5969.9,5942.64,5959.61 +5959.61,6136.0,5959.6,6135.0 +6135.0,6290.69,6065.01,6180.0 +6180.0,6219.0,6128.56,6170.0 +6170.0,6180.0,6128.36,6171.89 +6171.88,6208.0,6098.99,6126.52 +6126.51,6150.0,6090.0,6095.91 +6095.91,6143.35,6078.01,6135.03 +6135.03,6135.03,6105.0,6113.51 +6113.51,6168.01,6085.02,6163.6 +6163.61,6170.0,6140.38,6150.0 +6150.0,6150.0,6107.29,6114.2 +6114.2,6135.18,6114.19,6123.76 +6123.77,6160.0,6110.22,6145.03 +6145.03,6145.03,6122.23,6134.27 +6134.27,6169.38,6134.26,6166.34 +6166.91,6200.0,6160.95,6199.98 +6199.99,6200.0,6143.1,6160.01 +6160.0,6161.35,6113.54,6144.88 +6144.87,6170.49,6141.76,6156.99 +6157.0,6158.16,6028.0,6029.3 +6029.3,6096.66,6029.29,6087.1 +6087.1,6087.1,6054.72,6083.0 +6083.0,6138.0,6070.0,6137.99 +6137.99,6138.0,6112.0,6112.04 +6112.01,6117.36,6080.0,6086.0 +6086.0,6112.0,6086.0,6109.0 +6109.0,6117.36,6092.5,6092.72 +6092.72,6113.56,6089.0,6099.0 +6099.0,6144.0,6080.04,6134.51 +6134.51,6149.0,6104.41,6131.16 +6131.16,6148.69,6131.16,6136.01 +6136.01,6145.0,6126.0,6133.99 +6133.99,6136.98,6133.37,6136.69 +6136.69,6149.35,6136.68,6149.35 +6149.35,6169.9,6149.35,6158.01 +6158.01,6158.01,6100.19,6115.0 +6115.0,6119.13,6099.0,6105.47 +6105.47,6135.97,6105.46,6133.97 +6133.97,6163.0,6131.12,6163.0 +6163.0,6169.99,6160.01,6169.99 +6169.99,6238.33,6169.98,6226.79 +6226.79,6227.86,6203.69,6222.0 +6222.0,6349.98,6215.0,6349.97 +6349.97,6420.13,6317.5,6352.66 +6352.67,6420.65,6352.66,6375.0 +6375.0,6392.98,6366.17,6366.18 +6366.18,6379.01,6322.01,6364.99 +6365.0,6369.9,6338.96,6341.0 +6341.01,6365.0,6307.71,6364.22 +6364.22,6378.99,6354.01,6372.02 +6372.02,6420.0,6372.01,6411.5 +6411.5,6421.2,6387.7,6391.01 +6391.01,6472.13,6378.44,6419.91 +6419.91,6419.91,6370.1,6397.86 +6397.86,6420.25,6390.01,6417.0 +6417.0,6445.38,6410.99,6439.99 +6440.0,6461.4,6410.0,6413.57 +6413.59,6413.68,6363.59,6370.95 +6370.95,6422.0,6370.94,6400.01 +6400.01,6414.17,6394.08,6407.24 +6407.22,6413.62,6396.65,6412.0 +6412.0,6468.0,6412.0,6468.0 +6468.0,6548.98,6467.99,6521.0 +6523.69,6635.0,6503.01,6562.0 +6562.84,6613.02,6562.83,6584.53 +6584.82,6584.85,6493.38,6520.0 +6520.0,6538.46,6483.34,6517.01 +6517.01,6572.71,6517.0,6560.24 +6560.01,6594.98,6544.99,6594.98 +6594.98,6650.84,6571.0,6590.7 +6590.7,6623.77,6582.74,6610.0 +6610.0,6615.63,6580.0,6602.0 +6602.0,6620.0,6576.21,6576.21 +6576.22,6588.98,6551.0,6588.98 +6588.98,6612.0,6580.01,6589.81 +6589.81,6681.02,6589.81,6659.01 +6659.01,6784.0,6658.0,6784.0 +6784.0,6939.99,6759.0,6886.77 +6886.76,6987.87,6855.0,6874.56 +6874.53,6917.0,6821.0,6856.13 +6856.12,6949.0,6856.12,6907.78 +6909.99,6970.84,6870.0,6970.84 +6970.84,6986.99,6925.75,6951.14 +6953.98,7089.99,6953.98,7079.92 +7079.92,7079.92,6966.54,7009.71 +7002.6,7049.0,7002.6,7049.0 +7049.0,7049.9,7005.01,7040.99 +7040.99,7319.31,7040.99,7319.31 +7319.31,7445.0,6769.74,6994.99 +6995.0,7089.86,6825.0,6981.0 +6978.51,7199.0,6978.51,7165.0 +7165.01,7194.98,7000.5,7062.47 +7062.51,7100.0,7020.29,7079.83 +7079.83,7079.83,6904.2,6917.01 +6917.0,7015.0,6904.21,6968.43 +6969.89,6969.89,6855.0,6925.31 +6925.31,6984.0,6884.18,6970.0 +6970.0,7115.0,6969.99,7055.98 +7055.98,7089.95,7047.32,7080.0 +7080.01,7085.84,7020.21,7042.65 +7042.65,7085.9,7009.99,7048.81 +7049.96,7051.17,6955.89,6988.83 +6988.82,7025.32,6964.1,7025.32 +7025.32,7098.83,7025.31,7098.83 +7098.83,7273.0,7098.83,7222.73 +7222.63,7295.0,7120.0,7154.98 +7154.98,7238.84,7145.1,7228.88 +7227.77,7266.39,7205.16,7237.16 +7237.17,7344.25,7210.71,7317.0 +7317.01,7449.0,7277.0,7401.49 +7408.11,7444.99,7350.0,7392.97 +7392.97,7449.99,7286.41,7303.77 +7303.77,7370.0,7256.88,7324.99 +7325.0,7345.68,7279.79,7338.0 +7338.0,7338.0,7200.0,7226.95 +7226.95,7320.0,7225.46,7309.01 +7309.01,7373.0,7283.0,7340.0 +7340.0,7363.83,7300.0,7307.0 +7307.0,7328.92,7303.21,7324.54 +7324.54,7355.0,7324.53,7342.99 +7343.0,7343.0,7274.99,7311.01 +7311.01,7311.01,7110.9,7174.98 +7174.98,7233.77,7110.0,7174.0 +7174.0,7233.26,7147.69,7195.49 +7195.5,7222.33,7144.53,7144.54 +7144.54,7157.7,7020.0,7101.0 +7101.01,7159.95,7011.1,7145.01 +7145.01,7196.0,7145.01,7185.35 +7185.35,7249.69,7181.64,7237.95 +7237.95,7298.0,7220.3,7264.99 +7265.0,7265.0,7194.5,7194.5 +7194.5,7232.82,7186.99,7232.82 +7232.83,7259.01,7221.87,7242.64 +7242.65,7242.65,7180.01,7180.02 +7180.02,7200.77,7137.51,7167.82 +7167.82,7179.49,7128.2,7175.27 +7175.27,7185.59,7135.0,7184.82 +7184.81,7217.0,7172.48,7208.17 +7208.16,7346.0,7208.16,7333.84 +7333.76,7349.55,7276.16,7280.87 +7277.8,7348.77,7268.2,7348.77 +7348.77,7399.99,7348.77,7352.02 +7352.02,7355.01,7320.0,7355.0 +7355.0,7360.0,7338.0,7358.32 +7358.32,7447.0,7358.31,7434.97 +7429.72,7498.0,7416.78,7479.98 +7479.99,7488.01,7455.08,7468.01 +7468.0,7468.0,7369.05,7428.58 +7428.58,7477.0,7385.0,7409.95 +7409.95,7409.99,7323.0,7409.99 +7409.98,7438.21,7375.0,7402.36 +7402.36,7425.0,7400.0,7411.0 +7411.01,7445.0,7380.0,7445.0 +7445.0,7463.9,7427.8,7450.0 +7450.0,7479.95,7442.39,7479.94 +7479.94,7489.98,7442.0,7444.72 +7444.72,7461.0,7412.94,7461.0 +7461.0,7479.0,7461.0,7477.42 +7477.42,7487.02,7440.0,7467.84 +7464.16,7485.0,7464.16,7485.0 +7485.0,7550.0,7485.0,7539.71 +7539.69,7580.0,7475.01,7550.0 +7550.0,7629.7,7548.28,7577.01 +7577.01,7630.0,7501.24,7544.42 +7544.42,7584.0,7513.0,7551.0 +7551.0,7569.99,7508.0,7524.27 +7524.28,7560.0,7524.0,7560.0 +7560.0,7584.85,7559.99,7574.99 +7574.99,7594.0,7571.2,7594.0 +7594.0,7594.02,7550.0,7560.05 +7560.05,7562.0,7354.52,7419.99 +7419.99,7458.0,7325.05,7373.9 +7373.99,7420.0,7310.0,7398.99 +7399.0,7432.49,7318.0,7363.26 +7363.06,7388.99,7325.8,7385.0 +7385.0,7408.95,7331.53,7331.53 +7331.22,7331.22,7200.6,7233.1 +7233.11,7249.0,7027.09,7234.26 +7234.26,7339.0,7234.25,7310.0 +7310.01,7349.99,7275.0,7306.42 +7306.43,7326.98,7255.76,7322.06 +7322.06,7424.83,7307.08,7350.25 +7350.25,7366.77,7283.02,7322.01 +7322.01,7340.0,7280.07,7321.1 +7320.75,7366.1,7308.03,7342.78 +7342.78,7427.43,7341.03,7404.02 +7404.12,7419.63,7308.06,7316.41 +7311.6,7311.6,7225.35,7261.19 +7261.19,7280.0,7202.86,7274.01 +7274.01,7277.69,7136.73,7167.01 +7167.01,7167.01,7001.01,7101.0 +7101.0,7104.84,6900.73,6949.89 +6949.88,7100.0,6949.0,7096.08 +7096.12,7157.75,7075.0,7120.0 +7120.01,7139.99,7060.0,7127.32 +7127.32,7181.07,6983.0,7012.38 +7012.38,7035.0,6950.0,7034.99 +7035.0,7100.0,7000.0,7100.0 +7100.0,7130.0,7050.0,7055.03 +7055.03,7099.0,7024.53,7099.0 +7099.0,7170.0,7089.02,7146.62 +7146.62,7219.97,7123.05,7206.64 +7206.64,7224.98,7114.23,7152.94 +7152.94,7198.0,7100.0,7162.11 +7162.1,7187.01,7160.77,7185.92 +7186.07,7227.0,7175.94,7207.95 +7207.96,7229.98,7175.94,7175.95 +7175.95,7192.99,7175.01,7185.01 +7185.01,7210.0,7181.8,7200.01 +7203.01,7232.84,7160.01,7170.48 +7170.63,7170.63,7038.67,7058.83 +7058.83,7087.56,6980.0,7025.0 +7025.0,7069.99,7024.0,7062.0 +7062.0,7062.0,7005.0,7013.0 +7013.0,7105.0,7004.05,7089.17 +7089.17,7130.0,7075.01,7113.79 +7113.79,7134.9,7056.0,7076.8 +7076.81,7076.81,7010.0,7042.25 +7042.24,7085.0,7040.15,7083.7 +7083.37,7098.19,7055.0,7098.19 +7098.19,7133.23,7089.99,7096.99 +7096.99,7126.99,7090.0,7108.06 +7108.06,7346.0,7108.06,7291.99 +7291.99,7365.23,7270.73,7361.99 +7361.99,7387.57,7330.5,7341.72 +7341.72,7368.99,7290.0,7354.0 +7354.0,7399.0,7338.98,7396.48 +7396.49,7430.8,7362.32,7412.01 +7412.01,7412.01,7337.0,7348.9 +7348.91,7401.0,7348.9,7393.61 +7392.85,7398.69,7342.84,7382.05 +7382.04,7400.0,7360.3,7400.0 +7400.0,7474.74,7394.19,7464.14 +7464.14,7500.0,7454.86,7455.03 +7455.03,7499.01,7437.0,7462.2 +7462.2,7550.0,7462.2,7501.0 +7501.0,7524.56,7440.0,7440.0 +7440.01,7488.0,7435.0,7487.01 +7487.01,7898.0,7483.74,7732.95 +7732.94,7732.95,7031.66,7236.99 +7235.74,7402.57,7150.0,7202.09 +7193.02,7335.0,7165.0,7269.41 +7260.0,7349.0,7250.0,7314.6 +7314.6,7441.71,7312.82,7357.34 +7354.11,7489.0,7354.08,7427.84 +7425.51,7448.5,7310.17,7351.8 +7351.8,7418.88,7290.0,7414.78 +7414.79,7470.01,7367.36,7413.22 +7413.22,7424.07,7340.0,7358.3 +7363.35,7368.8,7305.0,7358.01 +7358.01,7436.57,7351.01,7369.35 +7369.35,7399.99,7355.0,7368.54 +7364.86,7396.85,7350.0,7396.85 +7396.97,7409.0,7201.48,7206.0 +7204.9,7265.0,7187.0,7243.57 +7243.57,7245.33,7186.0,7201.86 +7201.86,7203.49,7089.0,7089.24 +7089.24,7218.18,7079.0,7201.23 +7201.23,7205.0,7130.0,7175.0 +7174.99,7240.0,7171.0,7212.26 +7212.24,7223.5,7145.0,7157.58 +7157.58,7193.0,7151.2,7180.0 +7180.0,7193.0,7167.9,7190.0 +7190.0,7240.21,7180.0,7188.01 +7188.01,7197.9,7153.0,7175.0 +7175.0,7208.41,7165.01,7170.3 +7170.31,7172.0,7105.0,7129.45 +7129.45,7159.0,7115.0,7115.01 +7115.01,7184.81,7094.0,7184.81 +7184.81,7350.0,7153.8,7278.81 +7278.82,7310.0,7257.5,7262.95 +7262.96,7301.86,7260.0,7260.01 +7260.01,7298.0,7260.0,7280.0 +7280.0,7320.0,7279.99,7303.18 +7303.18,7311.99,7215.0,7215.01 +7215.01,7240.0,7206.0,7235.01 +7235.01,7237.49,7153.43,7185.04 +7185.04,7223.1,7158.81,7205.91 +7205.9,7211.0,7115.0,7135.27 +7135.26,7139.99,7100.0,7100.0 +7100.01,7100.02,6801.0,6807.0 +6806.99,6942.55,6735.0,6795.46 +6795.46,6879.09,6750.02,6840.01 +6840.01,6870.0,6764.0,6765.73 +6765.74,6899.8,6760.0,6893.27 +6886.87,6949.99,6830.42,6830.42 +6830.42,6847.76,6634.9,6650.98 +6650.98,6669.89,6460.71,6571.0 +6571.0,6665.08,6533.97,6574.02 +6574.0,6590.0,6426.0,6567.34 +6566.99,6674.32,6510.11,6634.99 +6635.0,6743.03,6634.99,6644.2 +6644.2,6659.95,6565.0,6575.0 +6575.0,6790.0,6575.0,6750.39 +6755.26,6894.99,6745.0,6865.0 +6865.0,6865.5,6781.01,6853.57 +6853.51,6853.51,6766.02,6791.7 +6791.7,6834.99,6771.5,6834.98 +6834.99,6834.99,6712.0,6742.43 +6742.45,6764.76,6730.01,6741.29 +6741.29,6741.29,6650.31,6700.0 +6699.99,6785.0,6699.98,6751.31 +6743.31,6756.09,6710.01,6724.58 +6724.58,6753.92,6650.0,6650.01 +6650.01,6650.01,6500.0,6500.0 +6500.0,6500.01,6320.0,6320.0 +6320.01,6536.51,6259.0,6499.08 +6494.0,6518.0,6346.17,6351.0 +6351.0,6431.92,6322.0,6365.8 +6365.8,6473.81,6365.8,6388.72 +6389.07,6400.01,6350.0,6367.17 +6367.18,6387.0,6201.01,6205.03 +6205.03,6385.0,6205.0,6347.98 +6347.98,6444.87,6258.7,6410.13 +6410.13,6486.0,6358.88,6445.01 +6445.01,6445.01,6300.57,6300.58 +6300.58,6385.28,6269.1,6315.63 +6315.65,6330.0,6231.0,6264.87 +6264.87,6326.01,6215.0,6215.0 +6215.01,6299.0,6201.0,6221.04 +6221.04,6226.29,6050.0,6122.99 +6123.0,6123.0,5878.98,5880.07 +5880.08,5980.0,5611.0,5751.09 +5751.09,5886.67,5511.11,5840.42 +5840.4,6236.85,5787.12,6201.07 +6201.07,6485.67,6110.0,6110.89 +6110.0,6289.99,6000.0,6185.01 +6189.0,6398.87,6165.01,6361.0 +6361.0,6486.0,6257.0,6261.52 +6261.36,6354.05,6100.0,6100.0 +6100.0,6228.3,5950.0,6138.4 +6138.34,6223.32,6073.68,6155.01 +6155.01,6302.0,6131.78,6245.02 +6245.01,6245.01,6100.01,6110.0 +6110.14,6166.7,6050.11,6080.0 +6080.0,6186.21,6055.01,6154.9 +6154.9,6160.0,6000.0,6081.99 +6081.99,6110.0,5862.21,5862.99 +5863.0,5949.0,5820.0,5831.38 +5831.38,5849.99,5702.12,5740.0 +5740.0,5949.0,5652.8,5948.02 +5948.51,6053.97,5885.17,5957.3 +5957.3,5995.0,5850.0,5915.0 +5915.0,5980.18,5862.57,5977.55 +5977.55,6080.73,5910.0,5983.23 +5983.23,6099.0,5981.0,6094.26 +6094.26,6298.32,6075.01,6285.0 +6285.0,6343.87,6218.07,6284.33 +6280.0,6314.28,6200.0,6260.03 +6260.03,6342.51,6250.12,6280.0 +6280.0,6437.21,6278.59,6437.21 +6437.21,6459.0,6340.71,6459.0 +6459.0,6586.57,6459.0,6545.37 +6545.37,6790.0,6523.01,6769.99 +6770.0,6841.45,6605.0,6649.96 +6649.96,6650.0,6500.0,6553.01 +6553.01,6720.63,6553.0,6672.0 +6672.01,6690.0,6425.0,6428.0 +6428.0,6564.36,6405.01,6447.34 +6447.39,6450.69,6312.0,6341.87 +6341.87,6533.0,6341.87,6450.01 +6450.02,6600.0,6370.99,6581.74 +6581.73,6601.99,6490.0,6490.01 +6490.0,6515.0,6451.02,6451.03 +6451.03,6574.0,6450.49,6564.0 +6564.0,6699.99,6544.99,6670.0 +6670.01,6696.99,6600.0,6648.91 +6648.91,6686.2,6610.0,6679.21 +6679.21,6748.0,6634.56,6635.02 +6635.01,6690.0,6580.0,6632.6 +6632.6,6632.6,6551.2,6621.0 +6620.99,6630.0,6575.0,6585.0 +6585.0,6600.0,6569.35,6579.97 +6579.97,6599.99,6464.64,6507.97 +6507.94,6630.0,6501.08,6627.03 +6627.03,6639.45,6582.49,6609.01 +6609.01,6609.01,6511.99,6515.1 +6515.1,6557.94,6505.0,6534.01 +6534.01,6558.0,6520.05,6557.51 +6557.51,6609.99,6549.99,6606.06 +6605.87,6610.0,6547.94,6561.16 +6561.21,6599.99,6550.0,6588.84 +6588.84,6599.8,6560.0,6560.01 +6560.01,6587.5,6530.0,6559.99 +6559.99,6599.99,6546.48,6599.0 +6599.0,6648.71,6598.99,6612.0 +6612.0,6630.0,6575.0,6587.0 +6587.0,6619.0,6555.0,6564.1 +6564.1,6639.68,6559.84,6639.68 +6639.71,6763.9,6639.71,6755.0 +6754.99,6798.5,6736.78,6791.68 +6791.68,6923.0,6779.9,6880.01 +6880.01,6884.85,6815.01,6870.01 +6870.01,6870.01,6832.5,6844.95 +6844.95,6880.01,6844.95,6852.01 +6852.01,6897.0,6852.0,6896.92 +6896.92,6970.0,6896.91,6934.91 +6934.91,6964.99,6934.9,6964.99 +6964.99,6974.0,6903.74,6905.82 +6905.83,6989.98,6905.82,6989.98 +6989.98,7170.94,6989.94,7170.93 +7170.93,7274.0,7107.01,7235.51 +7235.5,7235.51,7131.97,7225.0 +7225.0,7272.91,7160.0,7245.99 +7246.77,7270.0,7182.0,7223.01 +7233.22,7244.77,7101.01,7204.38 +7204.37,7210.0,7156.04,7174.6 +7174.6,7176.88,7125.0,7146.0 +7146.0,7244.99,7140.02,7230.0 +7230.0,7349.0,7225.0,7261.16 +7261.16,7310.19,7235.03,7292.61 +7292.61,7323.0,7261.07,7261.11 +7261.11,7294.0,7206.3,7280.01 +7280.01,7280.01,7204.15,7213.99 +7213.99,7224.6,7130.0,7163.23 +7163.23,7235.0,7131.25,7180.01 +7180.0,7264.0,7176.26,7249.99 +7249.99,7250.0,7201.0,7204.0 +7204.01,7239.99,7175.0,7236.23 +7236.23,7279.88,7225.91,7260.31 +7260.31,7400.0,7257.03,7399.01 +7399.01,7436.38,7352.99,7434.0 +7434.0,7469.69,7420.01,7469.69 +7469.69,7500.0,7455.02,7492.36 +7492.36,7492.36,7370.0,7432.0 +7432.01,7474.16,7418.7,7439.1 +7439.1,7450.75,7381.41,7420.01 +7420.01,7489.99,7411.0,7474.99 +7475.0,7489.9,7450.0,7473.47 +7473.3,7474.99,7440.0,7470.02 +7470.02,7700.0,7470.0,7659.01 +7659.01,7830.0,7659.0,7790.0 +7790.0,7819.97,7660.0,7729.99 +7730.0,7766.0,7682.01,7739.9 +7739.9,7945.05,7739.9,7945.04 +7945.4,7985.37,7700.0,7814.83 +7814.83,7905.0,7790.0,7889.23 +7889.22,7979.99,7868.02,7950.0 +7950.0,7988.5,7821.0,7821.01 +7821.01,7939.0,7784.41,7913.99 +7914.0,7975.0,7911.0,7920.04 +7920.03,7946.5,7874.51,7875.01 +7875.01,7919.99,7821.13,7919.99 +7919.99,7919.99,7850.0,7850.02 +7850.03,7850.03,7536.0,7591.94 +7591.94,7799.99,7591.93,7799.99 +7799.99,7838.0,7700.0,7787.85 +7787.85,7896.93,7787.85,7895.17 +7888.89,7895.5,7815.4,7861.0 +7861.0,7899.99,7746.0,7848.0 +7848.0,7875.5,7800.0,7859.41 +7859.41,7940.25,7828.0,7935.0 +7935.0,7974.88,7911.77,7963.03 +7963.02,7969.0,7865.0,7880.01 +7880.01,7898.9,7807.0,7817.0 +7817.0,7875.1,7817.0,7841.0 +7841.0,7850.0,7776.11,7815.0 +7815.0,7816.01,7640.0,7700.0 +7700.0,7725.0,7585.0,7718.53 +7718.01,7797.0,7690.2,7737.8 +7737.81,7775.0,7655.32,7661.49 +7661.5,7693.78,7575.0,7627.99 +7628.0,7655.0,7510.0,7511.01 +7511.01,7618.0,7502.0,7561.81 +7573.31,7679.99,7551.9,7605.99 +7606.0,7790.5,7600.0,7749.5 +7749.5,7769.89,7702.8,7717.24 +7717.19,7725.0,7645.06,7649.01 +7649.01,7748.13,7649.0,7730.03 +7730.03,7800.0,7721.78,7773.91 +7773.91,7799.99,7773.87,7785.54 +7785.54,7785.54,7720.86,7728.49 +7728.5,7793.31,7728.49,7772.14 +7772.14,7780.0,7671.33,7733.0 +7733.0,7750.0,7660.0,7678.01 +7678.01,7718.0,7665.0,7695.13 +7695.12,7700.05,7655.0,7665.0 +7663.01,7697.95,7658.95,7675.06 +7675.06,7758.0,7675.06,7742.01 +7742.01,7774.95,7723.47,7770.0 +7770.0,7770.39,7740.1,7770.39 +7770.39,7775.0,7750.0,7765.38 +7765.38,7847.98,7765.38,7820.0 +7820.0,7829.88,7801.0,7820.94 +7820.95,7820.95,7752.5,7764.1 +7764.11,7790.0,7750.99,7769.43 +7769.43,7816.1,7769.42,7813.96 +7813.96,7817.0,7800.02,7807.79 +7807.79,7818.85,7789.53,7814.45 +7814.46,7816.0,7760.66,7760.66 +7760.67,7785.2,7754.0,7776.22 +7776.02,7794.21,7760.2,7760.21 +7760.21,7760.21,7700.0,7705.06 +7705.06,7751.72,7705.06,7751.72 +7751.72,7774.99,7744.66,7774.99 +7774.98,7775.0,7754.48,7775.0 +7775.0,7780.0,7730.0,7758.44 +7758.44,7758.44,7721.0,7725.01 +7725.01,7809.99,7725.0,7809.98 +7809.98,7809.99,7772.19,7785.01 +7785.01,7785.01,7740.49,7759.99 +7759.99,7804.7,7759.99,7804.7 +7804.7,8059.99,7804.69,8004.14 +8004.14,8060.0,7950.0,7975.33 +7975.33,8048.0,7975.32,8035.79 +8035.78,8098.62,8033.37,8041.0 +8041.0,8069.0,8033.05,8033.05 +8033.06,8033.06,7960.01,8000.03 +8000.03,8049.99,8000.0,8044.99 +8044.99,8049.97,8028.0,8049.5 +8049.49,8072.41,8014.0,8027.02 +8027.02,8027.02,7981.0,7990.0 +7990.0,7997.0,7969.0,7994.0 +7994.01,8027.02,7985.0,8022.85 +8022.86,8022.86,7986.58,8001.01 +8001.01,8025.0,7991.13,8025.0 +8025.0,8036.99,8012.21,8035.0 +8035.0,8062.01,8035.0,8061.99 +8061.99,8061.99,8035.0,8048.36 +8048.36,8050.0,8041.8,8050.0 +8050.0,8074.0,8050.0,8074.0 +8074.0,8147.0,8073.99,8143.16 +8143.17,8174.0,8140.8,8169.99 +8169.99,8263.49,8169.98,8250.01 +8250.0,8250.01,8183.14,8224.99 +8225.0,8254.5,8224.99,8247.11 +8247.11,8292.93,8247.11,8274.63 +8274.63,8274.63,8200.0,8215.7 +8215.7,8249.97,8210.0,8210.0 +8210.01,8249.0,8188.88,8249.0 +8249.0,8279.99,8230.0,8279.99 +8279.99,8284.8,8243.88,8284.0 +8284.0,8293.25,8252.27,8265.21 +8265.21,8274.93,8250.0,8259.99 +8259.98,8269.98,8259.0,8264.51 +8264.51,8264.51,8051.06,8051.06 +8051.07,8120.0,7802.99,7934.05 +7934.05,8019.87,7826.24,7918.9 +7918.9,8118.97,7889.22,8104.96 +8104.95,8149.99,8066.0,8094.0 +8094.0,8174.0,8090.01,8174.0 +8174.0,8228.0,8174.0,8200.01 +8200.01,8220.0,8155.2,8210.2 +8210.2,8219.0,8184.53,8186.4 +8186.4,8237.0,8185.24,8224.53 +8224.53,8250.0,8213.0,8230.01 +8230.0,8248.5,8219.99,8232.46 +8232.46,8340.0,8232.45,8319.0 +8319.0,8375.0,8319.0,8326.46 +8326.46,8344.11,8265.01,8314.0 +8313.99,8330.0,8284.22,8305.0 +8305.0,8315.0,8262.0,8280.0 +8280.0,8280.0,8029.0,8146.0 +8146.0,8247.0,8117.01,8225.0 +8225.0,8264.04,8120.0,8142.59 +8142.59,8160.0,8000.45,8106.02 +8106.02,8144.94,8050.65,8130.0 +8130.0,8196.26,8109.0,8110.24 +8110.24,8185.0,8103.13,8181.63 +8181.62,8188.0,8107.95,8176.73 +8176.73,8215.0,8158.04,8193.57 +8193.57,8193.57,8125.0,8177.67 +8177.47,8177.47,8150.0,8152.81 +8152.81,8227.0,8152.8,8227.0 +8227.0,8256.0,8221.99,8256.0 +8256.0,8296.01,8255.99,8296.01 +8296.01,8296.69,8241.0,8264.96 +8264.96,8298.98,8264.95,8297.95 +8297.95,8298.98,8250.7,8254.78 +8254.78,8280.0,8230.0,8251.47 +8251.48,8265.54,8188.04,8194.46 +8194.46,8240.0,8149.68,8205.5 +8205.5,8250.0,8205.49,8234.98 +8234.98,8235.0,8175.0,8217.0 +8217.0,8220.0,8110.49,8114.93 +8114.93,8174.99,8114.0,8162.11 +8162.1,8198.5,8157.17,8193.01 +8193.01,8199.92,8182.93,8199.92 +8199.92,8235.99,8188.99,8235.99 +8235.99,8275.0,8235.99,8275.0 +8275.0,8285.36,8225.0,8259.65 +8257.18,8274.98,8215.0,8245.35 +8245.35,8245.35,8200.02,8207.0 +8206.72,8244.0,8206.72,8223.01 +8223.01,8229.0,8188.0,8210.5 +8210.51,8243.24,8199.99,8243.24 +8243.24,8262.12,8240.0,8251.31 +8251.32,8260.0,8235.0,8256.0 +8256.0,8256.0,8160.7,8160.7 +8160.68,8214.39,8159.0,8184.31 +8184.31,8190.13,8177.0,8177.01 +8177.01,8177.01,8104.0,8133.94 +8133.95,8175.0,8103.0,8174.97 +8174.97,8191.17,8140.0,8184.86 +8184.86,8235.0,8184.86,8206.37 +8206.37,8215.44,8185.1,8189.99 +8190.0,8209.0,8170.0,8171.54 +8171.55,8195.5,8171.54,8176.02 +8176.02,8176.02,8150.0,8171.0 +8171.01,8171.01,8152.0,8159.0 +8159.0,8170.6,8151.77,8160.01 +8160.01,8186.69,8155.0,8186.68 +8186.68,8186.68,8170.5,8174.97 +8174.97,8177.7,8150.0,8150.0 +8150.01,8150.01,8015.0,8050.02 +8053.56,8110.0,8011.11,8011.11 +8011.12,8070.05,7900.0,8040.06 +8040.08,8147.0,8040.07,8147.0 +8147.0,8149.99,8089.99,8090.98 +8090.98,8090.98,8051.51,8090.01 +8090.01,8137.0,8090.0,8137.0 +8137.0,8198.56,8135.16,8177.0 +8177.0,8286.03,8160.26,8286.03 +8286.03,8324.0,8206.07,8206.91 +8224.8,8224.8,8108.48,8200.06 +8200.06,8213.26,8165.73,8195.02 +8195.01,8260.0,8195.01,8259.99 +8258.99,8260.03,8210.0,8210.0 +8210.01,8223.99,8205.0,8223.51 +8223.52,8223.52,8179.15,8186.53 +8186.53,8210.0,8176.0,8187.28 +8184.81,8200.0,8175.0,8199.99 +8200.0,8239.99,8199.99,8229.98 +8229.99,8298.0,8229.98,8277.0 +8277.0,8291.1,8205.0,8229.0 +8229.0,8250.0,8205.0,8231.63 +8232.71,8286.99,8232.7,8274.01 +8274.01,8285.25,8274.0,8276.99 +8276.99,8277.0,8214.0,8214.99 +8215.0,8240.0,8214.55,8219.5 +8219.51,8219.51,8203.98,8217.92 +8217.92,8256.21,8210.0,8236.92 +8236.91,8256.97,8223.56,8240.0 +8239.99,8269.42,8235.01,8262.31 +8262.31,8264.99,8240.0,8262.92 +8262.92,8268.43,8248.96,8259.99 +8259.99,8346.06,8259.98,8346.06 +8346.06,8446.0,8346.06,8420.1 +8420.1,8488.0,8420.09,8461.41 +8461.41,8484.0,8403.4,8415.78 +8415.79,8477.95,8415.7,8477.95 +8477.95,8640.0,8471.41,8600.0 +8600.01,8650.88,8600.0,8622.15 +8629.1,8639.55,8570.83,8589.14 +8589.14,8666.0,8580.06,8662.18 +8655.37,8750.0,8655.05,8727.37 +8727.37,8750.0,8692.94,8749.98 +8749.99,8749.99,8650.99,8690.01 +8690.01,8725.0,8679.25,8725.0 +8725.0,8742.78,8724.99,8735.38 +8735.38,8743.02,8715.02,8741.61 +8741.61,8775.22,8715.0,8759.99 +8759.99,8799.0,8742.0,8799.0 +8799.0,8948.0,8798.99,8860.0 +8860.0,8912.98,8826.0,8911.0 +8911.0,8961.25,8880.0,8895.03 +8895.03,8926.0,8895.02,8925.99 +8926.0,9100.0,8925.99,9085.02 +9085.02,9086.0,8950.0,9084.5 +9084.5,9196.0,9084.5,9195.93 +9195.93,9197.8,9070.05,9140.66 +9140.66,9170.0,8926.01,8960.64 +8960.64,9000.0,8911.58,8926.21 +8926.21,9040.0,8910.0,9040.0 +9040.0,9098.0,9040.0,9077.02 +9077.02,9079.96,9015.0,9055.61 +9055.61,9105.0,9050.0,9097.09 +9097.09,9100.0,9039.0,9040.0 +9040.0,9199.99,9040.0,9199.99 +9199.99,9384.0,9142.74,9384.0 +9384.0,9495.0,9329.86,9443.2 +9443.21,9596.0,9436.0,9595.39 +9595.4,9595.4,9151.97,9471.1 +9471.1,9471.1,9350.0,9373.87 +9373.87,9449.98,9326.0,9449.98 +9449.98,9455.03,9400.0,9400.01 +9400.01,9439.25,9362.07,9438.49 +9438.49,9589.0,9401.01,9589.0 +9589.0,9725.0,9564.8,9696.92 +9696.92,9749.0,9550.0,9649.0 +9649.0,9680.0,9648.99,9679.89 +9679.89,9746.53,9667.39,9682.63 +9682.63,9710.0,9633.7,9700.0 +9700.01,9731.98,9685.91,9711.0 +9711.0,9749.49,9705.0,9737.12 +9737.12,9774.0,9725.09,9725.1 +9725.1,9725.1,9525.0,9725.0 +9725.0,9775.0,9708.55,9764.98 +9764.98,9788.0,9701.07,9788.0 +9788.0,9795.0,9711.23,9762.02 +9762.03,9772.33,9680.0,9724.99 +9724.99,9724.99,9687.19,9700.02 +9700.02,9718.58,9660.07,9677.92 +9677.92,9677.92,9552.0,9560.04 +9560.05,9620.0,9438.02,9620.0 +9620.0,9648.99,9568.16,9574.96 +9574.96,9600.0,9550.0,9567.01 +9567.0,9641.1,9567.0,9639.0 +9639.0,9675.0,9638.99,9661.0 +9661.01,9699.99,9630.01,9699.99 +9699.99,9774.99,9699.98,9774.99 +9774.99,9780.0,9705.99,9749.0 +9749.0,9772.21,9730.01,9761.17 +9761.17,9764.8,9708.82,9708.82 +9708.83,9750.0,9708.82,9750.0 +9750.0,9845.0,9726.01,9845.0 +9845.0,9900.0,9826.0,9900.0 +9900.0,9939.98,9858.03,9919.92 +9919.92,9937.6,9881.0,9916.8 +9916.8,9916.8,9851.0,9898.99 +9898.98,9929.89,9881.0,9881.01 +9881.01,9924.0,9881.01,9923.79 +9923.79,9950.0,9923.78,9950.0 +9950.0,9967.0,9905.0,9956.1 +9956.01,9956.02,9840.0,9929.99 +9930.0,9949.95,9926.43,9949.0 +9949.0,9949.0,9900.0,9939.49 +9939.49,9940.0,9910.0,9938.93 +9938.93,9969.0,9923.01,9969.0 +9969.0,9989.95,9968.99,9989.88 +9989.87,9989.89,9901.0,9985.01 +9985.01,9985.01,9925.01,9925.02 +9925.02,9974.0,9925.0,9968.8 +9968.79,9974.86,9940.0,9950.0 +9950.0,9968.0,9941.0,9948.0 +9948.0,9969.0,9948.0,9969.0 +9969.1,10098.99,9969.1,10083.31 +10083.31,10248.0,10061.0,10238.99 +10239.0,10399.99,10185.43,10290.04 +10290.04,10658.0,10275.0,10581.41 +10581.41,10928.47,10032.0,10349.98 +10349.99,10599.98,10311.0,10475.97 +10475.97,10650.0,10351.07,10650.0 +10650.0,10748.0,10601.0,10730.59 +10739.7,10874.05,10710.0,10873.99 +10874.0,10946.11,10723.67,10945.0 +10945.0,10948.0,10805.01,10936.8 +10936.79,10984.0,10900.0,10954.99 +10956.0,11333.33,10949.99,11333.33 +11333.33,11485.0,11200.0,11250.0 +11250.0,11375.0,10450.0,11026.105 +11026.11,11194.0,10740.0,10802.21 +10802.22,10976.61,10510.0,10714.87 +10714.87,10831.0,10250.05,10289.99 +10289.98,10486.9,8595.55,9894.95 +9894.97,10200.0,9525.0,9799.45 +9799.45,10399.99,9667.79,10399.99 +10399.99,10415.0,9850.0,10011.11 +10011.11,10079.07,9720.27,9826.99 +9827.0,10145.0,9814.0,10144.0 +10144.77,10494.0,10108.03,10430.0 +10430.0,10650.0,10300.01,10616.0 +10615.99,10850.0,10510.0,10690.01 +10686.01,10790.0,10620.08,10682.24 +10685.0,10700.0,10300.0,10349.89 +10349.89,10360.0,9945.0,10250.01 +10250.01,10430.41,10246.84,10424.0 +10424.0,10459.0,10282.99,10369.15 +10369.15,10370.0,10152.0,10285.3 +10285.3,10314.69,9709.99,9889.99 +9890.0,10190.52,9750.0,9864.51 +9864.53,10209.67,9864.53,9900.0 +9949.53,9995.0,9200.0,9201.99 +9201.0,9600.0,9135.6,9501.0 +9500.99,9501.0,9210.0,9470.01 +9469.83,9665.0,9353.0,9427.61 +9427.61,9780.0,9371.0,9751.0 +9751.0,9900.0,9673.26,9770.07 +9770.07,10077.97,9770.06,9815.0 +9825.0,9841.0,9425.0,9545.99 +9545.99,9795.0,9545.98,9691.33 +9691.34,9943.75,9687.64,9900.0 +9900.0,10099.0,9845.62,9982.71 +9982.71,10062.06,9720.0,9775.5 +9782.58,9890.01,9700.0,9701.01 +9701.0,9798.99,9572.43,9772.75 +9763.99,9763.99,9628.59,9650.01 +9650.0,9876.32,9650.0,9761.0 +9760.99,9783.68,9517.0,9629.0 +9628.99,9650.0,9540.45,9627.0 +9626.994999999999,9625.0,9540.46,9625.0 +9625.0,9839.99,9600.0,9782.1 +9782.1,9996.68,9753.62,9964.74 +9964.75,9965.0,9775.0,9850.4 +9850.4,10000.0,9842.01,10000.0 +10000.0,10242.16,9999.99,10230.0 +10230.0,10710.01,10229.99,10547.99 +10548.0,10700.0,10401.0,10537.97 +10537.91,10549.99,10430.17,10511.0 +10511.0,10678.94,10470.0,10522.59 +10521.38,10550.01,10411.01,10464.73 +10465.96,10520.0,10427.5,10465.0 +10466.0,10600.0,10463.99,10570.0 +10570.0,10799.96,10569.99,10735.0 +10735.0,10937.0,10734.99,10865.67 +10865.65,10934.78,10780.0,10829.0 +10828.99,10890.0,10722.0,10867.0 +10867.0,10957.0,10866.99,10946.99 +10947.0,11089.98,10946.99,11026.0 +11026.0,11060.0,10910.0,10976.01 +10976.01,11023.0,10930.0,10950.0 +10950.0,10950.0,10701.0,10824.66 +10824.66,10985.0,10755.0,10955.0 +10955.0,10956.03,10830.04,10843.52 +10843.51,10989.0,10822.81,10920.0 +10937.18,11025.0,10909.06,11025.0 +11025.0,11100.0,11024.99,11099.99 +11100.0,11100.0,11065.82,11090.0 +11090.0,11100.0,10905.0,11010.0 +11010.0,11094.5,10961.42,11030.26 +11030.26,11100.0,10988.0,11084.99 +11084.99,11087.91,10752.0,10930.0 +10930.01,10972.3,10765.02,10822.21 +10822.21,10875.95,10784.0,10870.0 +10870.0,10960.0,10869.99,10960.0 +10960.0,10996.0,10901.0,10910.94 +10910.94,10971.0,10910.93,10945.29 +10945.29,10996.99,10933.0,10996.99 +10996.99,11050.0,10960.0,11020.01 +11020.01,11020.01,10981.27,10999.0 +10999.0,11006.99,10902.0,10959.99 +10959.99,10985.0,10851.81,10899.99 +10900.0,10929.94,10865.0,10912.38 +10912.38,10950.0,10910.0,10910.0 +10910.01,11019.0,10908.01,11019.0 +11019.18,11090.97,10978.2,11057.99 +11057.99,11090.95,11029.99,11052.72 +11052.72,11106.49,10977.0,11106.49 +11106.49,11190.98,11106.48,11177.97 +11177.97,11196.95,11109.51,11157.83 +11157.83,11174.96,11111.0,11160.1 +11160.1,11190.0,11122.22,11154.19 +11154.13,11622.0,11154.11,11621.99 +11622.0,11699.99,11345.01,11694.09 +11694.09,11699.99,11614.48,11680.0 +11680.0,11680.0,11600.0,11680.0 +11680.0,11798.5,11679.99,11749.01 +11749.01,11799.99,11665.46,11747.11 +11747.11,11771.12,11725.0,11725.01 +11725.01,11780.0,11724.0,11780.0 +11780.0,11782.0,11746.2,11782.0 +11782.0,11891.0,11226.23,11457.04 +11457.04,11490.0,10800.0,10806.0 +10806.0,11450.0,10601.0,11289.0 +11289.0,11383.12,11101.01,11300.0 +11300.0,11482.0,11250.0,11460.05 +11460.05,11510.0,11379.67,11399.01 +11399.01,11399.01,11250.0,11369.13 +11369.13,11521.0,11307.37,11504.62 +11504.63,11521.65,11447.08,11515.0 +11515.0,11519.0,11365.0,11486.43 +11486.42,11486.43,11370.0,11412.9 +11412.65,11589.98,11380.01,11544.92 +11544.92,11565.0,11450.0,11542.58 +11542.58,11560.0,11209.3,11300.0 +11300.0,11387.11,11252.32,11370.0 +11370.0,11389.82,11190.0,11249.97 +11249.97,11340.0,11125.0,11136.76 +11130.0,11349.0,10950.0,11289.91 +11289.91,11476.39,11289.91,11458.0 +11457.99,11458.0,11271.0,11368.97 +11368.96,11371.97,11281.01,11300.0 +11300.0,11370.0,11300.0,11309.99 +11309.99,11318.0,11212.0,11309.59 +11309.59,11393.99,11283.0,11393.99 +11393.99,11549.0,11381.46,11549.0 +11549.0,11550.0,11480.0,11516.16 +11516.17,11525.99,11500.0,11524.99 +11524.99,11680.0,11515.0,11635.38 +11635.37,11649.99,11553.0,11620.0 +11620.0,11625.0,11575.99,11597.28 +11597.28,11683.0,11532.0,11612.66 +11612.65,11643.0,11552.5,11641.18 +11641.17,11641.17,11545.99,11573.72 +11573.72,11630.0,11573.71,11603.41 +11603.42,11646.0,11603.42,11646.0 +11645.99,11795.0,11612.47,11795.0 +11795.0,11796.36,11738.01,11789.03 +11789.03,11797.0,11626.0,11626.0 +11626.01,11690.0,11550.0,11690.0 +11689.99,11733.33,11639.84,11675.69 +11675.68,11793.14,11675.68,11793.14 +11793.14,11875.0,11761.11,11790.09 +11790.09,11859.0,11786.26,11801.71 +11801.71,11850.0,11712.87,11759.85 +11759.85,11769.99,11651.01,11719.75 +11719.76,11840.0,11719.75,11790.01 +11790.0,11823.0,11785.0,11823.0 +11822.99,11825.0,11791.0,11810.0 +11810.0,11823.2,11782.03,11809.0 +11808.99,11810.11,11779.0,11799.5 +11799.5,11800.0,11710.8,11780.06 +11780.07,11780.07,11713.0,11760.0 +11760.0,11874.99,11759.99,11874.98 +11874.99,11978.0,11867.5,11972.0 +11972.0,12244.88,11957.99,12223.96 +12223.97,12300.0,12090.0,12275.01 +12275.0,12275.0,12152.03,12214.89 +12214.9,12350.0,12204.01,12350.0 +12350.99,12499.0,12332.87,12499.0 +12499.0,12540.0,12354.99,12414.78 +12414.79,12599.01,12410.87,12599.01 +12599.01,12731.19,12599.01,12712.98 +12712.98,12947.0,12657.52,12679.91 +12664.97,12900.0,12313.37,12788.75 +12788.74,12864.0,12762.75,12837.9 +12837.9,12894.01,12810.0,12873.99 +12873.99,12929.66,12864.0,12864.41 +12864.41,12931.28,12510.0,12599.99 +12600.0,12849.95,12599.99,12837.79 +12837.8,12882.0,12816.64,12825.02 +12825.02,12989.85,12825.01,12988.97 +12988.97,13400.0,12932.59,13324.48 +13324.47,13473.35,13125.0,13454.99 +13454.45,13475.0,13404.06,13470.0 +13470.0,14425.0,13470.0,14186.86 +14186.86,14200.0,13750.0,14200.0 +14200.0,14400.0,14126.02,14344.78 +14344.78,14400.0,14210.0,14231.01 +14238.0,14319.07,13500.0,14059.99 +14060.0,14250.0,13841.93,13989.0 +13989.0,14374.01,13988.99,14374.01 +14374.01,14399.99,14206.0,14397.89 +14397.89,14499.89,14300.0,14414.0 +14414.99,14533.0,14414.0,14533.0 +14533.0,14900.0,14533.0,14839.72 +14839.71,15100.11,14802.81,15100.11 +15100.11,15699.0,15020.0,15489.82 +15489.64,15898.0,14580.0,15140.0 +15140.0,15450.0,15000.0,15340.01 +15340.01,15884.56,15340.0,15884.56 +15877.05,16295.0,15720.0,16286.01 +16286.01,16990.0,16150.0,16989.99 +16990.0,19697.0,15101.0,16914.49 +16914.5,17294.99,15100.0,16838.99 +16839.0,17869.99,16500.0,16699.99 +16699.99,16699.99,15305.0,16010.12 +16010.12,16474.99,15735.01,16362.99 +16362.98,16890.0,16362.98,16848.75 +16849.0,17240.0,16801.0,17020.0 +17020.0,17430.01,16800.0,17424.0 +17423.98,17650.0,17311.0,17541.72 +17541.72,17777.69,17167.85,17326.5 +17326.49,17481.16,16777.0,17283.01 +17283.0,17283.01,16090.0,17000.0 +17000.0,17096.0,15577.0,15860.29 +15860.3,16347.04,15142.42,15999.98 +15999.98,16721.0,15650.0,16559.0 +16553.0,16945.0,16202.12,16514.99 +16514.99,16720.0,15750.0,16092.71 +16092.7,16366.98,15460.0,15959.93 +15959.91,15999.0,15209.09,15378.35 +15378.35,15700.0,13788.99,15587.79 +15576.76,15745.56,15042.57,15180.61 +15180.61,15599.87,14760.0,15470.0 +15469.98,16711.31,15457.0,16430.0 +16433.35,16433.35,15750.0,16171.85 +16171.84,16200.0,15300.0,15555.3 +15550.59,15799.99,15200.01,15459.78 +15469.99,15700.0,15250.0,15699.99 +15699.99,15958.19,15514.3,15717.19 +15712.32,15774.09,15525.0,15707.21 +15707.21,16435.0,15707.21,16435.0 +16435.0,16469.0,16107.0,16350.0 +16350.0,16492.0,16185.42,16424.0 +16424.0,16499.0,16215.0,16292.79 +16292.79,16299.99,15800.65,16057.96 +16057.94,16230.0,15850.02,16147.0 +16147.99,16174.99,15930.0,16146.66 +16146.66,16199.58,15650.0,15665.17 +15660.41,15979.5,15425.0,15819.99 +15819.99,16194.97,15750.0,16105.33 +16105.33,16287.99,16055.0,16059.01 +16059.01,16131.99,15711.54,15881.2 +15881.2,15881.2,15600.0,15720.56 +15720.56,15749.0,15372.82,15372.82 +15372.82,15893.25,15332.0,15866.72 +15872.12,15934.61,15525.0,15650.09 +15644.13,15795.99,15520.0,15675.0 +15675.01,15789.0,15648.83,15669.09 +15670.0,15680.0,15516.0,15540.0 +15540.35,15548.86,14620.0,14925.99 +14921.93,14950.0,13550.0,14600.0 +14605.77,15200.0,14500.0,14909.99 +14909.99,14947.0,14505.07,14799.99 +14799.98,15180.0,14780.4,14920.0 +14935.45,15124.47,14810.0,15085.0 +15085.0,15495.0,15050.88,15225.92 +15225.92,15310.0,15100.01,15159.99 +15160.0,15178.41,14625.0,14716.2 +14707.26,14817.79,14130.85,14488.64 +14488.64,14650.0,13828.0,13828.0 +13828.67,14213.13,13501.0,13599.99 +13599.99,14200.0,13563.02,14012.31 +14013.49,14075.0,13704.0,14018.0 +14017.99,14499.0,13810.0,14457.9 +14457.91,14457.91,13900.0,14072.01 +14072.01,14084.88,13800.0,14083.71 +14079.0,14247.74,13929.01,14212.0 +14212.0,14556.0,14212.0,14384.99 +14385.0,14405.58,14051.03,14168.15 +14168.14,14487.8,14106.05,14487.8 +14487.8,15491.0,14487.8,15491.0 +15491.0,15960.0,15233.22,15247.0 +15247.0,15760.0,15145.11,15562.66 +15561.4,15900.0,15411.24,15629.88 +15629.89,15790.0,15600.37,15665.0 +15665.0,15665.0,15350.0,15530.83 +15530.82,15888.0,15460.03,15828.99 +15829.0,15829.0,15531.11,15685.0 +15685.0,15685.0,14800.0,15050.0 +15049.99,16300.0,14661.55,16098.97 +16030.0,16099.0,15000.05,15308.81 +15305.12,15697.0,15209.55,15678.98 +15678.98,16200.0,15650.0,16168.0 +16167.99,16980.0,16030.0,16823.92 +16823.91,16988.0,16523.78,16855.0 +16855.01,16855.01,16301.0,16631.0 +16626.0,16730.0,16554.01,16668.99 +16668.99,16950.0,16641.03,16856.04 +16856.04,16925.0,16733.78,16925.0 +16924.99,16940.0,16657.57,16666.0 +16666.0,16809.99,16631.48,16809.99 +16809.99,16888.0,16671.89,16700.0 +16700.0,16800.0,16600.0,16764.99 +16765.0,16900.0,16750.05,16837.68 +16837.68,16850.0,16517.67,16710.0 +16710.0,16780.01,16414.75,16569.96 +16569.96,16750.0,16532.95,16749.0 +16748.99,16749.0,16550.0,16620.0 +16620.0,16620.67,16530.0,16575.0 +16574.99,16720.0,16574.99,16670.0 +16669.99,17240.0,16669.99,17149.98 +17149.98,17493.0,17000.04,17201.11 +17201.12,17303.14,17000.0,17171.05 +17171.06,17186.0,16900.51,17099.0 +17098.99,17117.61,16759.0,16800.0 +16800.0,16897.0,16600.0,16701.0 +16701.0,17050.0,16650.62,16949.0 +16949.94,16975.0,16755.0,16792.0 +16792.0,16792.01,16375.0,16647.99 +16647.99,16668.75,16404.01,16429.99 +16430.0,16766.0,16429.99,16636.65 +16636.66,16916.6,16597.99,16843.31 +16843.32,17067.2,16765.99,17049.97 +17049.98,17100.0,16949.95,17073.5 +17073.5,17100.0,16965.0,16985.04 +16985.03,16985.03,16844.68,16896.11 +16896.12,17000.0,16864.11,16899.98 +16899.98,16927.77,16690.0,16900.0 +16900.01,17400.0,16900.0,17231.03 +17219.99,17220.0,17050.0,17065.05 +17065.05,17390.0,16958.89,17350.0 +17360.0,17490.0,17100.0,17338.8 +17338.81,17899.0,17250.0,17899.0 +17899.0,18149.99,17576.38,17720.0 +17720.01,17850.0,17509.32,17750.01 +17750.01,17875.0,17520.0,17553.0 +17553.01,17627.12,17410.0,17598.99 +17599.0,17920.42,17598.99,17797.99 +17797.99,17798.01,17600.96,17793.03 +17793.03,17900.0,17730.11,17789.99 +17789.99,17789.99,17551.0,17659.99 +17659.98,17659.99,16750.0,17272.29 +17272.29,17375.0,16923.0,16923.14 +16923.14,17180.0,16870.01,17178.0 +17178.0,17250.0,17005.03,17199.0 +17199.01,17248.47,17090.0,17218.31 +17218.31,17245.0,17160.28,17238.99 +17238.99,17250.0,17200.0,17249.99 +17249.99,17250.0,17205.0,17249.99 +17249.99,17250.0,17185.02,17201.41 +17238.25,17278.53,17231.0,17278.53 +17278.53,17746.73,17278.53,17450.11 +17450.11,17640.0,17401.01,17431.51 +17431.51,17540.95,17349.99,17405.51 +17405.52,17491.04,17151.06,17153.61 +17153.6,17292.5,16901.0,16902.0 +16902.0,16974.83,16600.0,16665.28 +16665.22,16665.22,15700.0,16570.15 +16570.15,16750.0,16337.21,16628.17 +16628.16,16839.19,16367.79,16839.19 +16839.19,16998.0,16651.68,16919.01 +16919.0,16959.99,16754.84,16800.0 +16800.0,16862.02,16515.52,16601.01 +16601.01,16898.7,16601.01,16833.62 +16833.62,16833.63,16556.79,16646.03 +16646.02,16745.0,16307.2,16465.0 +16465.0,16690.0,16420.0,16690.0 +16690.0,16801.0,16690.0,16740.96 +16740.96,16800.0,16615.54,16717.79 +16717.79,16799.9,16650.0,16677.68 +16677.68,17098.32,16677.68,17050.0 +17050.0,17199.6,17005.0,17074.01 +17074.0,17138.0,16837.63,16874.17 +16874.17,17060.1,16750.01,16940.0 +16940.0,16950.0,16798.91,16888.59 +16888.58,17187.0,16881.59,17086.23 +17086.23,17086.23,16926.94,16993.93 +16993.91,16993.91,16500.0,16500.0 +16500.0,16795.0,16256.0,16777.1 +16780.86,16790.0,16650.0,16723.99 +16723.99,16910.0,16723.99,16878.89 +16878.91,16949.11,16804.99,16828.79 +16828.8,16850.0,16750.0,16840.0 +16839.99,16840.0,16625.0,16681.84 +16681.84,16799.0,16604.0,16790.27 +16790.28,16837.8,16734.42,16768.0 +16768.01,16788.0,16705.01,16749.99 +16749.98,17143.0,16745.0,17020.0 +17019.91,17250.0,16910.0,17160.08 +17150.0,17899.0,17150.0,17599.99 +17599.99,17698.56,17310.95,17350.99 +17350.99,17419.0,17160.01,17385.02 +17385.02,17499.98,17332.79,17437.95 +17437.95,17450.0,17328.8,17331.01 +17331.01,17442.51,17331.0,17331.98 +17331.99,17498.25,17252.47,17490.0 +17490.0,17700.0,17435.23,17700.0 +17700.0,17800.0,17648.0,17740.0 +17739.99,17850.0,17709.13,17849.99 +17849.99,17890.0,17732.0,17854.7 +17854.7,17854.7,17582.0,17819.99 +17819.99,17825.0,17608.3,17651.56 +17651.55,17700.0,17500.0,17699.09 +17699.09,17725.72,17576.0,17602.05 +17602.04,17698.4,17569.99,17604.73 +17604.73,17790.0,17524.01,17781.49 +17781.49,17797.0,17668.0,17711.95 +17711.94,17800.0,17711.94,17759.99 +17760.0,17760.0,17601.01,17699.89 +17699.9,17737.42,17566.41,17737.41 +17737.41,17790.0,17689.99,17739.98 +17739.99,17849.88,17733.0,17759.39 +17759.4,17775.01,17700.0,17774.0 +17773.99,17775.0,17660.0,17679.0 +17679.0,17714.05,17630.0,17712.75 +17712.75,17770.28,17712.74,17765.0 +17765.0,17850.0,17764.17,17850.0 +17850.0,17980.0,17849.99,17978.0 +17978.0,18209.61,17977.99,18050.03 +18051.48,18150.04,17936.01,18124.88 +18124.87,18179.01,18078.51,18145.05 +18145.85,18250.0,18120.03,18130.08 +18130.08,18350.0,18130.07,18325.01 +18325.0,18350.0,18285.9,18349.01 +18349.0,18699.49,18349.0,18540.0 +18539.99,18799.0,18539.99,18693.31 +18693.3,18997.0,18693.3,18996.99 +18997.0,19000.0,18719.98,18989.99 +18990.0,18992.5,18837.63,18901.04 +18901.04,18945.08,18901.04,18945.07 +18945.07,19479.94,18945.07,19401.59 +19401.59,19479.0,19167.0,19399.97 +19399.97,19482.26,19330.0,19468.11 +19468.11,19598.99,19460.0,19596.96 +19596.97,19797.0,19228.46,19350.02 +19350.02,19550.0,19340.0,19340.99 +19340.99,19393.92,19010.0,19180.0 +19180.0,19490.0,19180.0,19431.99 +19432.0,19580.09,19250.01,19391.23 +19391.23,19391.24,19250.0,19390.4 +19390.4,19560.0,19350.0,19454.11 +19454.11,19532.99,19409.95,19532.99 +19532.98,19749.94,19532.98,19746.0 +19746.0,19748.99,19560.0,19578.0 +19578.0,19740.25,19545.0,19736.79 +19736.79,19750.0,19720.0,19750.0 +19750.0,19850.0,19614.95,19850.0 +19850.0,19891.99,19707.5,19726.0 +19726.0,19870.0,19726.0,19790.51 +19790.51,19808.0,19563.19,19620.79 +19621.6,19688.23,19420.0,19681.0 +19681.0,19691.44,19402.0,19548.6 +19548.6,19550.0,19470.0,19475.08 +19475.07,19492.31,19222.02,19343.0 +19343.0,19449.01,19127.0,19419.95 +19419.95,19557.6,19370.0,19378.11 +19378.11,19450.0,19378.1,19419.51 +19419.52,19787.99,19202.79,19461.66 +19461.66,19550.0,19125.0,19375.02 +19375.02,19375.02,18200.0,18300.0 +18300.0,18880.0,18277.5,18800.0 +18800.01,19098.82,18432.0,18731.37 +18731.38,18887.65,18615.0,18875.7 +18875.69,19099.99,18780.0,18875.0 +18875.0,19183.75,18874.99,19050.23 +19054.85,19173.47,18960.0,19143.0 +19143.01,19143.01,18810.1,18949.9 +18949.9,19122.99,18867.98,18938.59 +18938.58,19012.4,18860.0,18970.0 +18970.01,19099.0,18970.0,19021.0 +19021.0,19349.0,19020.99,19349.0 +19349.0,19367.5,19059.33,19100.01 +19100.0,19120.0,18650.0,18786.18 +18786.19,18887.5,18478.71,18864.04 +18864.05,18900.0,18791.02,18888.0 +18888.0,18896.9,18632.0,18632.01 +18632.01,18697.15,18494.71,18528.19 +18528.2,18613.02,18425.0,18600.0 +18600.0,18855.38,18599.99,18836.0 +18836.0,18840.01,18648.78,18810.93 +18810.94,18849.9,18795.0,18818.47 +18818.48,18999.0,18715.0,18999.0 +18999.0,19175.0,18950.76,19054.64 +19054.63,19099.0,18802.4,18959.01 +18959.02,18991.0,18830.0,18840.5 +18840.5,18900.0,18760.04,18835.5 +18834.05,19096.55,18707.67,19044.99 +19045.0,19045.0,18920.0,18976.01 +18976.01,18976.01,18898.95,18898.96 +18898.95,18918.85,18780.0,18829.07 +18829.08,18898.0,18800.0,18873.64 +18873.65,18907.77,18863.0,18899.9 +18899.9,18899.91,18615.42,18615.44 +18615.44,18631.89,18223.91,18223.91 +18223.91,18455.31,17763.48,18036.32 +18036.32,18299.99,17930.39,18291.0 +18291.0,18498.95,18130.01,18163.0 +18163.0,18198.96,17900.0,18119.06 +18119.06,18300.0,18009.0,18268.05 +18268.05,18494.66,18131.5,18494.66 +18494.66,18499.99,18292.0,18295.99 +18292.01,18360.0,18175.94,18269.99 +18269.99,18275.71,17929.67,18129.99 +18129.99,18139.99,17610.0,17650.0 +17650.0,17666.72,16800.0,17548.98 +17545.0,17648.2,17340.0,17579.0 +17579.0,17905.73,17443.25,17720.01 +17720.01,17735.92,14001.0,16935.04 +16949.82,16989.99,15500.0,16888.0 +16887.99,17498.37,16751.0,17384.03 +17384.04,17395.0,16701.0,16888.42 +16871.18,17199.99,16871.16,17065.02 +17065.05,17065.07,16611.0,16631.9 +16631.91,16653.13,15979.08,16313.44 +16313.44,16848.0,16290.0,16551.05 +16551.04,17100.0,16547.37,17095.01 +17095.0,17099.0,16906.0,17099.0 +17099.0,17499.98,17071.11,17252.38 +17272.38,17498.98,17250.0,17498.98 +17498.98,17890.0,17497.99,17684.3 +17684.3,17794.0,17049.0,17344.02 +17344.02,17490.0,17140.0,17140.1 +17140.09,17140.1,16177.0,16177.0 +16177.0,16700.0,16145.0,16666.97 +16666.97,16999.0,16512.02,16705.01 +16705.0,16985.0,16606.0,16700.8 +16700.98,16950.0,16510.01,16803.61 +16803.61,16849.98,16604.0,16612.5 +16612.5,16680.0,16163.96,16174.25 +16163.96,16493.16,15693.97,16269.99 +16270.0,16605.0,16270.0,16510.53 +16511.05,16794.95,16450.0,16676.0 +16676.0,16689.0,16502.0,16657.99 +16657.99,16709.99,16250.0,16336.62 +16336.62,17120.0,16200.0,16931.96 +16931.96,17158.34,16851.0,16930.01 +16930.0,16950.0,16720.1,16860.18 +16860.19,17290.0,16860.18,17289.99 +17289.99,17364.57,17000.01,17168.05 +17168.05,17168.05,16865.0,16999.0 +16999.0,17070.0,16875.0,16875.01 +16875.01,16875.01,16608.31,16844.2 +16844.19,16844.2,16601.0,16804.99 +16805.0,16899.47,16716.79,16716.8 +16716.79,16764.24,16300.0,16399.98 +16399.98,16541.0,16036.36,16036.37 +16036.37,16149.99,15345.0,15700.0 +15696.31,16002.27,15555.0,15849.09 +15849.05,15892.92,15151.0,15425.0 +15425.0,15678.0,15380.0,15430.94 +15430.94,15583.09,15200.0,15549.99 +15549.99,15576.0,15325.0,15400.0 +15400.0,15839.0,15399.99,15733.29 +15733.29,15999.99,15659.25,15809.81 +15805.0,15974.95,15555.0,15854.53 +15854.53,15854.53,15202.0,15202.0 +15202.01,15320.05,14505.02,14675.0 +14678.81,14992.84,13588.88,13735.18 +13735.17,14799.28,12712.0,14699.97 +14590.0,15297.98,14400.0,14999.02 +14999.02,14999.03,14107.19,14362.99 +14362.97,14660.0,13500.0,13713.0 +13713.0,13988.0,12805.0,13348.46 +13409.65,13888.0,13250.0,13728.2 +13728.21,14249.98,13582.5,13900.01 +13900.01,14699.99,13709.94,13847.92 +13867.17,14212.63,13750.0,13949.0 +13949.0,14300.0,13250.0,13253.64 +13253.63,13378.25,11369.53,11369.53 +11385.0,12590.0,10400.0,12047.11 +12026.05,13595.0,11901.01,13001.0 +13001.01,13299.0,12151.62,12886.61 +12886.6,13450.0,12850.0,13237.26 +13237.255000000001,13588.0,12600.0,13587.91 +13587.91,13599.0,13000.0,13389.99 +13390.0,14826.02,13365.0,14535.3 +14535.3,14756.0,14200.0,14667.93 +14660.05,15490.0,14560.0,15260.03 +15267.12,15299.99,13724.22,14578.89 +14574.99,14752.1,14139.79,14425.88 +14426.19,14591.0,14200.0,14364.9 +14364.89,14740.0,14364.72,14444.01 +14440.05,14991.99,14439.29,14917.51 +14917.52,14969.33,14700.0,14845.0 +14845.0,14845.01,14000.0,14150.86 +14150.86,14435.0,13750.0,14390.0 +14398.98,14693.0,14340.05,14621.03 +14628.0,14800.0,14608.0,14670.89 +14670.81,14873.0,14452.0,14848.04 +14848.04,15198.0,14684.44,15190.0 +15190.0,15465.0,15065.89,15215.05 +15254.16,15445.99,15057.45,15336.01 +15336.0,15471.98,15150.0,15471.98 +15471.97,16200.0,15471.97,16130.0 +16130.0,16261.0,15307.23,15490.01 +15490.02,15774.99,15385.03,15618.8 +15618.79,15699.67,15303.0,15649.51 +15649.51,15686.48,15556.0,15645.52 +15645.52,15668.43,15574.0,15668.43 +15649.32,15891.0,15630.0,15850.02 +15850.01,15945.0,15775.01,15881.03 +15881.03,15887.69,15376.0,15538.48 +15549.68,15550.0,14680.0,14760.37 +14760.38,15091.35,14567.0,14856.51 +14856.51,15090.52,14335.01,14350.0 +14350.01,14605.33,13818.0,14279.36 +14279.36,14772.0,14107.01,14536.31 +14536.31,14585.99,13900.0,14551.05 +14569.23,14695.0,14300.0,14600.0 +14600.01,14870.0,14522.89,14855.33 +14859.66,14945.0,14355.55,14400.0 +14400.0,14764.71,14399.99,14694.84 +14694.83,14694.84,14190.0,14227.56 +14227.55,14235.0,13776.0,13887.0 +13887.0,14000.0,13573.0,13607.81 +13607.81,14178.97,13210.0,13985.88 +13985.88,14253.99,13700.98,14093.0 +14093.01,14620.0,13950.0,14260.0 +14260.0,14350.0,13641.72,13969.31 +13969.21,14250.0,13950.0,14100.01 +14100.01,14109.99,13602.0,13602.0 +13609.74,13850.0,13530.0,13637.31 +13637.3,13725.0,13356.0,13650.0 +13649.99,14099.35,13649.99,13892.74 +13892.73,13892.74,13604.0,13649.95 +13649.94,14202.0,13649.0,14200.06 +14200.51,14250.0,14035.0,14250.0 +14250.23,14360.0,13900.0,13919.9 +13919.01,14130.23,13824.98,14053.99 +14053.98,14075.99,13680.0,13900.01 +13900.01,14075.0,13500.0,13658.44 +13658.44,14272.61,13625.21,14114.09 +14114.09,14249.8,14000.0,14200.0 +14200.0,14286.27,13900.15,14200.0 +14150.01,14299.0,14007.79,14113.89 +14113.7,14491.0,14055.58,14490.99 +14491.0,14491.0,14200.01,14289.91 +14267.91,14389.99,14227.91,14316.71 +14316.71,14484.56,14270.0,14469.27 +14469.26,14774.0,14469.26,14658.62 +14658.62,14670.01,13879.99,13880.0 +13879.99,14147.22,13845.0,14043.08 +14043.08,14239.99,14043.07,14205.58 +14205.57,14378.0,14205.57,14285.01 +14285.01,14305.91,14000.02,14200.0 +14200.0,14399.49,14199.99,14260.0 +14260.0,14310.0,14206.96,14250.01 +14250.01,14299.0,14000.0,14022.0 +14021.77,14162.0,14021.76,14090.2 +14096.49,14189.0,13973.21,14160.0 +14160.0,14200.0,14110.0,14199.99 +14200.0,14290.0,14175.52,14202.51 +14202.51,14233.99,14184.39,14225.0 +14225.0,14349.98,14190.03,14300.0 +14300.0,14999.0,14269.01,14893.75 +14894.11,15350.0,14871.77,15349.99 +15350.0,15710.76,15260.0,15356.64 +15356.65,15630.0,15310.01,15511.91 +15511.91,15511.91,15257.37,15487.65 +15487.66,15499.0,15057.18,15194.67 +15194.61,15484.24,15059.84,15455.94 +15455.93,15455.94,15305.0,15327.0 +15327.01,15327.01,15110.99,15168.98 +15168.99,15463.0,15100.01,15462.99 +15463.0,15475.27,15207.67,15385.92 +15379.99,15865.0,15270.82,15731.71 +15731.7,15955.0,15659.0,15955.0 +15955.0,16148.0,15895.27,16035.46 +16035.45,16072.66,15535.12,15750.0 +15750.0,15875.0,15573.19,15859.99 +15860.0,15935.0,15790.0,15934.99 +15935.0,16085.0,15783.0,15798.01 +15798.01,15991.2,15725.0,15990.0 +15989.99,16036.93,15719.0,15829.13 +15829.14,15860.0,15651.57,15707.8 +15707.81,15889.0,15665.66,15888.99 +15889.0,15995.43,15889.0,15935.01 +15935.0,15935.01,15810.0,15855.19 +15855.19,15979.99,15781.0,15979.99 +15979.98,16490.0,15951.95,16400.0 +16399.99,16484.62,16275.0,16484.61 +16484.61,16484.62,16365.0,16423.77 +16423.77,16442.87,16105.0,16232.77 +16232.77,16318.7,16100.55,16155.92 +16155.93,16250.0,15823.0,15982.0 +15982.0,15982.0,15550.0,15761.96 +15785.98,15834.0,15651.0,15834.0 +15834.0,16043.66,15833.99,15936.51 +15936.51,15936.51,15568.09,15803.64 +15803.64,15803.64,15100.0,15100.01 +15100.01,15457.25,15100.0,15401.6 +15401.6,15401.6,14536.59,14539.0 +14538.99,15086.96,14524.37,15004.0 +15003.99,15200.0,14800.0,15182.0 +15182.0,15284.0,14750.0,14913.49 +14913.16,14977.38,14636.0,14940.28 +14936.42,15245.0,14917.63,15179.98 +15179.99,15490.0,15178.01,15241.0 +15242.0,15462.32,15241.01,15385.08 +15385.08,15431.12,15105.0,15275.0 +15275.0,15489.0,15150.0,15449.99 +15450.0,15450.0,14120.0,14321.01 +14321.0,14774.91,13905.0,14182.86 +14182.86,14760.1,14182.86,14403.0 +14403.0,14403.0,13801.0,13870.18 +13870.18,14175.0,13850.0,14170.0 +14170.0,14369.66,14125.15,14289.96 +14277.53,14357.5,14000.0,14250.0 +14250.0,14490.0,14207.77,14381.46 +14381.47,14427.0,13806.1,13870.27 +13870.28,14088.58,13810.0,14009.77 +14000.15,14399.99,13935.68,14349.96 +14349.96,14464.9,14104.55,14127.87 +14129.92,14550.0,13845.0,14520.02 +14520.01,14545.0,14207.01,14207.02 +14207.02,14330.0,14006.85,14149.0 +14149.0,14205.87,13891.18,14112.43 +14112.43,14112.44,13500.0,13759.09 +13759.95,13990.0,13700.0,13990.0 +13990.0,14126.67,13900.01,13986.92 +13986.55,14000.0,13730.31,13959.97 +13959.97,14239.0,13959.97,14124.47 +14124.47,14489.0,14118.42,14447.0 +14447.0,14480.48,14280.23,14329.99 +14330.0,14600.0,14249.99,14594.99 +14569.21,15105.34,14561.81,14910.0 +14910.0,14950.0,14800.0,14847.55 +14847.56,15037.0,14804.76,14870.57 +14870.58,14994.53,14760.5,14913.61 +14913.61,15087.0,14782.0,14782.0 +14786.61,14786.61,14544.16,14575.44 +14575.44,14695.44,14500.0,14588.0 +14588.0,14588.0,14200.0,14294.43 +14283.56,14473.14,14041.81,14192.0 +14191.99,14389.0,14125.03,14277.14 +14277.13,14289.61,14125.44,14260.0 +14243.18,14436.25,14047.25,14436.0 +14436.0,14564.26,14382.2,14519.0 +14519.0,14599.99,14325.0,14520.01 +14520.01,14870.0,14520.0,14737.0 +14736.99,14819.98,14589.53,14624.68 +14624.67,14640.01,14511.0,14533.82 +14533.82,14650.0,14500.01,14633.0 +14633.0,14633.0,14401.0,14493.21 +14493.21,14522.68,14359.2,14389.99 +14389.99,14696.97,14389.99,14624.99 +14624.99,14790.78,14539.78,14539.79 +14539.79,14639.79,14301.1,14509.99 +14510.0,14550.0,13911.0,14070.38 +14070.37,14100.0,13750.0,13878.01 +13878.0,14083.49,13804.0,13853.33 +13851.01,13983.55,13601.0,13719.99 +13712.0,14054.98,13658.0,14000.01 +14000.01,14050.0,13905.0,13910.0 +13923.54,14100.0,13905.0,14089.99 +14090.0,14099.97,13837.4,13882.15 +13882.15,13985.58,13840.0,13924.34 +13924.34,13950.0,13740.01,13757.62 +13757.62,13968.58,13725.0,13730.11 +13730.11,13730.11,13250.0,13250.0 +13250.0,13500.0,12845.0,13409.0 +13401.17,13596.75,12941.38,13100.0 +13100.0,13217.03,12900.0,13035.69 +13035.68,13035.7,12500.0,12820.0 +12820.01,13433.97,12700.0,13176.42 +13176.41,13295.99,12850.02,13218.99 +13219.0,13490.0,13155.03,13349.99 +13349.99,13370.82,13088.23,13239.57 +13238.67,13293.0,13075.0,13250.0 +13250.0,13280.0,13050.0,13050.0 +13050.01,13187.24,12750.0,12825.54 +12825.55,13250.0,12633.8,13143.0 +13136.56,13347.97,13039.74,13071.01 +13071.44,13330.0,13069.99,13265.36 +13265.36,13450.0,13070.09,13120.95 +13128.51,13169.58,12933.66,13075.0 +13075.0,13225.0,12916.26,13000.75 +13000.75,13071.91,12811.0,13000.0 +12999.99,13200.0,12824.07,13067.25 +13067.25,13067.25,12794.32,12794.32 +12796.69,12897.9,12701.0,12776.11 +12776.11,13103.0,12734.97,13097.93 +13097.93,13250.0,13018.6,13098.98 +13098.98,13333.0,13079.02,13175.01 +13175.01,13192.0,13079.01,13184.91 +13184.91,13424.23,13177.62,13382.01 +13380.49,13651.18,13230.19,13651.0 +13651.0,14196.1,13536.92,13919.13 +13919.13,14062.0,13740.76,14042.22 +14041.87,14041.87,13820.01,13990.99 +13991.0,14125.18,13880.0,14125.18 +14125.18,14280.26,13960.0,14065.03 +14065.01,14122.0,14049.0,14095.0 +14095.0,14095.0,13850.0,13948.99 +13949.0,13985.37,13698.54,13724.98 +13724.99,13756.07,13536.13,13628.99 +13629.0,13673.99,13331.18,13424.97 +13412.58,13488.99,13320.01,13406.1 +13406.11,13703.9,13400.57,13485.79 +13485.78,13649.0,13361.01,13539.0 +13539.54,13600.0,13450.0,13456.09 +13456.09,13850.0,13400.0,13849.71 +13849.98,13889.0,13543.09,13552.43 +13552.43,13700.0,13432.0,13509.52 +13509.51,13650.0,13502.37,13560.0 +13560.01,13576.5,13256.09,13281.0 +13281.0,13361.46,13188.0,13329.98 +13329.98,13339.99,13100.0,13100.0 +13100.0,13230.83,13022.52,13022.53 +13022.53,13277.73,12952.5,13260.0 +13260.0,13399.0,13187.0,13229.99 +13229.99,13260.39,13035.0,13171.68 +13171.68,13248.6,13114.47,13168.45 +13168.44,13321.23,13140.0,13165.11 +13165.1,13450.0,13156.91,13431.02 +13431.02,13623.86,13405.36,13623.86 +13608.98,13772.59,13511.04,13580.0 +13580.0,13688.0,13454.0,13480.0 +13479.99,13535.0,13455.0,13535.0 +13534.99,13999.0,13534.99,13846.79 +13846.79,13887.0,13601.0,13616.01 +13616.0,13700.0,13410.0,13456.0 +13456.0,13500.0,13310.66,13379.98 +13379.97,13400.0,13005.0,13217.74 +13217.75,13245.0,13150.0,13191.11 +13190.99,13424.0,13154.63,13363.05 +13363.1,13465.0,13300.0,13465.0 +13465.0,13558.94,13431.68,13529.98 +13529.97,13665.01,13529.97,13665.01 +13665.01,13750.0,13665.0,13685.0 +13685.0,13720.0,13560.0,13720.0 +13719.99,13720.0,13580.0,13712.07 +13714.9,13991.97,13714.9,13923.12 +13923.12,13953.77,13790.0,13872.0 +13871.99,13872.0,13660.0,13819.09 +13820.0,13894.0,13680.0,13765.01 +13765.0,13991.24,13717.26,13991.24 +13991.24,14800.0,13991.24,14599.98 +14599.98,15275.0,14599.98,14972.3 +14972.3,15177.02,14830.0,14915.0 +14915.0,14965.01,14700.0,14875.59 +14875.59,15049.0,14860.0,14882.01 +14882.0,14942.24,14718.01,14793.7 +14793.7,14970.0,14784.96,14861.05 +14861.06,14899.99,14816.0,14850.01 +14850.0,15084.46,14822.47,15079.52 +15079.51,15198.88,14850.0,15000.0 +15000.0,15150.0,14954.38,15069.99 +15070.0,15149.8,15067.61,15082.0 +15081.99,15379.0,15081.99,15351.0 +15351.0,15400.0,15230.74,15230.87 +15230.87,15251.6,15028.0,15028.0 +15028.0,15047.99,14860.62,14899.99 +14900.0,14900.0,14629.0,14847.32 +14847.31,14928.62,14750.0,14928.62 +14928.62,14944.83,14628.0,14718.01 +14718.0,15038.78,14718.0,15038.78 +15038.77,15100.0,14900.0,14999.99 +14999.98,15160.0,14965.0,15160.0 +15160.0,15250.0,15080.0,15090.0 +15090.01,15120.2,14924.12,14932.0 +14931.99,14950.0,14775.0,14832.5 +14832.5,14944.0,14780.0,14835.28 +14835.29,14993.42,14819.0,14985.6 +14985.6,15080.84,14955.73,15040.98 +15040.98,15060.79,14863.0,14887.22 +14887.23,15129.99,14880.0,15129.99 +15129.99,15129.99,15032.0,15101.0 +15100.19,15400.0,14926.26,15371.99 +15371.99,15390.0,15213.77,15279.01 +15279.0,15300.52,14950.0,14971.02 +14971.02,15080.0,14950.0,14969.41 +14969.4,15069.0,14863.69,15068.99 +15069.0,15142.0,14929.8,14984.37 +14984.37,14984.98,14920.0,14930.03 +14930.03,14930.03,14230.0,14394.73 +14394.73,14614.54,14339.96,14565.0 +14564.99,14698.88,14460.0,14460.01 +14460.01,14645.25,14386.01,14621.71 +14621.7,14647.0,14400.0,14503.15 +14503.17,14686.56,14492.27,14600.01 +14600.01,14699.06,14567.33,14649.99 +14650.0,14650.6,14510.0,14550.01 +14550.0,14649.42,14500.0,14609.0 +14609.0,14800.0,14609.0,14800.0 +14800.0,14928.04,14784.22,14784.23 +14784.23,14999.99,14784.22,14997.99 +14997.99,15075.0,14860.97,14935.98 +14935.99,15024.99,14894.0,14931.0 +14931.01,15049.0,14899.81,15015.0 +15015.0,15176.86,14979.44,15069.99 +15069.99,15094.84,14980.0,15062.0 +15062.0,15100.0,15035.0,15100.0 +15100.0,15171.0,15074.8,15074.8 +15074.8,15074.81,14950.0,14998.86 +14998.86,15021.0,14819.78,14930.01 +14930.0,15068.1,14850.01,15000.01 +15000.01,15046.53,14902.24,14907.0 +14907.0,14985.0,14842.47,14985.0 +14984.99,15598.5,14984.99,15598.5 +15598.5,15940.0,15376.52,15859.95 +15859.95,16097.0,15859.95,15958.05 +15958.04,16052.73,15775.18,16016.8 +16016.79,16016.79,15714.01,15856.38 +15856.37,16054.97,15850.0,15923.96 +15923.96,16102.0,15923.96,16000.01 +16000.01,16060.63,15927.13,16060.63 +16060.62,16351.5,16060.62,16249.99 +16250.0,16586.0,16239.16,16400.0 +16400.0,16550.0,16254.17,16271.59 +16271.6,16489.0,16213.81,16402.0 +16402.01,16749.0,16320.0,16681.08 +16692.54,16899.5,16688.71,16755.11 +16764.01,16991.42,16750.01,16944.02 +16944.01,17178.0,16795.0,16795.0 +16795.0,16900.0,16655.01,16857.75 +16857.75,16999.0,16857.75,16992.5 +16992.49,16992.5,16519.33,16610.01 +16610.0,16770.0,16509.95,16520.02 +16520.01,16650.0,16410.75,16550.0 +16550.0,16682.0,16434.0,16640.0 +16639.99,16658.9,16520.0,16538.13 +16538.14,16600.0,16404.99,16569.0 +16569.0,16569.0,16403.43,16474.89 +16474.9,16514.56,16328.03,16366.0 +16366.0,16680.0,16355.0,16650.0 +16650.0,16684.0,16496.2,16499.9 +16499.77,16499.77,16300.0,16349.93 +16349.93,16393.05,16251.01,16306.99 +16307.0,16518.4,16307.0,16449.01 +16449.01,16650.0,16449.01,16581.71 +16581.98,16893.18,16541.47,16799.01 +16799.0,16908.19,16710.0,16908.19 +16908.19,16984.8,16726.64,16830.0 +16830.0,16849.99,16682.47,16736.99 +16736.99,16849.99,16716.56,16849.0 +16848.99,16939.0,16712.2,16939.0 +16939.0,17174.0,16856.88,17028.99 +17029.0,17122.0,17029.0,17069.99 +17069.98,17069.98,16925.0,16959.01 +16959.01,17039.0,16885.0,16954.0 +16954.0,16960.91,16822.22,16840.6 +16840.6,16849.96,16666.6,16758.38 +16758.38,16783.2,16554.99,16774.67 +16774.67,16807.06,16519.2,16579.16 +16579.17,16634.16,16355.0,16430.91 +16435.02,16745.64,16435.01,16735.83 +16735.83,16850.0,16709.0,16764.7 +16764.69,16775.01,16625.0,16674.98 +16674.97,16739.0,16674.97,16731.0 +16731.0,16768.0,16570.0,16580.99 +16581.0,16581.0,16471.82,16471.99 +16471.82,16543.7,16401.0,16507.77 +16507.35,16600.0,16507.35,16575.76 +16575.76,16575.77,16430.0,16432.01 +16432.0,16432.0,16080.0,16235.16 +16235.16,16256.72,15755.01,16000.0 +16001.07,16165.42,15775.0,16137.76 +16137.76,16211.11,16100.0,16164.98 +16164.98,16199.3,16020.0,16165.54 +16164.49,16305.0,16150.0,16220.22 +16220.22,16460.0,16220.21,16408.7 +16408.7,16408.71,16101.0,16101.0 +16101.01,16275.0,15900.0,15900.01 +15900.0,16049.0,15760.0,16000.0 +16000.0,16100.0,15821.43,15844.15 +15844.15,15844.15,15514.55,15765.73 +15765.74,15830.0,15552.9,15596.45 +15596.56,15940.0,15596.56,15802.01 +15802.0,15904.57,15765.27,15845.0 +15845.0,15940.02,15840.01,15840.02 +15840.02,15840.02,15401.0,15530.12 +15530.13,15530.13,15211.0,15250.01 +15250.01,15449.88,15194.99,15397.54 +15397.54,15552.76,15364.17,15536.05 +15536.05,15536.05,15313.13,15479.89 +15470.66,15470.67,14652.26,14762.88 +14762.88,14850.0,14000.0,14000.0 +14000.01,14862.41,14000.0,14730.0 +14730.0,14982.99,14651.0,14930.01 +14930.01,14966.35,14602.01,14860.72 +14861.35,15165.0,14861.35,15069.72 +15069.73,15149.5,15005.01,15100.01 +15100.01,15100.01,14616.82,14956.18 +14956.18,15048.99,14899.99,14900.01 +14900.01,14918.22,14615.0,14616.83 +14616.83,15039.1,14616.82,14953.5 +14953.49,15260.0,14928.63,15228.46 +15228.47,15330.0,15004.02,15207.97 +15207.96,15249.0,15190.0,15247.0 +15247.0,15340.0,15200.0,15260.01 +15260.0,15384.0,15260.0,15332.99 +15333.0,15357.6,14950.0,15043.11 +15044.89,15129.99,14805.0,15040.09 +15053.99,15186.0,15035.0,15152.0 +15152.0,15259.01,15150.0,15151.0 +15151.01,15157.16,14834.15,14834.15 +14834.15,14893.84,14539.75,14761.32 +14750.01,14874.55,14600.0,14874.55 +14874.55,14875.0,14626.77,14750.0 +14750.01,14750.01,14231.0,14350.0 +14350.0,14739.92,14230.0,14713.12 +14713.11,14766.07,14580.35,14737.01 +14737.0,14970.02,14650.02,14870.13 +14870.14,14994.0,14833.04,14950.04 +14950.03,15028.85,14775.05,14800.0 +14800.1,14888.57,14741.67,14779.06 +14786.54,14808.48,14651.22,14770.0 +14770.0,14800.0,14551.0,14576.49 +14578.39,14631.34,14331.0,14331.0 +14331.01,14525.0,14270.0,14400.02 +14400.02,14432.54,14023.14,14199.99 +14192.64,14360.81,14100.0,14240.0 +14240.0,14350.0,14189.0,14345.53 +14345.53,14399.91,14118.0,14156.28 +14156.28,14390.0,14150.0,14281.91 +14281.91,14290.0,14121.19,14229.99 +14229.99,14340.0,14180.0,14264.34 +14264.33,14264.33,14000.0,14000.0 +14000.01,14000.01,13550.01,13667.63 +13667.63,13989.97,13627.0,13948.56 +13951.54,14000.0,13826.31,13880.22 +13880.21,14180.0,13870.98,14087.77 +14087.78,14200.95,13900.01,13920.84 +13920.83,14100.1,13818.46,13899.99 +13899.99,13940.0,13610.81,13934.9 +13935.0,14641.0,13934.89,14595.06 +14595.05,14659.99,14351.0,14420.25 +14420.24,14600.0,14362.0,14600.0 +14600.0,14669.98,14433.49,14468.01 +14468.01,14477.44,14255.04,14380.99 +14380.9,14500.0,14259.98,14473.22 +14473.22,14590.0,14410.01,14482.83 +14482.85,14575.0,14300.0,14574.99 +14574.99,14970.0,14460.1,14795.33 +14796.08,14900.0,14587.9,14669.15 +14669.15,14688.92,14450.0,14527.46 +14527.47,14559.0,13944.25,13944.25 +13944.26,14027.71,13100.0,13471.99 +13471.99,13552.03,12800.01,13510.8 +13510.81,13723.27,13100.0,13290.0 +13290.0,13624.57,13290.0,13344.99 +13335.64,13800.0,13277.0,13800.0 +13800.0,13888.0,13710.54,13725.01 +13725.01,13786.0,13463.67,13614.97 +13615.09,13615.09,13254.9,13254.91 +13254.91,13635.17,13250.0,13622.39 +13622.39,13890.0,13570.74,13854.1 +13854.1,13872.82,13610.0,13742.68 +13742.69,14158.0,13596.9,14158.0 +14158.0,14193.5,13861.25,13985.0 +13985.0,14125.0,13720.0,13811.51 +13811.52,13877.43,13663.0,13699.01 +13699.0,13890.0,13650.17,13790.01 +13790.01,13841.98,13162.88,13409.09 +13409.09,13549.0,13145.0,13456.31 +13427.28,13496.97,13215.08,13431.0 +13431.0,13461.38,13001.0,13091.43 +13091.56,13350.0,12916.18,13166.37 +13166.36,13200.0,12900.0,13063.76 +13076.32,13449.06,13064.92,13393.85 +13393.85,13590.02,13336.29,13479.99 +13479.99,13699.99,13363.0,13666.77 +13666.78,13800.0,13500.0,13779.9 +13779.91,13779.91,13437.12,13609.72 +13609.72,13780.1,13604.38,13710.0 +13710.0,13769.53,13566.11,13566.12 +13566.12,13657.26,13550.0,13596.86 +13596.86,13600.0,13387.33,13599.99 +13599.99,13945.0,13599.99,13941.4 +13941.4,14080.83,13834.88,13862.36 +13862.37,14055.66,13862.37,14025.0 +14025.0,14025.0,13821.0,13849.2 +13849.2,13949.99,13727.0,13875.68 +13875.67,13923.0,13611.11,13683.11 +13683.11,13718.99,13379.99,13560.01 +13560.01,13687.49,13471.22,13545.24 +13545.24,13600.0,13450.0,13525.0 +13524.99,13799.43,13494.98,13771.41 +13771.41,13949.9,13629.59,13773.28 +13773.29,13800.0,13689.92,13693.61 +13693.62,13730.0,13600.0,13670.54 +13670.53,13899.01,13670.53,13884.01 +13884.01,14233.0,13792.25,14182.4 +14182.4,14299.99,14071.0,14166.77 +14166.76,14189.0,14120.0,14144.68 +14144.67,14160.0,13975.0,14158.0 +14158.0,14170.0,14070.0,14169.99 +14169.99,14308.0,14141.0,14141.0 +14141.67,14229.62,14110.0,14180.0 +14180.0,14400.0,14180.0,14261.86 +14260.94,14340.0,14224.33,14224.33 +14224.32,14224.32,14111.0,14173.32 +14173.33,14211.0,14144.6,14211.0 +14211.0,14234.9,14155.71,14234.89 +14234.89,14340.0,14234.89,14340.0 +14340.0,14500.0,14330.01,14484.99 +14484.99,14497.99,14241.28,14241.28 +14241.28,14300.0,14147.33,14300.0 +14300.0,14360.0,14270.01,14299.01 +14299.01,14311.04,14230.0,14299.0 +14293.97,14342.16,14240.0,14240.9 +14240.9,14277.01,14001.0,14142.36 +14142.36,14217.85,14142.35,14190.01 +14190.0,14220.0,14080.0,14162.91 +14162.91,14320.0,14141.47,14250.99 +14251.0,14268.99,14173.0,14176.52 +14176.52,14288.0,14150.0,14232.0 +14232.0,14332.85,14220.01,14290.11 +14290.11,14290.11,14174.01,14187.0 +14187.0,14235.0,14186.75,14234.0 +14234.0,14235.0,13825.21,13914.67 +13914.7,13930.34,13599.0,13810.01 +13810.01,13891.92,13766.32,13869.99 +13869.99,13870.0,13651.0,13790.04 +13790.03,13817.14,13625.01,13625.01 +13625.02,13625.02,13500.0,13578.05 +13578.05,13636.72,13557.69,13610.01 +13610.0,13610.01,13502.0,13505.01 +13505.01,13505.01,13380.0,13410.3 +13410.3,13696.09,13410.0,13624.74 +13624.74,13626.83,13476.29,13500.01 +13500.01,13500.01,13110.0,13177.87 +13177.86,13407.77,13177.86,13350.01 +13350.01,13572.84,13305.01,13548.99 +13548.99,13645.39,13537.5,13598.91 +13598.92,13604.97,13358.74,13413.68 +13413.68,13548.09,13370.0,13488.36 +13488.36,13500.0,13423.0,13487.73 +13487.74,13688.23,13475.02,13688.23 +13688.23,13750.67,13600.0,13638.22 +13638.22,13747.5,13626.6,13747.5 +13747.5,13750.0,13610.36,13641.31 +13641.3,13641.31,13416.0,13446.99 +13447.0,13579.0,13442.24,13569.99 +13569.99,13649.31,13532.02,13646.09 +13646.1,13690.01,13510.01,13683.87 +13683.87,13773.0,13637.63,13730.0 +13730.0,13730.0,13602.0,13602.0 +13602.01,13666.66,13543.89,13633.94 +13633.94,13720.0,13572.21,13669.74 +13669.74,13779.57,13669.73,13750.89 +13750.89,13786.16,13551.0,13740.0 +13740.01,14124.24,13690.0,14061.61 +14061.61,14200.0,14061.61,14200.0 +14200.0,14253.0,14050.0,14080.01 +14080.01,14094.86,13960.29,14043.62 +14043.61,14125.0,13969.71,14094.39 +14094.39,14094.39,13861.02,13880.0 +13880.0,13958.0,13864.63,13925.0 +13924.99,13954.92,13800.0,13900.0 +13900.0,13941.8,13721.0,13795.16 +13795.16,13937.98,13765.01,13888.0 +13888.0,13917.76,13774.99,13778.01 +13778.0,13805.01,13475.68,13552.0 +13552.01,13552.01,13073.18,13249.0 +13249.0,13385.06,12800.0,13031.97 +13031.97,13247.0,12731.56,13170.54 +13170.54,13190.0,12840.0,12947.64 +12940.01,13082.91,12877.0,12997.98 +12997.99,13179.99,12950.0,13110.0 +13110.01,13240.0,13061.0,13239.99 +13240.0,13240.0,12500.0,12500.0 +12500.0,12500.01,11600.0,11876.99 +11876.98,12180.0,11204.0,11735.27 +11735.27,12160.93,11612.34,12095.0 +12094.42,12485.08,12000.75,12426.21 +12426.21,12579.14,11861.62,12348.97 +12348.97,12348.97,11375.0,11770.0 +11770.0,12250.0,11630.0,12111.17 +12111.17,12442.45,11953.65,12263.33 +12263.33,12350.0,11953.85,11999.0 +11994.3,12020.0,11200.0,11200.0 +11200.0,11620.0,11064.0,11620.0 +11620.0,11890.0,11382.87,11525.08 +11539.52,11734.0,11000.0,11272.99 +11272.99,11281.0,10226.41,10529.01 +10520.0,11366.61,9928.62,10971.41 +10948.18,11849.97,10764.0,11790.01 +11801.99,12358.89,11013.07,11299.0 +11299.0,11669.0,11231.0,11279.17 +11279.16,11465.16,10843.01,11024.99 +11025.0,11047.81,10545.84,10839.57 +10839.58,11350.0,10650.0,11084.12 +11084.12,11245.0,10890.0,11230.0 +11230.0,11445.0,11200.0,11311.25 +11311.24,11312.0,11016.07,11016.07 +11016.07,11098.05,10820.1,10830.0 +10830.0,10963.21,10500.01,10521.01 +10521.01,10521.01,10070.0,10401.34 +10401.34,10660.0,10015.0,10111.95 +10111.95,10794.2,10111.95,10433.86 +10432.24,10563.57,9900.0,9900.0 +9900.0,10150.0,9317.0,9541.54 +9537.33,9749.99,9005.0,9649.99 +9649.99,10442.26,9649.99,10239.96 +10239.86,10500.0,9910.0,10020.01 +10020.0,10097.86,9763.38,10000.01 +10000.0,10659.0,9988.88,10499.0 +10499.0,10979.5,10499.0,10826.2 +10819.98,11492.5,10688.85,11492.5 +11492.5,11634.12,10929.0,10929.01 +10929.0,11365.61,10764.82,10955.64 +10955.58,11385.0,10865.15,11270.0 +11270.0,11616.01,11170.0,11465.04 +11465.03,11790.0,11460.01,11700.97 +11700.97,11800.0,11325.0,11499.93 +11499.93,11593.03,11001.0,11001.0 +11001.0,11350.0,10871.9,11294.54 +11294.55,11336.08,11061.0,11200.01 +11200.01,11210.28,10687.21,10900.0 +10900.0,11166.62,10750.0,11133.8 +11133.79,11396.75,11061.15,11249.98 +11249.98,11500.0,11167.94,11500.0 +11500.0,11754.65,11438.23,11754.65 +11754.65,11948.97,11631.06,11668.0 +11668.01,11895.0,11525.77,11784.04 +11784.03,11995.0,11646.3,11995.0 +11995.0,12123.1,11840.0,11900.0 +11900.0,11906.98,11649.0,11824.01 +11824.01,11840.0,11520.0,11580.0 +11580.0,11840.0,11580.0,11788.0 +11788.01,11806.5,11575.0,11784.72 +11784.72,11995.0,11700.0,11786.41 +11786.41,11824.0,11400.0,11454.93 +11454.93,11454.93,11190.0,11328.15 +11328.16,11377.0,11112.03,11310.99 +11314.62,11640.28,11297.03,11600.01 +11600.01,11645.0,11410.0,11490.0 +11489.99,11548.9,11100.0,11149.2 +11149.03,11265.0,11050.0,11238.33 +11238.33,11498.0,11061.86,11475.64 +11475.6,11517.18,11269.03,11358.04 +11358.05,11594.0,11330.07,11550.02 +11550.01,11550.01,11250.0,11400.42 +11400.41,11799.99,11400.41,11769.91 +11769.92,11820.71,11611.0,11670.89 +11670.89,11848.96,11653.74,11818.3 +11818.3,11866.0,11659.81,11866.0 +11866.0,11967.5,11783.51,11895.0 +11895.0,11973.99,11664.86,11764.35 +11764.26,11795.99,11428.21,11479.96 +11479.96,11656.91,11469.13,11639.47 +11639.48,11699.0,11619.79,11633.85 +11633.84,11633.84,11207.5,11305.05 +11310.0,11342.96,11065.34,11226.67 +11226.66,11334.35,11165.0,11286.01 +11286.01,11450.0,11201.07,11350.01 +11350.01,11545.0,11340.0,11375.0 +11375.0,11399.0,11251.0,11283.52 +11283.52,11549.84,11265.1,11541.69 +11541.69,11600.0,11510.0,11521.63 +11521.62,11699.95,11521.62,11699.0 +11699.0,11798.21,11554.01,11740.0 +11740.0,11793.0,11700.0,11709.73 +11701.41,12345.11,11557.49,12244.3 +12244.3,12692.29,12198.42,12550.01 +12550.02,12596.47,12312.83,12402.63 +12402.63,12579.0,12402.63,12451.04 +12451.04,12707.08,12417.1,12665.01 +12665.01,12672.6,12450.0,12450.0 +12450.01,12550.0,12450.0,12500.0 +12500.0,12550.0,12301.0,12330.0 +12329.99,12488.88,12256.01,12461.14 +12461.14,12651.17,12445.0,12475.0 +12475.01,12710.0,12475.0,12626.15 +12626.15,12629.0,12475.0,12558.7 +12558.7,12850.55,12558.69,12820.0 +12820.0,12952.0,12697.45,12766.0 +12766.0,12985.55,12760.01,12878.1 +12878.11,12896.0,12665.0,12725.0 +12725.0,12802.16,12616.0,12784.01 +12784.0,12895.0,12723.0,12877.8 +12877.79,12929.99,12800.0,12800.0 +12800.01,12814.41,12727.0,12727.01 +12727.0,12727.0,12351.26,12447.98 +12447.99,12576.0,12411.69,12554.3 +12563.2,12610.36,12441.31,12599.01 +12599.01,12645.83,12410.0,12430.35 +12430.35,12480.0,12117.62,12120.0 +12120.0,12295.59,12082.23,12150.99 +12150.99,12169.58,11870.0,11880.0 +11890.9,11999.99,11722.2,11880.0 +11882.0,12067.0,11789.99,11790.0 +11790.0,11851.24,11666.66,11792.75 +11799.97,11930.6,11752.08,11863.06 +11863.06,12172.62,11801.67,12170.79 +12170.79,12224.0,12004.95,12044.99 +12044.99,12218.47,12010.0,12074.53 +12082.11,12082.83,11700.0,11888.01 +11888.0,11894.49,11388.0,11399.0 +11399.01,11469.5,11250.0,11275.0 +11275.01,11490.0,11223.0,11440.0 +11440.01,11577.3,11310.0,11550.0 +11550.0,11649.0,11387.0,11387.0 +11387.01,11389.98,11118.0,11230.56 +11230.55,11374.92,11162.71,11369.27 +11369.27,11474.0,11198.0,11318.0 +11317.99,11543.0,11317.99,11540.0 +11539.99,11700.0,11461.4,11620.45 +11620.46,11633.0,11315.36,11315.36 +11315.36,11550.19,11245.0,11480.01 +11480.0,11599.0,11412.89,11591.47 +11591.46,11739.96,11500.0,11500.01 +11500.01,11525.0,11350.0,11459.25 +11459.25,11647.99,11433.97,11576.31 +11576.31,11773.0,11539.86,11773.0 +11773.0,11849.0,11631.23,11649.99 +11649.99,11840.86,11597.12,11667.95 +11662.8,11751.25,11640.71,11683.27 +11683.27,11700.0,11294.7,11294.71 +11294.71,11345.77,11200.0,11200.0 +11200.01,11200.01,10335.11,10724.98 +10724.98,10848.0,10550.0,10575.0 +10574.99,10689.28,10222.0,10387.48 +10387.47,10683.28,10340.2,10672.64 +10672.64,10752.7,10450.0,10477.75 +10477.75,10649.7,10400.0,10501.68 +10493.82,10598.1,10405.0,10580.0 +10580.0,10580.0,10300.0,10300.0 +10300.0,10397.21,10025.0,10350.0 +10354.01,10745.0,10311.49,10628.18 +10628.18,10850.0,10559.99,10780.0 +10780.0,10849.51,10609.66,10800.0 +10800.0,10950.0,10656.52,10679.2 +10679.19,10849.49,10667.75,10813.52 +10813.51,10972.0,10805.65,10868.4 +10868.4,10900.0,10502.1,10511.02 +10511.02,10511.02,10265.45,10425.0 +10425.0,10600.0,10251.03,10329.02 +10329.01,10375.0,10161.0,10250.01 +10250.01,10717.97,10250.0,10642.07 +10642.08,10709.04,10429.66,10499.99 +10499.99,10547.99,10268.0,10387.78 +10387.78,10399.56,9945.0,10162.67 +10162.67,10399.99,10055.37,10161.0 +10161.01,10398.5,10142.42,10282.27 +10280.7,10489.82,10225.0,10387.84 +10387.84,10879.0,10387.84,10878.99 +10878.99,11370.0,10830.49,11339.94 +11339.94,11339.94,11072.0,11244.95 +11244.96,11343.87,11132.87,11170.0 +11170.0,11170.0,10897.92,10929.48 +10929.48,11164.5,10860.6,11089.93 +11089.94,11089.94,10925.0,11024.61 +11024.61,11159.0,10971.43,11000.0 +11000.0,11050.0,10750.42,10850.0 +10850.01,10850.01,10571.7,10639.97 +10639.97,10798.51,10561.03,10652.71 +10652.7,10770.0,10578.71,10709.92 +10709.91,10867.5,10670.0,10800.01 +10800.0,10800.01,10450.0,10650.99 +10650.98,10720.0,10605.0,10635.89 +10635.88,11054.77,10635.7,10973.86 +10973.86,11099.0,10850.39,10927.66 +10927.66,10996.6,10801.53,10801.54 +10801.53,11127.26,10750.0,11126.99 +11127.0,11142.0,10902.48,10939.73 +10939.72,11140.19,10892.33,10950.87 +10950.87,11390.0,10950.43,11276.77 +11276.78,11326.01,11139.74,11226.5 +11225.21,11450.0,11214.83,11231.0 +11230.99,11245.0,10991.27,11026.0 +11025.99,11069.98,10906.0,10960.0 +10960.01,11115.13,10801.0,11115.13 +11115.14,11130.0,10970.01,11015.0 +11015.01,11199.3,11009.18,11170.0 +11170.01,11197.65,11089.0,11162.5 +11162.49,11249.99,11135.0,11177.26 +11177.26,11179.0,11091.0,11150.0 +11149.99,11385.0,11111.11,11348.99 +11348.99,11349.0,11238.63,11329.99 +11330.0,11485.0,11300.35,11386.74 +11386.73,11595.0,11339.55,11500.0 +11500.0,11690.0,11431.65,11560.0 +11560.0,11590.27,11305.0,11443.98 +11443.98,11525.0,11423.0,11471.76 +11471.77,11528.81,11376.03,11441.77 +11453.99,11486.41,11349.83,11361.6 +11361.6,11370.7,11168.0,11175.15 +11175.15,11295.0,11146.0,11263.21 +11263.21,11355.79,11206.82,11280.0 +11280.0,11323.75,11061.17,11061.17 +11061.18,11190.0,11025.0,11091.29 +11091.29,11267.61,11084.0,11175.6 +11175.6,11246.99,11140.0,11150.0 +11150.0,11151.0,10851.0,10980.29 +10980.3,11087.0,10875.01,10949.99 +10949.99,11110.0,10901.0,11110.0 +11110.0,11250.0,11109.99,11239.2 +11239.2,11249.98,11161.0,11231.0 +11231.0,11350.0,11220.0,11260.71 +11260.01,11315.0,11111.0,11230.23 +11230.24,11278.0,11110.06,11110.07 +11110.07,11164.98,11031.2,11138.16 +11138.15,11329.0,11115.0,11280.13 +11280.12,11399.99,11250.01,11399.99 +11399.99,11570.0,11399.98,11468.82 +11468.81,11505.6,11451.12,11495.99 +11495.99,11496.0,11300.0,11386.4 +11386.4,11400.0,11285.72,11299.99 +11299.99,11380.0,11260.0,11275.61 +11275.43,11275.44,10926.02,10926.02 +10926.03,10926.03,10560.0,10577.48 +10577.48,10747.0,10305.0,10532.23 +10532.23,10660.72,10439.37,10517.47 +10517.47,10581.73,10410.0,10525.59 +10517.0,10719.24,10423.91,10694.01 +10694.01,10766.6,10536.0,10598.0 +10598.0,10839.99,10597.99,10798.01 +10798.01,11250.0,10795.0,11219.58 +11219.58,11220.0,11028.17,11028.79 +11028.79,11140.0,10955.02,11076.52 +11076.53,11102.98,10954.78,10980.01 +10980.0,11044.99,10888.86,10946.01 +10945.92,11044.0,10930.0,10935.1 +10935.09,10940.0,10819.03,10891.99 +10891.98,10895.0,10761.0,10853.84 +10853.84,11130.0,10853.84,11099.98 +11099.97,11145.0,10975.99,10984.99 +10985.0,11014.89,10888.15,10910.0 +10910.0,11150.0,10852.92,11122.01 +11122.0,11122.01,10959.9,11073.99 +11074.0,11091.0,11000.0,11027.69 +11027.7,11198.4,10987.07,11194.0 +11195.0,11349.0,11171.11,11198.99 +11198.99,11198.99,11055.55,11149.98 +11149.98,11218.05,11090.0,11118.02 +11118.01,11245.98,11076.0,11234.96 +11234.97,11249.82,11125.0,11157.0 +11160.0,11192.38,10850.0,10912.29 +10915.63,11020.43,10900.0,11005.97 +11005.97,11047.5,10920.15,10952.69 +10952.69,11074.0,10952.69,11074.0 +11073.99,11442.02,11045.01,11399.99 +11400.0,11485.56,11330.0,11378.59 +11378.59,11428.0,11300.0,11315.01 +11315.01,11397.0,11305.17,11396.99 +11397.0,11479.99,11313.89,11479.99 +11479.99,11494.08,11380.0,11390.0 +11389.99,11440.0,11368.64,11439.51 +11439.51,11439.9,11301.58,11368.08 +11368.07,11368.08,11220.0,11341.99 +11341.99,11424.0,11306.25,11322.0 +11322.0,11358.0,11261.0,11321.99 +11321.99,11329.0,11234.38,11329.0 +11329.0,11333.0,11281.0,11333.0 +11333.0,11492.24,11332.99,11492.24 +11492.24,11644.0,11491.0,11548.95 +11548.95,11695.0,11540.0,11656.82 +11656.77,11656.77,11525.25,11547.97 +11547.97,11570.62,11511.22,11526.0 +11525.01,11545.0,11434.5,11468.0 +11467.63,11518.0,11322.0,11328.99 +11329.0,11530.95,11328.55,11505.01 +11505.0,11505.01,11261.0,11301.01 +11301.02,11341.71,11251.0,11312.24 +11312.24,11399.99,11302.05,11358.61 +11358.6,11450.0,11324.0,11343.81 +11343.82,11429.5,11343.8,11425.99 +11425.99,11425.99,11358.0,11410.0 +11409.99,11425.0,11381.27,11381.27 +11381.27,11425.0,11359.38,11425.0 +11424.99,11449.0,11399.0,11440.0 +11440.0,11564.4,11435.0,11539.33 +11539.33,11588.0,11455.16,11509.2 +11509.19,11550.3,11500.0,11510.0 +11510.0,11570.0,11509.99,11521.98 +11521.98,11521.98,11169.33,11231.0 +11231.0,11294.51,11185.0,11290.0 +11290.0,11300.0,11223.49,11280.0 +11279.99,11294.0,11225.0,11231.0 +11232.0,11255.0,11220.5,11240.01 +11240.0,11240.01,11012.0,11067.0 +11067.99,11099.98,11002.0,11005.0 +11005.01,11139.99,11005.0,11046.24 +11046.23,11087.18,11030.0,11059.0 +11059.0,11105.73,11040.0,11064.54 +11064.54,11064.64,10840.0,10932.0 +10932.0,10950.0,10870.0,10886.68 +10886.68,11060.05,10869.52,11060.05 +11060.05,11150.0,11042.93,11095.6 +11095.59,11095.6,10967.93,11053.88 +11053.87,11116.73,11032.0,11116.73 +11116.73,11207.43,11085.71,11137.5 +11137.51,11205.0,11100.0,11168.34 +11168.0,11188.99,11077.39,11113.0 +11113.0,11168.2,11113.0,11149.1 +11149.09,11188.35,11100.99,11169.01 +11169.01,11169.01,11009.06,11074.96 +11075.0,11156.0,11066.17,11089.09 +11089.09,11150.0,11089.08,11120.89 +11120.89,11145.99,10900.0,10900.01 +10900.01,10968.3,10900.01,10905.75 +10905.75,10960.0,10803.0,10959.99 +10960.0,10999.98,10914.27,10948.5 +10948.49,10960.0,10936.74,10940.01 +10940.01,10973.34,10900.0,10900.0 +10900.01,10995.0,10870.27,10975.1 +10975.11,10999.0,10963.83,10970.02 +10970.02,10974.96,10830.0,10830.0 +10830.01,10885.49,10820.0,10835.0 +10835.01,10927.5,10831.9,10925.0 +10925.0,10949.0,10848.0,10848.0 +10848.0,10849.0,10378.72,10528.34 +10528.34,10580.0,10410.0,10516.01 +10516.01,10519.99,10211.17,10367.85 +10367.85,10450.0,10301.58,10364.72 +10364.72,10419.98,10013.0,10013.0 +10013.0,10099.0,9711.11,9899.99 +9900.0,10349.86,9766.0,10110.01 +10110.02,10150.0,9920.01,10033.0 +10033.0,10144.47,10032.0,10125.0 +10125.0,10243.29,10005.97,10026.96 +10026.97,10050.49,9868.0,9909.13 +9909.13,10075.83,9602.0,9620.01 +9620.0,9865.58,9601.02,9862.91 +9862.91,10050.0,9705.95,9960.01 +9960.01,9998.98,9800.93,9821.36 +9821.36,9850.23,9712.0,9810.0 +9810.01,9970.38,9657.94,9921.31 +9931.0,10085.0,9850.0,10004.5 +10004.5,10180.0,10004.49,10180.0 +10180.33,10207.0,10079.0,10090.54 +10094.16,10140.0,9910.0,10100.23 +10100.22,10161.39,10036.4,10123.0 +10122.99,10296.0,10030.0,10230.0 +10230.0,10299.95,10150.01,10231.18 +10231.18,10275.0,10030.18,10053.0 +10055.37,10096.02,9809.0,9914.0 +9913.99,9982.99,9850.0,9850.0 +9857.33,9970.0,9800.0,9966.01 +9966.0,10044.16,9942.13,9982.99 +9982.99,10040.0,9925.3,9949.99 +9950.0,9979.0,9900.0,9942.0 +9942.0,10030.0,9942.0,10011.0 +10011.0,10011.0,9920.0,9954.6 +9954.63,10043.0,9940.0,10009.98 +10009.98,10166.25,9998.0,10156.99 +10156.99,10157.0,10075.0,10096.01 +10096.0,10140.0,10037.0,10112.5 +10112.51,10118.5,10049.8,10063.0 +10063.0,10081.27,9856.0,9883.07 +9883.06,10049.98,9883.0,9875.768 +9875.76,10049.5475,9850.0,9868.466 +9868.46,10049.115,9817.0,9861.163999999999 +9861.16,10048.682499999999,9784.0,9853.862 +9853.859999999999,10048.25,9751.0,9846.56 +9846.56,9846.56,9560.0,9560.01 +9560.01,9610.0,9381.0,9420.0 +9419.27,9620.89,9403.68,9516.08 +9518.15,9553.6,9222.23,9332.61 +9332.99,9375.75,9113.21,9278.34 +9278.34,9436.0,9200.0,9314.52 +9314.52,9336.95,9150.99,9150.99 +9150.99,9185.0,8788.8,8934.0 +8939.0,9040.0,8868.0,8985.0 +8984.99,9030.0,8900.0,8930.01 +8930.0,8970.0,8650.0,8659.73 +8660.37,9180.0,8400.0,9075.01 +9075.0,9234.0,8950.0,8984.94 +8984.94,9119.01,8905.0,8992.96 +8992.95,9098.3,8901.27,8901.28 +8901.28,8944.36,8600.0,8612.0 +8612.0,8776.31,8550.0,8700.0 +8700.0,8855.55,8581.94,8780.0 +8780.0,8900.0,8640.0,8640.0 +8640.0,8695.0,8534.06,8550.0 +8550.0,8649.97,8500.01,8540.0 +8540.0,8593.81,8310.0,8520.01 +8520.01,8644.77,8339.0,8349.19 +8349.19,8389.44,8250.0,8262.56 +8262.14,8440.09,8166.0,8247.99 +8247.99,8255.0,8067.12,8083.6 +8082.34,8147.98,7880.0,7884.99 +7884.99,8500.0,7540.0,8500.0 +8499.99,8824.09,8171.18,8735.2 +8735.2,8880.0,8417.79,8588.29 +8574.15,9067.03,8540.0,9003.04 +9003.04,9090.08,8834.47,8920.62 +8920.62,8921.8,8600.0,8718.47 +8718.47,8767.95,8433.01,8433.02 +8433.02,8690.0,8426.77,8573.68 +8573.68,8762.52,8463.57,8507.66 +8507.66,8644.36,8478.53,8549.91 +8549.9,8834.99,8515.15,8832.73 +8832.74,8842.86,8710.0,8777.01 +8777.0,8799.1,8556.47,8594.39 +8594.38,8650.25,8523.28,8598.0 +8598.0,8635.0,8260.0,8325.0 +8324.99,8338.94,8124.09,8170.0 +8170.01,8430.37,8170.0,8298.99 +8299.0,8447.94,8251.62,8430.0 +8430.0,8685.0,8365.0,8655.17 +8655.16,8667.4,8560.0,8574.99 +8575.0,8970.0,8539.14,8963.0 +8963.0,8963.0,8797.15,8833.94 +8834.56,8842.01,8710.0,8733.0 +8733.0,9085.0,8710.01,9000.0 +9000.0,9100.0,8901.0,8970.0 +8969.99,9268.86,8955.0,9221.0 +9221.0,9476.37,9209.0,9465.96 +9460.02,9470.01,9158.37,9159.92 +9159.91,9374.99,9050.12,9372.02 +9372.03,9375.01,9159.0,9159.01 +9159.0,9430.0,9155.0,9365.01 +9365.0,9404.87,9284.52,9396.88 +9396.88,9499.0,9251.2,9251.2 +9251.02,9270.0,9102.0,9129.03 +9129.03,9169.99,9037.0,9037.01 +9037.0,9248.82,9029.99,9184.99 +9185.0,9209.97,9080.0,9093.0 +9092.99,9130.47,8923.34,8950.77 +8950.77,9138.28,8950.77,9138.27 +9138.28,9225.28,9064.93,9176.09 +9176.85,9190.0,9035.31,9120.71 +9120.71,9350.0,9120.7,9335.01 +9335.01,9339.99,9225.32,9267.99 +9267.99,9285.0,9135.23,9205.0 +9205.0,9205.0,8928.25,8940.01 +8940.0,9000.0,8750.0,8788.36 +8788.36,8837.48,8710.0,8800.0 +8799.99,8978.14,8551.0,8635.8 +8635.81,8775.0,8501.54,8765.0 +8765.01,8844.0,8637.85,8790.01 +8790.01,8879.19,8637.41,8705.0 +8705.0,8715.0,8305.0,8378.01 +8378.01,8570.0,8253.38,8496.52 +8496.51,8550.0,8389.92,8524.98 +8524.98,8556.43,8173.0,8265.0 +8265.0,8296.62,8000.0,8029.99 +8029.99,8158.68,7859.0,8072.11 +8066.97,8250.0,8019.0,8100.0 +8100.01,8430.0,8085.36,8329.11 +8329.11,8350.0,8141.0,8235.28 +8234.99,8325.0,8098.5,8111.89 +8111.89,8166.94,7929.9,8113.24 +8110.55,8110.55,7880.0,8032.88 +8032.87,8245.0,8010.68,8049.98 +8049.98,8330.63,7955.0,8284.95 +8285.57,8349.16,8173.01,8256.08 +8256.07,8295.0,8061.14,8092.29 +8092.31,8092.31,7911.99,7929.99 +7929.99,7975.0,7753.95,7950.2 +7950.19,8037.99,7851.0,7851.01 +7851.0,7935.88,7659.65,7735.0 +7735.0,7740.0,7550.89,7675.0 +7675.0,7851.63,7550.5,7697.27 +7697.27,7726.8,7550.0,7550.0 +7550.0,7569.0,7211.61,7278.98 +7278.97,7531.94,7116.0,7378.78 +7378.77,7479.0,7222.0,7270.0 +7270.0,7300.0,6950.46,7061.1 +7055.0,7144.99,6814.0,6837.85 +6837.86,7000.0,6425.75,6940.0 +6939.99,7449.99,6585.04,7094.0 +7094.01,7305.0,6913.72,7132.84 +7135.0,7220.22,6650.0,6810.24 +6810.23,7075.0,6700.0,6992.62 +6992.61,7097.5,6842.01,6869.0 +6869.0,6900.0,6483.82,6532.01 +6532.01,6568.0,6301.0,6326.03 +6326.03,6370.94,6180.0,6245.01 +6245.02,6289.41,6000.0,6000.0 +6000.0,6599.0,5907.25,6285.9 +6290.0,6340.66,6046.7,6168.29 +6174.99,6297.43,5873.0,6105.0 +6105.0,6175.0,5977.77,6167.55 +6167.54,6865.68,6167.54,6660.0 +6660.0,6749.96,6344.82,6468.01 +6468.01,6578.0,6178.5,6560.12 +6565.01,6818.8,6381.02,6769.1 +6769.1,7264.99,6711.0,7260.0 +7260.0,7269.0,6851.23,7035.0 +7034.99,7442.89,7034.99,7285.0 +7285.0,7325.0,6929.56,7007.07 +7005.0,7135.0,6786.16,7119.99 +7120.0,7244.0,6965.0,7229.0 +7229.0,7635.0,7182.79,7484.88 +7484.88,7775.0,7461.0,7640.0 +7640.0,7948.89,7555.81,7600.34 +7600.34,7678.0,7439.5,7667.0 +7667.0,7869.0,7635.08,7784.99 +7785.0,7787.26,7460.0,7591.83 +7591.83,7773.28,7591.83,7684.99 +7685.0,7742.0,7311.64,7311.64 +7312.01,7428.64,7212.82,7259.33 +7259.33,7582.0,7215.0,7486.0 +7486.0,7577.0,7345.23,7399.0 +7399.57,7491.0,7281.95,7491.0 +7485.0,7749.0,7363.6,7664.99 +7664.99,7779.0,7622.0,7776.98 +7776.98,7992.39,7770.84,7937.8 +7937.8,8346.0,7937.8,8324.24 +8324.23,8362.1,8061.0,8136.57 +8136.57,8499.0,8136.56,8499.0 +8499.0,8650.0,8264.55,8345.01 +8345.01,8437.73,8111.0,8323.65 +8323.65,8350.0,8100.0,8216.7 +8216.69,8240.0,7945.04,8141.19 +8141.2,8390.0,8101.85,8389.99 +8390.0,8445.69,8148.7,8211.33 +8211.93,8260.0,8060.0,8125.01 +8125.01,8244.57,7963.0,8244.57 +8244.57,8265.0,8047.7,8084.0 +8084.01,8084.11,7740.0,7740.0 +7740.0,7775.0,7535.0,7685.0 +7685.0,7820.0,7610.0,7623.91 +7625.01,7985.0,7560.0,7965.01 +7965.0,8141.0,7918.0,8085.0 +8085.0,8093.12,7838.7,8014.99 +8014.99,8228.41,8014.99,8198.51 +8198.5,8198.51,7930.27,7940.0 +7940.01,8100.0,7873.23,8090.8 +8090.79,8309.0,8041.52,8241.09 +8241.09,8347.0,8187.26,8227.99 +8228.0,8369.0,8140.01,8369.0 +8369.0,8575.0,8368.99,8475.76 +8475.54,8550.0,8422.4,8437.87 +8431.8,8625.0,8350.99,8510.99 +8510.99,8575.12,8355.0,8386.77 +8386.77,8489.87,8342.0,8420.5 +8420.49,8448.0,8211.0,8267.89 +8267.89,8298.01,8112.09,8231.81 +8230.99,8268.0,8115.45,8154.0 +8154.0,8243.0,8029.97,8190.0 +8190.0,8444.44,8189.99,8373.75 +8373.75,8397.5,8285.0,8286.0 +8286.0,8340.0,8090.0,8145.91 +8145.99,8300.0,8110.0,8145.02 +8145.03,8278.52,8140.0,8180.0 +8180.0,8180.0,7751.22,7837.79 +7836.14,8015.4,7790.0,7989.0 +7989.0,8111.0,7900.0,8092.14 +8092.14,8092.15,7900.0,7995.39 +7995.4,7995.4,7828.0,7859.99 +7857.14,7930.0,7750.0,7827.17 +7827.17,7980.84,7825.05,7980.0 +7980.0,8046.99,7924.49,7924.49 +7945.31,8179.01,7876.34,8171.37 +8171.37,8306.97,8140.0,8254.99 +8255.0,8276.49,8135.01,8230.01 +8230.0,8338.5,8191.5,8233.43 +8233.42,8241.44,8166.49,8198.59 +8198.97,8293.55,8198.97,8293.54 +8293.55,8448.97,8293.55,8398.99 +8398.99,8398.99,8286.98,8314.24 +8314.24,8390.0,8308.0,8370.01 +8370.01,8689.0,8370.0,8689.0 +8689.0,8700.0,8555.89,8649.99 +8649.99,8699.0,8612.64,8694.99 +8695.0,8698.75,8532.0,8597.48 +8597.48,8601.24,8461.0,8520.25 +8520.22,8619.0,8465.0,8570.0 +8570.0,8685.0,8569.99,8592.0 +8592.01,8899.99,8592.01,8850.0 +8850.0,8960.0,8764.34,8822.0 +8821.99,8974.0,8810.0,8974.0 +8974.0,8980.96,8876.23,8876.23 +8876.18,8876.18,8796.0,8830.89 +8830.88,8900.0,8830.88,8860.99 +8861.0,9090.0,8860.99,9051.51 +9051.51,9051.51,8862.59,8883.01 +8883.0,8883.01,8656.79,8701.29 +8701.3,8788.63,8616.0,8683.83 +8683.82,8716.94,8560.99,8635.67 +8635.67,8746.51,8610.0,8642.12 +8642.12,8745.81,8562.5,8745.81 +8745.81,8785.77,8720.0,8776.32 +8776.32,8820.0,8595.35,8595.36 +8595.35,8595.35,8329.5,8470.69 +8472.67,8483.0,8260.0,8400.0 +8400.0,8499.99,8365.96,8397.21 +8397.21,8434.36,8315.5,8315.51 +8315.51,8465.0,8276.92,8380.01 +8380.0,8400.0,8167.0,8225.44 +8229.99,8329.95,8155.0,8284.97 +8284.97,8595.0,8284.97,8538.85 +8538.86,8584.63,8480.83,8490.0 +8490.0,8502.45,8317.0,8352.0 +8352.02,8352.02,8186.5,8220.92 +8220.93,8320.88,8203.59,8215.63 +8215.63,8215.64,8050.0,8125.0 +8125.0,8184.0,8000.5,8013.22 +8013.23,8163.26,8001.04,8050.0 +8055.0,8082.5,8005.0,8030.39 +8030.4,8085.44,7900.0,7900.0 +7900.0,7950.0,7857.78,7880.0 +7880.01,8135.0,7851.0,8118.04 +8118.04,8132.98,7977.98,8081.88 +8081.87,8200.0,7975.0,8182.0 +8182.0,8324.13,8130.0,8290.0 +8290.0,8340.0,8225.49,8250.01 +8250.0,8423.12,8226.28,8398.67 +8398.66,8420.0,8354.0,8419.99 +8420.0,8480.0,8255.0,8360.0 +8359.99,8359.99,8186.1,8226.01 +8226.01,8345.0,8201.0,8297.04 +8297.04,8395.0,8239.99,8258.57 +8258.56,8289.01,8208.87,8250.01 +8250.0,8334.28,8230.0,8302.0 +8302.0,8316.0,8271.9,8290.01 +8290.01,8290.01,8032.65,8115.49 +8115.49,8260.08,8115.49,8214.99 +8219.99,8441.89,8165.0,8334.47 +8335.0,8549.01,8300.0,8500.21 +8500.21,8530.0,8431.27,8530.0 +8530.0,8537.0,8455.0,8479.0 +8479.0,8479.0,8341.37,8412.4 +8412.39,8456.81,8360.81,8366.57 +8366.58,8509.74,8366.57,8495.93 +8495.94,8795.93,8495.93,8783.0 +8783.0,8789.03,8717.0,8788.4 +8788.4,8833.5,8730.0,8819.99 +8820.0,8820.0,8632.0,8702.59 +8702.58,8775.0,8660.06,8759.01 +8759.01,8759.02,8658.76,8680.0 +8676.27,8676.27,8520.73,8590.36 +8590.37,8674.99,8589.95,8650.0 +8650.0,8728.97,8619.09,8625.0 +8625.0,8760.0,8625.0,8733.12 +8733.12,8733.13,8635.0,8691.0 +8691.0,8784.91,8634.52,8784.91 +8784.99,8883.0,8784.99,8841.77 +8841.76,8849.1,8749.98,8774.0 +8774.06,8900.0,8733.01,8900.0 +8900.0,8950.0,8826.0,8897.0 +8897.0,8925.0,8831.0,8884.8 +8884.8,8890.0,8661.33,8681.74 +8681.74,8763.22,8670.0,8748.53 +8748.52,8780.0,8700.0,8743.01 +8743.0,8743.01,8558.48,8630.79 +8630.79,8637.0,8571.43,8599.9 +8599.89,8717.68,8586.25,8696.57 +8696.57,8740.12,8611.11,8628.98 +8628.99,8646.76,8466.34,8514.8 +8514.79,8514.79,8393.5,8393.5 +8393.5,8535.0,8393.1,8535.0 +8535.0,8581.88,8420.21,8495.0 +8492.01,8618.62,8467.66,8618.62 +8618.62,8647.33,8543.0,8630.45 +8630.45,8647.0,8586.11,8592.0 +8592.01,8592.01,8500.0,8530.0 +8530.0,8572.78,8509.99,8568.96 +8568.96,8650.0,8562.1,8650.0 +8649.99,8650.0,8566.0,8566.0 +8566.01,8661.81,8566.0,8661.81 +8661.81,8730.0,8629.25,8689.98 +8689.98,8690.0,8544.52,8544.53 +8544.53,8576.71,8488.0,8495.49 +8495.45,8554.99,8490.0,8540.0 +8540.0,8634.5,8535.7,8634.5 +8634.5,8710.01,8597.0,8691.89 +8691.88,8714.87,8658.52,8686.0 +8686.01,8725.0,8640.0,8725.0 +8725.0,8840.0,8725.0,8753.99 +8754.0,8849.99,8739.14,8827.99 +8827.99,8848.4,8781.95,8797.52 +8797.52,8882.0,8780.0,8882.0 +8882.0,8882.01,8825.15,8864.55 +8863.6,8863.6,8785.6,8818.96 +8818.96,8839.88,8744.89,8799.06 +8799.05,9050.0,8784.32,9002.71 +9002.71,9241.0,9002.71,9209.0 +9209.0,9300.0,9176.0,9229.99 +9229.99,9245.0,9145.14,9233.29 +9233.29,9369.69,9208.0,9327.0 +9327.01,9366.93,9264.96,9310.96 +9310.96,9313.0,9223.0,9310.0 +9310.01,9369.0,9254.0,9256.51 +9256.5,9273.0,9183.83,9229.8 +9229.81,9310.0,9229.8,9279.01 +9279.0,9308.17,9246.86,9270.99 +9271.0,9444.0,9269.0,9401.0 +9401.0,9482.5,9400.05,9445.9 +9445.89,9471.95,9342.46,9401.59 +9401.59,9441.4,9385.0,9423.7 +9423.69,9690.0,9423.69,9651.01 +9652.32,9743.0,9600.0,9695.99 +9695.99,9745.63,9650.0,9685.0 +9685.0,9734.65,9653.5,9711.15 +9711.14,9780.0,9688.18,9715.09 +9715.08,9844.9,9700.39,9844.45 +9844.45,9888.88,9812.83,9888.88 +9888.88,9966.0,9527.22,9635.03 +9635.03,9754.27,9502.1,9754.26 +9754.27,9756.48,9551.1,9647.86 +9647.85,9784.0,9610.7,9713.05 +9714.99,9747.25,9654.88,9725.0 +9725.0,9889.89,9721.44,9850.01 +9850.01,9889.76,9800.0,9855.0 +9855.0,9920.0,9805.73,9900.0 +9900.0,10143.0,9877.5,10143.0 +10143.0,10249.81,9945.43,10080.01 +10080.01,10188.0,10079.0,10127.52 +10127.52,10140.0,9974.98,10065.06 +10066.58,10083.06,9850.0,9934.45 +9934.45,10118.0,9911.51,10094.01 +10094.0,10144.0,10000.0,10022.99 +10022.99,10231.02,10016.0,10216.0 +10216.0,10307.68,10150.0,10255.35 +10255.36,10260.01,10160.02,10169.17 +10169.17,10214.96,10050.0,10090.0 +10090.01,10107.75,9952.97,10033.11 +10033.11,10141.0,10022.0,10070.0 +10070.0,10124.99,9860.5,9883.99 +9884.0,9948.22,9751.25,9788.18 +9788.18,9963.18,9785.0,9911.53 +9911.53,9974.0,9848.19,9883.41 +9883.42,9883.42,9781.0,9781.0 +9781.01,9864.99,9729.58,9860.0 +9859.99,9927.16,9777.34,9927.15 +9927.16,9967.99,9850.0,9880.93 +9880.93,10084.54,9880.93,10069.98 +10069.99,10130.0,10027.22,10053.57 +10053.56,10144.16,10053.56,10092.42 +10092.42,10099.0,9971.0,9987.4 +9990.0,9990.0,9914.05,9970.0 +9970.01,10050.0,9930.0,10037.67 +10037.66,10061.74,9970.0,10044.99 +10044.99,10109.0,10044.99,10060.6 +10060.6,10199.0,10057.0,10186.99 +10187.0,10197.28,10080.0,10080.0 +10080.0,10195.0,10057.0,10194.99 +10195.0,10390.9,10169.98,10390.9 +10390.9,10453.71,10340.0,10399.99 +10399.99,10493.0,10389.34,10483.01 +10483.01,10588.0,10483.01,10550.31 +10550.3,10634.64,10470.69,10634.64 +10634.64,10779.09,10597.21,10720.0 +10720.0,10745.2,10640.26,10717.38 +10717.38,10890.76,10717.37,10781.54 +10781.55,10867.5,10652.0,10673.94 +10670.93,10789.89,10653.06,10702.0 +10702.0,10805.0,10689.8,10795.84 +10795.0,10898.0,10795.0,10808.34 +10808.34,10808.34,10690.0,10710.0 +10710.0,10733.65,10548.0,10727.01 +10727.01,10760.0,10668.11,10760.0 +10760.0,10866.68,10737.0,10837.96 +10837.96,10869.99,10751.0,10782.11 +10782.12,10822.0,10740.0,10813.0 +10813.0,10813.0,10715.0,10769.34 +10769.35,10822.0,10715.0,10822.0 +10822.0,10858.0,10810.0,10836.31 +10836.31,10995.0,10806.0,10995.0 +10995.0,11149.0,10994.99,11088.01 +11088.02,11160.0,11005.0,11141.3 +11141.31,11289.6,11141.3,11223.56 +11223.57,11299.1,11096.55,11143.79 +11149.84,11201.75,10800.0,10959.76 +10959.76,11012.86,10871.02,10960.0 +10960.0,10960.0,10467.13,10557.93 +10557.93,10680.0,10410.0,10514.31 +10514.39,10661.5,10471.1,10561.34 +10561.35,10602.21,10333.0,10413.12 +10413.12,10460.0,10159.0,10321.98 +10321.98,10540.9,10321.98,10514.98 +10514.98,10631.44,10481.09,10567.22 +10567.22,10638.2,10444.97,10600.0 +10600.0,10866.03,10600.0,10832.0 +10832.0,10833.0,10740.01,10793.01 +10793.01,10898.0,10659.23,10749.01 +10749.01,10749.01,10487.0,10669.02 +10669.02,10750.0,10641.11,10700.0 +10700.0,10770.78,10605.0,10716.89 +10716.9,10852.84,10701.72,10783.24 +10783.23,10850.0,10756.82,10775.09 +10775.09,10775.41,10630.0,10757.0 +10757.0,10771.0,10455.02,10499.97 +10499.97,10523.45,10350.0,10412.85 +10412.85,10489.69,10297.39,10398.35 +10398.34,10625.0,10398.34,10573.78 +10573.78,10635.89,10425.55,10608.61 +10608.62,10650.0,10479.34,10543.0 +10544.9,10592.32,10513.42,10554.89 +10554.9,10561.0,10400.35,10504.99 +10505.73,10574.28,10454.32,10573.28 +10573.28,10862.25,10540.0,10781.66 +10781.14,10840.0,10705.0,10793.0 +10793.0,10966.21,10732.81,10966.21 +10966.2,11050.0,10879.0,10938.83 +10938.84,10973.19,10832.68,10955.5 +10955.5,11036.01,10860.0,10899.99 +10899.99,10949.99,10873.63,10948.01 +10948.0,11004.39,10915.0,10997.86 +10997.85,11195.0,10997.85,11130.01 +11130.01,11274.11,10971.26,11010.0 +11010.0,11075.26,10900.0,10960.02 +10960.03,11120.0,10960.03,11080.0 +11080.01,11175.0,11014.78,11077.99 +11078.0,11216.0,11072.22,11212.16 +11212.16,11212.16,11002.35,11095.78 +11095.78,11151.0,11055.7,11076.36 +11070.02,11165.0,11055.7,11165.0 +11165.0,11437.5,11164.99,11429.14 +11429.14,11482.41,11383.28,11470.01 +11470.02,11492.0,11355.0,11409.37 +11409.37,11432.0,11329.77,11429.04 +11429.04,11494.05,11427.5,11449.01 +11449.01,11468.0,11384.0,11450.09 +11450.09,11567.32,11430.0,11535.01 +11535.01,11635.71,11485.0,11535.92 +11535.92,11535.92,11188.88,11266.03 +11266.04,11375.0,11193.18,11360.01 +11360.01,11430.09,11277.43,11352.64 +11352.64,11471.96,11317.23,11459.99 +11460.0,11511.75,11435.0,11440.07 +11440.07,11610.45,11440.0,11569.1 +11569.1,11569.1,11453.27,11465.0 +11465.0,11560.0,11415.0,11550.0 +11550.0,11642.79,11537.29,11606.81 +11606.81,11720.0,11606.81,11718.48 +11718.48,11720.0,11625.44,11650.0 +11650.0,11680.0,11550.0,11636.02 +11636.02,11775.0,11636.01,11729.49 +11729.5,11729.5,11682.55,11712.63 +11712.62,11750.0,11200.0,11275.01 +11275.01,11389.99,11000.0,11100.0 +11100.0,11111.0,10835.0,11074.99 +11074.99,11279.99,11074.98,11100.0 +11099.99,11135.6,10910.0,11085.95 +11085.95,11150.0,10677.31,10759.67 +10759.67,10853.12,10650.0,10787.0 +10787.0,10894.0,10710.0,10792.01 +10792.0,11081.85,10786.83,11032.1 +11032.1,11137.0,10978.01,11055.8 +11055.81,11095.0,10949.81,11039.99 +11039.99,11180.02,11010.69,11096.34 +11096.33,11096.33,10900.0,10955.0 +10955.0,11094.94,10939.78,11000.0 +11000.0,11090.57,10956.01,11070.0 +11069.99,11120.0,10715.72,10780.0 +10780.0,10788.0,10465.0,10610.01 +10610.02,10635.13,10426.56,10575.0 +10572.11,10620.0,10355.0,10454.75 +10454.75,10595.0,10420.5,10562.0 +10562.0,10657.0,10473.75,10489.98 +10489.99,10574.97,10385.22,10470.0 +10470.0,10479.0,10250.0,10371.12 +10371.13,10435.0,10263.0,10268.29 +10268.29,10500.0,10260.0,10500.0 +10500.0,10545.97,10409.0,10409.82 +10409.81,10545.0,10322.03,10524.74 +10524.73,10639.66,10505.0,10613.09 +10613.09,10799.01,10613.09,10693.0 +10693.0,10768.0,10663.48,10666.65 +10666.65,10818.0,10620.35,10818.0 +10818.0,10838.99,10762.11,10825.02 +10825.02,10900.0,10812.39,10850.01 +10850.01,10850.01,10560.0,10630.1 +10630.1,10672.54,10467.66,10501.15 +10501.15,10571.42,10225.1,10269.99 +10270.0,10270.0,10102.0,10248.99 +10249.0,10300.0,10190.46,10272.14 +10272.13,10333.29,9876.54,9980.79 +9980.77,10000.0,9788.49,9929.99 +9930.0,10025.0,9761.0,9997.94 +9997.93,10142.58,9887.67,10049.0 +10049.0,10089.6,9854.61,9874.45 +9874.44,9947.6,9715.27,9869.99 +9870.0,9947.0,9805.0,9896.43 +9896.43,10046.0,9850.63,10023.34 +10023.34,10134.0,9959.28,10106.99 +10107.0,10107.0,9860.0,9913.97 +9913.98,9960.0,9823.42,9948.99 +9949.0,9950.0,9727.0,9730.02 +9730.03,9750.0,9601.19,9622.0 +9622.0,9745.0,9576.43,9678.05 +9678.04,9786.0,9645.82,9670.0 +9670.0,9887.0,9669.29,9887.0 +9886.99,9900.0,9818.39,9862.2 +9862.2,9999.5,9758.5,9815.0 +9815.0,9873.73,9683.8,9849.72 +9849.73,9943.07,9812.8,9895.01 +9894.18,9980.0,9853.53,9980.0 +9980.0,10130.0,9919.06,10113.01 +10113.01,10188.78,9941.0,10014.39 +10014.4,10246.99,10014.39,10199.0 +10199.0,10249.16,10120.0,10171.04 +10171.05,10326.92,10165.0,10326.92 +10326.92,10390.77,10282.06,10337.46 +10337.46,10348.76,10267.9,10290.01 +10290.0,10331.0,10063.18,10142.08 +10142.08,10205.94,10051.0,10205.94 +10205.94,10219.11,10142.0,10209.7 +10209.7,10209.7,9925.0,9943.84 +9943.84,10020.01,9900.01,9980.26 +9980.25,10007.88,9920.0,9975.0 +9975.0,10143.9,9952.62,10120.01 +10120.01,10196.0,10102.37,10161.52 +10161.82,10330.0,10161.82,10282.14 +10282.15,10419.99,10250.0,10418.0 +10418.0,10450.0,10335.76,10335.76 +10335.76,10480.0,10307.32,10466.25 +10466.25,10494.14,10371.99,10425.0 +10424.99,10489.26,10380.0,10488.0 +10488.0,10488.01,10065.0,10094.22 +10094.21,10136.52,9962.0,10084.81 +10085.21,10154.44,9994.38,10107.49 +10107.49,10160.0,9801.01,9801.01 +9801.01,9847.67,9701.02,9762.06 +9762.06,9861.07,9680.84,9748.72 +9737.47,9925.0,9737.47,9804.16 +9804.16,9804.17,9636.87,9683.0 +9684.51,9920.0,9671.0,9782.05 +9782.05,9869.99,9680.0,9692.02 +9692.02,9837.43,9657.42,9790.02 +9790.02,9790.02,9660.0,9690.0 +9691.47,9734.04,9563.0,9617.0 +9617.0,9687.94,9520.0,9520.0 +9520.01,9520.01,9372.72,9449.84 +9449.85,9538.99,9425.0,9486.06 +9486.06,9713.34,9486.05,9685.07 +9685.06,9724.94,9563.73,9605.08 +9605.07,9692.57,9580.95,9681.03 +9681.03,9777.0,9650.0,9765.0 +9764.99,9765.0,9571.0,9579.99 +9580.0,9611.99,9505.17,9611.94 +9611.95,9752.61,9611.95,9724.49 +9724.49,9799.0,9605.58,9799.0 +9794.85,9850.0,9775.99,9820.0 +9820.0,9839.99,9717.5,9752.5 +9752.49,9784.68,9580.03,9609.99 +9610.0,9656.73,9528.9,9600.01 +9600.01,9691.28,9574.5,9654.22 +9654.22,9722.0,9618.87,9689.82 +9689.82,9689.82,9513.0,9579.63 +9579.68,9700.0,9420.11,9470.08 +9470.24,9532.1,9351.0,9351.01 +9351.01,9472.29,9324.75,9412.45 +9412.45,9460.0,9370.0,9370.01 +9370.0,9445.0,9350.0,9360.08 +9360.07,9469.97,9332.0,9445.86 +9445.86,9530.0,9408.35,9510.99 +9511.0,9615.0,9482.8,9614.0 +9614.01,9630.04,9530.01,9539.99 +9540.0,9680.0,9540.0,9650.0 +9650.0,9661.0,9564.98,9599.01 +9599.01,9676.0,9547.0,9675.05 +9675.05,9733.0,9612.24,9700.01 +9700.0,9779.49,9675.88,9690.0 +9690.0,9710.0,9575.01,9615.3 +9615.3,9679.56,9590.69,9674.0 +9674.0,9685.0,9578.9,9617.0 +9616.99,9617.0,9430.0,9467.9 +9467.91,9499.96,9428.0,9444.87 +9444.87,9499.0,9404.0,9495.34 +9495.35,9545.4,9470.05,9545.4 +9545.4,9722.66,9535.0,9683.34 +9684.6,9759.0,9676.88,9695.64 +9695.64,10039.0,9654.19,10018.28 +10018.3,10258.14,10018.3,10225.11 +10225.12,10350.0,10117.82,10189.99 +10189.6,10300.0,10144.0,10275.01 +10275.02,10369.0,10120.0,10149.99 +10150.0,10243.45,10108.36,10243.45 +10243.45,10250.0,10178.11,10219.51 +10219.51,10279.8,10185.0,10185.0 +10185.0,10279.01,10167.56,10270.0 +10270.0,10447.74,10269.99,10369.98 +10369.98,10399.0,10319.96,10362.0 +10362.01,10362.01,10252.6,10320.45 +10320.46,10390.0,10284.12,10354.99 +10354.99,10355.01,10137.13,10211.99 +10211.5,10224.01,10133.33,10166.06 +10166.06,10300.0,10155.01,10275.0 +10275.01,10330.32,10260.0,10285.01 +10285.02,10326.95,10214.87,10326.94 +10326.95,10349.0,10250.0,10325.0 +10324.99,10660.34,10300.0,10655.13 +10655.13,10720.0,10593.58,10670.99 +10670.99,10768.99,10648.8,10702.44 +10702.44,10715.54,10606.0,10680.17 +10680.18,10721.69,10651.9,10689.97 +10689.96,10737.75,10651.97,10687.19 +10687.2,10845.07,10678.68,10771.95 +10771.95,10784.7,10561.0,10590.99 +10591.0,10596.0,10464.67,10596.0 +10596.0,10672.66,10561.01,10588.99 +10589.0,10619.64,10547.6,10589.04 +10589.03,10628.79,10583.81,10628.78 +10628.78,10718.0,10628.78,10695.45 +10696.01,10708.0,10601.0,10660.0 +10660.0,10765.58,10660.0,10765.58 +10765.58,10780.0,10690.0,10708.84 +10708.84,10719.0,10540.0,10576.0 +10576.01,10658.88,10562.0,10630.34 +10630.35,10743.21,10630.34,10743.2 +10743.21,10759.47,10654.36,10700.0 +10700.0,10947.6,10700.0,10929.44 +10929.44,10969.99,10857.48,10888.08 +10888.08,10945.24,10888.08,10930.13 +10930.12,11044.0,10660.0,10715.42 +10715.41,10800.0,10670.57,10770.0 +10769.99,10798.4,10507.97,10549.79 +10549.8,10623.69,10478.0,10592.27 +10592.28,10631.87,10504.99,10535.01 +10535.0,10640.94,10525.25,10600.45 +10600.45,10600.45,10393.0,10393.0 +10393.01,10504.12,10393.01,10457.5 +10457.49,10550.0,10452.0,10521.94 +10521.93,10563.33,10468.55,10523.77 +10523.77,10523.77,10400.0,10436.7 +10436.8,10497.0,10430.04,10448.99 +10449.0,10541.5,10448.99,10488.6 +10488.6,10579.0,10475.0,10579.0 +10579.0,10666.0,10578.99,10628.01 +10628.0,10679.0,10510.98,10539.99 +10539.99,10559.19,10426.0,10454.0 +10454.0,10454.01,10221.01,10249.44 +10249.44,10390.0,10213.99,10355.0 +10354.99,10425.0,10300.0,10409.98 +10409.98,10409.98,10280.0,10374.99 +10374.99,10397.74,10304.99,10381.0 +10381.0,10445.2,10359.0,10396.14 +10396.14,10420.0,10364.13,10375.9 +10375.9,10409.51,10321.0,10402.13 +10402.14,10603.04,10396.09,10592.51 +10592.51,10631.01,10570.0,10620.0 +10620.0,10639.24,10550.8,10639.24 +10639.23,10724.15,10619.23,10689.04 +10689.04,10699.99,10649.88,10669.99 +10669.99,10689.63,10602.3,10634.99 +10635.0,10782.57,10634.99,10779.59 +10779.59,10787.1,10725.01,10740.08 +10740.07,10753.01,10658.02,10690.0 +10690.0,10760.96,10690.0,10706.51 +10706.5,10864.04,10706.5,10861.99 +10861.99,10930.0,10813.0,10922.41 +10922.42,10934.99,10840.0,10860.03 +10860.03,11075.0,10860.02,11040.0 +11040.0,11040.01,10805.0,10805.01 +10805.0,10955.0,10748.43,10945.94 +10945.94,10970.0,10869.0,10919.99 +10919.98,11042.0,10909.99,11034.99 +11035.0,11149.0,10975.37,11098.0 +11098.0,11135.0,11020.0,11054.16 +11054.16,11121.01,11053.99,11118.82 +11120.0,11120.0,10925.0,10944.56 +10944.57,11040.0,10920.0,11040.0 +11040.0,11094.01,11017.09,11071.39 +11071.4,11110.0,11028.28,11044.07 +11044.07,11110.0,11044.07,11078.61 +11078.61,11087.63,10850.0,10927.03 +10927.03,10933.0,10827.18,10877.01 +10877.01,10944.28,10834.0,10932.89 +10932.9,11031.0,10923.0,11000.26 +11000.26,11015.65,10932.34,10932.34 +10932.35,10932.35,10765.0,10830.02 +10830.71,10858.57,10820.0,10851.94 +10850.1,10860.63,10786.0,10839.99 +10840.0,10912.07,10839.99,10889.08 +10889.07,10930.0,10861.0,10913.88 +10913.89,10917.15,10858.33,10905.04 +10904.86,11066.0,10881.8,11039.0 +11039.0,11039.0,10982.01,11017.08 +11017.08,11080.52,11000.0,11080.5 +11080.51,11080.51,10952.49,11045.59 +11045.6,11078.78,11011.84,11078.77 +11078.78,11198.0,11078.77,11177.0 +11177.0,11339.0,11176.99,11307.0 +11307.0,11321.4,11212.02,11299.99 +11299.99,11362.0,11270.0,11276.59 +11281.11,11325.67,11269.0,11313.67 +11313.67,11364.34,11303.99,11349.14 +11349.14,11349.14,11230.0,11230.99 +11230.99,11323.04,11230.99,11323.04 +11323.03,11325.0,11261.37,11304.99 +11305.0,11329.99,11290.31,11314.49 +11314.5,11325.0,11257.0,11291.35 +11291.35,11394.82,11291.35,11389.0 +11389.0,11475.0,11389.0,11448.0 +11448.0,11448.0,11366.8,11417.75 +11417.74,11475.0,11402.98,11453.53 +11453.52,11469.35,11440.0,11446.99 +11447.0,11494.57,11411.59,11466.02 +11466.01,11480.0,11446.01,11469.0 +11468.99,11470.0,11451.0,11459.0 +11459.0,11459.01,11214.09,11284.01 +11284.02,11328.92,11270.0,11314.99 +11314.99,11380.0,11288.08,11375.94 +11375.94,11472.99,11365.67,11408.36 +11408.36,11430.0,11340.0,11376.29 +11376.3,11400.0,11337.19,11340.02 +11340.02,11356.0,11275.26,11289.01 +11289.0,11289.0,11110.0,11175.01 +11175.01,11222.96,11101.0,11215.16 +11215.16,11225.0,11132.88,11179.4 +11179.4,11200.0,11110.01,11131.09 +11128.14,11150.04,11041.0,11133.33 +11133.33,11215.0,11133.32,11206.01 +11206.0,11250.0,11174.44,11222.87 +11222.86,11222.87,11110.71,11110.71 +11110.71,11166.0,11088.21,11160.0 +11160.0,11222.0,11125.45,11222.0 +11222.0,11222.0,11156.0,11159.66 +11159.65,11160.0,11092.46,11092.46 +11092.47,11150.0,11090.0,11150.0 +11150.0,11165.0,11117.02,11130.0 +11130.0,11139.4,11120.61,11129.01 +11129.01,11374.0,11129.0,11373.99 +11373.99,11385.6,11327.48,11385.6 +11385.6,11448.0,11380.05,11429.58 +11429.59,11439.96,11381.0,11389.99 +11389.99,11390.0,11331.02,11374.82 +11374.81,11487.0,11374.81,11439.95 +11439.96,11455.84,11404.11,11437.41 +11437.41,11449.18,11404.78,11444.99 +11445.0,11498.5,11444.99,11469.0 +11468.99,11579.99,11452.5,11549.92 +11549.91,11599.01,11505.0,11524.03 +11524.03,11529.97,11452.26,11529.96 +11529.97,11540.08,11486.25,11502.55 +11502.54,11549.03,11493.0,11512.0 +11512.0,11522.87,11414.89,11440.0 +11439.99,11460.0,11411.23,11427.41 +11427.41,11469.94,11415.0,11469.94 +11469.93,11522.0,11447.88,11521.98 +11521.99,11540.0,11489.78,11495.33 +11495.33,11495.35,11470.2,11495.0 +11495.0,11500.0,11445.0,11484.36 +11484.36,11498.0,11461.59,11495.99 +11495.98,11543.52,11495.98,11519.99 +11520.0,11520.0,11479.99,11498.96 +11498.95,11645.74,11483.25,11638.44 +11638.43,11640.0,11610.01,11640.0 +11640.0,11640.0,11560.0,11578.76 +11578.76,11578.76,11515.91,11555.01 +11555.0,11590.0,11540.0,11570.0 +11570.0,11570.0,11316.12,11357.49 +11357.5,11395.63,11221.0,11221.0 +11221.0,11298.21,11207.0,11275.71 +11275.7,11282.69,11215.25,11231.99 +11231.54,11276.15,11170.0,11276.14 +11276.15,11331.48,11246.0,11247.0 +11247.0,11307.27,11246.99,11298.06 +11298.06,11320.0,11250.05,11250.05 +11250.06,11279.48,11225.01,11279.48 +11279.48,11279.69,11255.89,11260.0 +11260.0,11285.0,11213.0,11215.9 +11214.62,11214.62,10875.0,10926.98 +10926.99,10965.51,10855.0,10942.02 +10942.01,10949.96,10875.82,10890.0 +10890.0,10919.83,10811.0,10869.71 +10869.7,11000.0,10869.7,10978.25 +10978.26,11010.0,10951.0,10951.01 +10951.01,10969.92,10915.01,10927.01 +10927.01,10927.01,10731.03,10800.0 +10800.0,10844.99,10625.0,10645.37 +10645.38,10725.69,10565.85,10642.0 +10642.0,10726.31,10580.5,10705.01 +10702.99,10798.0,10692.21,10770.8 +10770.79,10799.0,10725.33,10778.09 +10778.09,10778.09,10589.4,10749.9 +10749.9,10888.0,10745.11,10830.01 +10830.01,10894.0,10812.5,10849.02 +10849.01,10860.07,10734.52,10747.02 +10747.01,10763.0,10691.63,10762.99 +10763.0,10778.0,10716.0,10770.01 +10770.01,10813.92,10623.65,10655.0 +10655.0,10655.01,10500.0,10538.8 +10540.03,10582.55,10439.02,10554.62 +10565.0,10619.63,10500.06,10524.99 +10524.99,10525.08,10428.14,10518.63 +10518.63,10589.07,10458.92,10502.92 +10502.92,10659.29,10467.63,10620.67 +10620.68,10653.75,10590.0,10620.0 +10620.0,10632.75,10520.0,10575.99 +10576.0,10682.22,10563.91,10672.1 +10672.1,10705.0,10604.0,10656.98 +10656.98,10656.98,9870.67,9993.18 +9990.0,9990.0,9400.0,9840.0 +9840.0,9947.0,9618.0,9707.95 +9707.94,9872.01,9650.0,9824.26 +9824.26,9840.0,9712.53,9821.01 +9821.0,9987.46,9820.0,9965.01 +9965.01,10149.88,9887.81,9933.99 +9934.0,9980.0,9830.0,9950.0 +9950.0,10030.0,9901.97,9990.0 +9989.99,10037.44,9730.27,9765.01 +9765.01,9765.01,9570.0,9695.0 +9691.37,9703.42,9510.0,9632.01 +9632.01,9803.72,9602.5,9764.98 +9764.98,9866.71,9700.0,9848.99 +9849.0,9855.0,9702.4,9782.3 +9782.3,9996.0,9782.29,9950.21 +9950.21,9969.14,9828.54,9935.21 +9935.21,10098.0,9930.0,10063.99 +10064.0,10073.12,9940.0,9994.4 +9994.4,10042.65,9929.57,9962.0 +9962.01,9991.74,9734.02,9776.0 +9776.01,9933.43,9711.0,9900.0 +9900.01,9900.01,9770.0,9844.44 +9844.44,9938.0,9815.0,9902.02 +9902.02,9902.02,9230.0,9288.0 +9288.0,9397.77,9050.0,9300.0 +9299.99,9419.99,9212.0,9350.0 +9349.99,9388.0,9248.23,9330.01 +9330.01,9450.0,9281.52,9440.01 +9440.01,9462.59,9325.0,9380.0 +9380.0,9420.0,9250.0,9335.0 +9335.0,9369.0,9279.86,9354.71 +9354.71,9410.0,9340.01,9340.02 +9340.01,9355.0,8906.43,8920.09 +8920.09,9089.0,8903.0,9007.11 +9007.11,9049.0,8880.11,8880.11 +8880.11,8880.12,8573.23,8715.0 +8714.99,8767.0,8380.0,8380.01 +8380.0,8857.22,8370.0,8768.88 +8769.51,8864.4,8610.0,8671.91 +8671.6,8833.08,8659.0,8720.0 +8720.01,8720.01,8415.0,8527.94 +8527.95,8766.6,8527.95,8735.0 +8735.01,9040.06,8674.78,8997.97 +8997.96,9047.4,8878.98,8957.01 +8957.01,8998.0,8830.68,8937.69 +8937.69,9169.0,8937.69,9086.21 +9087.94,9087.94,8928.65,9010.0 +9010.0,9066.22,8650.0,8790.01 +8790.01,8842.0,8752.9,8821.01 +8821.01,8950.0,8774.83,8892.38 +8892.38,8892.49,8671.57,8808.75 +8808.75,9011.0,8760.0,8957.28 +8957.27,9130.0,8932.62,8994.0 +8994.0,9245.08,8976.0,9177.17 +9177.17,9339.0,9177.0,9313.0 +9313.0,9377.0,9240.01,9355.61 +9355.62,9416.56,9300.0,9341.59 +9341.6,9341.6,9252.51,9290.0 +9290.01,9290.01,9164.28,9225.88 +9225.87,9349.0,9225.87,9333.26 +9333.26,9486.07,9231.78,9486.07 +9486.07,9518.77,9411.0,9411.0 +9411.01,9465.5,9340.31,9383.01 +9383.0,9429.79,9313.0,9338.66 +9338.66,9338.66,9188.0,9188.0 +9188.0,9356.1,9188.0,9320.01 +9320.01,9400.0,9305.76,9349.79 +9349.79,9374.85,9280.0,9306.44 +9306.45,9375.0,9260.87,9375.0 +9375.75,9493.95,9375.75,9446.0 +9446.0,9489.24,9351.0,9360.02 +9360.01,9425.0,9350.02,9392.0 +9393.93,9399.27,9072.0,9126.03 +9126.03,9130.0,8967.61,9054.04 +9054.05,9143.54,9016.8,9108.73 +9108.73,9108.73,8770.22,8813.86 +8813.86,8874.98,8790.8,8800.0 +8800.0,8883.48,8720.08,8801.14 +8801.14,8845.1,8707.0,8707.0 +8707.0,8707.01,8516.0,8624.0 +8624.0,8690.0,8570.53,8614.04 +8614.04,8754.0,8570.0,8723.0 +8723.0,8739.0,8520.0,8620.76 +8621.0,8733.92,8621.0,8681.2 +8681.21,8850.0,8650.0,8838.01 +8838.0,8854.99,8750.0,8763.4 +8763.4,8810.0,8700.0,8742.81 +8742.81,8803.15,8742.8,8776.48 +8774.41,8779.4,8613.37,8638.5 +8638.49,8736.9,8610.33,8706.99 +8707.0,9125.25,8661.22,9116.07 +9116.07,9257.0,9049.36,9187.5 +9187.5,9339.0,9177.85,9206.83 +9206.82,9314.32,9118.16,9184.99 +9185.0,9256.48,9050.05,9149.0 +9149.0,9274.0,9137.09,9230.0 +9230.01,9690.16,9212.32,9608.91 +9608.91,9715.0,9550.0,9585.03 +9585.02,9699.01,9481.94,9520.02 +9520.01,9641.11,9451.36,9634.99 +9635.0,9649.0,9536.01,9615.0 +9614.99,9760.0,9410.0,9482.2 +9482.2,9629.99,9424.42,9597.24 +9597.24,9636.0,9550.18,9605.61 +9605.61,9697.05,9462.69,9513.73 +9513.73,9616.95,9513.73,9578.99 +9578.99,9618.99,9355.15,9425.0 +9425.0,9575.0,9390.0,9540.01 +9540.01,9633.55,9501.0,9581.4 +9581.4,9694.98,9542.0,9599.98 +9599.97,9624.44,9519.41,9570.64 +9570.0,9570.0,9470.0,9545.0 +9545.01,9859.0,9512.38,9820.32 +9820.31,9890.0,9755.0,9820.0 +9820.01,9849.12,9763.0,9797.12 +9797.13,9800.0,9750.9,9762.29 +9762.28,9794.0,9700.0,9766.0 +9766.0,9778.8,9215.0,9282.19 +9282.19,9334.67,9005.01,9093.87 +9093.86,9275.0,9056.2,9275.0 +9275.0,9292.96,9044.12,9171.02 +9171.01,9245.36,9131.5,9153.95 +9153.95,9189.96,8857.14,8889.96 +8889.96,9042.17,8780.49,9010.0 +9010.0,9163.97,8945.0,9130.0 +9130.0,9148.2,9005.0,9113.82 +9113.82,9221.0,9059.05,9080.0 +9080.01,9268.12,9080.0,9225.0 +9225.01,9233.33,9070.0,9144.34 +9144.34,9170.01,9080.37,9096.0 +9095.99,9168.12,8965.0,9159.99 +9160.0,9450.09,9160.0,9371.18 +9370.06,9472.88,9316.03,9472.88 +9472.87,9472.87,9348.0,9355.88 +9355.88,9401.0,9100.0,9177.62 +9177.61,9216.25,9057.84,9200.0 +9200.0,9349.99,9199.99,9289.12 +9289.13,9289.13,8891.0,8960.01 +8960.0,9096.27,8908.0,9031.52 +9031.52,9127.75,8855.0,9127.75 +9127.75,9247.31,9041.0,9073.78 +9073.78,9185.0,9031.84,9089.96 +9089.99,9109.0,8961.79,9046.67 +9046.67,9301.42,8969.83,9258.21 +9258.21,9258.22,9084.28,9110.31 +9110.31,9169.99,9062.0,9137.62 +9137.62,9194.17,9005.0,9091.8 +9091.8,9187.27,9023.0,9084.02 +9084.02,9150.0,9065.26,9135.0 +9135.01,9250.0,9110.01,9178.56 +9178.55,9215.2,9130.4,9170.0 +9170.0,9340.0,9167.01,9290.0 +9290.01,9305.0,9242.6,9292.0 +9291.99,9292.0,9211.16,9245.9 +9245.9,9289.5,9112.16,9120.97 +9120.98,9128.96,9083.0,9102.93 +9102.93,9176.0,9085.0,9148.28 +9148.28,9175.98,9111.49,9162.51 +9162.51,9162.51,9050.01,9114.54 +9114.53,9114.54,9079.96,9102.01 +9102.01,9102.01,8880.41,8925.07 +8925.07,8925.07,8688.0,8736.19 +8736.2,8747.71,8625.0,8660.01 +8660.01,8744.94,8609.0,8662.5 +8662.51,8690.4,8585.0,8680.01 +8680.0,8794.53,8675.05,8705.01 +8705.01,8738.65,8665.51,8699.93 +8699.94,8725.0,8315.56,8315.56 +8315.56,8443.69,8225.87,8235.02 +8235.01,8328.0,8226.0,8278.99 +8278.98,8363.52,8225.0,8236.98 +8236.97,8360.0,8227.5,8275.06 +8275.05,8282.77,7931.0,8133.6 +8133.61,8320.0,8122.5,8225.0 +8224.99,8292.2,8190.0,8249.0 +8249.05,8263.87,8051.0,8135.0 +8134.99,8183.94,8040.0,8043.69 +8043.69,8043.7,7740.0,7900.0 +7900.0,7988.99,7834.3,7860.86 +7860.86,7955.0,7840.0,7872.19 +7872.19,7887.09,7710.0,7716.91 +7716.91,7954.99,7666.0,7940.23 +7940.28,7942.86,7808.05,7819.99 +7819.98,8255.98,7819.98,8170.0 +8170.0,8290.24,8140.0,8247.71 +8247.72,8247.74,8059.43,8185.83 +8185.82,8272.9,8104.86,8228.0 +8225.48,8252.94,8121.19,8230.97 +8230.97,8400.0,8191.26,8367.21 +8367.21,8367.21,8093.14,8130.01 +8130.01,8130.01,7944.43,8049.99 +8050.0,8109.83,7970.0,8089.98 +8089.99,8225.0,8089.98,8160.01 +8160.0,8210.0,8075.59,8168.99 +8169.0,8317.84,8150.0,8263.99 +8263.99,8300.0,8201.0,8251.3 +8251.3,8369.99,8160.0,8350.01 +8350.01,8357.4,8268.97,8294.87 +8291.03,8320.0,8225.0,8319.0 +8319.0,8329.99,8037.22,8051.99 +8052.0,8096.08,7911.0,8051.3 +8051.3,8138.66,7990.65,8125.01 +8125.01,8125.01,8020.0,8076.59 +8076.59,8249.1,8076.59,8199.5 +8199.51,8258.31,8170.63,8189.73 +8189.73,8281.78,8173.32,8187.99 +8188.0,8284.34,8175.99,8193.89 +8193.88,8271.44,8108.77,8116.95 +8120.01,8200.0,8085.18,8163.16 +8163.16,8169.15,8080.77,8123.14 +8123.14,8195.01,8110.65,8169.39 +8169.38,8225.0,8169.38,8173.11 +8172.48,8528.74,8160.1,8474.99 +8474.98,8549.0,8433.82,8473.62 +8473.63,8600.0,8473.62,8521.0 +8521.0,8560.01,8487.99,8521.38 +8521.39,8559.0,8454.0,8491.0 +8490.99,8532.92,8490.99,8515.0 +8515.01,8595.0,8502.05,8554.56 +8554.56,8570.0,8500.0,8503.0 +8503.01,8524.0,8463.04,8520.63 +8520.63,8528.06,8488.28,8510.01 +8510.01,8512.93,8251.02,8274.99 +8275.0,8302.64,8217.35,8300.01 +8300.01,8300.01,8080.86,8143.86 +8143.87,8240.0,8103.73,8210.0 +8210.01,8224.44,8170.0,8180.01 +8180.0,8210.49,8102.5,8168.61 +8168.61,8191.0,8156.17,8158.66 +8158.66,8216.9,8135.0,8208.44 +8208.43,8234.94,8170.04,8172.57 +8172.57,8349.82,8172.57,8316.25 +8316.25,8316.25,8255.86,8266.25 +8266.25,8270.0,8228.65,8253.0 +8253.0,8317.12,8120.0,8133.04 +8133.03,8135.0,8011.14,8064.88 +8064.88,8064.88,7936.0,8010.03 +8010.03,8048.92,7960.01,7960.01 +7960.01,7960.01,7864.68,7899.18 +7899.18,7948.45,7880.0,7918.3 +7918.3,7985.0,7907.87,7944.12 +7944.12,7970.0,7752.0,7789.99 +7789.99,7832.0,7751.0,7798.04 +7798.03,7897.5,7770.0,7890.0 +7890.0,8050.0,7854.76,8020.32 +8020.31,8050.0,7938.56,7972.52 +7972.53,7985.87,7819.0,7836.02 +7836.02,7879.62,7712.99,7775.0 +7775.0,7800.23,7620.71,7625.0 +7626.46,7711.85,7551.01,7650.0 +7650.0,7730.0,7600.01,7680.41 +7680.41,7729.99,7551.0,7595.0 +7595.0,7691.27,7586.05,7665.0 +7665.0,7764.84,7655.24,7733.01 +7733.01,7749.27,7655.0,7695.17 +7695.17,7822.37,7695.16,7767.5 +7767.5,7767.51,7675.02,7714.57 +7714.58,7725.0,7566.0,7580.0 +7579.99,7821.1,7570.01,7765.14 +7765.14,7824.97,7677.4,7689.79 +7689.79,7689.8,7501.0,7501.0 +7501.0,7514.33,7315.0,7430.02 +7430.02,7505.59,7326.66,7326.67 +7326.67,7443.48,7310.0,7335.0 +7335.0,7496.79,7335.0,7477.03 +7477.03,7570.0,7385.0,7390.37 +7390.37,7520.55,7381.09,7487.82 +7487.82,7861.05,7476.0,7800.0 +7800.0,8302.73,7781.43,8165.12 +8166.81,8218.59,8040.0,8218.59 +8218.59,8440.0,8129.92,8375.0 +8375.0,8444.4,8208.0,8243.3 +8243.3,8246.11,8127.0,8217.74 +8217.74,8291.0,8175.27,8204.26 +8204.27,8230.0,8129.32,8176.87 +8176.86,8240.33,8166.0,8207.5 +8207.5,8362.46,8204.43,8317.48 +8317.49,8317.5,8247.2,8270.16 +8270.17,8329.18,8270.17,8323.33 +8323.33,8406.87,8227.13,8257.67 +8257.68,8275.0,8108.31,8149.98 +8149.99,8289.08,8139.49,8283.37 +8283.18,8363.21,8245.5,8284.99 +8285.0,8312.0,8241.55,8261.47 +8261.47,8625.0,8226.83,8590.0 +8589.99,8757.5,8529.06,8584.0 +8584.0,8613.12,8525.0,8589.78 +8589.78,8625.0,8307.0,8343.79 +8343.79,8401.43,8205.32,8340.0 +8339.99,8416.59,8295.0,8336.15 +8336.15,8439.98,8326.26,8399.5 +8399.5,8519.98,8385.0,8425.0 +8425.0,8450.0,8370.12,8400.84 +8400.84,8560.0,8370.0,8468.47 +8468.48,8600.0,8457.54,8506.58 +8506.58,8529.28,8450.0,8526.2 +8526.2,8530.0,8414.0,8460.01 +8460.0,8599.99,8460.0,8570.0 +8570.0,8674.32,8529.74,8569.91 +8569.91,8570.0,8387.99,8402.29 +8402.29,8483.1,8390.0,8450.0 +8450.0,8525.45,8435.31,8482.05 +8482.05,8502.88,8316.99,8316.99 +8317.0,8414.7,8317.0,8352.8 +8352.8,8483.1,8324.06,8463.77 +8463.77,8495.99,8434.04,8475.01 +8475.01,8550.0,8440.0,8482.52 +8482.51,8582.0,8482.51,8535.5 +8535.51,8548.5,8450.0,8476.32 +8476.32,8539.0,8450.0,8520.0 +8520.01,8588.62,8509.0,8549.0 +8549.0,8831.0,8537.08,8806.41 +8806.4,8889.99,8782.0,8847.58 +8847.58,8870.0,8805.0,8823.0 +8822.99,8988.88,8812.0,8988.87 +8988.88,9046.26,8836.37,8898.62 +8898.63,8994.43,8890.0,8961.24 +8961.23,8985.83,8905.88,8929.51 +8929.51,8938.96,8832.0,8905.01 +8905.0,8970.0,8871.08,8948.2 +8948.2,8970.0,8942.0,8970.0 +8969.99,8988.0,8944.01,8950.01 +8950.01,9054.0,8950.0,9022.01 +9022.0,9143.16,9022.0,9081.02 +9081.03,9112.25,9017.63,9034.99 +9034.99,9089.94,9015.53,9089.94 +9089.93,9089.94,8893.38,8941.73 +8941.73,8980.0,8917.5,8969.99 +8969.99,9073.05,8962.22,9070.0 +9070.0,9089.86,9050.0,9078.04 +9078.04,9117.0,9062.1,9089.91 +9089.91,9089.91,8970.49,9045.76 +9045.77,9072.0,9005.0,9023.99 +9024.0,9100.0,9023.99,9076.0 +9075.99,9174.0,8935.0,8969.12 +8969.12,8990.15,8800.55,8899.15 +8899.16,8908.56,8745.0,8810.0 +8810.0,8933.46,8810.0,8916.59 +8916.59,8957.62,8860.0,8861.01 +8861.01,8908.0,8850.0,8905.0 +8905.0,8945.67,8901.51,8901.51 +8901.51,8924.95,8809.96,8819.0 +8819.01,8913.97,8819.0,8891.8 +8891.8,9048.0,8874.04,9021.13 +9021.12,9073.93,8999.71,9040.37 +9040.36,9069.02,9032.0,9045.0 +9045.0,9070.01,8981.72,9010.1 +9010.1,9019.54,8984.84,9019.54 +9019.53,9036.0,9000.0,9029.91 +9029.91,9030.0,8991.82,9001.98 +9001.98,9017.0,8920.88,8979.69 +8979.68,9017.0,8966.19,9016.4 +9016.39,9017.0,8685.0,8705.0 +8704.99,8756.08,8670.0,8748.98 +8748.98,8748.98,8629.0,8689.99 +8689.99,8760.0,8689.99,8691.34 +8691.34,8720.0,8568.38,8608.03 +8608.03,8610.0,8467.27,8553.17 +8553.18,8635.0,8498.02,8635.0 +8635.0,8659.8,8576.0,8597.18 +8597.18,8684.0,8557.6,8655.53 +8655.54,8676.53,8630.76,8650.0 +8650.01,8669.0,8562.0,8590.0 +8590.0,8605.0,8555.0,8556.25 +8556.25,8637.22,8524.15,8637.22 +8637.22,8739.0,8637.22,8739.0 +8739.0,8768.38,8677.7,8692.62 +8692.61,8715.0,8601.0,8601.04 +8601.05,8626.0,8568.38,8614.97 +8614.97,8614.97,8372.0,8401.0 +8401.0,8425.0,8343.03,8409.72 +8409.72,8459.99,8365.0,8385.65 +8385.66,8447.63,8350.23,8447.63 +8447.62,8447.63,8350.0,8390.94 +8390.94,8415.0,8382.0,8415.0 +8415.0,8516.73,8415.0,8472.01 +8472.0,8522.45,8470.0,8481.27 +8481.21,8490.0,8426.99,8469.47 +8467.17,8515.0,8452.27,8500.0 +8500.0,8509.99,8280.04,8330.0 +8330.0,8406.0,8293.37,8406.0 +8406.11,8603.0,8406.11,8575.0 +8575.0,8673.67,8574.99,8615.0 +8615.01,8644.3,8587.79,8615.0 +8615.0,8649.59,8611.6,8615.0 +8615.0,8700.0,8553.13,8600.01 +8600.01,8632.18,8585.0,8587.65 +8587.64,8624.95,8560.06,8624.33 +8624.33,8678.99,8611.69,8677.32 +8677.33,8679.99,8617.72,8659.0 +8659.0,8943.0,8658.99,8909.91 +8909.9,8966.55,8885.03,8900.53 +8900.52,8904.96,8814.46,8839.96 +8839.96,8900.0,8839.95,8895.03 +8895.03,8895.03,8860.59,8869.12 +8869.12,8955.0,8869.11,8928.93 +8928.54,8932.61,8840.0,8866.5 +8866.5,8912.23,8865.0,8912.23 +8912.23,8949.67,8879.86,8885.34 +8885.34,8900.0,8867.0,8874.72 +8874.71,8912.66,8757.86,8780.0 +8780.0,8801.39,8718.03,8767.07 +8767.88,8790.0,8701.01,8701.02 +8701.01,8885.64,8666.81,8866.91 +8866.91,8892.06,8838.44,8856.96 +8856.96,8999.0,8835.59,8950.01 +8950.0,8962.0,8903.16,8903.16 +8903.17,8956.6,8895.56,8899.85 +8899.85,8902.73,8860.0,8900.0 +8900.0,8918.45,8872.74,8895.0 +8895.0,8945.0,8888.89,8919.99 +8919.99,8960.0,8899.91,8900.0 +8900.0,8900.0,8575.0,8578.5 +8578.5,8717.97,8578.5,8629.99 +8630.0,8665.63,8500.89,8500.89 +8500.49,8574.85,8476.0,8573.49 +8573.49,8587.97,8505.0,8530.0 +8529.99,8555.47,8450.0,8495.99 +8496.0,8557.49,8480.0,8531.01 +8531.01,8540.85,8500.0,8539.0 +8539.0,8574.63,8529.99,8549.03 +8549.03,8568.0,8492.52,8515.99 +8515.99,8515.99,8400.93,8502.84 +8503.13,8574.3,8503.13,8522.4 +8522.39,8543.37,8495.0,8518.88 +8518.87,8520.0,8450.0,8464.1 +8464.09,8472.04,8359.99,8451.03 +8451.03,8520.0,8401.0,8489.3 +8489.3,8585.87,8482.0,8532.0 +8532.0,8630.0,8531.99,8571.14 +8571.13,8571.14,8462.76,8531.99 +8528.51,8563.0,8500.0,8534.55 +8534.54,8629.15,8488.72,8600.62 +8600.62,8660.52,8571.42,8626.1 +8626.09,8670.0,8587.83,8604.94 +8604.94,8615.0,8525.0,8611.02 +8611.02,8648.0,8589.0,8632.55 +8632.55,8632.55,8400.0,8434.03 +8434.03,8487.99,8401.01,8475.01 +8475.01,8498.0,8370.0,8389.99 +8390.0,8438.33,8389.99,8437.46 +8439.0,8464.77,8391.96,8456.55 +8456.55,8471.8,8420.09,8457.69 +8457.69,8473.65,8432.74,8440.02 +8440.02,8479.17,8433.88,8440.08 +8431.69,8456.97,8423.36,8423.37 +8423.36,8425.96,8390.65,8415.0 +8415.0,8424.0,8301.71,8323.6 +8323.6,8360.01,8256.98,8298.84 +8298.84,8335.0,8180.41,8199.01 +8199.0,8199.98,8067.5,8069.01 +8069.0,8153.5,8020.0,8120.0 +8120.0,8165.44,8065.85,8074.76 +8074.76,8110.0,8030.0,8110.0 +8110.0,8110.0,8051.96,8063.36 +8063.34,8089.0,8056.1,8077.94 +8077.94,8077.94,7854.0,7934.88 +7934.88,7934.88,7880.0,7889.71 +7889.72,7960.0,7888.86,7935.16 +7933.94,7937.99,7858.1,7914.99 +7914.99,7917.69,7870.0,7914.01 +7914.01,8244.7,7914.01,8179.99 +8180.0,8250.0,8122.82,8179.44 +8179.44,8219.99,8152.32,8199.99 +8199.99,8201.83,7977.07,7987.02 +7987.01,7987.01,7823.6,7859.99 +7860.0,7904.83,7825.28,7846.62 +7846.62,7898.99,7757.0,7780.02 +7780.02,7951.79,7770.0,7904.42 +7904.42,8059.11,7890.62,7920.0 +7920.0,7952.86,7870.58,7870.58 +7870.58,8015.01,7825.01,7947.41 +7947.4,7985.36,7890.0,7943.84 +7943.85,8040.03,7930.0,7930.01 +7930.0,7957.36,7874.07,7911.88 +7911.89,7990.0,7911.89,7944.71 +7944.7,8127.83,7944.7,8075.62 +8075.61,8082.52,8039.15,8069.98 +8069.99,8129.0,8050.0,8090.37 +8090.38,8111.0,8073.65,8089.0 +8089.0,8091.6,7890.0,7910.28 +7910.29,7924.0,7835.15,7899.99 +7899.99,7920.0,7838.35,7900.0 +7899.99,8033.34,7865.65,7986.03 +7986.03,8014.0,7967.65,7976.17 +7976.17,7985.62,7918.0,7960.0 +7960.0,7966.2,7769.41,7800.19 +7800.18,7822.55,7727.76,7818.99 +7818.99,7835.0,7776.33,7819.02 +7819.03,7888.5,7760.0,7846.01 +7846.0,7860.0,7830.0,7853.9 +7853.89,7860.0,7808.0,7831.83 +7831.83,7869.99,7831.83,7865.0 +7865.0,7900.0,7864.99,7900.0 +7900.0,7937.7,7859.06,7879.97 +7879.97,7980.0,7879.97,7956.09 +7956.08,8088.0,7956.08,8065.92 +8065.5,8068.0,8030.0,8042.87 +8042.87,8088.0,8006.79,8041.01 +8041.0,8047.0,7987.66,8037.09 +8037.1,8040.0,8010.0,8020.99 +8021.0,8021.0,7875.0,7900.0 +7900.0,7925.04,7827.3,7888.01 +7888.01,7914.99,7858.36,7865.1 +7865.09,7931.63,7865.09,7895.0 +7895.0,7945.74,7885.4,7925.01 +7925.01,7935.0,7890.0,7912.0 +7912.0,7937.9,7876.41,7911.99 +7911.99,7969.99,7843.94,7969.99 +7969.99,7998.0,7943.0,7943.0 +7943.0,7960.0,7912.47,7942.72 +7942.73,7942.73,7912.47,7936.94 +7936.95,7957.0,7875.0,7890.0 +7889.99,7900.09,7857.64,7882.05 +7882.06,7882.06,7832.03,7855.03 +7855.02,7855.03,7600.0,7623.99 +7623.99,7659.94,7537.0,7584.41 +7584.41,7625.02,7562.0,7597.5 +7597.5,7597.5,7500.0,7500.0 +7500.0,7570.06,7500.0,7549.99 +7550.0,7574.44,7469.41,7532.71 +7532.71,7537.86,7450.0,7491.66 +7491.66,7565.23,7427.64,7523.02 +7523.01,7530.0,7466.0,7508.0 +7508.0,7524.5,7441.0,7470.0 +7470.01,7474.96,7323.2,7415.77 +7415.77,7510.0,7373.81,7484.0 +7484.0,7551.64,7462.26,7462.26 +7462.26,7497.19,7422.3,7423.99 +7424.0,7447.6,7411.2,7435.0 +7435.01,7465.0,7333.33,7347.68 +7347.68,7347.68,7057.88,7057.88 +7057.88,7248.99,6905.0,7064.02 +7064.02,7345.85,7051.63,7177.81 +7177.81,7177.81,7061.59,7100.0 +7100.0,7110.28,6759.16,6774.0 +6774.0,6925.53,6675.0,6915.52 +6915.5,6927.77,6763.5,6870.0 +6870.01,6947.0,6801.09,6811.31 +6811.31,6825.0,6630.1,6767.01 +6767.01,7185.0,6739.91,7090.48 +7094.04,7175.01,6960.11,6960.12 +6960.11,7275.35,6960.11,7265.01 +7265.0,7265.01,7090.01,7105.72 +7105.75,7147.84,7020.0,7041.98 +7041.99,7090.2,6885.86,6932.5 +6932.51,7030.07,6932.5,6944.99 +6944.99,7023.69,6944.99,7023.0 +7023.0,7023.0,6840.79,6900.0 +6899.99,6930.0,6750.0,6796.48 +6795.0,6795.0,6657.0,6753.13 +6753.14,6870.58,6600.0,6685.33 +6682.27,6765.0,6610.56,6717.11 +6717.12,6815.0,6670.09,6814.99 +6814.99,6880.0,6740.0,6797.09 +6797.08,6923.91,6767.11,6851.7 +6851.7,6949.0,6850.0,6880.12 +6880.11,6893.07,6755.08,6800.0 +6800.0,6895.0,6770.1,6893.06 +6893.07,7043.0,6893.06,6949.48 +6947.99,7138.0,6947.99,7100.0 +7100.01,7121.76,6981.44,6990.6 +6990.6,7043.68,6966.37,7000.0 +6999.99,7049.99,6999.99,7000.01 +7000.01,7016.88,6865.22,6911.99 +6912.0,6932.36,6805.0,6822.0 +6822.0,6853.56,6780.0,6835.6 +6835.59,6969.46,6835.59,6900.48 +6900.47,7023.0,6878.6,7000.01 +7000.0,7149.0,6962.42,7118.31 +7118.31,7124.99,7050.0,7103.35 +7103.35,7200.0,7099.75,7138.49 +7137.51,7146.12,7033.49,7060.9 +7060.9,7069.98,6975.8,7022.99 +7022.99,7101.0,7017.25,7101.0 +7101.0,7170.34,7089.0,7152.01 +7152.01,7152.01,7073.0,7125.0 +7125.0,7145.22,7040.0,7053.82 +7053.81,7067.0,7000.01,7056.6 +7056.6,7059.98,6859.0,6925.0 +6925.0,6948.67,6892.02,6930.22 +6930.22,6980.23,6911.97,6961.0 +6960.99,7015.0,6887.9,7001.31 +7001.31,7044.46,6974.57,6990.0 +6993.99,7040.0,6985.45,6999.6 +6999.6,7022.19,6901.0,6943.01 +6943.01,6960.0,6900.0,6942.86 +6942.85,6988.85,6934.49,6953.0 +6953.0,6970.01,6865.99,6878.12 +6878.13,6899.91,6829.29,6851.01 +6851.0,6851.01,6710.0,6750.23 +6750.22,6750.23,6675.0,6675.0 +6675.0,6749.0,6649.88,6733.01 +6733.01,6733.01,6666.66,6702.01 +6702.01,6726.62,6672.14,6721.0 +6720.99,6750.0,6691.0,6700.02 +6700.01,6701.0,6511.0,6511.04 +6511.04,6555.99,6465.0,6544.02 +6544.02,6544.02,6450.0,6513.0 +6513.0,6876.44,6513.0,6794.99 +6795.0,6861.26,6795.0,6843.0 +6843.0,6850.2,6745.02,6823.61 +6823.6,6986.85,6820.05,6863.05 +6863.06,6950.15,6862.57,6866.99 +6867.0,6900.0,6815.0,6844.04 +6844.03,6844.04,6752.01,6767.68 +6767.99,6830.01,6767.99,6783.53 +6783.5,7037.01,6777.28,6954.0 +6954.0,7008.85,6920.0,6954.47 +6954.47,6984.0,6926.0,6976.01 +6976.01,7022.0,6950.07,7004.02 +7005.0,7011.77,6851.1,6865.0 +6865.0,6907.47,6856.88,6898.39 +6898.39,6935.0,6880.0,6890.75 +6890.75,7093.0,6890.75,7084.31 +7084.3,7084.31,7020.1,7050.1 +7050.09,7075.0,7037.25,7044.99 +7044.99,7067.38,7005.74,7037.21 +7037.01,7100.0,7027.95,7031.01 +7031.01,7040.0,6978.99,7014.0 +7013.99,7045.18,6999.0,7000.04 +7000.04,7000.05,6880.0,6931.99 +6931.99,7050.0,6916.72,7022.01 +7022.01,7040.0,6979.27,6996.01 +6996.01,7008.27,6942.42,6943.99 +6943.99,6995.0,6943.99,6973.96 +6973.95,6994.0,6950.0,6975.8 +6975.8,6979.81,6893.36,6935.77 +6935.78,6994.0,6929.86,6989.0 +6988.99,7065.0,6982.0,7030.63 +7030.8,7095.0,7011.0,7075.39 +7075.38,7080.9,7017.0,7031.0 +7031.0,7046.0,7016.8,7039.99 +7040.0,7216.35,7034.96,7168.07 +7168.08,7263.0,7157.99,7263.0 +7263.0,7398.09,7261.65,7373.99 +7373.99,7374.0,7286.63,7345.17 +7345.16,7370.0,7325.1,7344.03 +7344.02,7425.0,7336.0,7382.46 +7382.47,7407.41,7335.58,7337.98 +7337.98,7382.99,7337.98,7375.0 +7374.99,7388.95,7265.14,7339.66 +7339.66,7339.66,7299.0,7319.41 +7319.41,7375.0,7319.4,7375.0 +7375.0,7435.0,7321.0,7347.0 +7346.99,7359.51,7290.5,7359.51 +7359.51,7417.97,7342.0,7377.68 +7377.67,7439.51,7369.28,7377.0 +7377.0,7440.0,7375.01,7417.4 +7417.4,7500.0,7410.03,7461.69 +7461.7,7520.0,7452.0,7472.99 +7473.0,7475.0,7384.34,7394.91 +7394.91,7434.0,7371.0,7401.35 +7401.36,7407.55,7361.58,7391.16 +7391.16,7430.0,7390.0,7405.0 +7405.0,7420.0,7392.56,7410.0 +7409.99,7415.0,7300.0,7315.89 +7315.9,7333.99,7227.17,7282.0 +7282.01,7319.5,7282.0,7300.03 +7300.04,7330.0,7275.78,7328.91 +7328.92,7385.0,7321.59,7351.99 +7351.99,7365.0,7340.0,7353.15 +7354.0,7365.71,7315.15,7317.12 +7317.11,7335.64,7281.0,7294.21 +7294.22,7294.22,7051.99,7072.11 +7072.12,7126.81,7044.0,7075.0 +7074.99,7075.0,7007.7,7062.21 +7062.21,7075.0,7012.5,7067.0 +7066.99,7106.62,6926.0,6926.0 +6926.0,6931.86,6805.71,6887.1 +6887.1,6900.0,6766.5,6841.9 +6841.32,6900.0,6810.72,6875.01 +6875.01,6880.37,6825.01,6845.01 +6845.0,6845.0,6725.0,6822.01 +6822.0,6889.78,6775.0,6878.93 +6878.0,6898.29,6828.51,6846.94 +6846.94,6854.98,6759.56,6811.0 +6811.0,6819.0,6711.0,6759.13 +6759.13,6818.0,6708.46,6775.65 +6775.65,6815.0,6682.01,6693.0 +6693.01,6711.59,6568.64,6631.25 +6628.41,6642.0,6590.0,6634.11 +6634.11,6845.0,6597.77,6828.65 +6828.65,6839.0,6750.06,6807.0 +6806.99,6852.0,6761.61,6823.65 +6823.65,6832.72,6721.53,6732.01 +6732.01,6819.0,6729.13,6785.08 +6786.38,6903.1,6778.86,6885.01 +6885.0,6885.0,6777.0,6787.0 +6786.99,6819.48,6769.73,6776.54 +6776.55,6820.73,6730.39,6741.01 +6741.0,6741.01,6631.0,6662.0 +6662.0,6850.0,6632.5,6819.01 +6819.01,6933.11,6710.0,6733.64 +6733.64,6762.01,6703.0,6754.47 +6754.47,6754.48,6670.0,6734.0 +6735.01,6794.34,6685.01,6712.01 +6712.01,6750.0,6688.53,6712.32 +6712.77,6798.23,6712.32,6758.8 +6758.0,6780.0,6730.0,6730.01 +6730.01,6759.0,6674.22,6759.0 +6759.0,6839.99,6755.13,6824.0 +6825.0,6831.28,6776.08,6789.19 +6789.99,6842.71,6789.99,6816.99 +6817.0,6817.18,6763.02,6809.98 +6809.99,6815.0,6731.0,6765.5 +6765.49,6791.01,6749.99,6791.01 +6791.01,6819.99,6780.0,6819.99 +6819.99,6847.0,6644.54,6648.94 +6648.94,6661.84,6537.15,6589.65 +6589.65,6657.89,6561.25,6608.0 +6607.01,6622.32,6572.82,6603.96 +6603.96,6603.96,6566.62,6594.59 +6594.59,6595.1,6518.88,6556.53 +6556.53,6663.24,6556.53,6610.01 +6610.0,6619.92,6557.1,6593.0 +6593.01,6645.81,6570.68,6609.01 +6609.0,6629.39,6596.25,6606.01 +6606.01,6608.97,6570.01,6600.97 +6600.97,6630.01,6583.99,6620.64 +6620.64,6620.64,6600.0,6608.65 +6608.65,6630.0,6585.0,6596.71 +6596.7,6620.01,6595.69,6612.0 +6612.0,6620.0,6595.8,6612.0 +6611.99,6625.0,6611.99,6625.0 +6625.0,6625.0,6524.99,6564.99 +6566.17,6623.0,6559.0,6615.99 +6616.0,6800.0,6606.32,6780.0 +6780.0,6900.0,6772.93,6835.0 +6835.01,6850.0,6806.48,6832.0 +6831.99,6879.78,6818.59,6849.99 +6850.0,6850.06,6824.7,6839.0 +6839.0,6879.99,6834.05,6849.32 +6849.32,6877.0,6846.92,6855.01 +6855.02,6870.0,6844.01,6868.01 +6868.01,6900.0,6850.0,6852.98 +6852.98,6874.96,6841.4,6852.01 +6852.0,6869.0,6848.0,6862.01 +6862.01,6869.0,6851.6,6868.99 +6869.0,6869.0,6861.36,6864.01 +6864.01,6864.01,6773.65,6854.99 +6854.98,6869.0,6842.5,6854.03 +6854.04,7064.64,6854.03,7044.89 +7044.89,7048.4,7006.01,7024.49 +7024.49,7024.5,6980.17,7008.01 +7008.01,7008.01,6966.81,6979.99 +6980.0,6988.02,6974.0,6974.0 +6974.0,7004.99,6974.0,6994.4 +6994.4,6994.4,6951.29,6974.59 +6974.59,6977.0,6913.26,6934.0 +6934.01,6934.01,6860.1,6918.99 +6918.0,6973.0,6915.25,6970.0 +6970.0,6981.01,6907.61,6921.11 +6921.1,6961.59,6921.1,6931.01 +6931.0,6961.29,6924.22,6958.57 +6958.57,6990.0,6958.56,6981.99 +6982.0,7000.0,6904.35,6919.16 +6919.15,6943.64,6890.92,6940.02 +6940.01,6949.37,6933.66,6940.57 +6940.57,6961.24,6940.0,6961.23 +6961.24,7008.0,6961.24,6982.34 +6982.34,7000.0,6976.02,6992.0 +6991.99,7099.99,6988.45,7070.28 +7070.01,7089.38,7063.54,7071.0 +7071.01,7071.01,7049.36,7066.64 +7066.63,7070.0,7030.46,7035.03 +7035.03,7060.0,6993.88,7000.0 +6999.99,7010.0,6961.86,6961.86 +6961.86,7000.0,6950.0,6994.44 +6994.44,7005.59,6956.77,6987.7 +6987.71,7000.0,6974.02,6974.02 +6974.01,6974.01,6957.3,6961.0 +6961.0,7035.56,6960.99,7035.54 +7035.55,7050.0,7009.19,7012.0 +7012.0,7040.0,6992.63,7034.56 +7034.47,7090.21,7022.67,7071.01 +7071.0,7149.0,7065.84,7136.97 +7136.97,7163.03,7107.38,7121.0 +7121.0,7121.0,7069.7,7111.01 +7111.0,7150.0,7103.31,7125.0 +7125.0,7134.14,7103.31,7103.33 +7103.32,7130.0,7091.01,7123.99 +7123.99,7155.0,7112.05,7155.0 +7155.0,7169.53,7120.0,7154.46 +7154.47,7155.52,7051.0,7051.0 +7051.01,7061.27,6722.0,6761.37 +6761.0,6783.01,6703.0,6762.01 +6762.01,6780.0,6703.02,6748.47 +6748.47,6759.83,6701.0,6710.09 +6710.09,6742.23,6685.0,6735.86 +6735.86,6787.17,6711.74,6725.0 +6725.0,6743.0,6724.99,6737.66 +6737.66,6739.9,6719.62,6730.99 +6731.0,6759.13,6730.99,6741.58 +6741.58,6750.42,6630.0,6642.18 +6642.17,6678.94,6617.0,6675.0 +6675.0,6726.06,6670.45,6713.89 +6713.9,6713.9,6680.34,6707.0 +6707.22,6784.0,6707.0,6780.11 +6780.11,6780.11,6738.0,6738.01 +6738.0,6748.0,6714.46,6740.01 +6742.01,6759.46,6738.36,6745.25 +6745.25,6789.0,6742.59,6782.01 +6782.01,6798.07,6747.6,6760.25 +6760.24,6765.2,6731.97,6759.99 +6759.99,6761.0,6695.47,6725.0 +6725.0,6740.0,6707.11,6729.21 +6729.21,6736.0,6661.19,6736.0 +6735.99,6770.0,6734.26,6739.0 +6738.0,6740.0,6699.92,6705.76 +6705.76,6747.73,6705.76,6736.0 +6736.0,6770.0,6725.73,6750.98 +6750.99,6763.3,6749.41,6751.79 +6751.79,6850.0,6737.82,6821.0 +6821.0,6848.31,6812.78,6824.73 +6824.74,6838.4,6814.0,6835.0 +6835.01,6865.77,6835.0,6859.1 +6859.09,6859.09,6823.7,6830.44 +6830.44,6847.36,6829.96,6835.04 +6835.03,6839.0,6813.0,6835.97 +6835.98,6855.0,6825.87,6849.01 +6849.01,6893.29,6784.15,6797.21 +6797.2,6835.0,6792.09,6835.0 +6834.99,6849.0,6830.0,6839.0 +6839.0,6846.0,6824.99,6841.45 +6841.44,6848.5,6831.7,6839.99 +6839.99,6840.0,6806.01,6817.99 +6818.0,6858.0,6817.99,6858.0 +6858.0,6859.0,6824.99,6824.99 +6824.99,6843.94,6810.0,6843.94 +6843.94,6844.38,6843.93,6844.38 +6844.38,6858.75,6844.37,6855.0 +6855.0,6857.5,6846.35,6848.77 +6848.77,6848.78,6819.0,6819.24 +6819.23,6858.0,6819.23,6855.0 +6855.0,6914.0,6845.0,6906.01 +6906.0,6960.0,6903.04,6949.0 +6949.0,6954.0,6917.0,6917.01 +6917.01,6931.15,6917.0,6926.81 +6926.81,6926.81,6906.28,6918.0 +6917.99,6918.0,6870.7,6897.97 +6897.98,6909.97,6892.38,6899.48 +6899.48,6914.93,6899.47,6910.59 +6910.58,6910.6,6883.97,6883.98 +6883.97,6903.85,6882.2,6903.85 +6903.85,6920.0,6903.0,6920.0 +6920.0,6972.27,6919.99,6945.8 +6945.8,6950.0,6901.0,6901.21 +6901.2,6925.0,6901.2,6925.0 +6925.0,6948.79,6924.99,6948.79 +6948.78,6949.04,6931.0,6935.98 +6935.98,6960.0,6935.5,6960.0 +6960.0,6960.0,6923.0,6941.02 +6941.02,6941.02,6767.77,6788.04 +6788.04,6846.87,6788.04,6820.0 +6820.01,6845.0,6811.0,6843.51 +6843.51,6850.02,6826.3,6850.02 +6850.02,7040.0,6842.2,7040.0 +7040.0,8050.0,7039.99,7725.0 +7725.0,7761.0,7616.1,7694.01 +7694.0,7721.0,7640.0,7699.5 +7699.51,7717.0,7585.6,7625.93 +7625.92,7630.0,7591.1,7596.32 +7596.33,7745.35,7557.1,7711.01 +7711.0,7725.7,7677.0,7684.98 +7684.98,7685.0,7661.71,7684.0 +7684.0,7743.0,7669.69,7679.0 +7679.01,7730.0,7679.01,7730.0 +7730.0,7900.0,7716.0,7755.0 +7755.01,7880.0,7750.22,7845.91 +7845.9,7975.0,7845.0,7962.05 +7962.05,7972.17,7833.0,7885.04 +7885.04,7885.04,7760.0,7805.0 +7804.99,7894.0,7800.01,7865.01 +7865.0,7869.93,7810.01,7816.83 +7816.83,7830.0,7800.0,7803.96 +7803.97,7828.01,7768.01,7821.8 +7821.8,7865.0,7804.58,7858.82 +7858.81,8176.92,7852.37,8087.94 +8087.94,8146.69,8048.07,8118.18 +8118.17,8145.0,8057.74,8075.2 +8075.01,8094.74,8018.05,8070.01 +8070.01,8132.0,8070.01,8106.81 +8104.0,8220.0,8094.9,8167.06 +8167.05,8214.71,8030.0,8091.0 +8091.0,8115.0,8037.0,8099.99 +8099.99,8131.63,8081.23,8115.56 +8115.56,8150.0,8098.31,8115.0 +8115.01,8153.03,8069.0,8121.81 +8121.8,8121.81,8085.91,8113.0 +8113.01,8114.5,8045.0,8085.24 +8085.24,8096.0,7845.0,7890.0 +7890.0,7900.0,7842.0,7849.95 +7849.94,7909.0,7805.9,7903.0 +7904.0,7965.0,7855.53,7855.53 +7855.53,7932.0,7830.0,7911.99 +7912.0,8050.0,7912.0,8026.04 +8026.99,8060.0,7997.71,8019.0 +8019.0,8040.0,8000.0,8029.0 +8028.99,8035.95,7960.0,8001.05 +8001.05,8021.34,7963.52,7966.41 +7966.42,8010.0,7966.41,7990.17 +7990.17,8150.0,7990.16,8150.0 +8150.0,8150.0,8078.91,8111.65 +8111.64,8111.64,7996.52,8024.0 +8024.0,8040.1,7927.15,7979.25 +7977.01,8010.0,7949.79,7980.0 +7980.34,7988.39,7875.0,7945.01 +7945.0,7977.49,7914.46,7960.42 +7960.42,7985.78,7941.99,7973.58 +7973.57,7999.99,7943.23,7954.98 +7954.98,8010.0,7941.99,7992.08 +7992.08,7992.09,7956.54,7967.8 +7967.81,8042.51,7961.0,8022.17 +8022.18,8040.0,8001.71,8022.01 +8022.0,8080.8,8015.88,8080.8 +8080.8,8086.74,8037.43,8062.99 +8063.0,8079.0,8040.0,8040.0 +8040.01,8100.0,7975.0,8070.0 +8070.01,8124.0,8051.1,8075.48 +8075.48,8115.0,8072.16,8099.63 +8099.64,8119.99,8080.01,8083.81 +8083.86,8099.0,8080.99,8084.83 +8084.83,8150.0,8084.23,8105.11 +8105.11,8123.37,8046.29,8117.01 +8117.01,8127.26,8100.0,8107.99 +8107.99,8108.76,8087.0,8088.46 +8088.46,8150.0,8088.45,8108.01 +8108.01,8127.36,8089.75,8125.46 +8125.46,8338.0,8114.36,8332.04 +8332.04,8392.56,8300.0,8337.01 +8337.01,8349.12,8305.26,8349.12 +8349.12,8379.0,8335.1,8357.01 +8357.01,8368.0,8326.16,8329.11 +8329.11,8329.11,8250.77,8293.0 +8293.0,8302.0,8269.99,8280.0 +8280.0,8314.36,8267.0,8298.0 +8298.0,8334.89,8296.55,8315.51 +8315.51,8320.0,8285.99,8319.99 +8320.0,8320.0,8285.43,8285.44 +8285.43,8305.69,8285.43,8301.0 +8301.0,8359.99,8300.0,8344.99 +8344.99,8365.0,8320.0,8347.98 +8347.99,8398.98,8330.0,8393.92 +8393.91,8393.92,8333.68,8346.52 +8346.51,8346.52,8100.0,8148.92 +8148.91,8170.0,8121.63,8155.01 +8155.01,8155.01,8114.0,8119.98 +8119.98,8135.0,8005.69,8046.99 +8046.99,8094.99,8035.99,8077.98 +8077.99,8116.99,8070.6,8105.01 +8105.01,8134.98,8092.2,8124.3 +8122.25,8135.0,8050.0,8094.0 +8093.99,8120.65,8021.13,8027.0 +8027.0,8095.55,8027.0,8074.48 +8074.48,8074.5,7925.0,7955.99 +7956.0,7970.0,7905.99,7960.77 +7960.77,7994.0,7930.0,7987.77 +7987.77,7989.15,7952.4,7955.15 +7955.15,7970.0,7940.0,7970.0 +7969.99,8051.03,7969.99,8020.01 +8020.0,8040.0,8015.0,8022.2 +8022.99,8037.65,7954.99,7966.0 +7966.0,8005.0,7950.0,8005.0 +8005.0,8017.23,7981.51,8016.01 +8016.01,8079.75,7978.87,8047.0 +8047.36,8065.0,8032.0,8041.61 +8041.62,8048.32,8017.88,8048.32 +8048.32,8063.01,8016.9,8016.91 +8016.91,8030.0,7961.34,8030.0 +8030.0,8033.0,8010.0,8020.0 +8019.99,8020.0,7999.99,8000.01 +8000.01,8010.0,7974.0,7980.49 +7980.49,8124.41,7962.69,8124.36 +8122.08,8162.5,8106.01,8136.54 +8136.54,8150.22,8129.0,8139.98 +8139.98,8157.88,8081.0,8097.1 +8097.09,8105.0,8086.38,8095.96 +8095.96,8131.52,8095.95,8131.52 +8131.51,8141.69,8095.0,8110.0 +8109.99,8110.0,8060.0,8093.22 +8093.22,8120.0,8081.0,8107.0 +8107.0,8107.0,8079.0,8089.99 +8089.99,8120.92,8086.0,8110.01 +8110.0,8116.91,8096.0,8096.01 +8096.01,8097.2,7860.0,7870.66 +7870.66,7904.13,7822.0,7857.99 +7857.99,7928.0,7857.99,7904.01 +7904.01,7930.0,7900.0,7900.01 +7900.01,7900.01,7885.34,7885.35 +7885.34,7900.02,7867.5,7900.02 +7900.02,7926.0,7899.99,7917.99 +7917.99,7949.12,7917.98,7935.95 +7935.95,7949.0,7906.42,7913.01 +7913.01,7936.0,7913.01,7927.33 +7927.34,7930.0,7912.0,7919.03 +7919.03,7937.95,7909.33,7918.02 +7918.02,8155.0,7879.8,8130.01 +8130.01,8130.02,8090.23,8108.0 +8108.0,8108.0,8077.81,8095.0 +8094.99,8108.0,8082.01,8100.0 +8100.01,8104.86,8079.45,8080.99 +8080.99,8108.0,8079.0,8108.0 +8107.99,8114.98,8087.0,8099.99 +8099.99,8107.0,8080.0,8095.01 +8095.01,8095.01,7950.0,7969.0 +7969.01,8010.0,7966.0,8005.18 +8005.18,8130.0,8005.17,8112.23 +8112.22,8124.99,8080.0,8108.01 +8108.0,8110.0,8084.39,8090.62 +8090.63,8120.0,8090.62,8110.0 +8110.12,8243.99,8102.38,8187.59 +8187.59,8189.99,8180.35,8189.99 +8189.99,8202.69,8120.3,8165.0 +8164.99,8177.99,8145.83,8152.06 +8152.05,8152.06,8105.0,8137.56 +8137.56,8199.0,8130.0,8177.01 +8177.01,8268.9,8145.26,8198.03 +8198.03,8198.03,8160.0,8172.87 +8172.88,8195.0,8136.39,8183.27 +8183.27,8194.42,8162.41,8187.99 +8187.99,8198.95,8162.0,8178.0 +8178.0,8230.08,8105.0,8164.31 +8164.3,8226.65,8163.14,8182.03 +8182.02,8269.96,8150.05,8222.0 +8222.0,8236.85,8212.87,8222.01 +8222.01,8222.1,8187.23,8190.01 +8190.0,8240.0,8190.0,8239.99 +8239.99,8240.0,8203.33,8203.33 +8207.99,8255.61,8170.0,8229.98 +8229.97,8232.0,8214.8,8232.0 +8231.99,8280.0,8229.72,8247.12 +8247.12,8300.0,8240.0,8269.55 +8269.55,8282.71,8239.9,8251.0 +8251.0,8263.03,8230.0,8230.0 +8230.0,8248.47,8210.0,8229.66 +8229.66,8265.01,8229.66,8265.0 +8265.01,8286.35,8241.0,8253.16 +8253.16,8293.94,8253.16,8293.93 +8293.94,8355.0,8293.94,8340.5 +8340.49,8374.0,8318.0,8373.96 +8373.96,8398.8,8290.75,8330.99 +8331.0,8349.99,8319.86,8319.86 +8319.53,8319.53,8216.21,8256.0 +8256.0,8290.01,8255.99,8280.5 +8280.49,8327.0,8271.76,8327.0 +8326.99,8349.98,8319.42,8335.93 +8335.94,8343.5,8283.0,8298.2 +8298.21,8323.92,8298.2,8314.01 +8314.0,8533.0,8313.94,8500.56 +8500.57,8525.0,8500.56,8520.0 +8520.0,8543.21,8503.0,8520.0 +8519.99,8525.0,8475.05,8504.0 +8503.99,8510.0,8494.99,8499.6 +8499.59,8499.59,8452.0,8458.51 +8458.5,8515.0,8457.93,8515.0 +8514.99,8515.0,8486.81,8486.82 +8486.82,8519.0,8486.81,8500.66 +8500.67,8541.66,8500.67,8518.79 +8518.8,8529.92,8500.0,8520.01 +8520.01,8549.0,8515.17,8532.01 +8532.01,8932.57,8523.0,8865.3 +8863.94,8897.33,8799.01,8852.0 +8852.0,8852.01,8805.0,8822.21 +8822.21,8824.93,8775.94,8810.01 +8810.02,8876.68,8810.01,8856.85 +8856.86,8916.7,8850.0,8868.78 +8868.79,8868.99,8837.17,8848.01 +8848.01,8892.33,8848.0,8892.33 +8892.32,8943.33,8885.0,8930.0 +8928.98,9038.87,8836.46,8865.01 +8865.01,8875.0,8730.4,8800.44 +8800.44,8809.99,8652.26,8751.08 +8751.07,8759.3,8670.0,8670.0 +8670.0,8749.0,8610.7,8715.03 +8715.03,8773.96,8700.0,8750.01 +8750.01,8775.0,8710.0,8768.95 +8768.95,8787.0,8768.0,8768.0 +8768.01,8872.35,8768.0,8858.12 +8858.11,8858.11,8772.0,8790.01 +8790.01,8813.14,8740.01,8762.11 +8762.1,8831.0,8755.0,8800.0 +8800.01,8824.23,8768.08,8786.04 +8786.05,8788.34,8724.0,8777.01 +8777.01,8809.0,8755.01,8790.48 +8790.48,8822.3,8778.01,8810.0 +8810.0,8972.09,8810.0,8869.98 +8869.0,8881.4,8815.65,8836.11 +8836.11,8840.75,8815.64,8831.5 +8831.51,8866.95,8831.5,8866.62 +8866.62,8870.0,8825.34,8825.34 +8825.35,8851.14,8825.34,8851.14 +8851.14,8884.01,8849.96,8849.96 +8849.97,8896.0,8849.96,8862.0 +8862.01,8900.0,8850.01,8885.01 +8885.01,8952.31,8885.0,8949.99 +8950.0,8966.06,8885.77,8913.02 +8913.02,8950.41,8913.01,8943.0 +8942.99,9015.0,8921.73,8955.05 +8955.05,8955.99,8800.0,8851.9 +8851.9,8900.0,8851.89,8877.0 +8877.0,8991.34,8877.0,8940.0 +8940.0,8980.0,8930.2,8949.93 +8949.93,9010.0,8850.0,8929.97 +8929.97,8961.0,8916.9,8933.34 +8933.34,8960.0,8929.02,8929.32 +8929.31,8929.31,8865.0,8881.3 +8881.3,8915.0,8881.29,8885.16 +8885.16,8914.6,8885.15,8909.99 +8910.0,8910.0,8829.0,8836.96 +8836.96,8836.96,8754.01,8798.0 +8797.99,8843.01,8797.0,8829.95 +8829.94,8875.0,8805.0,8841.44 +8841.43,8879.84,8828.88,8866.0 +8866.08,8888.0,8851.58,8866.0 +8866.0,8876.3,8842.0,8854.99 +8854.99,8876.3,8838.1,8862.16 +8862.15,8912.01,8854.0,8911.0 +8911.0,8950.0,8903.12,8928.8 +8928.81,8947.91,8902.94,8906.0 +8906.0,8906.01,8850.01,8889.99 +8889.32,8917.84,8880.62,8894.0 +8893.99,8933.0,8893.99,8916.29 +8918.0,8991.0,8911.48,8948.89 +8948.9,8948.9,8910.02,8931.4 +8931.39,8931.4,8863.0,8928.05 +8928.06,8928.06,8896.79,8913.03 +8913.02,8929.99,8909.41,8915.99 +8915.98,8915.98,8880.0,8889.99 +8889.98,8909.0,8888.88,8900.0 +8900.01,8907.48,8815.0,8849.99 +8849.99,8929.99,8849.99,8920.04 +8920.04,8939.0,8920.04,8938.99 +8939.0,8939.0,8920.01,8924.78 +8924.79,8932.0,8910.0,8930.01 +8930.0,9221.4,8930.0,9164.87 +9164.87,9195.0,9101.45,9192.01 +9192.01,9225.0,9170.0,9179.58 +9179.59,9214.95,9173.05,9214.95 +9214.95,9271.68,9200.0,9232.0 +9232.01,9290.0,9220.04,9263.0 +9263.0,9277.5,9220.98,9220.98 +9220.98,9230.0,9205.5,9226.98 +9226.98,9266.39,9226.98,9261.0 +9261.0,9280.0,9231.87,9280.0 +9279.99,9339.69,9270.0,9308.0 +9308.01,9328.74,9280.0,9303.95 +9303.95,9371.43,9303.94,9340.67 +9340.66,9401.99,9200.0,9255.95 +9255.94,9325.16,9255.94,9322.85 +9322.98,9365.0,9321.0,9343.02 +9343.02,9365.0,9321.01,9349.95 +9349.95,9410.0,9345.0,9376.52 +9376.53,9399.68,9365.81,9397.0 +9397.0,9460.0,9303.16,9453.0 +9453.0,9460.73,9417.09,9460.73 +9460.73,9489.98,9447.44,9476.99 +9476.99,9587.82,9452.25,9560.0 +9560.0,9728.56,9536.0,9616.0 +9616.86,9686.13,9464.0,9525.84 +9525.83,9662.87,9525.83,9662.87 +9662.87,9763.49,9650.0,9707.0 +9706.0,9726.83,9344.98,9468.25 +9468.25,9512.0,9140.42,9290.94 +9290.95,9414.16,9271.0,9404.21 +9404.2,9463.9,9378.55,9429.91 +9429.91,9435.0,9317.0,9415.0 +9413.01,9434.99,9300.0,9338.38 +9338.37,9350.0,9250.0,9297.9 +9297.99,9300.0,9021.0,9159.99 +9159.98,9175.0,9020.82,9158.0 +9158.0,9200.0,9085.0,9134.0 +9134.0,9160.5,8960.0,8990.01 +8990.0,9015.08,8602.43,8787.78 +8787.78,8941.23,8787.77,8898.19 +8898.19,8970.52,8768.0,8955.01 +8955.01,9075.98,8944.03,9013.72 +9013.71,9040.0,8951.31,9006.99 +9006.98,9038.39,8945.83,9038.39 +9038.39,9096.68,9038.38,9080.5 +9080.5,9177.96,9080.5,9177.79 +9177.79,9177.79,8930.49,8964.02 +8964.01,8973.0,8758.24,8798.0 +8799.0,8828.0,8660.0,8740.25 +8740.25,8843.5,8740.25,8785.01 +8785.0,8882.15,8785.0,8838.99 +8839.0,8882.4,8779.89,8841.99 +8841.99,8919.68,8840.47,8912.01 +8912.01,8945.0,8866.86,8899.42 +8899.42,8915.0,8780.79,8834.0 +8834.0,8885.95,8805.0,8869.01 +8869.01,8873.95,8690.0,8753.42 +8752.99,8760.69,8661.03,8759.43 +8759.43,8855.75,8759.43,8825.01 +8825.01,8907.24,8817.0,8893.37 +8893.38,8929.41,8852.08,8852.09 +8852.09,8877.59,8800.0,8833.16 +8833.15,8849.99,8734.07,8806.11 +8806.11,8810.0,8777.0,8785.01 +8785.01,8880.0,8782.99,8872.25 +8872.26,8906.0,8845.0,8845.0 +8845.01,8886.0,8813.07,8848.32 +8848.31,8980.0,8844.0,8980.0 +8979.99,9145.0,8979.99,9127.99 +9127.99,9150.0,9068.99,9120.0 +9120.0,9285.0,9119.99,9258.64 +9257.05,9318.0,9204.16,9265.11 +9265.1,9270.38,9183.49,9269.99 +9270.0,9296.72,9231.23,9250.0 +9250.0,9280.0,9246.0,9246.0 +9246.01,9246.01,9120.01,9171.75 +9171.75,9227.54,9163.71,9210.0 +9209.99,9215.22,9162.0,9175.0 +9175.01,9239.67,9175.01,9225.0 +9224.99,9230.17,9188.27,9230.17 +9230.17,9275.6,9230.17,9249.99 +9250.0,9349.0,9245.99,9305.0 +9304.99,9369.0,9303.81,9344.67 +9344.67,9344.68,9285.0,9319.6 +9319.6,9343.96,9254.62,9299.01 +9299.01,9299.01,9150.0,9203.0 +9203.0,9262.0,9194.43,9245.0 +9245.0,9274.0,9201.23,9273.99 +9274.0,9295.0,9254.46,9279.99 +9280.0,9317.85,9244.29,9267.0 +9267.0,9282.63,9220.0,9235.0 +9235.0,9240.0,9059.25,9135.01 +9135.01,9154.9,8928.57,8947.44 +8947.45,9050.0,8947.44,8999.73 +8999.73,9079.64,8999.73,9031.77 +9031.77,9055.0,8863.42,8892.29 +8892.29,9030.0,8892.28,9002.94 +9002.93,9110.0,9002.93,9100.01 +9100.01,9109.34,9051.01,9069.94 +9069.94,9173.58,9069.93,9130.28 +9130.28,9146.7,9100.47,9130.62 +9130.62,9175.75,9124.7,9152.27 +9149.91,9182.67,9107.4,9129.56 +9129.55,9151.94,9100.11,9108.96 +9108.95,9318.64,9064.12,9181.0 +9181.01,9281.29,9174.21,9276.5 +9276.5,9311.49,9230.01,9244.32 +9244.33,9256.9,9194.22,9232.94 +9232.93,9447.0,9232.93,9332.13 +9332.13,9388.77,9332.12,9375.0 +9375.0,9415.0,9252.0,9256.82 +9256.82,9360.0,9256.8,9349.99 +9350.0,9355.18,9255.95,9304.99 +9304.99,9321.09,9283.0,9299.0 +9299.0,9395.34,9298.99,9377.29 +9377.29,9385.51,9355.45,9378.01 +9378.0,9392.0,9301.0,9301.0 +9301.0,9317.0,9250.0,9304.84 +9304.85,9339.0,9300.0,9333.24 +9333.25,9350.0,9319.0,9340.01 +9340.02,9415.0,9340.02,9376.49 +9376.49,9498.99,9375.0,9491.28 +9491.29,9512.5,9447.49,9480.01 +9480.01,9480.01,9361.94,9443.88 +9443.89,9458.0,9426.99,9440.0 +9440.0,9452.45,9376.03,9392.88 +9392.89,9455.77,9392.84,9455.76 +9455.77,9455.77,9402.74,9434.27 +9434.27,9434.28,9200.0,9263.84 +9263.84,9328.45,9244.0,9284.41 +9284.41,9304.29,9179.99,9211.19 +9211.0,9307.88,9180.01,9302.51 +9302.51,9307.89,9207.83,9259.61 +9259.61,9325.32,9250.0,9301.02 +9301.02,9349.0,9273.0,9299.99 +9299.99,9330.9,9275.9,9284.2 +9284.21,9310.0,9250.0,9250.79 +9250.79,9315.0,9230.0,9300.0 +9300.0,9315.0,9295.08,9301.06 +9301.06,9331.0,9300.1,9300.11 +9300.1,9307.36,9285.0,9298.16 +9298.15,9333.0,9298.15,9331.89 +9331.89,9418.65,9331.88,9377.01 +9377.01,9415.0,9377.0,9414.0 +9414.0,9414.01,9349.9,9400.05 +9400.04,9407.0,9369.89,9395.89 +9395.89,9447.0,9384.5,9434.38 +9434.38,9434.38,9250.0,9280.0 +9284.04,9319.0,9259.0,9283.0 +9283.0,9334.66,9283.0,9320.01 +9320.01,9325.46,9265.0,9265.0 +9263.74,9263.74,9190.0,9246.62 +9246.62,9246.62,9110.88,9181.49 +9181.49,9220.0,9170.86,9194.69 +9194.69,9271.72,9183.0,9262.99 +9263.0,9270.04,9233.31,9270.04 +9270.04,9311.0,9265.5,9291.9 +9291.9,9300.0,9260.0,9260.01 +9260.01,9271.14,9235.52,9235.75 +9235.74,9299.0,9235.74,9291.47 +9291.48,9310.0,9251.89,9274.49 +9274.49,9312.0,9274.49,9301.45 +9301.44,9331.04,9300.0,9300.03 +9300.02,9311.46,9275.0,9310.09 +9310.09,9312.06,9220.0,9243.99 +9244.0,9259.0,9204.01,9258.99 +9258.99,9280.54,9170.46,9202.73 +9202.73,9245.37,9188.56,9213.13 +9213.14,9213.14,8950.0,9015.0 +9014.99,9015.19,8886.0,8983.99 +8983.99,9031.25,8943.27,8989.0 +8989.0,9014.0,8924.7,8989.0 +8989.0,8996.0,8949.0,8951.72 +8951.73,8967.24,8900.0,8956.99 +8957.0,8984.62,8940.0,8984.62 +8984.62,9004.79,8967.82,8981.91 +8981.91,9050.0,8981.9,9049.99 +9050.0,9054.99,9011.99,9023.08 +9023.09,9030.0,8977.99,9030.0 +9029.99,9037.72,8964.29,8964.29 +8964.04,8966.8,8831.21,8874.04 +8874.03,8929.99,8851.13,8916.77 +8916.78,8930.0,8880.0,8930.0 +8930.0,8939.81,8896.0,8932.4 +8932.4,8987.07,8923.9,8965.0 +8965.01,9021.0,8954.84,8992.5 +8992.5,8992.5,8939.41,8980.14 +8980.14,8984.41,8970.05,8973.0 +8972.99,9040.0,8966.84,9028.04 +9028.05,9089.63,9028.03,9074.93 +9074.94,9081.11,9038.0,9040.01 +9040.01,9083.79,9039.59,9071.01 +9071.02,9093.6,9026.36,9028.03 +9028.04,9040.0,8990.0,9040.0 +9040.0,9040.0,9023.25,9023.26 +9023.26,9051.63,9000.32,9051.62 +9051.63,9080.0,9042.59,9070.0 +9070.01,9088.13,9069.98,9069.98 +9069.98,9155.94,9069.48,9146.76 +9146.76,9150.0,9130.0,9144.99 +9145.0,9145.0,9107.51,9135.63 +9135.62,9144.49,9112.09,9134.93 +9134.92,9175.0,9134.92,9148.99 +9149.0,9170.09,9143.8,9145.01 +9145.01,9145.01,9012.5,9042.52 +9042.51,9068.0,9040.0,9064.99 +9064.99,9089.72,9063.0,9063.01 +9063.01,9134.75,9063.01,9119.01 +9119.01,9136.98,9114.85,9122.0 +9122.0,9122.0,9090.98,9090.98 +9090.99,9119.0,9090.98,9106.5 +9106.5,9115.8,9050.0,9103.54 +9103.54,9207.08,9103.53,9207.07 +9207.08,9251.05,9190.01,9225.01 +9225.0,9249.65,9201.61,9249.64 +9249.64,9249.64,9133.0,9202.31 +9202.3,9203.85,9131.0,9168.98 +9168.98,9206.77,9168.12,9168.13 +9168.13,9229.99,9168.12,9229.99 +9229.99,9243.0,9180.59,9230.02 +9230.02,9290.0,9230.0,9255.12 +9255.11,9255.12,9155.1,9175.34 +9175.33,9222.51,9174.0,9188.19 +9188.18,9230.0,9188.18,9230.0 +9229.99,9230.0,9180.0,9189.99 +9189.99,9211.0,9170.55,9210.99 +9210.99,9211.0,9190.01,9201.95 +9201.95,9202.69,9139.27,9160.0 +9160.0,9329.99,9154.34,9301.56 +9301.56,9445.62,9269.0,9419.0 +9419.0,9439.8,9374.23,9425.0 +9424.99,9425.0,9374.69,9394.96 +9394.97,9579.05,9389.61,9525.01 +9525.0,9720.24,9501.0,9670.0 +9670.0,9715.0,9580.0,9649.99 +9649.99,9673.48,9575.0,9624.99 +9624.99,9648.04,9567.81,9644.0 +9644.0,9649.99,9632.71,9636.93 +9636.93,9711.82,9621.85,9711.81 +9711.81,9800.0,9451.5,9553.16 +9553.15,9632.59,9553.15,9607.69 +9607.7,9675.0,9592.0,9604.37 +9604.38,9632.5,9598.0,9603.12 +9603.13,9631.24,9529.05,9602.36 +9602.35,9609.0,9580.21,9590.56 +9585.56,9599.99,9560.0,9571.04 +9571.04,9668.28,9562.0,9647.3 +9647.31,9669.0,9620.0,9650.01 +9650.0,9742.0,9650.0,9704.44 +9704.44,9704.44,9611.36,9670.57 +9670.57,9691.0,9660.18,9675.0 +9675.0,9739.99,9621.05,9721.23 +9721.23,9745.0,9665.5,9699.9 +9699.89,9699.9,9620.0,9645.89 +9645.89,9674.0,9621.51,9673.0 +9673.0,9674.34,9539.64,9575.74 +9575.74,9699.98,9575.73,9676.44 +9676.43,9702.98,9643.48,9650.0 +9649.99,9650.0,9617.39,9634.79 +9634.79,9692.05,9628.0,9692.05 +9692.05,9692.05,9645.0,9680.99 +9681.0,9725.0,9680.99,9721.0 +9721.0,9729.0,9681.07,9725.01 +9725.01,9725.01,9668.02,9699.01 +9699.01,9759.63,9699.01,9711.71 +9711.72,9830.03,9711.71,9830.0 +9830.0,9851.45,9784.71,9789.99 +9790.0,9825.58,9780.12,9820.0 +9820.0,9849.0,9795.0,9825.04 +9825.04,9825.04,9780.0,9780.0 +9780.01,9785.01,9765.0,9765.01 +9765.01,9783.41,9765.01,9777.01 +9777.01,9820.77,9771.77,9803.17 +9803.18,9826.0,9803.17,9825.0 +9824.99,9893.0,9824.99,9866.19 +9866.2,9866.2,9813.01,9850.76 +9850.76,9920.0,9850.75,9920.0 +9919.99,9948.12,9869.99,9918.6 +9918.6,9927.99,9899.66,9927.99 +9927.99,9927.99,9860.0,9868.0 +9868.0,9900.0,9865.0,9882.95 +9882.95,9898.17,9805.0,9824.95 +9825.0,9841.0,9811.16,9834.29 +9834.3,9834.5,9815.12,9815.55 +9815.55,9815.6,9705.0,9713.6 +9713.6,9748.99,9660.28,9738.02 +9738.02,9815.17,9738.02,9790.67 +9790.67,9819.2,9780.0,9794.01 +9794.01,9880.0,9783.0,9870.01 +9870.01,9870.02,9838.4,9860.98 +9860.97,9861.0,9802.43,9827.56 +9827.56,9838.59,9809.0,9838.59 +9838.59,9841.0,9735.36,9757.03 +9757.02,9781.89,9676.0,9698.96 +9698.96,9707.67,9567.0,9614.95 +9614.95,9665.0,9614.94,9664.99 +9664.99,9665.0,9400.0,9498.35 +9502.96,9550.0,9474.05,9549.99 +9550.0,9550.0,9490.0,9490.0 +9490.01,9537.16,9431.0,9455.0 +9455.0,9510.0,9390.0,9490.44 +9490.45,9607.22,9490.44,9541.12 +9541.13,9560.0,9500.0,9500.0 +9500.0,9500.01,9450.0,9475.0 +9474.99,9559.14,9474.99,9524.99 +9525.0,9561.0,9521.01,9545.01 +9545.01,9555.22,9503.0,9503.01 +9503.0,9514.7,9480.0,9510.73 +9510.74,9515.98,9489.95,9510.74 +9510.73,9587.43,9490.0,9584.99 +9584.99,9633.83,9552.37,9555.01 +9555.01,9615.4,9555.01,9606.33 +9606.33,9619.55,9400.0,9418.36 +9418.35,9448.0,9271.58,9287.23 +9287.23,9327.96,9260.0,9289.26 +9289.27,9347.0,9220.01,9338.99 +9338.99,9350.0,9300.0,9300.01 +9300.01,9365.0,9260.16,9339.99 +9339.99,9356.55,9300.67,9300.68 +9300.68,9328.76,9250.0,9267.85 +9267.86,9370.98,9267.85,9332.18 +9332.18,9334.92,9250.0,9284.11 +9284.11,9317.15,9277.17,9290.0 +9289.99,9340.0,9280.0,9339.99 +9340.0,9340.0,9294.23,9295.02 +9295.03,9309.98,9169.0,9199.99 +9199.99,9318.47,9162.85,9318.47 +9318.46,9377.44,9292.53,9361.61 +9361.61,9380.01,9328.33,9358.0 +9358.0,9379.97,9339.93,9344.5 +9344.5,9369.99,9344.5,9359.55 +9359.54,9430.0,9359.54,9419.99 +9419.99,9438.23,9385.0,9438.22 +9438.23,9438.23,9336.97,9349.49 +9349.49,9362.95,9275.0,9328.65 +9328.66,9383.0,9287.78,9383.0 +9382.99,9393.71,9359.08,9393.7 +9393.71,9427.95,9381.0,9411.42 +9411.43,9463.13,9411.42,9428.08 +9428.07,9434.0,9385.0,9402.91 +9402.91,9417.61,9382.5,9382.5 +9382.51,9382.51,9300.0,9309.6 +9309.6,9357.54,9309.59,9338.0 +9338.01,9357.45,9335.96,9355.0 +9354.99,9380.0,9349.99,9350.0 +9350.0,9350.0,9253.0,9292.77 +9292.77,9335.4,9280.65,9296.6 +9296.6,9296.6,9050.0,9086.55 +9086.55,9146.79,9075.79,9146.79 +9146.79,9158.0,9083.3,9130.0 +9129.99,9155.19,9100.0,9144.92 +9144.92,9177.0,9126.16,9156.01 +9156.0,9159.0,9092.92,9118.92 +9118.92,9150.0,9115.59,9115.59 +9115.6,9238.0,9055.0,9214.98 +9214.98,9235.0,9200.0,9229.96 +9229.97,9229.97,9160.0,9160.01 +9160.01,9202.63,9160.0,9200.0 +9200.0,9231.44,9184.01,9208.99 +9209.0,9247.24,9161.0,9161.0 +9161.0,9180.0,9119.99,9142.0 +9141.99,9165.0,9141.99,9157.74 +9157.74,9157.74,9023.24,9023.25 +9023.25,9053.23,8978.59,8980.57 +8980.57,9055.0,8960.0,9000.0 +9000.0,9066.0,8990.0,9047.06 +9047.06,9056.98,9036.0,9056.97 +9056.97,9069.0,9018.0,9027.35 +9027.34,9115.69,9027.34,9104.72 +9104.72,9104.72,9069.87,9082.32 +9082.33,9189.0,9067.45,9167.26 +9167.26,9322.0,9167.26,9319.49 +9319.49,9319.49,9245.94,9261.82 +9259.99,9290.18,9247.65,9250.83 +9250.83,9299.99,9250.82,9299.98 +9299.98,9306.79,9266.0,9274.01 +9274.01,9330.0,9270.0,9330.0 +9330.0,9370.0,9300.0,9303.0 +9303.0,9330.0,9263.91,9279.74 +9279.74,9280.0,9250.0,9280.0 +9280.0,9291.23,9240.8,9250.0 +9250.0,9250.0,9225.79,9235.43 +9235.44,9315.0,9235.43,9284.97 +9284.96,9317.08,9275.0,9317.08 +9317.07,9352.99,9297.0,9319.5 +9319.49,9341.0,9295.0,9295.01 +9295.01,9319.88,9280.0,9315.01 +9315.01,9315.01,9280.99,9308.18 +9308.176666666666,9331.885,9283.994999999999,9301.35 +9301.343333333334,9348.76,9287.0,9294.52 +9294.51,9320.0,9255.43,9289.99 +9290.0,9386.31,9285.88,9369.73 +9369.73,9369.73,9328.33,9333.5 +9333.49,9345.0,9321.0,9335.71 +9335.71,9380.0,9327.57,9365.01 +9365.0,9366.0,9315.8,9315.81 +9315.8,9339.99,9314.16,9330.02 +9330.02,9380.0,9330.0,9339.99 +9339.98,9339.98,9320.01,9320.02 +9320.01,9343.74,9318.38,9334.36 +9334.36,9367.45,9331.62,9332.64 +9332.64,9332.64,9102.9,9125.84 +9125.83,9158.0,9070.01,9120.01 +9120.01,9124.0,9068.41,9068.41 +9068.42,9108.43,9056.93,9096.83 +9096.84,9131.66,9095.0,9102.0 +9102.01,9102.01,9054.99,9070.0 +9070.01,9092.0,8883.0,8890.01 +8890.01,8950.69,8876.0,8916.12 +8916.13,8951.98,8907.48,8937.77 +8937.78,8954.74,8887.18,8925.82 +8925.82,8935.0,8910.0,8934.03 +8934.04,8964.99,8934.03,8954.51 +8954.51,9005.0,8941.0,8992.0 +8992.01,8992.01,8770.0,8820.0 +8820.0,8845.66,8694.1,8815.38 +8815.39,8820.0,8739.43,8764.06 +8764.07,8780.0,8679.03,8767.35 +8767.35,8775.43,8700.0,8720.06 +8720.06,8726.33,8538.81,8575.7 +8575.7,8588.0,8505.01,8513.88 +8513.88,8616.66,8513.88,8565.0 +8565.0,8655.0,8563.0,8622.55 +8622.56,8627.18,8565.7,8607.49 +8607.49,8668.23,8570.0,8623.36 +8623.35,8652.82,8559.0,8584.59 +8584.59,8638.0,8563.58,8611.2 +8611.21,8675.0,8601.1,8628.26 +8628.27,8628.27,8380.0,8442.8 +8442.81,8449.0,8351.0,8415.0 +8415.0,8475.0,8414.99,8475.0 +8474.99,8474.99,8363.33,8418.79 +8418.8,8471.86,8411.0,8417.57 +8417.56,8476.3,8375.0,8458.6 +8458.6,8466.42,8413.77,8445.0 +8444.99,8448.6,8357.28,8414.83 +8414.83,8440.89,8383.0,8392.63 +8392.63,8392.63,8260.0,8283.84 +8283.85,8335.91,8223.43,8321.29 +8321.28,8342.52,8270.81,8314.85 +8314.84,8326.16,8260.37,8276.74 +8276.19,8533.08,8244.22,8485.01 +8485.01,8588.44,8481.1,8555.48 +8555.49,8569.95,8501.0,8564.02 +8564.01,8658.57,8564.01,8624.12 +8624.13,8624.13,8526.25,8526.25 +8526.25,8530.9,8469.38,8508.03 +8508.02,8508.03,8321.0,8398.0 +8398.0,8398.0,8284.32,8350.14 +8350.14,8408.18,8305.0,8367.26 +8367.26,8387.3,8350.01,8363.3 +8363.3,8509.99,8363.29,8492.91 +8492.9,8492.91,8353.52,8356.0 +8356.0,8428.48,8350.0,8403.77 +8403.76,8498.43,8403.0,8480.0 +8481.8,8547.0,8450.0,8517.48 +8517.48,8525.0,8423.9,8457.59 +8457.58,8472.38,8380.0,8390.41 +8390.41,8418.0,8378.8,8405.26 +8405.26,8449.84,8405.25,8449.84 +8449.84,8450.4,8345.0,8366.69 +8366.69,8418.2,8365.0,8391.15 +8391.15,8500.9,8386.55,8475.0 +8474.99,8474.99,8420.0,8471.55 +8471.54,8475.0,8411.7,8415.32 +8415.31,8650.0,8409.11,8574.01 +8574.02,8585.0,8545.0,8560.0 +8560.0,8583.51,8557.43,8574.5 +8574.5,8627.78,8555.0,8574.38 +8574.38,8581.0,8538.0,8581.0 +8581.0,8651.0,8577.48,8637.23 +8637.23,8638.01,8584.44,8605.01 +8605.01,8690.0,8604.76,8664.01 +8664.01,8678.23,8570.81,8589.51 +8589.51,8644.59,8589.5,8643.05 +8643.05,8643.05,8605.0,8630.0 +8630.0,8741.19,8629.99,8719.89 +8719.89,8774.32,8670.0,8692.64 +8692.64,8749.81,8692.64,8740.0 +8740.0,8740.0,8653.18,8655.45 +8655.45,8706.99,8602.0,8675.14 +8675.15,8712.0,8655.42,8655.43 +8655.43,8687.68,8608.05,8631.62 +8631.62,8631.62,8378.0,8416.37 +8416.37,8435.27,8350.0,8362.63 +8362.62,8383.01,8289.79,8357.0 +8357.0,8400.0,8343.22,8387.35 +8387.35,8400.0,8337.0,8381.27 +8381.26,8439.99,8381.26,8408.93 +8420.43,8440.0,8370.15,8383.98 +8383.98,8429.0,8350.0,8420.01 +8420.02,8449.99,8396.76,8404.98 +8404.98,8429.79,8385.0,8409.2 +8409.2,8725.0,8338.29,8694.0 +8693.99,8824.0,8693.99,8764.97 +8764.97,8824.0,8717.38,8766.39 +8770.0,8800.0,8746.04,8758.01 +8758.0,8768.0,8708.68,8751.04 +8751.05,8774.32,8718.05,8774.31 +8774.31,8775.0,8730.0,8749.56 +8749.55,8880.01,8749.55,8834.15 +8834.14,8846.95,8657.0,8695.25 +8695.25,8753.99,8610.36,8629.0 +8628.35,8742.48,8616.1,8738.49 +8738.49,8750.0,8698.38,8707.21 +8707.21,8728.09,8661.25,8719.68 +8719.68,8719.68,8628.05,8638.02 +8638.02,8714.01,8638.02,8707.24 +8707.24,8740.24,8676.36,8706.51 +8706.51,8747.75,8687.0,8730.0 +8729.99,8797.18,8711.49,8739.91 +8739.14,8739.92,8678.81,8678.81 +8679.47,8730.03,8659.0,8715.0 +8715.01,8739.92,8702.52,8705.76 +8709.99,8847.0,8701.85,8790.01 +8790.0,8795.88,8745.5,8765.01 +8765.01,8784.0,8745.82,8751.01 +8751.0,8754.0,8691.86,8737.01 +8737.01,8740.61,8480.0,8520.01 +8520.01,8548.34,8503.01,8530.99 +8531.0,8592.57,8507.08,8553.03 +8553.03,8564.12,8420.45,8462.3 +8460.49,8549.77,8455.0,8499.0 +8499.0,8569.62,8456.7,8528.87 +8528.86,8538.48,8500.0,8521.88 +8521.88,8551.62,8500.0,8500.01 +8500.01,8561.87,8431.03,8478.9 +8478.89,8504.34,8453.92,8478.58 +8478.57,8500.0,8420.74,8470.56 +8467.43,8469.98,8283.14,8320.03 +8320.02,8328.62,8103.33,8162.05 +8162.04,8211.51,8151.4,8190.78 +8190.78,8280.0,8173.28,8197.0 +8197.0,8237.52,8175.0,8219.91 +8219.9,8259.0,8182.47,8234.28 +8234.28,8255.58,8200.0,8204.96 +8206.35,8240.0,8202.99,8216.0 +8216.0,8249.19,8203.45,8247.15 +8247.15,8436.14,8238.69,8384.98 +8384.99,8436.37,8367.71,8382.04 +8382.04,8389.98,8348.46,8365.0 +8365.0,8368.0,8114.36,8184.99 +8185.0,8220.5,8166.02,8213.0 +8213.0,8360.0,8213.0,8296.65 +8296.65,8326.31,8220.0,8252.03 +8252.04,8354.0,8252.03,8309.44 +8309.44,8348.99,8271.13,8294.0 +8294.01,8375.63,8225.18,8262.81 +8262.82,8294.3,8245.1,8283.43 +8283.43,8310.0,8263.64,8291.73 +8291.73,8379.36,8282.34,8292.22 +8292.23,8360.0,8292.22,8360.0 +8360.0,8398.97,8326.41,8363.09 +8363.09,8394.0,8320.0,8394.0 +8394.0,8394.0,8359.46,8383.99 +8383.99,8483.48,8323.59,8360.0 +8360.0,8380.0,8280.23,8322.38 +8322.39,8369.66,8312.6,8348.36 +8348.36,8377.84,8306.93,8317.05 +8317.05,8346.6,8200.0,8273.22 +8273.23,8280.0,8235.05,8269.56 +8269.57,8316.24,8269.57,8295.0 +8295.01,8317.03,8262.51,8314.47 +8314.47,8314.47,8289.53,8304.98 +8304.98,8322.98,8227.26,8270.15 +8270.15,8300.0,8262.01,8299.99 +8300.0,8350.0,8299.95,8305.01 +8305.01,8320.0,8299.0,8304.98 +8304.98,8305.0,8233.0,8269.3 +8269.3,8269.31,8236.99,8256.0 +8256.0,8270.01,8101.0,8163.92 +8163.92,8219.24,8156.08,8219.24 +8219.24,8227.0,8188.93,8202.74 +8202.75,8202.75,8045.0,8045.0 +8045.01,8095.0,8001.0,8095.0 +8094.99,8094.99,8006.0,8042.91 +8042.92,8055.44,7927.21,7945.0 +7947.02,8010.99,7947.02,7960.03 +7960.02,8019.98,7952.46,7999.0 +7999.0,8026.0,7987.68,8005.11 +8005.11,8067.16,8004.23,8043.84 +8039.08,8054.59,7990.1,8036.81 +8036.8,8036.83,7951.54,8022.05 +8022.06,8172.82,8019.7,8090.0 +8090.0,8139.96,8082.16,8125.0 +8125.01,8127.69,8084.45,8103.75 +8106.48,8148.38,8099.97,8125.27 +8125.27,8133.89,8051.0,8109.07 +8104.24,8139.99,8086.0,8100.0 +8100.0,8124.6,8067.11,8086.34 +8086.35,8092.65,8047.08,8078.37 +8078.38,8132.84,8070.32,8108.27 +8108.27,8145.0,8089.21,8130.58 +8130.58,8140.0,8100.0,8105.02 +8105.01,8259.0,8088.01,8244.31 +8244.32,8280.0,8185.17,8245.0 +8245.0,8247.1,8210.91,8234.99 +8234.99,8263.96,8225.35,8240.0 +8239.99,8249.0,8212.6,8235.01 +8235.01,8249.0,8220.45,8247.81 +8247.81,8250.0,8212.19,8225.0 +8225.0,8227.0,8166.09,8190.01 +8190.01,8214.65,8177.6,8193.36 +8193.36,8272.47,8192.01,8234.96 +8234.96,8243.79,8234.05,8234.06 +8234.06,8243.0,8222.0,8243.0 +8243.0,8243.0,8225.85,8225.85 +8225.86,8237.0,8152.54,8177.71 +8170.86,8214.5,8170.86,8214.5 +8214.5,8214.5,8200.0,8207.21 +8207.21,8249.0,8207.21,8243.69 +8243.69,8390.0,8243.68,8357.33 +8357.34,8363.87,8323.26,8363.86 +8363.86,8363.86,8294.58,8309.99 +8309.99,8333.97,8303.0,8313.42 +8313.42,8322.7,8300.01,8320.0 +8320.0,8320.0,8280.96,8281.88 +8283.59,8312.96,8283.59,8306.26 +8306.26,8336.14,8296.0,8296.02 +8296.02,8310.0,8296.0,8306.57 +8306.57,8310.0,8216.03,8258.05 +8258.04,8260.0,8191.53,8222.28 +8222.29,8235.0,8175.8,8209.73 +8209.77,8244.08,8205.0,8230.31 +8230.31,8230.32,8172.0,8202.23 +8202.23,8227.5,8182.2,8227.5 +8227.5,8279.83,8216.53,8273.0 +8273.0,8281.61,8242.0,8242.08 +8242.08,8270.0,8242.07,8268.47 +8268.48,8269.97,8248.0,8250.9 +8250.9,8266.0,8229.93,8242.1 +8245.26,8266.38,8243.49,8264.48 +8264.48,8285.0,8264.48,8284.26 +8284.27,8353.76,8284.26,8336.57 +8336.57,8373.35,8330.23,8335.0 +8335.0,8350.0,8330.0,8349.99 +8350.0,8350.0,8295.96,8309.97 +8309.97,8329.86,8309.96,8329.72 +8329.72,8349.77,8329.71,8342.11 +8342.11,8541.24,8340.0,8522.46 +8518.46,8520.2,8471.0,8480.0 +8480.0,8549.28,8469.46,8528.21 +8528.21,8531.0,8511.29,8515.0 +8516.17,8533.43,8481.0,8533.43 +8533.42,8597.0,8516.65,8558.89 +8558.89,8560.03,8515.0,8520.0 +8520.0,8535.03,8480.0,8507.91 +8507.91,8539.0,8500.0,8524.2 +8524.19,8524.2,8461.21,8473.95 +8473.95,8479.24,8436.0,8470.0 +8470.0,8512.79,8466.52,8486.46 +8486.45,8509.33,8486.45,8489.53 +8489.53,8519.99,8488.06,8500.02 +8500.02,8513.53,8497.55,8504.37 +8504.38,8584.39,8480.0,8536.75 +8536.75,8577.02,8520.01,8529.49 +8529.48,8529.49,8491.0,8515.99 +8515.99,8516.0,8470.3,8479.67 +8479.66,8489.95,8438.08,8447.78 +8447.78,8489.99,8433.23,8479.99 +8479.99,8507.4,8475.24,8492.0 +8492.01,8504.56,8460.28,8463.4 +8463.4,8469.59,8361.49,8403.86 +8403.86,8420.0,8385.0,8403.71 +8403.71,8403.72,8371.01,8395.27 +8395.26,8400.0,8309.23,8347.01 +8347.01,8360.0,8326.55,8359.99 +8359.99,8385.56,8359.99,8377.52 +8377.52,8438.76,8377.51,8411.09 +8411.08,8414.95,8374.54,8374.55 +8374.55,8397.0,8367.31,8395.43 +8395.59,8412.41,8380.43,8400.0 +8399.99,8399.99,8338.0,8338.0 +8338.0,8338.01,8263.0,8279.79 +8279.79,8315.7,8275.01,8293.0 +8297.12,8329.0,8291.91,8311.93 +8311.93,8312.25,8280.0,8280.01 +8280.01,8304.24,8280.0,8290.01 +8290.0,8349.0,8290.0,8307.15 +8307.15,8328.96,8303.0,8311.14 +8311.14,8311.14,8242.0,8248.57 +8248.57,8267.05,8225.0,8240.0 +8240.0,8273.1,8239.99,8260.0 +8260.0,8260.0,8195.0,8198.17 +8198.17,8209.8,8145.06,8194.98 +8194.99,8232.65,8182.08,8199.99 +8199.99,8231.84,8199.99,8211.15 +8211.95,8240.0,8211.95,8230.32 +8228.04,8239.99,8215.0,8215.01 +8215.0,8235.2,8192.53,8193.02 +8193.02,8219.72,8190.84,8216.39 +8216.39,8216.4,8164.76,8182.11 +8182.11,8195.81,8086.0,8090.01 +8090.01,8103.7,8063.77,8084.99 +8084.99,8100.01,7950.0,8005.15 +8005.15,8043.28,7985.32,8004.9 +8004.89,8030.0,7900.0,7919.15 +7919.15,7920.0,7864.0,7911.52 +7911.52,7927.0,7883.0,7915.68 +7915.67,7973.28,7911.41,7935.1 +7935.09,7937.49,7881.21,7897.0 +7894.01,7932.4,7891.08,7907.68 +7907.69,7949.72,7907.68,7933.06 +7933.06,7933.07,7814.5,7869.66 +7869.65,7889.38,7812.49,7851.34 +7851.28,7897.99,7809.0,7884.09 +7884.09,7911.46,7835.0,7871.15 +7871.15,7876.0,7808.23,7865.01 +7865.01,7936.0,7850.29,7910.0 +7911.82,7938.65,7885.5,7885.5 +7885.5,7900.0,7861.46,7899.99 +7900.0,7900.0,7647.12,7647.12 +7647.12,7655.01,7552.0,7617.94 +7625.0,7625.0,7433.19,7501.5 +7501.5,7546.78,7452.63,7521.25 +7521.24,7619.0,7516.1,7619.0 +7618.99,7659.54,7520.31,7577.88 +7577.89,7645.64,7569.99,7619.0 +7619.0,7619.0,7550.0,7562.22 +7560.05,7562.1,7466.52,7530.31 +7530.31,7619.19,7530.0,7611.62 +7611.61,7647.0,7574.89,7595.77 +7595.77,7612.5,7550.83,7577.76 +7577.77,7650.0,7567.04,7630.07 +7630.07,7734.99,7626.65,7710.01 +7710.0,7714.16,7660.97,7690.05 +7690.05,7695.73,7627.62,7669.56 +7669.55,7677.86,7530.0,7541.82 +7541.81,7541.82,7373.84,7396.46 +7396.46,7397.21,7282.23,7370.95 +7370.96,7400.0,7300.0,7381.56 +7381.57,7395.89,7311.39,7315.0 +7315.0,7534.99,7269.0,7517.56 +7517.56,7528.0,7461.83,7461.83 +7461.84,7595.25,7461.84,7525.0 +7525.0,7571.02,7493.16,7532.01 +7532.01,7558.31,7487.8,7521.9 +7520.0,7534.0,7446.14,7500.0 +7500.01,7629.53,7500.0,7620.11 +7620.11,7620.11,7543.6,7549.08 +7549.07,7569.0,7515.04,7560.79 +7560.79,7560.8,7476.1,7520.92 +7520.92,7596.35,7520.91,7573.14 +7573.13,7622.3,7537.97,7571.1 +7571.1,7588.61,7529.0,7554.25 +7554.25,7593.0,7527.3,7582.3 +7582.3,7661.85,7568.93,7605.02 +7605.01,7606.0,7574.59,7595.58 +7595.58,7619.0,7571.01,7596.99 +7596.99,7639.98,7591.36,7632.22 +7632.22,7649.98,7475.0,7485.0 +7482.09,7482.09,7387.31,7406.47 +7406.47,7459.86,7398.96,7442.0 +7441.99,7449.66,7393.84,7434.34 +7434.33,7474.9,7326.94,7358.03 +7355.18,7545.86,7355.18,7512.12 +7512.12,7518.41,7478.75,7478.76 +7478.75,7501.94,7467.9,7485.66 +7485.67,7512.99,7431.99,7458.99 +7459.0,7513.0,7450.11,7489.99 +7489.99,7495.0,7431.0,7444.52 +7444.52,7460.0,7390.0,7400.94 +7404.83,7440.65,7400.02,7415.92 +7415.93,7447.56,7368.01,7415.1 +7415.1,7453.78,7406.25,7435.01 +7435.0,7451.28,7420.0,7435.0 +7438.02,7439.08,7365.56,7409.01 +7409.0,7499.99,7384.88,7447.01 +7447.01,7458.8,7425.88,7443.0 +7443.0,7469.59,7425.06,7444.92 +7439.22,7454.08,7415.79,7420.8 +7422.51,7436.07,7417.42,7430.31 +7430.3,7430.31,7380.0,7384.0 +7384.0,7440.0,7384.0,7428.51 +7428.51,7437.77,7401.86,7419.91 +7419.91,7640.46,7419.91,7560.0 +7560.0,7560.0,7522.5,7545.62 +7545.62,7551.0,7538.0,7547.36 +7543.65,7544.41,7517.0,7532.24 +7544.0,7554.09,7521.77,7521.78 +7521.78,7536.49,7480.0,7521.63 +7521.63,7546.84,7510.35,7537.71 +7536.15,7540.0,7514.36,7520.02 +7520.01,7541.01,7520.01,7540.0 +7539.99,7540.0,7519.0,7534.99 +7534.99,7556.68,7525.74,7537.74 +7537.75,7560.0,7537.74,7555.77 +7555.76,7555.77,7520.87,7531.0 +7531.0,7539.87,7519.1,7527.5 +7527.49,7627.8,7451.0,7451.01 +7451.01,7465.9,7287.23,7335.1 +7335.1,7350.06,7301.0,7326.01 +7326.0,7326.01,7230.01,7250.0 +7250.01,7316.43,7250.0,7316.43 +7316.43,7316.43,7281.0,7289.83 +7286.83,7300.0,7250.07,7290.13 +7290.13,7311.0,7284.89,7302.61 +7302.6,7302.61,7241.81,7274.6 +7274.6,7303.51,7274.59,7288.54 +7288.55,7344.99,7266.15,7308.12 +7308.13,7325.21,7229.03,7316.52 +7316.53,7329.69,7293.76,7320.74 +7320.74,7390.19,7310.12,7320.57 +7320.58,7347.0,7290.39,7320.84 +7318.99,7330.24,7292.78,7294.61 +7294.61,7310.0,7284.24,7299.75 +7299.75,7356.0,7286.0,7340.47 +7340.46,7353.78,7326.93,7346.16 +7346.17,7357.3,7333.04,7348.03 +7348.04,7392.7,7323.01,7366.46 +7366.45,7366.45,7272.0,7293.9 +7293.9,7309.67,7277.2,7309.67 +7309.67,7322.13,7290.94,7306.65 +7306.65,7330.0,7293.62,7330.0 +7330.0,7369.69,7315.92,7341.4 +7344.54,7354.35,7328.85,7333.04 +7333.04,7370.39,7326.61,7326.61 +7326.36,7380.0,7320.71,7369.0 +7369.0,7369.4,7355.0,7369.39 +7369.39,7444.8,7354.0,7364.65 +7364.65,7391.2,7314.75,7330.0 +7329.99,7355.0,7167.99,7214.04 +7214.93,7228.0,7196.0,7227.99 +7228.0,7247.09,7215.01,7233.98 +7233.97,7241.99,7219.17,7240.43 +7240.42,7246.06,7220.99,7232.57 +7232.58,7240.0,7223.92,7224.6 +7224.61,7225.19,7180.0,7189.81 +7189.81,7307.0,7180.0,7284.33 +7284.33,7284.33,7253.31,7260.03 +7260.03,7280.0,7245.02,7254.25 +7254.25,7265.0,7205.69,7220.0 +7219.99,7239.99,7193.0,7200.0 +7199.99,7239.89,7199.99,7239.3 +7239.3,7239.3,7201.65,7222.99 +7223.0,7257.53,7208.3,7237.23 +7237.24,7238.67,7126.01,7152.63 +7152.63,7183.27,7134.59,7155.38 +7155.39,7157.54,7087.0,7122.95 +7118.47,7134.9,7100.0,7120.49 +7120.49,7133.0,7107.88,7124.99 +7124.99,7125.0,7058.0,7107.01 +7107.0,7116.0,7087.0,7107.0 +7106.99,7125.0,7101.0,7106.05 +7106.06,7130.0,7105.0,7119.96 +7119.95,7119.96,7073.5,7105.0 +7104.99,7111.0,7088.81,7100.0 +7100.0,7150.0,7093.15,7130.14 +7129.01,7129.01,7105.6,7119.94 +7119.93,7131.84,7091.79,7130.1 +7130.09,7304.13,7111.82,7299.02 +7299.18,7479.98,7270.78,7432.52 +7432.52,7442.15,7380.87,7415.97 +7415.97,7475.0,7415.96,7440.39 +7440.39,7442.89,7402.97,7406.9 +7406.89,7425.0,7391.69,7425.0 +7425.0,7431.17,7417.55,7424.05 +7424.06,7522.0,7411.58,7479.84 +7479.83,7524.99,7440.0,7459.98 +7459.99,7467.32,7452.73,7456.44 +7456.43,7518.0,7456.43,7500.01 +7500.0,7500.44,7480.0,7491.0 +7489.58,7494.97,7399.77,7417.59 +7417.6,7475.97,7417.59,7463.13 +7463.13,7508.01,7442.62,7490.08 +7490.08,7557.78,7490.07,7515.89 +7515.89,7544.1,7493.85,7506.93 +7506.926666666667,7518.98,7478.575000000001,7497.97 +7497.963333333333,7493.86,7463.3,7489.01 +7489.0,7534.27,7489.0,7513.01 +7513.0,7524.4,7422.47,7472.64 +7472.63,7484.0,7443.15,7479.3 +7479.31,7498.97,7450.0,7469.01 +7469.01,7492.0,7457.99,7479.38 +7479.38,7515.0,7470.38,7490.0 +7490.01,7538.14,7490.0,7506.4 +7506.41,7534.76,7490.0,7522.01 +7522.01,7526.71,7486.82,7500.01 +7500.01,7501.79,7325.33,7347.72 +7347.72,7355.0,7310.0,7339.14 +7339.14,7349.14,7272.71,7289.01 +7289.0,7316.77,7289.0,7315.0 +7315.0,7316.01,7290.0,7292.99 +7293.0,7317.0,7292.5,7316.99 +7317.0,7339.99,7316.99,7339.96 +7339.95,7339.99,7325.01,7330.1 +7330.09,7349.99,7330.09,7347.0 +7347.0,7390.2,7345.31,7364.93 +7364.93,7370.0,7350.71,7353.59 +7353.59,7360.0,7340.0,7346.48 +7346.48,7365.18,7340.84,7365.18 +7365.18,7374.96,7352.47,7374.92 +7374.91,7509.99,7364.01,7484.98 +7484.98,7509.99,7477.49,7496.12 +7496.11,7599.0,7496.11,7576.0 +7574.12,7582.05,7551.01,7562.01 +7562.01,7562.01,7504.97,7538.53 +7538.54,7556.4,7524.9,7536.4 +7536.39,7545.0,7511.0,7545.0 +7544.99,7551.07,7533.4,7548.99 +7548.99,7569.9,7529.32,7529.32 +7529.32,7538.0,7506.06,7530.01 +7530.0,7579.0,7525.0,7549.48 +7552.01,7567.83,7540.0,7544.44 +7541.55,7549.98,7528.0,7549.93 +7549.94,7609.99,7540.32,7575.01 +7575.0,7577.0,7530.33,7534.35 +7534.36,7556.0,7528.41,7534.0 +7533.99,7559.03,7533.99,7542.9 +7542.9,7563.06,7461.27,7461.27 +7470.0,7474.37,7415.09,7461.41 +7461.41,7491.0,7461.4,7491.0 +7491.0,7522.0,7491.0,7494.01 +7494.0,7507.93,7480.0,7499.99 +7500.0,7521.95,7461.42,7465.01 +7465.01,7500.0,7465.01,7488.28 +7488.29,7490.29,7470.61,7484.99 +7485.0,7490.0,7484.99,7490.0 +7489.99,7550.0,7488.11,7550.0 +7550.0,7599.99,7549.99,7565.22 +7565.22,7583.0,7563.06,7582.03 +7577.07,7582.75,7528.0,7534.07 +7534.07,7550.0,7534.07,7550.0 +7550.0,7560.0,7351.01,7387.16 +7387.15,7418.19,7376.88,7399.01 +7399.01,7425.0,7394.99,7417.01 +7417.0,7434.31,7406.73,7415.67 +7415.68,7450.0,7393.07,7440.79 +7440.8,7442.13,7425.12,7425.13 +7425.13,7439.99,7401.85,7424.99 +7425.0,7425.01,7387.51,7409.01 +7409.0,7445.0,7401.29,7434.09 +7434.09,7448.0,7401.02,7441.0 +7441.0,7443.21,7425.8,7441.0 +7441.0,7524.63,7436.49,7507.99 +7508.0,7532.01,7504.06,7519.2 +7519.2,7519.21,7440.0,7480.56 +7480.57,7490.0,7475.07,7487.32 +7487.32,7498.0,7480.17,7494.05 +7494.05,7498.0,7479.46,7482.0 +7482.0,7485.69,7469.45,7482.83 +7482.83,7520.0,7480.07,7515.0 +7515.01,7697.09,7450.0,7658.45 +7658.45,7658.97,7630.0,7639.4 +7639.39,7683.05,7639.39,7652.02 +7652.02,7655.0,7629.19,7654.99 +7655.0,7669.0,7645.09,7655.99 +7655.99,7655.99,7605.16,7641.0 +7640.99,7641.0,7625.79,7636.29 +7636.3,7644.0,7624.17,7629.99 +7630.0,7640.0,7627.5,7639.22 +7639.22,7675.99,7570.83,7616.51 +7616.51,7631.51,7600.0,7630.0 +7629.99,7647.08,7625.0,7639.74 +7639.74,7655.0,7630.26,7650.0 +7650.01,7672.47,7650.0,7656.17 +7653.11,7661.13,7615.0,7624.11 +7625.43,7645.0,7625.43,7628.0 +7628.0,7634.07,7612.97,7628.01 +7628.01,7644.22,7628.0,7635.0 +7635.01,7649.0,7635.0,7649.0 +7649.0,7650.0,7635.4,7635.41 +7635.41,7635.41,7583.24,7635.1 +7635.1,7665.74,7620.98,7645.98 +7645.98,7645.98,7624.84,7645.98 +7645.98,7652.81,7640.01,7640.91 +7640.91,7777.0,7640.9,7724.01 +7724.0,7725.0,7707.77,7720.7 +7720.7,7750.0,7717.72,7719.68 +7719.68,7739.99,7714.99,7739.99 +7739.99,7739.99,7701.0,7716.78 +7716.78,7720.0,7695.78,7711.99 +7712.0,7720.0,7704.06,7720.0 +7719.99,7739.9,7715.16,7718.03 +7718.03,7725.69,7695.0,7724.3 +7724.29,7729.92,7713.53,7725.77 +7725.78,7725.78,7705.5,7705.86 +7705.85,7705.86,7679.43,7696.43 +7696.44,7696.44,7680.81,7685.12 +7685.13,7716.22,7650.04,7704.0 +7704.0,7725.95,7675.0,7725.0 +7725.0,7725.0,7675.27,7696.89 +7696.9,7710.0,7687.95,7703.8 +7703.8,7720.45,7695.0,7720.45 +7720.45,7747.57,7706.0,7709.08 +7709.08,7710.77,7656.0,7699.9 +7699.9,7705.61,7685.53,7687.1775 +7687.1775,7700.91,7685.535,7674.455 +7674.455,7696.21,7685.54,7661.7325 +7661.7325,7696.21,7610.0,7649.01 +7649.01,7661.77,7531.36,7594.98 +7594.99,7619.27,7594.99,7599.61 +7599.62,7601.89,7579.07,7599.98 +7599.98,7616.18,7579.07,7608.34 +7608.34,7617.89,7504.53,7556.02 +7556.03,7563.77,7480.79,7534.73 +7534.73,7537.83,7511.58,7524.91 +7524.9,7525.0,7475.0,7486.35 +7487.63,7500.0,7447.61,7498.75 +7498.76,7500.0,7473.89,7492.49 +7492.49,7500.0,7473.5,7473.51 +7473.5,7480.5,7453.0,7465.99 +7465.99,7499.95,7465.99,7499.88 +7499.88,7506.86,7485.67,7498.16 +7498.16,7531.35,7481.64,7531.35 +7531.35,7541.0,7522.4,7522.4 +7522.4,7525.0,7460.58,7483.37 +7483.37,7500.0,7465.0,7499.0 +7499.0,7500.0,7480.6,7499.98 +7499.99,7499.99,7470.0,7478.49 +7478.49,7479.6,7380.15,7395.0 +7395.01,7417.1,7395.0,7414.23 +7414.23,7418.0,7374.35,7382.38 +7382.38,7437.05,7375.05,7437.04 +7437.04,7446.68,7408.06,7411.46 +7411.46,7424.33,7390.36,7424.33 +7424.33,7463.78,7420.0,7436.04 +7436.03,7444.97,7420.0,7429.54 +7424.51,7437.34,7404.78,7409.4 +7409.4,7437.94,7405.69,7425.0 +7424.99,7433.81,7405.55,7413.0 +7412.99,7423.75,7355.0,7381.82 +7381.81,7409.47,7373.33,7404.99 +7405.0,7578.75,7404.99,7560.01 +7560.01,7590.0,7542.45,7567.0 +7567.0,7677.5,7559.41,7635.33 +7635.3,7639.0,7614.98,7620.0 +7620.01,7626.86,7607.0,7614.01 +7614.0,7635.0,7610.0,7626.01 +7626.01,7629.99,7567.96,7599.99 +7600.0,7628.9,7599.98,7625.01 +7625.02,7627.73,7603.0,7624.96 +7623.55,7623.55,7600.0,7600.0 +7600.0,7628.0,7591.0,7620.0 +7620.0,7624.22,7600.0,7613.17 +7613.17,7622.33,7605.0,7611.04 +7611.04,7617.0,7582.73,7586.76 +7586.77,7635.0,7566.62,7621.52 +7621.52,7633.57,7613.75,7624.36 +7624.35,7673.98,7607.15,7613.01 +7612.96,7615.0,7582.89,7610.44 +7610.44,7610.44,7589.41,7593.98 +7593.99,7625.63,7590.0,7625.63 +7625.63,7629.99,7611.93,7619.29 +7619.29,7661.22,7601.11,7640.5 +7640.49,7648.39,7626.81,7630.0 +7629.99,7640.0,7620.01,7624.99 +7625.0,7660.0,7624.99,7654.0 +7654.0,7654.01,7501.0,7520.0 +7520.01,7533.32,7484.0,7506.94 +7506.93,7520.0,7492.32,7519.99 +7519.99,7530.0,7513.73,7530.0 +7530.0,7640.0,7508.25,7618.77 +7619.13,7691.0,7618.75,7659.99 +7659.99,7683.83,7637.15,7651.41 +7651.4,7667.74,7632.45,7667.73 +7667.74,7731.7,7655.52,7721.73 +7721.73,7744.24,7707.72,7716.8 +7716.8,7747.0,7708.0,7719.74 +7719.74,7735.0,7703.4,7715.0 +7714.99,7715.93,7700.0,7705.95 +7705.95,7715.9,7700.0,7700.03 +7700.02,7703.44,7667.23,7703.0 +7703.0,7709.54,7699.97,7699.98 +7699.98,7719.99,7671.07,7671.31 +7671.3,7700.0,7663.0,7693.62 +7693.63,7699.3,7679.0,7690.08 +7690.08,7694.96,7675.02,7684.58 +7684.57,7709.87,7678.85,7699.73 +7699.74,7707.5,7691.74,7700.0 +7699.99,7700.0,7651.2,7676.56 +7676.56,7700.0,7660.01,7682.74 +7682.74,7719.99,7682.73,7692.48 +7692.49,7700.0,7669.67,7693.5 +7693.51,7700.0,7690.0,7694.0 +7694.0,7697.76,7681.02,7683.43 +7686.02,7690.0,7635.0,7660.0 +7659.99,7663.81,7643.67,7656.93 +7656.93,7660.0,7646.0,7660.0 +7659.99,7684.93,7651.24,7683.51 +7683.5,7690.0,7675.48,7684.0 +7684.0,7684.96,7668.0,7668.45 +7668.45,7679.0,7656.97,7656.98 +7656.97,7656.98,7625.24,7636.0 +7636.0,7648.09,7616.59,7631.01 +7631.0,7635.99,7623.86,7631.61 +7631.61,7650.0,7623.41,7645.94 +7645.01,7650.0,7629.88,7629.88 +7629.89,7636.27,7617.86,7630.01 +7630.0,7640.0,7624.5,7624.51 +7624.51,7624.51,7550.1,7550.11 +7550.11,7576.6,7550.11,7561.75 +7561.74,7575.98,7536.58,7563.51 +7563.5,7584.61,7563.0,7570.27 +7570.0,7591.55,7568.0,7585.0 +7585.01,7650.0,7565.01,7640.33 +7640.33,7665.0,7634.79,7651.62 +7651.61,7657.0,7646.0,7650.0 +7649.99,7650.0,7633.7,7633.7 +7633.71,7643.89,7633.7,7635.52 +7635.52,7650.0,7625.68,7646.81 +7646.82,7649.99,7638.0,7649.99 +7649.99,7649.99,7631.31,7636.66 +7636.65,7636.66,7611.01,7620.01 +7620.01,7631.96,7613.0,7625.3 +7625.3,7669.99,7625.3,7669.98 +7669.99,7679.2,7660.0,7663.51 +7663.96,7667.92,7654.92,7659.8 +7659.8,7670.0,7659.79,7660.79 +7660.8,7668.88,7652.12,7660.89 +7660.9,7670.0,7660.0,7660.01 +7660.0,7667.38,7647.0,7647.01 +7647.01,7647.01,7625.0,7637.25 +7637.25,7642.57,7631.0,7639.99 +7640.0,7654.82,7639.99,7640.01 +7640.02,7647.28,7627.67,7632.5 +7632.5,7642.95,7594.05,7604.22 +7604.21,7604.21,7574.63,7593.2 +7590.0,7605.24,7582.45,7595.92 +7595.91,7622.25,7595.91,7614.21 +7614.21,7614.21,7575.0,7575.51 +7575.51,7600.0,7575.0,7596.0 +7596.0,7610.11,7588.5,7608.23 +7608.22,7615.95,7602.5,7614.65 +7611.99,7630.0,7610.03,7628.4 +7628.39,7628.39,7612.0,7617.01 +7617.01,7617.01,7584.68,7600.04 +7600.05,7609.97,7425.0,7443.54 +7443.54,7449.73,7279.6,7300.01 +7300.0,7363.67,7300.0,7327.0 +7327.0,7330.73,7279.6,7328.74 +7328.73,7328.74,7265.0,7307.62 +7307.63,7316.11,7289.0,7307.5 +7307.57,7308.37,7289.99,7299.02 +7299.01,7319.99,7299.01,7310.0 +7310.01,7310.01,7200.0,7222.88 +7222.89,7243.33,7187.5,7227.81 +7227.81,7251.99,7225.0,7237.95 +7237.95,7247.8,7222.09,7247.79 +7247.8,7257.0,7221.14,7248.3 +7248.3,7262.25,7226.0,7243.68 +7243.68,7283.97,7187.01,7273.06 +7273.06,7273.06,7230.93,7260.92 +7260.92,7260.92,7210.1,7243.79 +7243.79,7243.79,7137.0,7138.71 +7138.7,7138.71,6700.0,6774.57 +6774.58,6780.0,6652.0,6768.39 +6768.39,6868.0,6750.0,6830.01 +6830.0,6849.98,6705.0,6762.86 +6762.86,6790.96,6707.81,6723.63 +6723.63,6756.41,6672.01,6701.77 +6701.77,6780.0,6701.77,6749.0 +6749.0,6757.0,6716.0,6730.0 +6730.01,6780.0,6693.41,6780.0 +6780.0,6829.75,6778.43,6789.08 +6789.07,6799.0,6760.0,6771.3 +6771.3,6812.8,6760.33,6805.02 +6805.02,6805.02,6755.0,6755.01 +6755.01,6779.99,6755.0,6779.99 +6779.99,6780.0,6666.66,6703.81 +6703.81,6839.3,6692.17,6792.0 +6792.0,6795.48,6743.07,6761.97 +6761.97,6797.0,6737.29,6768.01 +6768.01,6794.3,6760.01,6772.03 +6772.03,6773.0,6730.42,6768.02 +6768.01,6768.5,6749.99,6758.69 +6758.69,6758.73,6688.33,6717.1 +6717.1,6755.0,6670.0,6748.99 +6749.0,6758.77,6723.9,6730.0 +6730.0,6749.71,6719.0,6720.42 +6720.42,6770.0,6684.0,6759.7 +6759.71,6800.0,6740.09,6761.94 +6761.95,6769.99,6735.0,6768.99 +6769.0,6775.0,6755.99,6775.0 +6775.0,6791.0,6757.64,6790.01 +6790.01,6913.83,6780.0,6859.59 +6859.6,6859.99,6834.85,6856.58 +6856.58,6869.96,6842.0,6869.96 +6869.98,6875.0,6850.0,6860.0 +6860.0,6868.0,6793.05,6829.99 +6829.99,6854.98,6821.68,6830.16 +6830.16,6850.0,6830.16,6844.4 +6844.4,6846.85,6835.13,6835.14 +6835.14,6854.0,6820.0,6820.0 +6820.0,6870.0,6807.0,6853.96 +6853.97,6857.33,6841.01,6845.0 +6845.0,6849.11,6831.96,6840.86 +6840.86,6848.45,6812.03,6822.83 +6822.82,6839.97,6711.99,6720.0 +6720.0,6743.02,6711.99,6741.31 +6741.32,6774.45,6741.31,6753.94 +6753.94,6770.0,6746.0,6768.55 +6768.54,6768.55,6692.69,6735.0 +6734.13,6749.0,6714.43,6724.5 +6724.5,6724.5,6632.57,6633.08 +6633.08,6633.08,6450.0,6522.49 +6522.5,6582.14,6522.5,6524.79 +6524.8,6559.0,6507.42,6530.23 +6530.23,6547.49,6526.6,6531.47 +6531.48,6574.99,6481.47,6550.64 +6550.64,6574.0,6541.0,6541.01 +6541.01,6565.0,6541.0,6559.99 +6559.99,6567.0,6554.27,6560.96 +6560.97,6564.6,6541.0,6549.06 +6549.06,6618.95,6529.29,6605.01 +6605.0,6605.01,6559.5,6570.33 +6570.32,6583.61,6564.89,6583.61 +6583.61,6585.0,6512.0,6528.46 +6530.0,6563.62,6505.0,6535.22 +6535.23,6535.23,6380.0,6437.15 +6437.15,6479.04,6407.08,6449.94 +6449.94,6463.0,6422.39,6446.88 +6446.88,6488.46,6425.0,6462.24 +6462.24,6487.31,6437.61,6442.58 +6442.59,6449.0,6405.02,6439.99 +6440.0,6462.91,6342.0,6392.84 +6392.84,6393.23,6135.0,6256.93 +6256.93,6373.0,6231.11,6355.0 +6355.01,6362.71,6311.17,6324.8 +6324.79,6337.11,6250.45,6272.73 +6272.74,6280.0,6233.11,6267.1 +6267.1,6298.79,6240.0,6292.93 +6291.71,6350.0,6268.68,6325.0 +6325.01,6345.0,6287.77,6325.34 +6322.66,6327.61,6269.0,6299.9 +6299.9,6333.0,6293.24,6333.0 +6333.0,6529.8,6333.0,6487.55 +6487.54,6510.0,6462.5,6508.58 +6508.57,6510.0,6472.31,6472.31 +6472.3,6484.0,6430.64,6472.0 +6471.99,6500.0,6471.99,6481.98 +6481.99,6485.0,6449.0,6485.0 +6485.0,6538.47,6470.03,6485.0 +6485.0,6500.0,6475.93,6495.0 +6495.0,6499.92,6466.18,6490.0 +6489.99,6539.99,6485.31,6510.15 +6510.14,6513.47,6402.81,6425.01 +6426.0,6440.22,6356.62,6390.0 +6389.99,6436.12,6384.99,6414.98 +6414.98,6414.98,6310.0,6364.53 +6364.54,6578.0,6353.75,6561.79 +6561.79,6750.0,6561.0,6693.66 +6693.66,6693.66,6630.0,6649.77 +6649.77,6659.15,6617.11,6648.34 +6648.35,6689.1,6638.5,6662.52 +6662.52,6694.56,6650.0,6665.28 +6665.27,6665.28,6591.79,6634.35 +6634.36,6683.48,6590.11,6640.79 +6640.8,6640.8,6592.04,6618.85 +6619.98,6625.0,6564.84,6576.74 +6576.74,6595.13,6561.0,6590.67 +6590.67,6618.99,6585.72,6598.92 +6598.92,6598.92,6537.68,6545.13 +6545.13,6589.57,6543.06,6583.88 +6583.87,6612.04,6564.11,6589.74 +6589.75,6598.24,6559.53,6580.0 +6580.0,6617.77,6571.93,6580.7 +6583.37,6592.2,6561.32,6592.2 +6592.2,6660.0,6564.58,6643.34 +6643.34,6643.34,6475.0,6519.0 +6519.0,6532.63,6490.0,6496.44 +6496.44,6533.69,6495.54,6497.99 +6497.99,6550.0,6489.16,6538.34 +6538.33,6556.52,6526.93,6540.0 +6540.0,6616.72,6539.99,6542.0 +6542.0,6572.29,6507.5,6541.44 +6541.28,6558.28,6541.28,6550.0 +6550.0,6554.75,6537.63,6548.94 +6548.95,6548.95,6445.0,6474.78 +6475.51,6494.98,6444.78,6465.0 +6465.0,6465.19,6370.0,6394.04 +6392.26,6418.0,6374.74,6402.08 +6402.08,6421.92,6388.38,6400.0 +6400.0,6450.0,6399.99,6437.55 +6437.55,6454.57,6435.71,6440.01 +6440.01,6440.01,6410.19,6426.61 +6426.6,6439.0,6422.22,6433.57 +6433.58,6481.41,6429.95,6454.33 +6454.33,6471.22,6438.18,6460.14 +6460.14,6475.21,6450.31,6450.31 +6450.31,6458.0,6436.27,6457.11 +6457.11,6514.91,6450.67,6493.69 +6492.82,6499.99,6457.05,6457.05 +6457.05,6465.19,6443.0,6443.0 +6443.0,6470.0,6429.0,6432.27 +6432.27,6432.27,6371.96,6397.0 +6397.0,6416.0,6396.99,6408.0 +6408.0,6415.64,6330.0,6353.01 +6353.2,6549.99,6340.07,6525.0 +6525.0,6544.0,6492.3,6527.0 +6527.0,6529.99,6501.0,6512.01 +6512.01,6513.0,6485.0,6500.0 +6500.0,6529.99,6499.99,6523.0 +6523.0,6543.54,6516.09,6538.0 +6537.99,6541.99,6509.0,6509.01 +6509.01,6509.93,6472.97,6487.31 +6487.31,6520.0,6487.31,6507.0 +6507.0,6528.26,6507.0,6523.87 +6523.86,6536.95,6514.13,6525.2 +6525.19,6539.0,6521.08,6528.01 +6528.01,6546.33,6509.71,6526.04 +6526.05,6528.34,6510.0,6510.01 +6510.01,6514.13,6505.0,6514.13 +6514.13,6529.83,6510.01,6529.29 +6529.29,6570.01,6506.43,6512.02 +6512.02,6524.42,6508.22,6516.46 +6516.47,6521.55,6505.99,6516.35 +6516.34,6519.25,6502.65,6508.54 +6508.53,6509.39,6450.0,6479.53 +6479.54,6490.04,6471.66,6479.99 +6479.98,6490.0,6464.94,6475.52 +6475.51,6520.0,6444.44,6515.0 +6515.01,6515.01,6496.13,6511.55 +6508.96,6511.53,6493.83,6499.85 +6499.85,6516.54,6495.0,6515.0 +6515.01,6539.99,6500.0,6501.86 +6501.87,6506.99,6479.9,6495.0 +6495.01,6505.0,6480.0,6501.2 +6501.19,6504.0,6475.38,6482.94 +6482.94,6482.94,6428.14,6447.73 +6447.74,6450.0,6385.0,6400.24 +6400.24,6440.95,6390.4,6422.21 +6422.21,6434.0,6422.2,6417.610000000001 +6417.610000000001,6434.0,6405.53,6413.01 +6413.01,6418.87,6385.02,6406.0 +6406.01,6447.48,6391.89,6428.01 +6428.0,6445.0,6420.0,6435.01 +6435.0,6441.5,6423.22,6433.5 +6433.27,6489.99,6432.24,6462.52 +6462.52,6474.9,6439.99,6439.99 +6439.99,6443.22,6416.3,6418.14 +6418.14,6428.81,6398.22,6428.8 +6428.8,6442.11,6421.66,6423.22 +6423.23,6437.69,6404.61,6434.07 +6434.07,6476.06,6422.07,6462.36 +6462.35,6468.83,6442.18,6458.06 +6458.06,6679.99,6457.0,6651.16 +6651.16,6807.64,6651.15,6745.99 +6745.99,6750.0,6717.03,6722.13 +6722.13,6725.0,6670.0,6710.51 +6710.51,6724.0,6695.13,6723.85 +6723.84,6724.0,6704.08,6722.0 +6722.0,6722.0,6701.68,6704.19 +6704.2,6714.0,6689.9,6714.0 +6713.99,6723.09,6713.99,6714.0 +6714.0,6722.0,6711.0,6714.69 +6714.69,6723.1,6676.03,6700.99 +6700.99,6700.99,6680.0,6690.42 +6690.42,6711.32,6690.41,6708.01 +6708.01,6714.21,6690.89,6706.44 +6706.45,6709.26,6676.25,6686.43 +6686.43,6706.29,6674.47,6690.22 +6690.22,6708.29,6682.31,6700.47 +6700.46,6711.21,6697.05,6711.2 +6711.21,6736.55,6687.4,6714.99 +6714.99,6768.48,6714.99,6729.0 +6729.0,6778.0,6724.0,6772.31 +6772.31,6829.06,6748.0,6750.0 +6750.0,6756.94,6735.06,6743.14 +6743.14,6756.46,6711.65,6718.48 +6718.48,6723.0,6670.01,6715.0 +6715.0,6724.41,6700.12,6720.0 +6720.01,6723.82,6708.44,6719.53 +6719.54,6747.01,6716.0,6740.95 +6740.95,6740.95,6690.58,6697.85 +6697.85,6733.72,6697.84,6717.01 +6717.0,6730.0,6703.14,6723.0 +6723.0,6743.22,6717.0,6739.32 +6739.32,6742.2,6583.8,6592.5 +6590.0,6627.38,6557.66,6600.06 +6600.06,6619.51,6599.53,6619.51 +6619.51,6622.82,6612.14,6613.01 +6613.01,6613.01,6578.8,6610.0 +6610.0,6611.84,6595.8,6599.01 +6599.0,6656.01,6599.0,6629.82 +6629.82,6635.77,6618.21,6632.36 +6632.35,6641.03,6629.0,6630.88 +6630.87,6662.49,6625.0,6625.01 +6625.0,6633.95,6611.12,6622.7 +6622.7,6638.87,6622.0,6627.69 +6627.69,6630.0,6587.06,6588.96 +6588.97,6760.0,6588.96,6742.14 +6742.14,6779.56,6742.0,6761.99 +6758.69,6780.0,6752.01,6773.04 +6773.05,6817.0,6755.25,6756.9 +6756.9,6757.0,6743.08,6752.49 +6752.5,6762.72,6741.19,6747.0 +6747.0,6755.91,6746.12,6747.01 +6747.0,6755.0,6707.44,6749.49 +6749.49,6749.49,6718.31,6730.0 +6728.49,6746.03,6710.3,6746.02 +6746.03,6760.0,6746.01,6752.2 +6752.19,6781.43,6732.22,6758.42 +6758.41,6760.09,6747.31,6760.09 +6760.09,6787.0,6760.08,6779.44 +6779.44,6779.44,6762.81,6770.01 +6770.01,6770.01,6752.29,6759.47 +6759.2,6759.2,6740.1,6741.13 +6741.13,6764.0,6741.13,6759.54 +6759.55,6764.0,6743.47,6743.47 +6743.47,6744.3,6720.99,6726.0 +6726.0,6744.9,6682.3,6736.4 +6736.4,6780.0,6728.72,6732.96 +6732.97,6739.0,6719.9,6734.99 +6733.63,6736.9,6717.28,6727.37 +6727.04,6728.77,6692.45,6719.0 +6719.0,6723.0,6695.36,6713.83 +6713.83,6738.29,6712.9,6712.91 +6712.9,6729.0,6710.0,6719.59 +6719.59,6720.0,6690.48,6715.93 +6715.93,6719.0,6695.0,6719.0 +6719.0,6719.0,6702.72,6712.99 +6713.0,6726.99,6708.98,6719.99 +6720.0,6720.0,6705.08,6713.59 +6713.59,6743.0,6700.0,6719.99 +6719.99,6720.0,6718.0,6719.01 +6719.01,6725.0,6718.99,6722.0 +6722.0,6722.01,6613.75,6645.0 +6645.0,6678.15,6632.38,6675.0 +6675.0,6675.0,6650.99,6652.99 +6653.0,6666.66,6645.0,6662.65 +6662.66,6672.0,6660.9,6660.91 +6660.91,6666.16,6625.0,6625.01 +6625.01,6625.01,6468.34,6503.99 +6503.99,6505.86,6347.0,6379.64 +6379.63,6398.39,6291.99,6334.32 +6334.08,6387.62,6311.85,6361.1 +6361.1,6378.73,6341.59,6354.5 +6354.5,6367.0,6276.11,6276.11 +6276.11,6296.7,6070.93,6144.0 +6144.0,6206.39,6144.0,6186.76 +6186.75,6186.75,6120.09,6140.01 +6140.01,6187.49,6128.0,6172.01 +6172.01,6173.9,6130.0,6161.76 +6161.76,6247.0,6161.75,6203.68 +6203.24,6243.91,6186.93,6207.5 +6207.51,6207.79,6020.0,6020.0 +6020.0,6058.99,5921.21,5988.76 +5988.77,6098.77,5988.77,6053.07 +6053.08,6079.87,6040.1,6074.12 +6073.02,6174.98,6040.08,6139.73 +6139.74,6159.99,6129.29,6144.0 +6144.0,6160.0,6119.08,6139.54 +6139.54,6141.27,6089.82,6108.02 +6108.02,6146.0,6105.0,6135.96 +6135.95,6144.46,6056.24,6061.01 +6061.0,6084.42,6040.01,6071.53 +6074.08,6140.99,6074.08,6120.28 +6120.29,6129.23,6092.99,6104.12 +6104.13,6165.0,6104.09,6145.99 +6146.0,6189.53,6129.47,6155.78 +6155.78,6166.51,6103.87,6112.0 +6109.29,6150.0,6087.38,6127.94 +6127.93,6160.0,6110.01,6140.92 +6140.91,6150.96,6119.4,6119.67 +6119.67,6139.96,6073.57,6131.31 +6130.12,6136.59,6115.0,6129.89 +6129.63,6150.0,6113.76,6138.18 +6138.07,6154.0,6125.0,6129.09 +6129.02,6158.99,6121.12,6141.01 +6141.01,6144.64,6130.0,6138.91 +6138.91,6250.0,6135.0,6229.42 +6229.99,6230.0,6196.39,6200.2 +6200.2,6200.2,6160.0,6192.75 +6192.75,6192.75,6113.63,6132.01 +6132.02,6138.59,6080.0,6114.11 +6114.11,6124.06,6107.48,6113.46 +6113.46,6114.0,6040.19,6052.53 +6052.52,6069.99,5900.0,5916.0 +5916.0,5926.7,5867.0,5895.21 +5895.21,5919.99,5825.0,5900.81 +5900.07,5900.93,5860.01,5879.0 +5878.99,5880.0,5830.0,5867.0 +5867.01,5907.48,5867.0,5895.0 +5895.0,5950.0,5885.0,5921.81 +5921.81,5943.81,5897.41,5904.99 +5908.77,5930.78,5890.73,5926.0 +5926.0,5947.17,5907.07,5932.01 +5932.0,5940.99,5854.01,5865.53 +5865.54,5883.48,5777.0,5838.45 +5834.62,6255.8,5830.0,6138.58 +6138.56,6250.0,6138.56,6172.0 +6172.0,6199.99,6153.38,6190.65 +6189.66,6200.0,6153.11,6162.44 +6162.43,6199.0,6153.11,6193.0 +6193.0,6193.0,6149.96,6155.76 +6155.76,6160.99,6111.0,6139.5 +6139.5,6170.0,6121.71,6148.39 +6148.39,6185.82,6137.76,6159.98 +6159.97,6164.88,6135.0,6135.0 +6135.01,6144.98,6115.67,6125.01 +6125.01,6188.89,6125.01,6171.25 +6168.26,6169.96,6137.41,6139.46 +6139.46,6161.77,6139.45,6150.23 +6150.24,6190.0,6144.04,6154.04 +6154.05,6162.5,6146.0,6150.46 +6150.45,6180.0,6144.98,6153.76 +6153.76,6175.0,6151.62,6175.0 +6175.0,6220.0,6173.28,6181.99 +6182.0,6275.0,6182.0,6231.24 +6227.91,6227.91,6070.13,6101.83 +6101.84,6136.95,6092.0,6125.01 +6125.0,6340.01,6125.0,6286.82 +6286.83,6321.85,6271.0,6313.85 +6313.86,6321.85,6256.0,6270.79 +6270.79,6288.36,6263.14,6280.0 +6280.01,6294.08,6254.83,6266.05 +6266.04,6269.96,6237.99,6259.12 +6258.0,6274.0,6245.0,6253.45 +6254.45,6273.02,6243.84,6271.84 +6271.84,6271.84,6230.3,6239.08 +6239.08,6251.44,6233.0,6251.43 +6251.43,6260.0,6184.17,6205.01 +6205.02,6237.01,6193.08,6234.5 +6234.51,6241.08,6228.93,6241.07 +6241.08,6251.78,6221.87,6238.0 +6238.0,6260.0,6226.13,6256.86 +6255.65,6271.0,6248.52,6250.0 +6249.99,6255.02,6210.03,6217.96 +6217.97,6236.78,6211.01,6217.96 +6218.26,6225.0,6191.3,6214.57 +6214.56,6218.99,6154.0,6204.82 +6204.82,6225.0,6192.34,6219.04 +6219.05,6219.05,6195.5,6202.99 +6203.0,6225.02,6203.0,6217.94 +6217.94,6238.33,6146.93,6178.0 +6178.01,6196.55,6127.36,6183.63 +6183.64,6226.97,6161.92,6215.0 +6214.99,6215.0,6168.48,6180.0 +6179.99,6195.0,6174.23,6191.01 +6191.0,6200.0,6164.44,6164.44 +6164.44,6186.03,6164.44,6177.29 +6177.29,6189.0,6177.29,6185.41 +6185.4,6256.0,6170.0,6189.27 +6181.23,6181.23,6100.0,6148.02 +6148.01,6148.02,6006.39,6027.37 +6027.37,6099.0,6020.0,6075.37 +6075.37,6124.0,6060.0,6075.01 +6075.01,6084.0,6066.0,6071.1 +6071.1,6080.0,6035.0,6055.0 +6055.0,6060.0,6041.43,6059.99 +6059.99,6090.01,6055.51,6074.25 +6074.25,6089.02,6073.5,6073.51 +6073.51,6084.0,6062.0,6075.81 +6075.82,6117.06,6071.53,6072.5 +6072.5,6109.42,6071.35,6096.78 +6096.78,6131.0,6087.5,6109.95 +6109.96,6114.07,6084.56,6089.69 +6089.7,6089.7,6056.61,6085.99 +6085.99,6103.09,6079.11,6086.29 +6086.3,6134.73,5983.56,6097.67 +6098.66,6150.0,6083.59,6109.0 +6109.0,6130.0,6092.43,6125.0 +6125.0,6129.99,6108.69,6125.0 +6125.0,6126.0,6112.19,6119.0 +6119.0,6149.25,6111.0,6126.93 +6127.0,6134.0,6115.0,6121.02 +6121.01,6128.0,6117.07,6126.01 +6126.0,6145.0,6120.0,6140.0 +6140.0,6175.43,6116.0,6133.93 +6133.94,6161.47,6133.93,6136.02 +6136.02,6138.01,6120.05,6133.91 +6133.91,6147.54,6083.87,6119.99 +6119.99,6124.2,6076.74,6091.53 +6091.53,6107.06,6078.46,6101.51 +6101.51,6114.05,6094.31,6108.51 +6108.5,6108.96,6098.89,6100.75 +6100.75,6115.66,6083.46,6115.66 +6115.65,6127.43,6110.0,6116.88 +6116.88,6118.61,6091.92,6097.54 +6097.54,6103.58,6080.28,6086.16 +6086.17,6112.15,6086.17,6108.56 +6108.55,6120.01,6101.22,6105.47 +6105.47,6108.94,6093.5,6103.47 +6103.47,6122.0,6064.0,6099.73 +6098.13,6108.0,6091.51,6095.2 +6095.21,6114.51,6095.0,6095.46 +6095.45,6100.0,6093.47,6100.0 +6099.99,6104.11,6091.15,6099.52 +6099.52,6099.52,6045.84,6074.11 +6074.1,6082.08,6031.03,6031.89 +6031.89,6039.73,5879.0,5919.35 +5919.64,5959.97,5896.43,5904.58 +5904.58,5909.99,5816.6,5885.2 +5883.78,5900.0,5868.0,5896.46 +5896.46,5906.91,5850.0,5871.39 +5871.4,5885.0,5850.0,5859.42 +5859.42,5880.0,5859.42,5877.05 +5877.04,5877.04,5790.01,5818.02 +5815.33,5965.74,5811.0,5876.79 +5876.79,5900.0,5865.0,5876.37 +5876.37,5895.16,5875.6,5895.16 +5895.16,5916.77,5889.46,5891.07 +5891.07,5916.66,5890.57,5906.45 +5906.45,5912.9,5872.44,5887.0 +5887.0,5900.0,5834.01,5880.01 +5880.0,5880.01,5844.99,5857.37 +5857.37,5897.07,5812.1,5877.01 +5877.01,5901.18,5872.06,5887.33 +5887.33,5900.0,5879.44,5885.0 +5884.99,5893.82,5866.49,5872.19 +5872.19,5895.0,5872.14,5886.27 +5886.27,5889.94,5871.02,5871.03 +5871.03,5890.27,5865.79,5883.65 +5883.66,5936.9,5883.65,5905.43 +5905.42,5930.0,5895.01,5930.0 +5930.0,6300.0,5928.66,6242.0 +6242.0,6250.0,6185.0,6218.99 +6218.99,6249.0,6205.69,6238.8 +6238.8,6520.15,6233.1,6392.45 +6392.44,6436.0,6376.56,6387.48 +6387.49,6435.0,6361.67,6374.99 +6375.0,6395.0,6365.0,6394.85 +6394.85,6405.52,6385.06,6389.02 +6389.02,6395.0,6382.63,6387.14 +6387.14,6418.28,6387.13,6402.0 +6402.01,6402.01,6380.0,6385.89 +6385.89,6404.0,6374.17,6397.72 +6397.73,6399.99,6376.27,6382.0 +6382.0,6405.44,6382.0,6403.53 +6403.52,6463.02,6379.19,6391.05 +6391.05,6400.0,6380.0,6380.15 +6380.15,6386.91,6342.0,6364.91 +6364.91,6377.49,6330.0,6367.66 +6367.67,6370.0,6345.0,6360.92 +6360.93,6360.93,6333.15,6343.65 +6343.66,6343.66,6302.29,6312.51 +6312.51,6323.47,6312.51,6323.24 +6323.23,6365.03,6323.23,6354.01 +6354.0,6354.01,6327.5,6335.0 +6335.0,6336.0,6334.99,6336.0 +6336.0,6415.0,6335.99,6408.11 +6407.75,6424.14,6357.01,6359.56 +6359.55,6363.7,6315.0,6350.0 +6349.99,6352.39,6330.54,6338.92 +6338.92,6355.0,6338.91,6343.57 +6343.57,6347.83,6335.0,6345.52 +6345.52,6397.48,6345.5,6382.15 +6382.16,6390.68,6355.17,6366.15 +6366.16,6379.26,6361.43,6369.37 +6369.37,6380.72,6360.0,6380.72 +6380.71,6385.99,6339.32,6363.62 +6363.63,6363.63,6356.76,6358.88 +6358.88,6374.98,6358.88,6370.25 +6370.25,6370.26,6346.0,6349.99 +6349.99,6358.97,6319.57,6334.98 +6334.99,6334.99,6265.0,6293.96 +6293.96,6324.67,6256.76,6321.05 +6321.05,6324.23,6303.0,6314.79 +6314.78,6328.67,6314.78,6328.35 +6328.36,6328.36,6318.0,6318.01 +6318.01,6319.9,6292.0,6309.89 +6309.89,6393.96,6305.52,6338.07 +6338.06,6383.81,6338.05,6374.99 +6375.0,6382.08,6353.95,6366.64 +6366.65,6382.89,6329.21,6330.27 +6329.56,6351.0,6316.83,6335.95 +6335.95,6343.7,6318.32,6332.0 +6331.99,6332.0,6325.0,6325.0 +6325.01,6332.0,6319.0,6329.05 +6329.04,6329.05,6270.01,6301.33 +6301.33,6301.81,6285.05,6285.68 +6285.68,6313.0,6270.01,6304.29 +6304.29,6342.0,6304.28,6342.0 +6343.68,6356.36,6322.84,6324.47 +6324.47,6326.11,6307.01,6313.09 +6313.09,6345.28,6313.09,6330.25 +6330.24,6346.05,6330.24,6332.84 +6332.96,6346.9,6323.41,6337.99 +6337.99,6665.0,6337.99,6616.11 +6616.17,6635.0,6585.0,6615.06 +6615.06,6630.89,6607.0,6621.46 +6621.45,6625.0,6595.49,6612.0 +6612.0,6619.94,6605.11,6611.44 +6611.45,6631.31,6606.5,6631.31 +6631.31,6669.99,6610.0,6618.0 +6618.01,6625.81,6617.0,6624.0 +6624.0,6650.0,6615.0,6615.97 +6615.98,6627.05,6615.98,6626.22 +6626.22,6626.22,6602.0,6614.81 +6614.81,6617.0,6600.0,6612.01 +6612.01,6633.84,6605.1,6633.84 +6633.84,6636.17,6618.72,6621.66 +6621.67,6656.19,6621.65,6641.38 +6641.37,6673.99,6633.67,6646.0 +6646.01,6646.01,6625.93,6625.94 +6625.94,6640.5,6618.02,6640.5 +6640.49,6646.75,6640.49,6644.36 +6643.51,6647.78,6618.02,6639.04 +6639.4,6640.29,6581.91,6599.99 +6599.99,6600.76,6535.0,6567.22 +6567.22,6600.34,6557.32,6578.34 +6578.34,6587.05,6565.3,6585.98 +6585.97,6585.98,6558.45,6575.0 +6574.99,6580.7,6560.0,6574.48 +6574.48,6588.58,6574.48,6580.53 +6580.53,6592.94,6579.22,6580.57 +6580.57,6584.81,6569.08,6582.78 +6582.77,6582.78,6570.0,6571.99 +6571.99,6649.78,6544.64,6614.28 +6614.28,6624.99,6606.62,6613.6 +6613.6,6613.6,6594.14,6609.4 +6609.39,6610.0,6465.0,6475.72 +6475.24,6520.17,6474.64,6514.48 +6514.48,6515.83,6430.0,6438.99 +6438.99,6462.99,6411.51,6453.95 +6453.94,6473.42,6440.0,6460.04 +6460.04,6482.86,6460.04,6471.49 +6471.49,6480.03,6465.0,6468.9 +6468.9,6487.0,6454.33,6476.0 +6475.99,6498.99,6464.53,6468.37 +6468.84,6495.0,6464.53,6495.0 +6495.0,6550.0,6490.01,6490.01 +6490.55,6523.76,6487.8,6522.64 +6522.64,6522.64,6494.04,6494.04 +6494.05,6536.0,6493.0,6533.29 +6533.49,6546.49,6519.44,6544.74 +6544.75,6796.62,6541.01,6700.0 +6700.0,6714.19,6681.0,6700.0 +6700.0,6700.0,6674.01,6687.86 +6687.85,6688.61,6655.05,6669.99 +6670.0,6683.46,6665.69,6683.18 +6683.18,6695.0,6661.59,6673.88 +6673.87,6685.48,6663.36,6685.48 +6685.48,6695.35,6681.94,6685.0 +6685.01,6692.0,6668.7,6691.93 +6691.94,6691.94,6560.24,6590.44 +6590.45,6600.0,6557.39,6587.46 +6587.47,6587.47,6508.72,6556.0 +6556.0,6700.0,6556.0,6640.0 +6640.0,6640.0,6590.01,6606.59 +6606.59,6640.67,6603.0,6619.34 +6618.17,6637.19,6614.47,6621.02 +6621.02,6671.43,6569.17,6605.3 +6605.3,6605.3,6582.9,6602.44 +6602.44,6615.83,6592.66,6612.87 +6612.86,6620.0,6598.03,6612.81 +6612.8,6650.0,6546.21,6618.05 +6618.04,6682.94,6599.88,6682.94 +6682.94,6684.0,6575.86,6624.73 +6624.72,6670.0,6623.64,6660.9 +6657.51,6657.51,6585.0,6596.5 +6596.49,6612.52,6568.0,6583.11 +6583.1,6639.34,6539.0,6621.16 +6621.15,6631.11,6576.65,6576.65 +6576.65,6579.01,6550.0,6558.66 +6558.66,6586.18,6449.5,6466.89 +6466.88,6527.86,6462.07,6490.01 +6490.01,6510.99,6486.85,6504.57 +6504.58,6504.58,6475.47,6488.31 +6488.31,6540.0,6480.76,6529.06 +6529.07,6548.0,6525.0,6535.8 +6535.91,6544.94,6520.0,6520.01 +6520.01,6529.48,6510.8,6525.0 +6525.01,6539.99,6525.0,6539.98 +6539.98,6539.98,6525.16,6525.37 +6525.38,6530.0,6481.05,6517.89 +6517.88,6523.0,6496.46,6501.99 +6501.99,6510.75,6452.2,6472.22 +6471.33,6494.22,6454.0,6483.35 +6483.35,6531.99,6483.35,6511.01 +6511.01,6512.84,6488.0,6510.2 +6510.2,6545.54,6508.3,6531.74 +6531.73,6595.0,6508.57,6595.0 +6594.99,6639.0,6563.21,6565.55 +6565.55,6566.84,6546.71,6558.28 +6558.28,6569.91,6550.0,6551.81 +6551.81,6569.93,6546.72,6569.93 +6569.93,6573.72,6553.66,6562.0 +6562.0,6630.0,6551.0,6597.31 +6597.31,6597.31,6500.0,6569.0 +6569.98,6575.97,6561.89,6572.66 +6572.67,6592.1,6566.21,6568.92 +6568.92,6620.0,6562.0,6590.02 +6590.01,6590.02,6568.17,6573.0 +6573.0,6610.0,6572.99,6609.01 +6609.01,6609.29,6582.85,6590.01 +6590.01,6590.01,6557.5,6566.52 +6566.52,6590.0,6565.84,6583.71 +6583.7,6599.32,6580.46,6599.01 +6599.01,6614.53,6591.77,6596.84 +6596.33,6602.73,6592.38,6592.69 +6592.69,6592.69,6575.29,6580.01 +6580.02,6590.99,6575.02,6590.15 +6590.16,6590.16,6571.0,6571.01 +6571.0,6575.02,6570.01,6575.01 +6575.01,6586.33,6566.0,6581.02 +6581.03,6581.27,6575.0,6581.26 +6581.27,6614.8,6528.3,6541.87 +6541.87,6544.77,6521.0,6534.73 +6534.73,6583.62,6534.72,6563.75 +6563.75,6567.5,6544.75,6566.95 +6566.96,6566.96,6558.0,6559.13 +6559.12,6559.12,6540.0,6549.43 +6549.44,6551.0,6525.69,6546.75 +6546.75,6546.76,6533.0,6534.75 +6534.74,6535.13,6512.0,6532.01 +6532.01,6538.94,6520.06,6528.35 +6528.35,6600.55,6517.8,6590.17 +6592.0,6843.26,6575.0,6767.85 +6767.85,6778.31,6721.0,6736.01 +6736.0,6754.0,6724.9,6732.76 +6732.76,6745.14,6722.25,6737.0 +6737.71,6739.99,6718.12,6722.85 +6722.86,6722.86,6711.0,6722.0 +6722.0,6730.0,6721.99,6730.0 +6730.0,6733.87,6721.37,6726.24 +6726.24,6732.67,6726.24,6732.66 +6732.66,6732.66,6720.0,6725.1 +6725.1,6726.0,6720.86,6726.0 +6726.0,6726.0,6720.85,6722.35 +6722.35,6730.0,6718.06,6729.99 +6730.0,6761.0,6711.0,6721.0 +6721.0,6740.0,6720.99,6734.51 +6734.51,6754.5,6725.0,6744.69 +6744.68,6762.88,6740.0,6740.01 +6740.01,6753.38,6740.0,6743.01 +6743.01,6753.83,6743.0,6750.85 +6750.84,6753.0,6741.0,6741.01 +6741.0,6757.46,6740.99,6753.38 +6753.38,6759.22,6743.0,6743.01 +6743.01,6749.76,6740.0,6748.01 +6748.01,6751.55,6721.0,6721.01 +6721.0,6721.0,6671.0,6699.37 +6699.37,6721.94,6699.36,6709.01 +6709.01,6709.01,6688.0,6695.0 +6695.0,6699.0,6685.0,6698.22 +6698.23,6713.67,6698.22,6709.51 +6709.51,6709.51,6687.5,6687.9 +6687.91,6697.11,6687.9,6695.91 +6695.91,6709.86,6695.91,6705.5 +6705.5,6738.58,6702.84,6715.0 +6715.0,6724.0,6710.0,6711.36 +6711.35,6711.36,6660.01,6677.52 +6677.52,6699.58,6677.52,6695.32 +6695.32,6748.84,6692.55,6718.99 +6718.98,6718.98,6700.16,6708.96 +6708.96,6734.73,6708.96,6718.79 +6718.79,6727.73,6715.01,6720.0 +6720.01,6720.01,6706.34,6706.34 +6706.1,6709.99,6670.0,6708.29 +6708.29,6708.29,6669.32,6693.6 +6693.6,6702.0,6681.03,6701.01 +6701.01,6712.17,6701.01,6712.16 +6712.15,6712.16,6695.01,6695.02 +6695.01,6717.0,6695.0,6717.0 +6717.0,6815.82,6680.0,6698.09 +6698.0,6700.0,6625.0,6642.67 +6642.67,6679.47,6640.22,6660.11 +6660.11,6674.0,6651.5,6654.16 +6654.15,6658.76,6620.83,6632.99 +6633.0,6648.0,6629.62,6629.62 +6629.62,6647.72,6627.86,6640.63 +6640.63,6645.0,6610.0,6611.54 +6611.54,6611.55,6565.98,6604.4 +6604.41,6610.91,6586.15,6610.9 +6610.91,6613.98,6580.04,6585.05 +6585.04,6585.05,6424.87,6454.16 +6454.16,6475.0,6431.0,6470.21 +6470.2,6470.29,6320.16,6371.15 +6371.15,6375.48,6324.56,6365.85 +6365.85,6395.62,6362.98,6369.76 +6369.76,6385.0,6340.28,6379.0 +6379.0,6385.0,6365.0,6381.81 +6381.81,6409.47,6334.25,6358.12 +6358.11,6374.0,6351.11,6366.01 +6366.01,6384.15,6364.7,6373.99 +6374.0,6389.61,6360.1,6388.3 +6388.3,6399.38,6375.84,6391.17 +6391.18,6402.18,6361.0,6364.68 +6364.68,6385.0,6360.1,6361.02 +6361.02,6372.0,6279.0,6293.29 +6293.29,6400.0,6282.77,6382.69 +6382.68,6391.2,6357.99,6369.3 +6369.3,6374.96,6360.0,6367.63 +6367.63,6374.56,6336.08,6348.79 +6349.15,6358.48,6323.5,6345.26 +6345.26,6345.26,6291.3,6336.77 +6336.77,6336.77,6281.01,6322.69 +6322.68,6363.23,6319.75,6349.5 +6349.49,6372.0,6349.49,6372.0 +6371.99,6372.0,6328.26,6347.7 +6347.69,6354.9,6331.85,6354.9 +6354.89,6395.98,6354.89,6373.06 +6373.06,6374.9,6357.5,6370.24 +6370.25,6387.01,6365.76,6370.11 +6370.1,6370.1,6340.35,6358.58 +6358.58,6366.01,6352.0,6363.33 +6363.33,6363.34,6330.0,6363.29 +6363.35,6368.97,6343.0,6353.57 +6353.65,6356.99,6343.69,6346.05 +6346.05,6350.0,6287.9,6350.0 +6349.99,6370.0,6344.38,6357.11 +6357.11,6377.39,6355.07,6371.0 +6371.01,6378.65,6364.0,6370.06 +6370.06,6390.04,6368.37,6380.14 +6380.14,6385.64,6354.36,6380.0 +6380.01,6380.01,6320.0,6338.3 +6338.31,6353.67,6310.0,6339.99 +6340.0,6349.99,6337.71,6341.01 +6341.01,6341.01,6325.0,6325.01 +6325.01,6337.5,6311.41,6332.34 +6332.35,6332.35,6183.9,6207.26 +6207.21,6207.95,6156.08,6180.0 +6179.99,6196.1,6139.09,6194.88 +6194.88,6207.06,6168.96,6175.42 +6175.42,6180.5,6149.81,6176.99 +6177.0,6183.2,6139.0,6180.0 +6180.0,6192.77,6175.56,6182.69 +6182.7,6188.04,6162.35,6181.99 +6182.0,6196.85,6168.5,6177.54 +6177.71,6180.19,6159.7,6179.99 +6179.99,6193.48,6175.16,6188.69 +6188.68,6192.0,6172.0,6178.99 +6179.0,6185.0,6165.54,6169.15 +6169.37,6184.27,6153.22,6180.01 +6180.0,6181.41,6170.61,6172.64 +6172.64,6174.08,6160.01,6165.68 +6165.68,6166.51,6126.0,6151.7 +6151.7,6265.61,6075.01,6224.55 +6224.81,6284.0,6223.0,6237.38 +6237.38,6253.49,6233.0,6235.6 +6235.6,6249.99,6235.6,6245.48 +6245.71,6263.33,6242.85,6250.0 +6250.01,6253.17,6240.0,6245.0 +6245.0,6251.0,6239.43,6245.26 +6245.26,6245.26,6210.97,6234.99 +6234.99,6246.55,6234.98,6245.01 +6245.0,6245.01,6227.13,6232.98 +6232.99,6242.77,6231.31,6237.19 +6237.19,6243.73,6232.64,6241.26 +6241.25,6247.91,6238.02,6243.94 +6243.94,6281.11,6243.94,6262.86 +6262.87,6262.88,6230.0,6233.99 +6233.99,6261.67,6233.99,6247.19 +6247.2,6257.64,6247.19,6253.13 +6253.13,6268.99,6250.0,6257.67 +6258.64,6275.0,6256.12,6275.0 +6274.99,6335.09,6222.09,6222.1 +6222.09,6222.1,6121.53,6151.44 +6151.43,6216.0,6151.43,6189.31 +6189.31,6229.72,6186.44,6213.9 +6213.9,6225.0,6196.57,6215.0 +6215.0,6239.97,6196.58,6225.25 +6225.25,6271.57,6225.0,6249.94 +6249.94,6277.5,6218.0,6235.01 +6235.01,6244.76,6225.0,6230.11 +6230.11,6230.17,6204.69,6216.88 +6216.89,6220.0,6216.88,6220.0 +6220.0,6227.81,6219.96,6226.01 +6226.01,6226.01,6205.0,6205.01 +6205.0,6224.95,6205.0,6220.03 +6220.03,6220.03,6209.58,6219.02 +6219.02,6219.02,6187.0,6202.09 +6202.09,6229.78,6200.15,6227.63 +6227.64,6242.5,6225.31,6240.0 +6240.0,6245.15,6231.42,6237.55 +6237.55,6244.81,6227.15,6244.8 +6244.81,6247.0,6230.0,6240.72 +6240.72,6265.24,6228.73,6264.85 +6264.85,6270.0,6254.3,6266.89 +6264.76,6271.28,6259.99,6271.28 +6271.28,6295.22,6227.37,6238.33 +6238.33,6266.24,6208.4,6266.24 +6266.24,6323.68,6213.3,6270.0 +6270.01,6276.37,6258.51,6276.37 +6276.36,6279.72,6242.13,6260.0 +6260.0,6260.0,6245.56,6257.89 +6257.9,6258.35,6233.26,6242.29 +6242.3,6246.93,6235.33,6239.99 +6239.98,6248.18,6238.73,6241.99 +6241.98,6257.45,6239.6,6257.45 +6257.45,6275.71,6257.44,6272.42 +6272.41,6282.4,6265.22,6281.05 +6281.05,6281.05,6278.07,6278.08 +6278.08,6279.0,6266.72,6279.0 +6279.0,6367.35,6279.0,6319.42 +6319.42,6327.22,6303.34,6309.67 +6309.66,6385.0,6309.66,6348.46 +6348.46,6358.21,6339.0,6350.03 +6350.03,6350.03,6330.0,6333.93 +6333.93,6354.83,6332.39,6353.67 +6353.66,6354.6,6338.5,6347.0 +6347.01,6379.55,6347.0,6366.42 +6366.41,6385.35,6366.41,6379.01 +6379.01,6379.01,6360.22,6368.03 +6368.03,6368.03,6350.3,6353.7 +6353.7,6367.95,6352.31,6358.99 +6359.0,6380.0,6358.99,6379.99 +6380.0,6382.0,6371.42,6380.0 +6380.0,6380.01,6355.0,6368.19 +6368.19,6368.19,6336.8,6352.5 +6352.5,6380.59,6347.0,6348.91 +6348.91,6348.91,6335.33,6335.33 +6335.34,6359.95,6330.3,6353.99 +6353.99,6361.68,6351.68,6352.05 +6352.06,6352.68,6347.0,6350.0 +6350.0,6364.99,6348.94,6360.52 +6360.52,6374.99,6360.52,6360.52 +6360.53,6361.02,6357.5,6357.5 +6357.51,6389.99,6356.51,6366.01 +6366.0,6533.22,6366.0,6501.06 +6501.06,6547.86,6494.91,6531.69 +6531.68,6663.66,6531.68,6614.08 +6614.09,6621.47,6582.87,6605.83 +6605.83,6615.88,6581.73,6587.67 +6587.66,6636.41,6587.66,6632.33 +6632.32,6644.93,6612.16,6637.51 +6637.51,6637.88,6610.75,6615.08 +6615.09,6715.0,6615.08,6674.95 +6674.95,6697.8,6660.0,6660.01 +6660.01,6680.76,6631.39,6664.49 +6664.5,6671.05,6650.0,6652.48 +6652.48,6660.0,6645.3,6660.0 +6659.99,6682.5,6657.38,6674.24 +6674.23,6750.0,6666.66,6730.01 +6730.0,6743.1,6706.41,6735.01 +6735.01,6735.01,6696.64,6726.63 +6726.82,6737.26,6721.13,6736.99 +6737.0,6749.0,6732.5,6747.7 +6747.69,6753.85,6693.51,6696.18 +6696.18,6718.33,6665.0,6682.0 +6682.0,6693.88,6663.51,6675.77 +6675.78,6710.0,6674.99,6709.99 +6710.0,6729.53,6699.95,6699.95 +6699.96,6714.0,6695.41,6704.01 +6704.01,6718.92,6704.0,6718.91 +6718.92,6719.99,6679.9,6688.9 +6688.9,6707.95,6676.5,6696.49 +6696.5,6709.0,6689.2,6706.58 +6706.58,6742.0,6701.1,6725.39 +6725.4,6800.0,6718.0,6755.3 +6755.31,6766.69,6738.8,6766.69 +6766.69,7430.0,6762.1,7360.0 +7360.01,7472.5,7325.02,7343.91 +7343.91,7369.38,7291.35,7311.68 +7311.69,7329.51,7306.1,7324.04 +7324.04,7375.0,7318.17,7368.62 +7368.62,7374.98,7264.2,7306.0 +7306.01,7330.0,7292.23,7315.01 +7315.01,7369.99,7315.01,7335.0 +7334.99,7350.0,7320.0,7345.0 +7345.0,7516.73,7342.0,7493.5 +7493.5,7545.0,7450.39,7473.01 +7473.01,7473.01,7411.01,7438.36 +7438.36,7476.4,7424.5,7469.75 +7469.74,7475.88,7451.22,7456.06 +7456.07,7456.07,7423.0,7439.53 +7436.95,7438.26,7326.98,7391.1 +7391.1,7430.85,7368.0,7430.85 +7430.84,7430.85,7375.0,7408.33 +7408.34,7429.0,7391.33,7423.85 +7423.85,7471.05,7413.03,7448.0 +7448.0,7461.06,7385.0,7448.23 +7448.23,7523.93,7400.0,7404.6 +7404.6,7436.0,7375.0,7435.0 +7435.01,7455.0,7417.68,7440.0 +7440.0,7539.3,7430.0,7531.75 +7531.76,7584.85,7391.18,7409.01 +7409.0,7436.87,7334.0,7334.0 +7334.0,7336.49,7229.89,7320.51 +7320.41,7358.0,7320.41,7326.68 +7326.68,7385.03,7280.0,7370.0 +7370.0,7390.0,7344.0,7376.0 +7376.01,7376.01,7311.34,7326.0 +7323.26,7331.87,7281.42,7305.91 +7305.92,7345.0,7291.86,7329.79 +7329.79,7353.86,7315.79,7325.22 +7325.22,7344.0,7315.2,7319.54 +7319.55,7343.41,7307.39,7343.41 +7343.4,7359.94,7335.88,7341.0 +7341.0,7341.01,7305.86,7305.86 +7305.69,7343.0,7305.68,7337.5 +7337.49,7414.85,7335.59,7403.48 +7403.48,7403.48,7372.5,7374.99 +7375.0,7436.7,7362.5,7416.15 +7416.15,7443.71,7415.0,7419.92 +7419.92,7515.0,7419.91,7442.71 +7442.71,7472.82,7432.01,7457.95 +7457.95,7469.3,7362.32,7400.0 +7400.0,7400.0,7347.0,7374.98 +7374.97,7439.91,7371.86,7439.91 +7439.91,7440.0,7403.0,7417.13 +7417.13,7482.7,7410.06,7459.0 +7459.0,7479.75,7412.5,7435.03 +7435.03,7471.58,7430.26,7463.65 +7463.65,7581.0,7439.2,7485.0 +7485.0,7485.01,7435.0,7440.01 +7440.0,7440.01,7378.84,7398.8 +7398.8,7459.0,7398.79,7459.0 +7459.0,7470.0,7445.0,7449.29 +7451.45,7475.16,7436.01,7450.01 +7450.0,7450.01,7429.0,7444.99 +7445.0,7446.0,7411.25,7422.11 +7422.12,7425.0,7358.6,7372.36 +7372.35,7453.01,7362.63,7439.69 +7436.57,7489.86,7436.57,7460.2 +7460.2,7464.39,7428.37,7457.59 +7457.6,7466.83,7444.0,7466.74 +7466.73,7511.97,7459.05,7471.11 +7471.12,7475.0,7443.6,7459.99 +7459.99,7475.0,7450.0,7464.07 +7464.07,7489.0,7438.0,7479.85 +7479.85,7500.0,7450.0,7480.0 +7479.99,7687.0,7365.0,7411.85 +7409.37,7427.9,7259.76,7313.21 +7313.21,7400.29,7313.2,7356.01 +7356.01,7379.89,7300.0,7326.08 +7326.07,7369.26,7325.0,7351.76 +7351.76,7369.05,7287.92,7292.01 +7292.01,7369.11,7275.32,7342.33 +7342.34,7343.72,7310.66,7314.78 +7313.01,7317.55,7204.32,7242.03 +7242.03,7275.0,7233.0,7274.99 +7275.0,7298.59,7266.1,7282.01 +7282.0,7299.31,7254.08,7275.0 +7275.0,7309.09,7260.01,7305.5 +7305.49,7327.94,7288.98,7319.53 +7319.53,7345.0,7306.0,7332.62 +7332.62,7332.62,7314.99,7319.74 +7319.74,7330.0,7300.0,7310.67 +7310.67,7339.85,7310.67,7315.1 +7315.1,7315.11,7288.5,7295.0 +7295.0,7318.52,7289.56,7301.93 +7301.93,7356.3,7300.25,7347.45 +7347.44,7369.11,7347.44,7364.0 +7363.99,7371.94,7340.0,7343.33 +7343.33,7420.0,7343.0,7408.05 +7408.04,7414.88,7382.0,7384.49 +7384.49,7420.28,7384.48,7420.28 +7420.28,7444.27,7415.96,7441.17 +7441.17,7441.17,7390.47,7426.67 +7426.68,7444.77,7412.0,7420.0 +7419.99,7428.53,7400.07,7415.0 +7415.01,7427.0,7400.62,7415.06 +7415.07,7419.99,7354.11,7354.11 +7354.11,7435.0,7340.0,7432.0 +7432.0,7475.01,7427.62,7473.36 +7473.35,7473.36,7408.0,7411.57 +7411.57,7429.9,7390.01,7390.01 +7390.02,7414.0,7359.91,7371.1 +7371.1,7408.0,7371.09,7408.0 +7407.99,7408.0,7374.0,7399.0 +7399.0,7404.54,7378.0,7404.54 +7404.55,7449.99,7404.55,7435.16 +7435.16,7445.16,7420.0,7425.21 +7425.22,7456.43,7425.22,7452.51 +7452.5,7462.17,7437.0,7440.0 +7440.0,7455.0,7432.98,7438.71 +7438.7,7488.0,7438.7,7458.43 +7458.43,7500.0,7455.51,7498.9 +7498.91,7543.8,7492.8,7512.01 +7511.91,7529.99,7490.0,7510.0 +7510.0,7510.0,7490.33,7496.0 +7496.0,7529.99,7495.99,7511.51 +7511.5,7528.99,7511.5,7520.0 +7520.0,7535.0,7514.0,7535.0 +7534.99,7569.69,7327.75,7370.01 +7370.01,7420.0,7363.31,7393.02 +7393.02,7409.02,7378.26,7400.0 +7400.0,7468.43,7392.19,7461.01 +7461.01,7525.0,7454.65,7515.49 +7515.5,7664.98,7515.49,7610.02 +7610.01,7640.0,7610.01,7630.0 +7629.99,7700.0,7629.99,7649.99 +7649.35,7662.81,7632.22,7662.81 +7662.81,7694.5,7647.18,7668.61 +7668.6,7779.99,7645.0,7736.03 +7736.03,7748.0,7676.0,7685.01 +7685.0,7714.99,7663.52,7711.99 +7712.0,7712.0,7671.11,7708.46 +7708.45,7708.54,7652.24,7681.53 +7681.8,7712.05,7672.52,7700.05 +7700.05,7727.0,7700.04,7715.0 +7714.99,7715.0,7690.0,7709.81 +7709.81,7745.0,7688.0,7726.48 +7726.48,7740.0,7706.0,7735.0 +7735.0,7747.0,7700.0,7727.99 +7727.99,7809.0,7628.0,7749.99 +7749.99,7798.0,7732.12,7750.01 +7750.01,7760.0,7702.0,7723.51 +7723.51,7755.0,7718.05,7753.56 +7753.56,7760.0,7705.55,7721.01 +7721.01,7726.0,7705.55,7726.0 +7725.99,7727.1,7695.99,7721.6 +7721.6,7756.0,7717.66,7756.0 +7756.0,7763.7,7714.15,7738.89 +7738.89,7780.0,7735.98,7755.0 +7755.0,7875.0,7755.0,7875.0 +7875.0,8030.0,7874.99,7966.5 +7964.0,8003.1,7950.0,7990.0 +7989.99,8020.0,7989.99,7998.0 +7997.99,7998.84,7969.91,7988.01 +7988.0,8024.99,7986.14,8013.0 +8013.0,8138.5,8007.0,8098.14 +8098.13,8299.99,8097.41,8299.99 +8299.99,8360.0,8140.28,8164.01 +8164.0,8255.0,8126.46,8235.0 +8235.0,8250.0,8113.89,8170.0 +8169.99,8212.33,8155.9,8189.99 +8189.98,8193.53,8156.01,8189.47 +8189.48,8269.79,8189.47,8225.01 +8225.01,8267.0,8208.47,8265.0 +8265.0,8310.96,8239.98,8250.94 +8250.95,8250.95,8189.99,8221.0 +8221.01,8272.0,8210.0,8260.84 +8260.83,8335.0,8259.8,8332.5 +8332.5,8488.0,8320.0,8421.34 +8421.34,8482.84,8392.0,8426.67 +8426.67,8447.2,8384.0,8386.21 +8386.21,8387.39,8304.36,8304.37 +8304.37,8375.0,8286.0,8348.99 +8349.0,8430.02,8333.09,8426.7 +8426.69,8435.0,8396.39,8410.0 +8410.0,8410.02,8286.9,8344.99 +8345.0,8360.0,8310.07,8315.08 +8315.08,8320.0,8237.25,8244.34 +8247.86,8283.23,8184.01,8189.89 +8189.9,8226.01,8156.22,8202.69 +8202.7,8233.78,8168.68,8208.5 +8208.51,8228.77,8186.7,8211.01 +8211.01,8218.0,8154.72,8206.52 +8206.53,8206.54,8164.76,8189.64 +8189.65,8189.65,8042.0,8090.01 +8090.01,8168.27,8069.18,8145.13 +8145.13,8150.0,8081.57,8109.73 +8109.74,8120.0,8066.88,8095.0 +8095.0,8160.0,8094.99,8129.99 +8130.0,8233.0,8125.79,8212.5 +8212.51,8325.32,8205.0,8269.58 +8269.57,8310.0,8250.0,8269.0 +8269.0,8273.23,8156.75,8190.0 +8190.0,8240.98,8179.0,8230.0 +8230.0,8238.02,8200.0,8200.0 +8200.0,8205.28,8170.0,8181.68 +8181.69,8220.0,8175.1,8220.0 +8220.0,8220.0,8197.0,8219.7 +8219.7,8219.7,8189.72,8194.26 +8194.26,8286.0,8194.25,8269.88 +8269.88,8283.55,8225.0,8239.21 +8239.22,8260.0,8239.21,8241.0 +8241.0,8275.32,8240.99,8269.99 +8270.0,8290.0,8263.48,8283.22 +8283.23,8283.23,8229.67,8240.01 +8240.0,8240.01,8185.0,8219.67 +8219.67,8230.0,8185.51,8205.49 +8205.5,8213.22,8178.0,8212.57 +8212.57,8212.57,8193.06,8200.01 +8200.01,8206.76,8185.0,8204.55 +8204.75,8237.55,8199.99,8200.0 +8200.0,8222.75,8200.0,8222.74 +8222.75,8264.0,8222.74,8250.01 +8250.01,8287.0,8070.0,8120.0 +8120.0,8139.47,7869.0,7988.01 +7988.01,8038.0,7854.99,7879.0 +7879.0,7940.0,7840.0,7931.52 +7931.52,7931.52,7883.18,7900.0 +7900.0,7916.0,7852.1,7890.0 +7890.0,7906.0,7860.0,7870.24 +7870.23,7895.88,7870.23,7894.95 +7894.94,7939.8,7894.94,7930.01 +7930.01,7930.01,7902.8,7918.42 +7918.42,7922.17,7883.0,7907.35 +7907.36,7920.0,7888.6,7919.99 +7919.99,7984.0,7919.99,7980.01 +7980.02,7980.02,7944.41,7944.41 +7944.41,7955.48,7920.0,7939.99 +7940.0,7940.0,7899.48,7923.54 +7923.53,7923.54,7787.29,7787.3 +7787.3,7880.48,7787.3,7868.66 +7868.66,7975.0,7811.44,7944.92 +7944.91,8171.4,7938.72,8154.99 +8155.0,8229.0,8154.08,8172.89 +8172.89,8199.01,8154.05,8199.0 +8199.0,8276.55,8198.99,8260.0 +8260.0,8260.01,8200.0,8220.25 +8220.25,8229.99,8209.22,8229.99 +8229.99,8260.0,8229.98,8242.99 +8243.71,8250.0,8229.98,8249.99 +8249.99,8261.17,8133.04,8197.44 +8197.44,8197.91,8157.04,8158.0 +8158.0,8182.16,8153.01,8170.01 +8170.01,8190.0,8160.0,8160.0 +8160.0,8175.0,8155.0,8175.0 +8175.0,8215.0,8157.83,8215.0 +8214.99,8220.0,8173.77,8173.78 +8173.78,8193.99,8173.77,8193.99 +8193.99,8195.0,8175.55,8195.0 +8194.99,8203.81,8185.61,8198.19 +8198.2,8198.2,8170.0,8193.93 +8193.92,8200.0,8166.0,8166.01 +8166.0,8205.85,8138.1,8170.87 +8170.87,8195.0,8170.87,8177.41 +8177.4,8190.0,8152.39,8152.49 +8152.64,8158.9,8110.0,8130.02 +8130.02,8162.61,8065.0,8156.63 +8156.63,8179.47,8145.76,8179.46 +8179.47,8210.0,8150.0,8172.64 +8172.63,8195.66,8160.5,8188.11 +8188.11,8199.98,8188.1,8195.11 +8195.1,8195.11,8163.8,8164.09 +8164.1,8170.25,8158.0,8170.25 +8170.24,8188.13,8169.01,8175.5 +8175.51,8238.06,8175.0,8234.17 +8234.17,8289.96,8234.16,8238.0 +8237.99,8265.0,8237.99,8265.0 +8264.99,8280.0,8238.9,8241.27 +8241.27,8241.27,8218.02,8230.73 +8230.73,8230.73,8185.01,8192.09 +8192.08,8218.01,8192.08,8208.83 +8208.83,8208.83,8204.31,8204.32 +8204.32,8208.83,8164.82,8164.82 +8164.8,8164.8,8137.77,8158.35 +8158.35,8174.15,8143.07,8155.78 +8155.77,8160.0,8146.02,8146.04 +8146.03,8168.73,8127.87,8164.27 +8164.27,8219.99,8164.26,8209.04 +8209.04,8209.04,8176.86,8195.58 +8195.58,8229.65,8192.03,8206.0 +8206.0,8224.99,8202.41,8205.68 +8205.69,8205.69,8166.0,8184.0 +8184.01,8195.86,8182.09,8195.86 +8195.86,8214.83,8195.0,8214.82 +8214.83,8214.83,8205.19,8214.34 +8214.33,8214.34,8192.51,8203.05 +8203.04,8205.0,8181.67,8189.99 +8190.0,8195.0,8178.66,8195.0 +8194.99,8270.0,8131.04,8131.04 +8131.04,8160.0,8080.0,8149.66 +8149.66,8274.92,8149.65,8201.55 +8201.55,8210.0,8188.88,8198.15 +8198.15,8213.34,8171.21,8172.76 +8172.76,8190.0,8164.75,8179.99 +8179.99,8186.54,8171.51,8179.99 +8179.99,8180.0,8118.42,8133.46 +8133.46,8187.0,8115.88,8178.25 +8178.26,8178.26,8150.0,8150.01 +8150.01,8165.0,8145.21,8157.86 +8157.86,8157.86,8134.79,8139.99 +8139.99,8160.0,8119.5,8151.92 +8151.92,8151.92,8125.0,8139.99 +8139.98,8139.98,8096.96,8125.0 +8125.0,8200.0,8124.99,8160.0 +8160.0,8160.0,8107.45,8124.15 +8124.14,8124.15,8069.23,8110.92 +8110.92,8110.92,7850.0,7853.0 +7853.0,7975.0,7852.99,7975.0 +7975.0,8130.0,7974.99,8076.92 +8076.92,8178.0,8076.92,8135.0 +8134.99,8140.0,8110.0,8140.0 +8139.99,8199.99,8139.0,8168.64 +8168.64,8189.99,8166.01,8168.0 +8168.01,8168.01,8107.84,8109.6 +8109.61,8131.1,8107.0,8125.0 +8124.99,8135.0,8111.0,8112.01 +8112.01,8121.0,8107.28,8112.62 +8112.62,8119.38,8077.0,8103.33 +8103.33,8131.98,8100.0,8130.57 +8130.56,8130.57,8110.33,8110.34 +8110.34,8110.34,8110.21,8110.22 +8110.22,8110.22,7985.17,8041.99 +8041.99,8043.95,7963.47,8009.99 +8010.0,8010.0,7929.05,7955.0 +7955.0,8012.96,7947.64,7955.01 +7955.01,7960.0,7757.25,7773.55 +7773.55,7820.0,7654.0,7727.66 +7725.19,7774.0,7687.01,7698.01 +7698.01,7752.9,7666.66,7716.56 +7716.56,7817.0,7713.61,7806.4 +7806.41,7810.0,7700.0,7706.5 +7706.5,7764.0,7690.0,7734.99 +7734.99,7760.0,7725.0,7725.01 +7725.01,7729.99,7665.0,7695.01 +7695.01,7723.9,7681.58,7690.12 +7690.11,7714.36,7665.13,7670.02 +7670.02,7780.0,7629.48,7727.11 +7727.1,7750.0,7610.0,7644.3 +7644.3,7675.0,7526.11,7527.99 +7528.0,7560.0,7504.0,7531.01 +7531.01,7549.54,7506.94,7531.37 +7531.37,7575.0,7525.0,7540.51 +7540.5,7544.54,7460.0,7534.77 +7534.77,7570.0,7516.23,7535.74 +7535.75,7577.0,7527.6,7577.0 +7577.0,7645.0,7574.74,7597.01 +7603.41,7609.81,7555.84,7555.85 +7555.85,7555.85,7531.94,7548.21 +7548.2,7590.99,7521.0,7583.01 +7583.01,7592.0,7555.0,7583.24 +7583.23,7635.99,7581.43,7613.77 +7613.78,7625.0,7569.37,7585.0 +7585.0,7614.41,7585.0,7604.71 +7604.71,7607.0,7535.52,7551.19 +7551.19,7583.76,7533.61,7538.69 +7538.69,7555.0,7538.68,7540.01 +7540.0,7569.0,7540.0,7551.62 +7551.62,7551.62,7475.2,7510.0 +7510.0,7513.86,7437.0,7457.52 +7457.54,7632.62,7457.54,7578.01 +7578.0,7628.9,7572.69,7606.1 +7606.1,7707.54,7593.51,7691.01 +7691.01,7698.21,7635.0,7669.9 +7669.9,7689.99,7656.33,7662.01 +7662.01,7662.01,7630.0,7645.05 +7645.04,7645.05,7627.37,7628.65 +7628.66,7667.07,7628.66,7667.07 +7667.07,7669.08,7640.0,7664.7 +7664.69,7688.95,7645.02,7651.16 +7651.15,7665.99,7618.32,7632.66 +7632.67,7648.22,7604.01,7604.01 +7604.0,7604.01,7555.0,7566.01 +7566.0,7577.65,7550.22,7563.03 +7563.02,7567.0,7515.44,7529.83 +7529.84,7545.0,7474.89,7494.69 +7494.68,7557.11,7494.68,7540.52 +7540.51,7550.77,7512.16,7523.58 +7523.58,7584.83,7462.0,7572.53 +7572.53,7572.53,7506.51,7520.7 +7520.71,7521.95,7483.2,7517.54 +7517.54,7554.01,7517.54,7540.51 +7540.51,7578.0,7535.29,7555.0 +7555.0,7561.0,7521.0,7523.56 +7523.56,7565.0,7509.75,7549.61 +7549.62,7568.46,7500.1,7503.0 +7502.99,7508.62,7334.0,7374.65 +7374.66,7374.66,7315.0,7335.27 +7335.27,7363.22,7312.0,7347.12 +7347.12,7355.0,7312.69,7312.69 +7312.69,7360.0,7285.0,7344.56 +7344.55,7359.98,7318.2,7321.29 +7321.28,7360.0,7315.0,7327.0 +7327.01,7417.0,7308.99,7404.0 +7402.06,7414.26,7362.99,7365.3 +7365.29,7365.3,7334.22,7365.0 +7364.99,7370.0,7334.06,7352.67 +7352.67,7372.76,7329.29,7356.65 +7356.65,7405.87,7349.51,7386.15 +7386.15,7441.99,7363.27,7440.05 +7440.05,7493.0,7432.27,7472.24 +7472.24,7479.99,7454.05,7479.99 +7479.99,7489.97,7461.03,7488.99 +7489.0,7538.53,7482.51,7528.99 +7529.0,7529.99,7433.14,7447.12 +7447.11,7447.12,7355.72,7392.74 +7392.75,7410.0,7370.0,7400.0 +7400.0,7448.37,7399.99,7417.71 +7417.71,7441.3,7412.0,7412.01 +7412.0,7431.15,7360.0,7391.21 +7391.22,7470.0,7391.0,7462.8 +7462.8,7485.09,7436.24,7481.28 +7481.28,7495.0,7463.08,7475.92 +7475.92,7480.0,7453.0,7456.05 +7456.05,7468.84,7445.11,7468.83 +7468.84,7468.84,7433.88,7443.6 +7443.59,7443.59,7415.75,7433.2 +7433.2,7449.18,7433.19,7445.83 +7445.83,7475.65,7445.82,7463.17 +7463.17,7463.17,7426.16,7456.21 +7456.2,7459.32,7385.0,7393.59 +7393.58,7421.83,7377.11,7377.12 +7377.12,7377.12,7216.21,7255.6 +7255.59,7278.68,7225.33,7229.99 +7230.0,7239.87,7011.51,7063.14 +7063.14,7063.14,6956.15,6990.0 +6990.0,7025.0,6956.15,6998.05 +6998.05,7000.21,6940.0,6982.0 +6982.01,7015.0,6960.47,6970.36 +6970.36,7010.0,6958.43,6995.71 +6995.7,6995.71,6973.96,6984.73 +6984.73,7026.54,6983.01,7009.99 +7009.99,7024.67,7000.0,7019.5 +7019.8,7019.99,6997.0,7011.0 +7011.0,7020.89,6880.0,6889.34 +6889.35,6970.0,6889.34,6928.99 +6928.99,6961.99,6900.62,6942.08 +6942.08,7012.25,6942.07,7008.01 +7008.01,7008.01,6968.83,6974.03 +6974.03,6999.22,6973.13,6975.58 +6975.59,6976.09,6951.33,6973.44 +6976.08,6976.1,6931.01,6944.15 +6944.15,7006.02,6944.15,7006.01 +7006.02,7084.16,6987.49,7080.0 +7080.01,7080.01,7038.32,7043.88 +7043.89,7045.0,7015.2,7042.63 +7042.64,7060.0,7038.0,7038.01 +7038.01,7038.01,6945.0,6945.01 +6945.01,7017.82,6890.0,6996.62 +6996.62,7043.78,6981.66,7010.0 +7010.0,7034.0,6978.2,6981.93 +6981.92,7005.0,6950.0,6998.56 +6998.56,7030.0,6971.67,7030.0 +7029.99,7036.0,7001.0,7015.6 +7015.52,7076.0,7005.0,7069.99 +7070.0,7086.52,7036.4,7041.99 +7040.97,7040.97,7009.05,7030.13 +7030.13,7047.81,7020.01,7037.47 +7037.47,7083.63,7036.51,7047.69 +7047.7,7163.0,7046.81,7139.13 +7139.13,7146.59,7124.1,7135.29 +7135.29,7138.55,7097.13,7111.84 +7111.84,7120.0,7076.11,7090.44 +7090.44,7099.5,7065.01,7090.22 +7090.23,7105.0,7077.79,7077.8 +7077.8,7091.54,6985.44,6995.4 +6995.39,7005.78,6953.08,6986.14 +6986.14,6999.85,6955.42,6976.68 +6976.68,6984.0,6952.76,6975.0 +6975.0,6984.0,6930.0,6975.38 +6975.38,6987.11,6940.0,6951.36 +6951.36,6954.0,6887.0,6935.0 +6934.99,6950.02,6907.99,6940.01 +6940.01,6984.5,6938.23,6974.07 +6974.07,6978.97,6911.22,6937.82 +6937.82,6943.25,6913.23,6916.32 +6916.31,6928.8,6900.84,6924.0 +6923.99,6951.6,6923.0,6949.99 +6950.0,6954.66,6912.0,6922.24 +6922.24,6922.25,6853.0,6874.28 +6874.28,6938.59,6840.06,6913.76 +6913.77,6974.0,6913.76,6974.0 +6974.0,6990.0,6946.85,6963.53 +6963.53,6966.83,6904.31,6925.01 +6925.0,6952.0,6921.26,6947.79 +6947.79,6957.0,6926.01,6939.84 +6939.85,6959.49,6938.24,6951.4 +6951.4,6955.59,6926.0,6926.0 +6926.0,6968.98,6924.0,6968.98 +6968.98,7066.5,6968.97,7020.37 +7020.37,7058.0,7013.45,7057.99 +7058.0,7066.5,7040.41,7050.01 +7050.01,7056.87,7035.0,7055.86 +7055.86,7112.11,7052.51,7085.01 +7085.01,7152.0,7067.43,7152.0 +7151.99,7151.99,7059.82,7068.01 +7068.0,7093.07,7051.0,7093.06 +7093.06,7125.0,7093.06,7101.37 +7101.37,7131.0,7100.9,7118.0 +7118.0,7118.88,7083.48,7083.48 +7083.48,7105.0,7078.62,7096.9 +7096.89,7097.16,6924.07,6924.08 +6924.07,6940.0,6647.07,6714.57 +6714.56,6754.1,6663.48,6744.62 +6744.63,6798.56,6704.62,6705.0 +6705.0,6738.1,6694.44,6694.45 +6694.45,6694.45,6556.08,6617.45 +6617.49,6636.99,6563.95,6575.95 +6575.94,6620.0,6565.0,6608.61 +6608.61,6608.61,6568.85,6575.0 +6575.01,6575.01,6463.0,6492.99 +6492.98,6552.41,6395.0,6513.0 +6513.01,6555.32,6512.71,6549.68 +6549.67,6551.77,6440.03,6462.68 +6462.67,6527.06,6462.67,6496.29 +6499.06,6512.5,6472.76,6495.0 +6494.99,6495.0,6441.85,6490.89 +6490.86,6533.96,6484.5,6515.0 +6515.01,6522.13,6470.22,6503.69 +6503.69,6503.69,6425.15,6437.24 +6438.72,6491.46,6414.18,6478.49 +6479.29,6499.0,6470.0,6484.98 +6484.97,6484.98,6181.0,6292.26 +6292.26,6292.26,6218.76,6259.36 +6259.35,6350.08,6121.04,6319.01 +6319.01,6365.99,6290.02,6303.0 +6303.0,6337.11,6300.0,6315.06 +6315.06,6326.31,6250.0,6299.0 +6299.0,6300.82,6241.44,6248.28 +6248.29,6300.0,6221.28,6294.28 +6294.29,6331.08,6284.0,6300.03 +6300.03,6338.0,6300.0,6320.0 +6320.01,6337.3,6310.0,6321.0 +6320.99,6330.0,6294.49,6310.01 +6310.01,6389.96,6303.6,6375.01 +6375.01,6375.01,6338.0,6359.99 +6360.0,6369.28,6339.99,6355.55 +6355.55,6364.73,6306.0,6328.01 +6328.01,6328.01,6282.51,6322.24 +6322.24,6341.61,6317.7,6328.25 +6328.26,6349.99,6311.2,6343.34 +6343.34,6343.34,6290.0,6290.01 +6290.0,6296.07,6235.19,6255.01 +6255.01,6473.0,6177.51,6422.28 +6422.28,6557.16,6422.28,6533.86 +6533.86,6533.86,6427.16,6445.01 +6445.01,6479.99,6445.0,6457.11 +6457.11,6489.99,6440.0,6478.19 +6478.2,6480.0,6452.56,6479.99 +6480.0,6515.76,6460.0,6470.0 +6469.99,6633.21,6469.99,6580.01 +6580.01,6626.0,6566.71,6585.5 +6585.51,6623.79,6576.7,6590.11 +6590.11,6590.11,6529.81,6557.19 +6557.19,6584.8,6556.23,6547.767647058823 +6547.767647058823,6578.008125,6544.084374999999,6538.3452941176465 +6538.3452941176465,6571.21625,6531.938749999999,6528.92294117647 +6528.92294117647,6564.4243750000005,6519.793124999999,6519.500588235293 +6519.500588235293,6557.6325,6507.647499999999,6510.078235294118 +6510.078235294118,6550.840625,6495.501875,6500.655882352941 +6500.655882352941,6544.04875,6483.35625,6491.233529411765 +6491.233529411765,6537.256875,6471.210625,6481.811176470588 +6481.811176470588,6530.465,6459.065,6472.388823529412 +6472.388823529412,6523.673125,6446.9193749999995,6462.966470588235 +6462.966470588235,6516.88125,6434.773749999999,6453.544117647059 +6453.544117647059,6510.0893750000005,6422.628124999999,6444.121764705882 +6444.121764705882,6503.297500000001,6410.4825,6434.699411764706 +6434.699411764706,6496.505625,6398.336875,6425.27705882353 +6425.27705882353,6489.71375,6386.19125,6415.854705882353 +6415.854705882353,6482.921875,6374.045625,6406.432352941177 +6406.432352941177,6476.13,6361.9,6397.01 +6397.01,6439.0,6345.0,6399.0 +6399.0,6420.0,6384.95,6389.89 +6389.89,6402.49,6387.24,6390.01 +6390.01,6400.0,6025.0,6027.01 +6027.02,6153.57,6015.0,6144.99 +6145.0,6145.0,6072.0,6100.98 +6100.98,6196.01,6077.0,6150.01 +6150.01,6150.01,6080.03,6119.79 +6119.79,6119.79,6092.41,6107.0 +6107.0,6153.01,6090.0,6135.01 +6135.01,6135.01,6094.0,6114.99 +6115.0,6145.0,6080.01,6096.71 +6096.71,6140.0,6003.0,6097.94 +6097.95,6107.35,6058.09,6078.23 +6078.23,6150.0,6065.14,6121.75 +6121.76,6133.5,6098.57,6109.65 +6109.65,6123.34,6100.0,6113.82 +6113.83,6190.0,6113.82,6131.19 +6131.19,6131.19,6086.72,6102.31 +6102.31,6158.06,6075.0,6113.56 +6113.55,6129.8,6099.97,6111.01 +6112.0,6149.0,6103.88,6128.22 +6126.27,6135.0,6094.34,6108.68 +6109.14,6176.91,6082.0,6144.69 +6144.68,6485.76,6135.66,6423.8 +6423.8,6430.0,6375.0,6388.6 +6388.6,6403.56,6369.92,6398.1 +6398.09,6421.12,6386.12,6401.78 +6401.78,6403.17,6384.63,6394.53 +6394.49,6410.0,6392.06,6406.81 +6406.81,6410.0,6191.0,6212.03 +6212.03,6314.9,6169.46,6276.28 +6276.28,6284.74,6224.4,6275.01 +6281.26,6299.0,6276.47,6294.19 +6294.03,6300.0,6264.3,6279.96 +6279.96,6279.96,6260.0,6268.01 +6268.01,6385.45,6268.0,6326.92 +6326.93,6361.96,6317.99,6352.95 +6352.95,6354.02,6305.16,6321.13 +6321.14,6321.14,6287.73,6300.0 +6300.01,6336.67,6299.82,6314.22 +6314.22,6347.5,6307.01,6333.07 +6329.9,6374.0,6304.33,6320.06 +6320.05,6332.94,6190.42,6247.75 +6247.75,6337.92,6240.0,6304.26 +6304.25,6333.84,6292.84,6323.37 +6323.36,6375.0,6300.54,6314.53 +6314.54,6338.91,6251.53,6316.06 +6316.06,6328.53,6274.0,6307.99 +6307.99,6324.0,6283.44,6298.84 +6298.85,6482.0,6225.58,6317.11 +6317.11,6355.7,6304.69,6335.77 +6335.77,6393.93,6323.4,6363.0 +6362.99,6363.0,6314.84,6343.96 +6343.96,6343.97,6294.02,6335.0 +6335.0,6347.1,6325.0,6344.17 +6344.17,6345.0,6324.24,6324.56 +6324.56,6332.78,6307.22,6330.66 +6330.66,6383.39,6330.65,6383.38 +6383.38,6383.38,6337.76,6340.0 +6339.99,6349.8,6309.97,6345.44 +6345.43,6472.0,6345.24,6419.03 +6419.02,6475.0,6401.99,6465.0 +6465.0,6544.99,6454.27,6471.47 +6471.47,6501.0,6444.79,6469.96 +6469.97,6476.0,6460.0,6460.0 +6460.0,6472.63,6433.42,6450.76 +6450.75,6475.84,6408.2,6408.21 +6408.2,6425.21,6360.0,6424.99 +6424.99,6425.0,6354.79,6369.39 +6369.38,6369.39,6206.0,6306.59 +6306.58,6331.38,6223.82,6247.97 +6247.97,6247.97,6139.57,6205.99 +6204.14,6250.0,6201.2,6244.99 +6245.0,6245.0,6205.0,6225.62 +6225.62,6299.96,6225.61,6265.0 +6265.01,6272.4,6239.99,6252.0 +6252.0,6289.04,6213.02,6270.0 +6270.0,6290.0,6238.24,6253.54 +6251.32,6256.96,6182.34,6225.01 +6225.01,6235.0,5907.0,5907.47 +5907.48,6006.02,5900.0,5934.98 +5934.97,6006.96,5920.0,6006.96 +6006.96,6047.28,5989.46,6008.71 +6008.71,6020.0,5956.34,5967.62 +5967.62,5988.77,5960.0,5980.93 +5980.94,6075.88,5966.7,6029.45 +6029.45,6051.53,6010.0,6021.4 +6021.4,6066.24,6016.29,6056.51 +6056.51,6089.86,6008.85,6016.43 +6016.43,6032.72,5979.79,6006.87 +6006.88,6168.0,6000.15,6119.0 +6118.99,6170.0,6106.03,6122.0 +6122.0,6140.0,6023.75,6047.37 +6047.35,6051.0,5980.0,6024.62 +6026.21,6047.46,5991.0,6038.03 +6038.03,6085.0,6009.99,6028.25 +6028.25,6145.0,6024.98,6092.25 +6092.26,6125.0,6060.68,6068.99 +6069.0,6101.13,6060.0,6081.96 +6081.96,6132.57,6080.35,6120.23 +6120.23,6172.12,6080.9,6123.26 +6123.26,6239.13,6123.17,6203.74 +6205.25,6264.74,6189.0,6220.01 +6220.01,6236.0,6200.0,6230.88 +6230.87,6296.0,6230.87,6267.38 +6267.38,6302.53,6222.51,6294.79 +6294.79,6383.0,6284.0,6339.99 +6339.99,6339.99,6308.0,6308.01 +6308.01,6345.0,6300.73,6344.86 +6344.86,6490.0,6344.86,6430.0 +6430.0,6472.5,6389.59,6406.36 +6406.36,6414.98,6328.14,6374.0 +6374.0,6374.01,6280.0,6317.71 +6317.7,6355.98,6306.13,6335.74 +6336.2,6400.0,6324.68,6382.68 +6382.68,6410.86,6337.0,6349.22 +6349.21,6434.5,6331.13,6409.99 +6409.99,6490.0,6409.99,6456.29 +6456.29,6636.0,6456.28,6569.92 +6569.93,6584.95,6534.1,6578.14 +6578.15,6589.0,6525.01,6526.0 +6526.0,6526.01,6303.7,6350.0 +6350.0,6380.0,6330.0,6342.14 +6342.15,6440.0,6332.57,6438.93 +6438.93,6438.98,6315.29,6340.0 +6340.01,6350.0,6235.0,6235.01 +6235.0,6320.0,6200.0,6293.12 +6292.59,6292.59,6244.63,6274.53 +6274.53,6316.08,6267.0,6316.06 +6316.06,6335.0,6265.0,6273.32 +6273.32,6320.27,6273.0,6302.01 +6302.01,6304.74,6280.0,6285.0 +6285.01,6313.06,6270.0,6313.06 +6313.06,6417.0,6313.05,6387.0 +6387.01,6422.99,6380.05,6387.0 +6387.01,6421.42,6371.8,6396.02 +6396.01,6475.01,6387.3,6437.06 +6437.06,6451.4,6418.2,6451.4 +6451.39,6475.0,6283.0,6300.02 +6300.92,6351.53,6300.92,6325.61 +6325.6,6375.24,6303.0,6360.01 +6362.29,6433.0,6362.29,6422.0 +6421.99,6422.0,6380.0,6389.6 +6389.59,6464.0,6386.68,6413.19 +6413.2,6438.1,6386.5,6413.03 +6413.11,6420.0,6395.0,6401.0 +6401.01,6407.99,6232.3,6245.81 +6245.81,6298.0,6244.39,6280.0 +6280.01,6299.0,6268.03,6276.05 +6278.08,6317.58,6265.0,6293.83 +6293.83,6350.0,6293.83,6350.0 +6349.99,6366.01,6335.41,6343.0 +6343.0,6438.24,6342.99,6407.16 +6407.17,6435.0,6401.0,6417.0 +6416.99,6528.22,6414.97,6494.01 +6494.0,6494.0,6426.1,6426.11 +6426.11,6510.39,6426.1,6500.0 +6500.0,6520.0,6455.02,6477.0 +6477.0,6490.79,6448.0,6472.0 +6472.0,6508.86,6461.04,6486.11 +6486.11,6559.75,6408.16,6438.81 +6438.53,6483.3,6438.0,6460.69 +6460.69,6490.0,6444.5,6485.05 +6485.05,6525.11,6457.0,6473.71 +6473.02,6496.58,6436.22,6470.0 +6470.0,6510.0,6469.99,6488.01 +6488.01,6539.39,6460.0,6526.41 +6526.17,6550.0,6480.89,6495.98 +6495.98,6517.25,6471.0,6501.77 +6501.77,6513.0,6484.52,6489.99 +6489.98,6495.81,6443.89,6491.7 +6491.7,6539.06,6491.7,6521.32 +6521.31,6577.6,6502.97,6561.99 +6561.98,6586.5,6533.32,6563.71 +6563.7,6613.23,6563.7,6605.31 +6605.31,6605.31,6521.61,6553.0 +6553.0,6564.79,6479.22,6496.97 +6496.96,6552.07,6478.3,6543.83 +6543.83,6545.0,6530.0,6542.9 +6542.9,6542.9,6510.49,6525.0 +6525.0,6525.0,6482.49,6482.5 +6482.5,6505.88,6476.85,6489.99 +6490.0,6515.62,6489.99,6515.62 +6515.62,6523.16,6505.63,6519.08 +6519.08,6521.55,6510.03,6516.62 +6518.0,6528.24,6500.0,6510.9 +6510.91,6521.0,6348.0,6381.8 +6381.8,6399.51,6318.51,6368.99 +6368.99,6390.78,6325.0,6339.99 +6340.0,6370.0,6340.0,6357.98 +6357.98,6357.98,6312.0,6340.01 +6340.01,6355.0,6325.0,6353.01 +6353.01,6376.41,6350.08,6369.98 +6369.99,6372.5,6352.0,6366.87 +6366.87,6371.0,6336.0,6367.43 +6367.43,6423.98,6360.14,6406.95 +6406.95,6448.96,6388.23,6422.83 +6422.84,6425.0,6360.33,6365.0 +6365.0,6389.16,6350.88,6372.94 +6372.93,6385.0,6354.81,6360.0 +6360.0,6371.26,6356.0,6371.26 +6371.26,6371.26,6328.45,6350.0 +6350.0,6379.34,6345.67,6375.0 +6375.0,6393.08,6374.01,6374.01 +6374.02,6398.49,6366.14,6368.53 +6368.54,6368.64,6359.71,6365.0 +6365.01,6378.24,6365.0,6378.23 +6378.24,6392.15,6359.98,6364.75 +6364.74,6393.52,6364.74,6393.52 +6392.88,6449.16,6392.88,6418.16 +6418.16,6424.42,6404.61,6421.0 +6421.01,6465.0,6421.0,6462.46 +6462.46,6463.95,6410.0,6420.0 +6420.01,6420.01,6389.0,6402.59 +6402.59,6405.1,6360.0,6393.47 +6393.47,6397.59,6349.0,6362.03 +6362.03,6380.06,6350.0,6365.11 +6365.1,6396.54,6365.1,6373.72 +6373.71,6543.99,6373.71,6513.01 +6513.02,6547.34,6501.0,6501.0 +6501.01,6530.0,6487.0,6510.59 +6510.6,6513.98,6482.08,6501.74 +6501.74,6515.0,6492.92,6502.93 +6502.94,6515.7,6500.0,6510.97 +6510.98,6525.0,6495.0,6497.58 +6497.58,6499.0,6483.99,6485.88 +6485.89,6485.89,6452.61,6461.1 +6461.1,6478.45,6459.28,6475.27 +6475.27,6479.95,6429.01,6436.07 +6436.08,6462.26,6429.75,6462.25 +6462.25,6469.11,6400.0,6406.99 +6407.0,6421.09,6389.0,6402.63 +6402.63,6423.82,6390.01,6423.82 +6423.81,6462.0,6421.9,6461.03 +6461.02,6478.37,6414.02,6414.02 +6413.61,6453.6,6400.0,6450.01 +6450.0,6464.22,6426.99,6463.21 +6463.22,6469.81,6431.22,6435.0 +6435.01,6506.12,6417.57,6444.99 +6445.0,6482.3,6442.85,6459.75 +6459.76,6479.99,6459.75,6466.93 +6466.92,6480.0,6443.86,6454.99 +6454.99,6467.0,6431.38,6444.94 +6444.94,6445.0,6415.0,6418.68 +6417.35,6417.35,6227.71,6257.0 +6257.0,6290.0,6249.12,6267.84 +6267.84,6319.91,6265.68,6314.57 +6314.56,6345.56,6300.0,6316.25 +6316.26,6317.06,6290.0,6300.0 +6299.99,6315.0,6299.99,6309.8 +6309.79,6309.81,6288.46,6300.55 +6300.55,6328.74,6300.54,6325.78 +6325.77,6397.5,6325.77,6380.11 +6380.11,6475.0,6380.11,6467.16 +6467.15,6480.0,6445.62,6460.94 +6460.95,6460.95,6419.52,6419.52 +6419.52,6450.0,6413.39,6445.56 +6445.56,6445.56,6421.94,6427.49 +6427.5,6444.0,6416.0,6423.56 +6423.56,6428.6,6385.01,6406.0 +6405.99,6427.69,6385.0,6416.29 +6416.29,6420.0,6400.0,6408.12 +6408.11,6459.0,6369.18,6431.5 +6431.5,6436.71,6402.97,6411.0 +6411.0,6448.0,6410.99,6443.99 +6443.57,6460.0,6421.69,6425.01 +6425.0,6452.8,6411.0,6451.58 +6451.57,6490.0,6445.54,6473.58 +6473.58,6483.6,6451.0,6483.6 +6483.6,6485.3,6464.0,6475.9 +6475.9,6849.0,6441.0,6843.56 +6843.57,6890.65,6721.0,6721.01 +6721.01,6752.66,6680.0,6710.72 +6710.72,6757.0,6699.0,6755.31 +6755.3,6755.3,6713.57,6717.0 +6717.01,6725.0,6670.1,6689.88 +6689.88,6692.0,6667.0,6686.24 +6686.25,6686.25,6635.1,6643.81 +6643.81,6685.26,6639.8,6672.99 +6672.99,6694.18,6665.65,6673.98 +6673.99,6677.47,6652.09,6652.1 +6652.1,6670.37,6630.35,6662.54 +6662.54,6684.36,6654.76,6654.77 +6654.77,6672.0,6652.02,6656.77 +6656.76,6660.0,6640.0,6640.76 +6640.77,6659.46,6384.76,6410.01 +6410.0,6450.0,6385.62,6432.0 +6432.0,6445.0,6425.0,6425.23 +6425.23,6440.0,6407.31,6420.87 +6420.87,6433.49,6327.01,6327.01 +6327.02,6349.62,6296.16,6312.29 +6312.28,6371.77,6288.13,6295.16 +6295.16,6473.29,6250.0,6380.01 +6380.01,6398.0,6327.24,6354.99 +6355.0,6434.94,6354.99,6418.69 +6418.69,6427.38,6404.0,6419.89 +6419.88,6430.71,6417.58,6417.59 +6417.59,6417.59,6381.07,6404.54 +6402.82,6410.04,6386.63,6407.3 +6407.3,6448.08,6392.42,6434.81 +6434.82,6436.92,6414.74,6429.99 +6429.99,6440.0,6417.4,6437.66 +6437.67,6440.0,6424.99,6434.73 +6434.73,6434.74,6395.92,6408.96 +6410.18,6425.38,6406.51,6419.88 +6419.88,6423.44,6393.0,6400.0 +6399.99,6437.0,6399.99,6430.0 +6430.0,6489.99,6412.0,6459.5 +6459.49,6470.6,6434.99,6439.99 +6439.98,6460.0,6434.88,6448.0 +6448.0,6481.0,6447.99,6460.52 +6460.52,6473.92,6452.23,6454.79 +6454.78,6464.0,6435.4,6450.01 +6450.01,6450.01,6363.01,6410.75 +6410.75,6463.05,6410.74,6460.05 +6460.04,6503.6,6460.04,6503.52 +6503.52,6568.37,6493.44,6495.0 +6495.01,6535.99,6495.0,6534.2 +6534.2,6534.21,6471.7,6488.69 +6488.69,6504.0,6483.1,6503.99 +6504.0,6516.01,6499.04,6505.0 +6504.99,6512.0,6488.7,6500.0 +6500.0,6503.0,6480.92,6501.0 +6501.01,6519.0,6501.0,6502.92 +6502.92,6518.0,6502.91,6518.0 +6518.0,6544.0,6515.64,6519.55 +6519.54,6529.76,6507.89,6515.5 +6515.5,6530.08,6515.49,6530.0 +6530.0,6545.23,6528.69,6535.35 +6535.34,6564.0,6525.0,6525.0 +6525.01,6558.17,6515.0,6543.04 +6543.04,6543.04,6525.0,6540.0 +6539.99,6545.0,6451.55,6517.1 +6517.09,6517.1,6488.24,6510.0 +6510.0,6628.94,6509.99,6584.02 +6584.02,6605.0,6565.6,6580.41 +6580.99,6639.01,6580.53,6616.03 +6616.03,6634.52,6595.0,6623.61 +6623.61,6629.46,6600.0,6615.99 +6616.0,6700.0,6615.0,6675.0 +6674.99,6718.89,6669.0,6669.0 +6669.01,6719.0,6669.0,6700.3 +6700.29,6764.06,6693.9,6716.55 +6716.54,6769.4,6701.02,6764.49 +6764.49,6790.0,6750.0,6762.01 +6762.01,6778.43,6706.5,6709.0 +6709.01,6747.0,6700.0,6743.73 +6743.74,6743.74,6712.0,6712.01 +6712.01,6723.1,6668.31,6679.12 +6679.12,6700.0,6668.0,6689.31 +6689.32,6720.0,6682.23,6720.0 +6719.99,6725.99,6693.0,6693.01 +6693.0,6720.38,6693.0,6710.99 +6711.0,6714.23,6692.07,6709.99 +6709.99,6720.5,6678.0,6691.26 +6691.26,6700.76,6677.77,6699.2 +6699.2,6735.55,6690.0,6730.01 +6730.0,6748.48,6705.0,6714.14 +6714.13,6720.0,6702.09,6709.03 +6709.02,6734.95,6707.0,6726.18 +6726.19,6727.24,6700.0,6712.24 +6712.24,6716.22,6707.0,6713.0 +6713.0,6725.0,6708.0,6708.01 +6708.01,6717.61,6695.56,6707.04 +6707.04,6731.75,6701.25,6724.52 +6723.84,6770.0,6712.14,6729.84 +6729.84,6773.0,6729.83,6745.67 +6745.73,6745.73,6727.53,6732.11 +6732.11,6732.12,6611.0,6612.69 +6612.69,6645.0,6593.56,6637.01 +6637.01,6637.01,6609.99,6628.17 +6628.18,6628.18,6574.27,6584.99 +6584.99,6608.0,6584.98,6604.7 +6604.71,6638.98,6604.7,6638.97 +6638.98,6652.09,6625.03,6625.03 +6625.04,6667.87,6625.03,6667.86 +6667.87,6670.0,6646.05,6669.99 +6669.99,6713.24,6669.99,6703.67 +6703.67,6710.73,6670.0,6692.23 +6692.23,6726.19,6692.22,6725.0 +6724.99,6726.19,6681.05,6687.33 +6687.32,6698.88,6676.28,6685.09 +6685.09,6705.23,6643.0,6646.79 +6646.79,6673.57,6630.0,6650.01 +6650.01,6695.07,6644.56,6695.0 +6695.01,6699.0,6674.1,6699.0 +6699.0,6699.0,6666.0,6693.89 +6693.89,6701.0,6680.01,6680.02 +6680.01,6684.0,6667.78,6684.0 +6683.99,6720.51,6679.9,6693.38 +6693.38,6705.53,6683.43,6703.68 +6703.69,6703.69,6665.19,6680.0 +6680.0,6683.31,6654.13,6656.76 +6656.77,6678.0,6656.76,6672.23 +6672.24,6711.94,6670.0,6699.01 +6699.01,6729.71,6697.3,6705.0 +6705.0,6720.0,6704.99,6714.13 +6714.13,6718.12,6700.0,6706.59 +6706.59,6706.59,6687.75,6692.5 +6692.5,6709.96,6687.75,6699.45 +6699.45,6719.0,6694.99,6719.0 +6718.99,6719.0,6695.97,6710.0 +6709.99,6764.85,6682.88,6697.32 +6697.33,6720.0,6686.0,6719.99 +6720.0,6750.11,6708.0,6730.0 +6729.98,6748.0,6725.0,6734.0 +6734.0,6744.97,6725.31,6738.79 +6738.8,6742.0,6727.13,6734.5 +6734.49,6734.5,6722.5,6730.09 +6730.09,6744.29,6729.13,6735.01 +6735.01,6735.01,6711.01,6711.02 +6711.02,6729.0,6711.01,6725.31 +6724.24,6758.75,6724.24,6745.85 +6745.84,6947.6,6740.0,6895.99 +6896.0,6947.0,6871.0,6937.62 +6937.62,6941.5,6896.37,6912.99 +6912.99,6912.99,6864.96,6885.0 +6884.99,6892.62,6880.44,6889.5 +6889.49,6898.08,6887.06,6898.07 +6898.08,6905.0,6898.07,6901.69 +6901.69,6923.97,6900.87,6909.99 +6910.0,6931.12,6909.99,6920.06 +6920.07,6923.8,6903.96,6914.02 +6914.03,6920.28,6913.0,6919.99 +6920.0,6940.98,6904.99,6940.92 +6940.92,7050.0,6940.91,7004.99 +7005.0,7040.0,7004.99,7036.9 +7036.9,7088.14,7036.89,7074.41 +7074.41,7084.1,7035.27,7042.14 +7044.68,7050.0,7030.0,7048.45 +7048.45,7048.69,6991.33,7021.0 +7020.99,7060.99,7012.0,7048.0 +7048.0,7078.0,7047.95,7060.0 +7060.01,7115.0,7060.0,7097.12 +7097.12,7128.0,7077.0,7084.99 +7084.99,7105.0,7064.57,7065.01 +7065.01,7079.0,7033.0,7075.0 +7074.99,7114.34,7060.0,7073.21 +7075.4,7086.43,7057.98,7082.82 +7082.83,7083.3,7044.0,7068.01 +7068.01,7068.02,7016.67,7029.25 +7029.25,7044.93,7010.83,7038.02 +7038.02,7060.0,7037.52,7041.13 +7041.13,7058.81,7032.15,7056.86 +7056.86,7065.5,7041.49,7052.21 +7052.22,7063.67,7046.43,7048.26 +7048.25,7080.0,7040.0,7076.09 +7076.09,7118.0,7062.64,7107.46 +7107.45,7119.0,7065.73,7067.91 +7067.9,7095.0,7060.0,7095.0 +7095.0,7103.62,7084.05,7091.0 +7091.0,7105.0,7088.02,7095.71 +7095.72,7095.72,7061.79,7065.01 +7065.01,7067.0,6907.42,6949.01 +6949.01,7020.0,6944.6,7020.0 +7019.99,7024.4,7000.0,7017.59 +7017.58,7017.59,6987.98,7012.58 +7012.58,7019.21,6985.64,7006.99 +7008.39,7044.0,7000.03,7036.93 +7036.92,7069.0,7032.84,7057.78 +7057.78,7059.71,7043.0,7049.7 +7049.7,7049.7,7023.5,7037.96 +7037.96,7048.66,7027.65,7047.39 +7047.39,7047.39,7030.5,7037.55 +7037.56,7037.56,6960.8,6992.5 +6992.49,7020.06,6992.49,7020.06 +7020.06,7021.59,6990.12,7000.08 +7000.09,7009.18,6933.11,6971.4 +6971.38,6992.54,6968.25,6992.54 +6992.54,6992.54,6964.28,6965.53 +6965.53,6983.79,6933.11,6942.3 +6942.31,6945.0,6879.0,6929.79 +6929.8,6929.8,6891.47,6925.0 +6925.0,6925.0,6850.0,6884.99 +6884.98,6894.0,6812.02,6824.98 +6824.98,6850.0,6822.38,6833.76 +6833.77,6884.51,6833.0,6859.82 +6859.81,6885.0,6853.01,6867.99 +6867.99,6868.0,6835.82,6863.97 +6863.96,6870.5,6852.01,6852.01 +6852.01,6861.75,6790.0,6830.0 +6830.0,6833.25,6796.46,6808.76 +6808.76,6942.0,6808.75,6927.21 +6927.21,6966.0,6914.38,6947.01 +6947.01,6953.35,6923.02,6930.01 +6930.01,6990.02,6929.99,6972.94 +6972.95,6985.0,6943.0,6950.0 +6950.0,6963.01,6929.24,6943.42 +6943.42,6964.27,6929.39,6958.21 +6958.21,6969.8,6945.9,6969.8 +6969.8,7019.76,6954.99,7011.02 +7011.02,7016.25,6982.44,6989.25 +6989.26,7002.15,6971.75,6995.19 +6995.19,6995.19,6955.4,6962.49 +6962.48,6975.78,6931.56,6950.0 +6950.0,6955.0,6934.34,6951.6 +6951.6,6960.0,6932.46,6956.55 +6956.55,6979.95,6953.52,6963.31 +6963.3,6963.31,6884.49,6909.01 +6909.02,6936.8,6905.46,6933.82 +6933.82,6970.83,6903.83,6970.0 +6970.0,6994.62,6953.0,6953.0 +6953.01,6995.0,6953.0,6980.0 +6979.99,7064.48,6979.99,7056.0 +7056.0,7090.46,7030.0,7033.55 +7033.56,7047.88,7029.99,7047.88 +7047.87,7051.52,7024.58,7027.94 +7027.93,7046.91,7008.5,7019.99 +7020.0,7035.0,7012.0,7035.0 +7035.0,7045.36,7002.99,7033.98 +7033.97,7042.0,7032.0,7041.99 +7042.0,7054.24,7029.0,7040.0 +7039.99,7053.36,7039.99,7043.0 +7043.0,7065.5,7042.99,7061.99 +7061.99,7062.0,7044.1,7049.98 +7049.98,7049.98,7026.0,7044.01 +7044.01,7050.0,7040.0,7049.99 +7049.99,7058.85,7046.57,7047.12 +7047.12,7056.61,7047.11,7051.11 +7051.12,7069.99,7047.69,7060.0 +7060.0,7090.0,7059.5,7090.0 +7089.99,7092.01,7045.0,7045.0 +7045.01,7048.96,7033.0,7048.96 +7048.95,7060.0,7040.0,7059.99 +7059.99,7200.0,7041.0,7155.52 +7155.52,7200.03,7155.51,7179.15 +7179.16,7215.5,7177.34,7177.34 +7177.35,7199.01,7174.16,7195.01 +7195.01,7199.0,7180.23,7199.0 +7199.0,7275.0,7198.99,7222.51 +7222.52,7230.0,7183.89,7195.97 +7195.97,7210.0,7174.16,7189.99 +7190.0,7207.69,7180.01,7193.01 +7193.01,7200.0,7188.0,7191.06 +7191.06,7191.06,7130.0,7155.0 +7155.01,7164.0,7130.35,7137.44 +7137.45,7164.33,7137.4,7160.0 +7160.01,7208.21,7154.88,7200.65 +7200.65,7224.99,7200.64,7215.96 +7215.96,7233.22,7205.0,7231.73 +7231.73,7231.73,7206.15,7219.91 +7219.9,7246.19,7212.78,7244.99 +7245.0,7284.1,7245.0,7263.85 +7263.46,7328.36,7240.01,7293.57 +7293.56,7293.57,7260.0,7275.0 +7275.0,7275.0,7221.0,7247.56 +7247.56,7250.0,7227.07,7233.27 +7233.28,7237.01,7180.6,7204.68 +7204.67,7230.0,7204.67,7230.0 +7230.0,7244.0,7212.0,7212.32 +7212.32,7276.46,7200.89,7273.06 +7273.07,7303.33,7270.0,7294.64 +7294.64,7313.0,7270.45,7309.99 +7309.99,7323.0,7271.3,7290.01 +7290.0,7290.01,7260.0,7283.99 +7283.97,7298.65,7270.0,7275.08 +7275.08,7293.28,7270.0,7285.01 +7285.01,7328.99,7268.31,7309.89 +7309.89,7324.64,7274.24,7278.3 +7277.07,7278.38,7235.0,7266.55 +7266.54,7277.83,7245.91,7265.0 +7265.0,7285.0,7251.0,7252.0 +7252.01,7252.01,7192.99,7205.0 +7205.0,7223.02,7204.99,7218.58 +7218.58,7259.46,7208.0,7236.29 +7236.29,7260.29,7225.36,7252.82 +7252.81,7256.79,7227.0,7227.0 +7227.0,7229.1,7206.11,7210.01 +7210.01,7235.98,7210.0,7232.76 +7232.77,7235.72,7219.0,7233.21 +7232.57,7267.33,7231.0,7261.56 +7261.57,7291.0,7261.57,7282.62 +7282.63,7282.63,7257.94,7274.0 +7274.01,7283.89,7266.73,7268.9 +7268.89,7272.48,7249.03,7260.0 +7259.99,7284.99,7259.0,7266.85 +7266.85,7275.02,7263.03,7268.74 +7268.74,7322.0,7266.72,7290.01 +7290.01,7302.0,7271.46,7290.94 +7290.94,7339.52,7286.56,7317.15 +7317.15,7317.15,7245.0,7253.49 +7253.48,7269.69,7245.0,7251.02 +7251.02,7270.69,7250.0,7267.19 +7267.19,7285.0,7265.29,7282.49 +7282.5,7284.01,7267.0,7267.91 +7267.91,7273.78,7258.31,7264.36 +7264.36,7264.36,7229.94,7254.99 +7255.0,7264.58,7254.99,7263.57 +7263.57,7285.0,7263.56,7278.46 +7278.46,7311.0,7270.68,7289.87 +7289.86,7304.99,7276.97,7281.12 +7281.13,7289.99,7272.29,7289.99 +7290.0,7310.04,7288.53,7310.03 +7310.04,7387.0,7304.14,7359.98 +7359.99,7380.47,7351.02,7359.99 +7359.99,7372.92,7330.79,7371.43 +7371.42,7387.42,7350.64,7350.68 +7350.68,7373.03,7350.5,7365.96 +7365.96,7384.0,7350.0,7384.0 +7383.99,7384.0,7370.0,7373.88 +7373.89,7402.5,7334.0,7339.83 +7339.83,7360.18,7333.0,7349.96 +7349.95,7360.0,7343.5,7354.99 +7355.0,7373.02,7353.33,7356.99 +7357.0,7357.0,7345.57,7349.4 +7349.4,7367.14,7345.99,7367.13 +7367.13,7378.0,7360.0,7375.01 +7375.01,7384.0,7365.01,7380.01 +7380.01,7381.67,7372.0,7373.0 +7373.01,7373.01,7366.39,7367.99 +7368.0,7370.0,7350.01,7358.07 +7358.07,7370.0,7358.06,7369.01 +7369.01,7371.0,7358.06,7371.0 +7371.0,7371.0,7358.0,7364.99 +7365.0,7380.0,7364.99,7371.57 +7371.57,7371.59,7091.8,7103.56 +7104.38,7162.21,6903.05,6998.0 +6997.99,7029.0,6934.54,6993.99 +6994.0,7025.0,6971.63,6979.0 +6979.0,7043.93,6978.99,7013.87 +7013.86,7027.0,6985.17,6997.0 +6997.01,7002.67,6931.01,6990.0 +6990.0,6990.0,6837.66,6890.01 +6890.01,6930.0,6875.0,6925.0 +6925.0,6927.8,6900.0,6919.36 +6919.37,6927.15,6882.63,6916.54 +6916.54,6948.58,6912.25,6936.45 +6936.45,6985.0,6914.14,6916.25 +6916.24,6920.0,6860.06,6910.0 +6909.99,6911.0,6664.07,6690.04 +6690.04,6690.04,6272.73,6386.0 +6386.0,6456.84,6385.99,6450.0 +6450.0,6490.13,6425.65,6432.56 +6431.31,6432.55,6391.0,6418.21 +6418.21,6448.97,6412.45,6424.74 +6424.73,6429.99,6338.0,6390.0 +6390.0,6425.0,6365.89,6389.52 +6389.52,6425.0,6381.19,6395.0 +6395.0,6432.0,6394.47,6412.98 +6411.86,6423.39,6286.5,6392.26 +6392.25,6393.4,6348.58,6374.28 +6374.29,6416.32,6370.09,6391.54 +6391.01,6409.75,6376.18,6389.8 +6389.8,6497.96,6389.79,6474.99 +6474.99,6475.0,6422.5,6435.0 +6435.01,6435.01,6391.01,6404.89 +6404.89,6433.99,6390.0,6410.04 +6410.05,6433.45,6329.41,6428.01 +6428.01,6435.0,6406.58,6420.0 +6420.0,6460.0,6419.99,6442.99 +6443.0,6455.0,6421.12,6455.0 +6454.99,6455.0,6425.0,6435.0 +6435.01,6476.57,6429.22,6476.57 +6476.57,6525.0,6467.84,6473.91 +6473.91,6493.0,6459.15,6492.99 +6492.99,6526.67,6488.88,6526.32 +6526.31,6529.0,6478.5,6500.0 +6500.0,6507.93,6475.0,6478.6 +6478.6,6494.94,6475.0,6492.0 +6492.0,6530.0,6492.0,6525.0 +6525.0,6525.0,6467.5,6477.98 +6477.99,6485.01,6472.07,6474.92 +6474.45,6474.46,6440.0,6452.99 +6453.0,6461.75,6434.09,6440.9 +6440.01,6440.01,6325.0,6363.69 +6363.7,6392.39,6358.75,6384.73 +6384.73,6446.57,6384.73,6435.26 +6435.25,6443.78,6422.41,6426.01 +6426.01,6478.91,6407.7,6434.78 +6434.79,6435.35,6360.0,6429.66 +6429.99,6484.99,6421.0,6426.01 +6426.01,6434.92,6386.0,6407.52 +6407.52,6429.0,6397.94,6420.0 +6419.99,6429.25,6405.0,6424.0 +6424.0,6442.58,6415.0,6439.05 +6438.0,6442.03,6414.45,6414.46 +6414.45,6425.0,6382.19,6410.0 +6410.0,6419.9,6392.03,6418.43 +6418.43,6441.11,6402.54,6435.0 +6435.0,6441.0,6422.31,6424.0 +6424.0,6444.65,6423.99,6436.11 +6436.11,6438.65,6410.69,6419.99 +6419.99,6423.63,6405.69,6421.58 +6421.58,6435.0,6416.31,6435.0 +6435.0,6448.0,6430.0,6441.39 +6441.4,6441.82,6437.44,6441.2 +6441.2,6460.0,6441.19,6450.01 +6450.01,6457.18,6439.07,6445.84 +6445.85,6450.0,6444.13,6449.99 +6450.0,6450.0,6414.54,6414.55 +6414.54,6420.0,6365.1,6397.84 +6397.79,6423.29,6393.09,6406.97 +6406.96,6413.94,6390.0,6392.84 +6392.85,6430.0,6392.85,6418.45 +6418.46,6423.52,6376.0,6390.22 +6390.22,6400.0,6150.0,6188.01 +6188.01,6209.99,6137.67,6194.78 +6194.78,6200.0,6161.0,6177.5 +6177.5,6183.0,6116.0,6170.47 +6172.32,6185.0,6156.17,6183.83 +6183.84,6200.0,6165.71,6180.74 +6181.22,6196.99,6172.0,6179.35 +6179.35,6185.0,6166.89,6181.0 +6180.99,6200.0,6180.99,6192.03 +6192.03,6194.97,6159.0,6167.5 +6167.49,6180.0,6147.0,6179.99 +6180.0,6195.48,6169.67,6174.99 +6174.99,6184.86,6172.13,6184.85 +6184.86,6193.28,6184.86,6185.71 +6185.72,6193.78,6172.01,6193.78 +6193.78,6196.0,6184.98,6192.78 +6192.78,6450.0,6192.63,6389.99 +6390.0,6398.0,6361.0,6367.51 +6367.5,6379.28,6364.73,6378.0 +6378.0,6396.0,6377.01,6390.76 +6390.76,6431.79,6390.0,6396.0 +6396.0,6414.0,6380.0,6384.01 +6384.0,6384.01,6367.28,6378.28 +6378.15,6381.01,6368.0,6380.64 +6379.72,6381.01,6368.0,6378.51 +6379.43,6392.76,6376.02,6377.96 +6377.96,6389.75,6374.7,6389.16 +6389.15,6395.88,6383.0,6388.0 +6388.0,6390.0,6252.02,6266.26 +6266.26,6298.65,6212.0,6255.0 +6255.0,6278.81,6230.68,6256.38 +6256.38,6257.77,6235.0,6254.5 +6254.5,6375.13,6254.49,6327.87 +6327.88,6330.0,6307.47,6311.78 +6311.78,6311.78,6290.78,6301.83 +6301.32,6304.56,6277.09,6295.05 +6295.05,6297.11,6278.97,6285.33 +6285.32,6313.15,6285.32,6309.38 +6309.39,6321.5,6302.14,6307.2 +6307.2,6311.58,6238.86,6266.31 +6266.32,6292.11,6260.08,6287.05 +6287.05,6299.21,6247.16,6283.73 +6283.74,6306.0,6272.99,6290.62 +6290.62,6304.0,6282.9,6291.0 +6289.51,6306.0,6272.17,6297.99 +6298.0,6341.21,6290.0,6295.76 +6295.76,6298.2,6276.59,6276.6 +6276.59,6292.13,6221.49,6253.69 +6250.86,6272.45,6240.01,6255.69 +6255.68,6290.0,6250.0,6280.01 +6280.01,6295.0,6275.01,6281.5 +6281.5,6299.99,6269.14,6297.81 +6297.81,6299.99,6287.28,6287.29 +6287.29,6288.52,6267.4,6288.52 +6288.52,6340.0,6288.51,6298.06 +6299.72,6319.17,6286.33,6314.48 +6314.49,6405.0,6310.61,6354.78 +6354.78,6364.01,6340.86,6358.0 +6358.01,6369.4,6342.98,6349.45 +6349.45,6349.45,6312.0,6324.42 +6324.42,6330.17,6313.14,6323.13 +6323.13,6338.47,6323.12,6328.01 +6328.0,6328.01,6296.0,6296.0 +6296.01,6324.32,6296.0,6324.32 +6324.31,6334.7,6315.39,6325.65 +6325.64,6329.0,6306.18,6317.33 +6317.32,6320.08,6242.79,6276.94 +6276.94,6280.0,6257.81,6270.06 +6270.06,6292.25,6270.06,6283.01 +6283.01,6285.0,6176.76,6215.71 +6215.71,6262.68,6215.7,6260.58 +6260.58,6260.68,6239.0,6239.01 +6239.0,6245.0,6228.13,6239.29 +6239.3,6243.5,6194.38,6239.02 +6239.01,6271.94,6230.0,6257.0 +6256.99,6260.0,6238.81,6244.14 +6244.14,6307.77,6236.01,6290.91 +6290.91,6305.0,6285.0,6289.0 +6288.99,6289.0,6267.87,6274.65 +6274.66,6287.0,6254.66,6260.01 +6260.0,6268.4,6252.69,6258.77 +6258.78,6259.0,6236.57,6240.21 +6241.53,6260.0,6223.74,6257.2 +6256.56,6277.91,6255.98,6266.0 +6266.0,6290.0,6260.39,6269.47 +6269.46,6269.47,6237.84,6237.84 +6237.21,6258.98,6229.53,6246.1 +6246.1,6246.1,6191.1,6242.18 +6242.18,6255.0,6233.0,6255.0 +6254.99,6255.0,6225.01,6229.35 +6229.35,6240.0,6211.95,6237.2 +6237.2,6274.87,6231.78,6250.0 +6250.0,6283.41,6248.77,6275.65 +6275.65,6278.45,6250.64,6271.13 +6271.13,6271.13,6249.01,6261.01 +6261.01,6274.39,6252.78,6261.01 +6260.07,6298.45,6258.63,6273.01 +6273.0,6340.94,6271.03,6316.82 +6316.28,6320.53,6289.0,6296.1 +6296.1,6306.81,6293.24,6300.0 +6299.99,6323.78,6295.0,6300.89 +6300.9,6335.66,6300.0,6326.69 +6326.69,6334.89,6319.85,6334.0 +6334.0,6434.0,6333.99,6400.0 +6400.01,6403.74,6383.1,6389.75 +6389.75,6400.0,6379.0,6400.0 +6399.99,6400.0,6377.9,6388.99 +6388.99,6405.78,6388.39,6395.0 +6395.0,6397.21,6369.11,6388.51 +6388.51,6388.51,6375.0,6386.0 +6386.0,6392.78,6380.0,6385.0 +6385.01,6422.9,6384.99,6406.34 +6406.34,6488.62,6406.33,6437.96 +6437.96,6457.36,6426.49,6427.32 +6427.31,6474.33,6425.0,6474.32 +6474.32,6478.61,6431.96,6450.0 +6450.01,6530.0,6450.0,6495.0 +6495.0,6517.0,6482.0,6482.01 +6482.01,6501.99,6471.0,6500.26 +6500.27,6523.84,6488.99,6519.9 +6519.9,6519.9,6485.0,6495.51 +6495.5,6505.0,6482.0,6483.57 +6483.57,6490.64,6429.68,6430.0 +6429.99,6467.69,6410.0,6462.99 +6462.99,6463.01,6441.93,6463.01 +6463.01,6504.32,6463.0,6504.32 +6504.32,6513.32,6477.93,6494.0 +6494.0,6496.98,6456.0,6464.12 +6464.11,6500.81,6464.11,6500.81 +6500.81,6564.25,6500.0,6554.31 +6554.32,6579.0,6547.0,6562.99 +6562.99,6562.99,6538.0,6550.0 +6550.0,6567.15,6544.9,6557.94 +6557.94,6560.0,6544.0,6559.99 +6560.0,6580.0,6504.79,6514.0 +6513.0,6549.85,6378.05,6444.13 +6444.12,6460.0,6415.67,6434.87 +6434.88,6459.58,6434.87,6448.01 +6448.01,6477.39,6447.91,6460.17 +6460.18,6475.0,6444.75,6467.0 +6467.0,6467.0,6426.71,6439.04 +6439.04,6461.33,6432.39,6461.32 +6461.33,6497.5,6460.2,6496.02 +6496.01,6516.41,6486.87,6486.87 +6486.88,6492.96,6465.01,6470.58 +6470.58,6484.91,6464.06,6477.69 +6477.69,6544.79,6477.68,6522.34 +6522.35,6539.02,6503.13,6535.01 +6535.01,6545.53,6500.0,6502.44 +6502.43,6535.0,6500.0,6520.93 +6520.94,6524.36,6468.0,6489.0 +6489.0,6500.0,6482.5,6493.0 +6493.0,6520.0,6492.99,6511.69 +6511.7,6516.99,6500.0,6506.51 +6506.51,6506.51,6480.22,6497.61 +6497.61,6513.67,6488.52,6508.83 +6508.83,6508.83,6482.4,6484.36 +6484.35,6488.16,6470.0,6485.37 +6485.37,6499.08,6485.36,6499.08 +6499.07,6528.0,6499.07,6520.29 +6520.3,6550.0,6512.99,6527.6 +6527.6,6527.6,6507.32,6507.33 +6507.33,6523.0,6499.9,6519.51 +6519.5,6549.0,6519.0,6540.22 +6540.22,6560.0,6533.87,6546.93 +6546.92,6565.0,6533.0,6533.01 +6533.01,6546.0,6522.0,6537.12 +6537.13,6556.5,6532.0,6537.54 +6537.54,6557.0,6532.0,6540.5 +6540.51,6545.17,6513.59,6520.31 +6520.31,6536.4,6512.66,6534.12 +6534.12,6534.12,6512.76,6533.38 +6533.38,6533.38,6479.36,6504.01 +6504.01,6532.56,6502.01,6528.34 +6528.33,6531.98,6515.08,6515.09 +6515.08,6516.34,6502.5,6508.0 +6508.0,6515.56,6490.0,6492.58 +6492.01,6500.0,6480.77,6497.96 +6497.97,6499.76,6323.68,6419.17 +6419.16,6471.0,6419.16,6462.0 +6461.99,6470.82,6445.43,6458.02 +6458.02,6465.35,6456.26,6456.27 +6456.27,6458.85,6443.56,6447.84 +6447.83,6500.0,6447.83,6479.3 +6479.3,6490.0,6478.57,6479.66 +6479.67,6515.0,6478.17,6496.12 +6496.11,6497.85,6496.11,6497.83 +6497.84,6505.0,6482.41,6505.0 +6505.0,6507.05,6470.36,6470.37 +6470.36,6479.99,6459.44,6473.01 +6473.01,6489.5,6465.79,6488.46 +6488.69,6490.0,6476.05,6486.72 +6486.72,6489.99,6411.44,6489.09 +6489.09,6489.09,6476.71,6485.06 +6485.06,6508.0,6484.69,6499.99 +6500.0,6509.0,6499.0,6499.3 +6499.3,6502.25,6490.0,6490.0 +6490.0,6494.87,6481.0,6491.99 +6492.0,6507.59,6488.5,6507.59 +6507.58,6529.75,6507.58,6524.39 +6524.39,6524.39,6510.28,6513.08 +6513.09,6519.99,6511.52,6518.01 +6518.01,6518.01,6503.38,6508.32 +6508.32,6511.38,6462.48,6473.34 +6473.35,6485.0,6459.54,6482.38 +6482.38,6485.0,6470.83,6479.2 +6479.21,6479.21,6463.0,6477.49 +6477.49,6477.5,6460.4,6473.22 +6473.22,6501.08,6412.84,6489.12 +6489.11,6498.04,6470.25,6474.89 +6474.9,6484.24,6440.0,6445.84 +6446.37,6462.0,6436.0,6439.05 +6439.05,6450.64,6385.0,6402.34 +6402.6,6404.81,6307.0,6317.45 +6317.44,6317.44,6224.88,6277.0 +6277.01,6285.0,6260.0,6268.44 +6268.44,6309.23,6255.84,6304.49 +6304.48,6314.03,6275.0,6296.2 +6296.19,6303.94,6244.93,6257.47 +6257.47,6262.94,6207.55,6243.19 +6243.2,6247.19,6236.22,6236.25 +6236.25,6264.23,6225.0,6256.36 +6256.36,6268.7,6241.07,6243.01 +6243.01,6255.0,6228.0,6249.01 +6249.0,6255.0,6235.63,6235.64 +6235.63,6250.07,6230.64,6242.71 +6242.71,6247.0,6233.37,6240.01 +6240.01,6260.52,6239.7,6260.51 +6260.51,6275.0,6260.01,6265.55 +6265.55,6275.0,6264.0,6270.0 +6269.99,6280.0,6265.58,6280.0 +6279.99,6280.0,6245.58,6246.57 +6246.62,6257.74,6236.72,6255.79 +6255.79,6258.73,6236.72,6236.73 +6236.72,6288.15,6236.72,6275.31 +6275.3,6334.74,6267.89,6334.08 +6334.08,6375.0,6334.07,6360.45 +6360.45,6384.04,6350.51,6374.71 +6374.72,6374.72,6340.71,6357.08 +6357.09,6360.0,6339.23,6339.97 +6339.98,6339.98,6307.32,6329.99 +6330.0,6336.39,6310.0,6323.47 +6323.47,6329.0,6290.11,6300.0 +6300.0,6329.0,6299.99,6321.07 +6321.05,6326.93,6310.0,6325.96 +6325.96,6358.63,6322.66,6347.17 +6347.17,6347.69,6320.0,6323.0 +6322.99,6332.18,6310.35,6331.7 +6331.7,6344.54,6326.14,6326.15 +6326.15,6352.0,6321.0,6349.48 +6349.49,6350.78,6325.01,6338.59 +6338.58,6341.86,6325.0,6332.33 +6332.33,6345.7,6332.0,6339.94 +6339.95,6350.0,6327.92,6332.38 +6332.38,6355.0,6318.5,6355.0 +6354.99,6355.0,6335.88,6335.89 +6335.88,6335.89,6290.44,6317.86 +6317.86,6330.0,6307.53,6313.2 +6313.19,6324.07,6258.0,6268.12 +6268.12,6298.8,6268.11,6286.6 +6286.59,6295.0,6279.57,6290.03 +6290.03,6342.32,6285.52,6324.96 +6324.96,6339.0,6324.96,6330.0 +6330.01,6331.2,6319.0,6321.32 +6321.31,6337.06,6316.49,6320.01 +6320.01,6320.01,6106.37,6147.34 +6147.34,6511.0,6130.01,6419.91 +6419.92,6459.0,6413.75,6436.09 +6436.08,6444.81,6372.21,6387.0 +6387.0,6394.9,6365.0,6378.6 +6378.6,6405.48,6374.47,6397.54 +6397.53,6417.54,6391.41,6415.01 +6415.01,6415.01,6397.0,6397.01 +6397.01,6397.01,6381.91,6386.73 +6386.73,6405.1,6381.91,6398.1 +6398.09,6403.0,6385.6,6390.81 +6390.8,6390.81,6381.01,6389.17 +6389.16,6402.82,6389.16,6399.46 +6399.46,6407.89,6394.69,6404.69 +6404.69,6404.7,6371.58,6387.99 +6388.0,6395.57,6378.15,6386.68 +6386.68,6425.0,6386.68,6421.87 +6421.87,6445.55,6403.35,6443.75 +6443.74,6443.75,6401.0,6401.0 +6401.0,6424.68,6399.01,6421.02 +6421.01,6421.02,6412.99,6415.0 +6415.01,6420.0,6400.0,6409.2 +6409.2,6419.99,6408.13,6419.61 +6419.61,6419.96,6388.0,6388.01 +6388.0,6407.61,6388.0,6404.99 +6405.0,6431.29,6402.36,6427.06 +6427.05,6434.0,6337.0,6362.65 +6362.65,6519.99,6362.64,6475.0 +6474.99,6530.0,6470.0,6507.99 +6507.95,6520.94,6486.71,6509.15 +6508.0,6530.0,6493.12,6495.01 +6495.01,6502.99,6492.5,6497.69 +6497.68,6575.0,6492.75,6536.01 +6536.0,6560.0,6535.41,6541.0 +6541.01,6547.61,6525.93,6536.0 +6536.01,6538.54,6516.6,6533.1 +6533.09,6552.87,6531.0,6541.21 +6541.2,6679.31,6541.2,6679.0 +6679.01,6737.65,6679.0,6704.97 +6704.98,6719.82,6676.64,6709.01 +6709.01,6717.85,6688.0,6713.82 +6713.83,6765.41,6705.31,6733.08 +6733.09,6739.0,6710.0,6724.01 +6724.01,6774.0,6699.98,6719.0 +6719.0,6746.92,6685.0,6716.93 +6716.74,6720.74,6671.21,6720.04 +6720.04,6725.0,6695.97,6706.69 +6707.12,6709.99,6690.01,6699.0 +6699.01,6750.0,6699.0,6750.0 +6750.0,6777.1,6739.47,6754.99 +6755.0,6773.41,6695.0,6724.49 +6724.5,6749.0,6708.06,6725.59 +6725.59,6750.0,6712.82,6730.0 +6730.01,6817.61,6728.0,6805.89 +6805.9,6823.0,6782.24,6792.3 +6792.3,6800.0,6745.24,6761.99 +6761.98,6765.0,6725.25,6725.53 +6725.54,6749.54,6713.72,6741.41 +6741.41,6754.49,6731.81,6742.55 +6742.54,6742.55,6726.59,6728.46 +6728.78,6730.53,6700.01,6716.01 +6716.01,6723.77,6708.36,6713.0 +6713.01,6713.01,6628.01,6665.99 +6666.0,6704.0,6664.48,6702.65 +6702.65,6708.14,6682.01,6687.99 +6687.99,6688.0,6655.08,6678.45 +6678.45,6698.0,6669.99,6680.0 +6679.99,6687.0,6663.01,6684.79 +6684.8,6684.8,6651.0,6656.0 +6656.0,6680.0,6651.0,6674.12 +6674.12,6680.5,6660.01,6672.0 +6672.01,6695.0,6664.25,6694.99 +6695.0,6745.97,6640.2,6721.01 +6721.0,6734.72,6710.0,6718.01 +6718.01,6719.99,6708.0,6712.58 +6712.59,6713.01,6673.91,6688.0 +6687.99,6704.78,6686.0,6694.41 +6694.41,6717.4,6685.54,6711.0 +6711.0,6711.0,6696.0,6696.01 +6696.01,6699.99,6679.95,6695.0 +6695.0,6699.99,6683.8,6695.0 +6695.0,6705.68,6693.46,6705.68 +6705.68,6725.0,6705.67,6715.0 +6715.01,6718.1,6705.0,6715.86 +6715.86,6715.86,6693.01,6711.06 +6711.14,6717.48,6704.01,6709.99 +6710.0,6727.0,6709.99,6727.0 +6727.0,6777.0,6727.0,6749.34 +6749.33,6753.0,6740.0,6749.01 +6749.01,6756.0,6731.01,6731.02 +6731.02,6741.92,6715.7,6721.94 +6721.94,6738.52,6718.0,6735.02 +6735.02,6738.0,6663.01,6695.77 +6695.77,6698.0,6664.45,6670.44 +6670.44,6699.05,6660.05,6693.31 +6693.3,6696.59,6670.01,6675.21 +6677.4,6697.0,6673.36,6686.8 +6686.79,6696.21,6676.9,6687.61 +6687.61,6692.03,6671.0,6673.04 +6673.04,6684.98,6670.7,6680.87 +6681.83,6712.0,6672.5,6697.67 +6697.67,6712.0,6690.0,6695.97 +6695.97,6696.99,6684.78,6693.0 +6692.99,6716.16,6692.0,6709.05 +6709.04,6710.0,6701.0,6705.41 +6705.41,6709.99,6701.0,6702.0 +6702.01,6702.01,6685.0,6696.2 +6696.2,6696.78,6675.0,6681.2 +6681.19,6684.85,6606.25,6642.68 +6642.51,6679.02,6639.0,6664.01 +6664.01,6664.01,6583.0,6615.0 +6615.13,6621.15,6565.22,6596.75 +6596.75,6615.0,6585.49,6598.27 +6598.27,6605.0,6571.04,6598.34 +6598.35,6632.0,6585.6,6613.0 +6613.0,6621.1,6600.08,6621.09 +6620.04,6620.24,6591.17,6608.45 +6608.45,6612.62,6593.41,6604.99 +6605.0,6612.83,6598.0,6611.99 +6611.99,6650.24,6611.98,6650.24 +6650.24,6655.0,6633.0,6633.01 +6633.0,6637.27,6612.03,6614.52 +6614.53,6631.33,6614.52,6622.55 +6622.54,6630.0,6605.0,6611.74 +6611.88,6613.6,6560.0,6572.43 +6572.42,6583.7,6555.99,6563.2 +6563.2,6563.2,6457.43,6466.99 +6466.99,6470.0,6388.88,6398.0 +6398.0,6428.72,6397.99,6427.0 +6426.99,6480.0,6426.99,6466.01 +6466.01,6474.98,6450.0,6455.9 +6455.9,6464.0,6455.0,6457.67 +6458.0,6464.27,6412.51,6424.99 +6425.0,6435.94,6366.68,6389.25 +6388.71,6414.69,6385.59,6414.69 +6415.42,6415.47,6388.78,6412.04 +6412.03,6412.03,6390.16,6401.55 +6401.55,6401.55,6369.0,6396.9 +6396.91,6442.55,6383.0,6427.57 +6427.57,6432.07,6389.41,6394.31 +6394.32,6427.5,6393.25,6419.99 +6420.0,6420.0,6356.56,6404.99 +6404.99,6415.0,6386.78,6394.99 +6394.99,6398.38,6361.16,6381.12 +6381.12,6385.0,6320.5,6353.19 +6353.18,6375.0,6350.0,6370.0 +6370.0,6413.4,6369.76,6387.36 +6387.35,6397.49,6360.11,6375.05 +6375.06,6408.0,6375.06,6390.02 +6390.02,6439.86,6390.0,6423.0 +6421.74,6424.26,6397.11,6402.0 +6401.34,6405.0,6382.0,6397.21 +6397.21,6403.19,6390.0,6392.9 +6392.9,6401.99,6380.62,6381.92 +6381.92,6399.57,6381.9,6398.99 +6399.0,6449.0,6398.99,6444.99 +6444.99,6445.0,6421.9,6441.46 +6441.46,6458.24,6439.8,6448.45 +6448.46,6448.46,6430.88,6447.42 +6447.42,6462.55,6427.48,6459.09 +6459.99,6490.0,6450.0,6489.99 +6490.0,6525.31,6488.75,6506.58 +6506.57,6526.09,6489.93,6493.96 +6493.95,6508.0,6461.0,6486.1 +6486.1,6523.5,6483.83,6511.01 +6511.0,6537.26,6498.09,6530.84 +6530.84,6530.84,6515.0,6520.18 +6520.8,6529.99,6515.01,6519.96 +6519.93,6530.0,6490.0,6497.33 +6497.35,6503.47,6485.0,6488.01 +6488.0,6497.0,6485.21,6495.76 +6495.77,6499.0,6454.55,6460.0 +6460.01,6465.0,6425.0,6462.08 +6462.09,6478.0,6453.71,6465.03 +6465.03,6500.0,6465.02,6497.32 +6498.0,6510.0,6480.0,6486.81 +6485.72,6493.79,6473.63,6490.99 +6491.0,6497.62,6480.01,6494.31 +6494.31,6494.32,6468.63,6475.0 +6474.99,6477.49,6455.0,6457.11 +6457.1,6465.0,6442.0,6465.0 +6465.0,6468.28,6432.67,6441.02 +6441.02,6464.32,6430.0,6459.54 +6460.58,6468.51,6450.0,6463.44 +6463.43,6468.91,6457.0,6457.79 +6457.79,6487.0,6457.72,6475.13 +6475.13,6519.0,6475.12,6507.69 +6507.69,6515.0,6490.0,6490.0 +6490.0,6512.29,6485.89,6503.03 +6503.03,6506.24,6476.14,6494.6 +6494.6,6504.7,6489.07,6498.0 +6498.0,6504.37,6487.21,6500.0 +6500.0,6514.0,6499.99,6514.0 +6514.0,6734.79,6501.3,6690.0 +6690.0,6715.0,6684.0,6700.0 +6700.0,6718.66,6693.76,6715.0 +6715.0,6715.0,6667.36,6675.0 +6674.99,6700.0,6667.52,6695.0 +6695.0,6704.0,6694.8,6696.11 +6696.11,6724.42,6690.0,6712.0 +6712.0,6712.01,6687.6,6690.0 +6690.0,6696.75,6681.0,6691.01 +6691.01,6710.0,6679.34,6700.01 +6700.01,6719.21,6693.0,6719.21 +6719.22,6767.52,6714.41,6750.0 +6750.01,6786.73,6735.78,6735.79 +6735.79,6744.99,6698.51,6707.76 +6707.76,6707.76,6570.36,6620.15 +6620.15,6653.93,6620.15,6645.73 +6645.73,6655.0,6630.0,6649.64 +6649.65,6649.65,6565.01,6572.67 +6572.67,6645.34,6572.66,6629.99 +6629.99,6671.92,6621.3,6630.01 +6630.0,6669.48,6627.76,6647.4 +6647.4,6650.0,6630.0,6649.73 +6649.74,6661.98,6637.1,6637.11 +6637.11,6648.49,6629.85,6633.1 +6633.1,6690.27,6530.01,6660.01 +6660.01,6664.9,6615.83,6638.81 +6638.81,6644.99,6615.64,6628.62 +6628.63,6641.66,6617.0,6624.02 +6624.02,6634.0,6600.01,6600.02 +6600.01,6609.98,6584.17,6601.02 +6601.02,6601.02,6452.02,6488.85 +6488.86,6520.0,6480.85,6492.94 +6492.94,6504.78,6470.01,6472.3 +6474.47,6496.63,6474.47,6481.04 +6481.04,6495.0,6481.03,6488.8 +6488.79,6497.5,6460.79,6496.76 +6496.75,6525.0,6493.14,6523.67 +6523.66,6541.91,6510.9,6541.91 +6541.9,6558.62,6517.1,6541.07 +6541.06,6547.87,6527.0,6541.35 +6541.34,6594.44,6541.34,6581.62 +6580.01,6580.01,6560.0,6570.37 +6570.38,6572.38,6541.0,6546.99 +6547.0,6557.98,6515.28,6557.98 +6557.98,6585.0,6552.57,6564.16 +6564.16,6569.47,6537.51,6556.73 +6556.73,6576.0,6545.45,6570.5 +6570.5,6576.0,6560.2,6566.42 +6565.94,6576.0,6563.12,6569.01 +6569.0,6590.0,6568.4,6569.99 +6570.0,6576.32,6568.0,6572.97 +6572.96,6595.43,6572.96,6595.43 +6595.43,6608.19,6555.0,6557.08 +6557.09,6563.42,6545.81,6558.99 +6559.0,6587.0,6558.99,6581.0 +6580.99,6581.0,6552.71,6560.74 +6560.73,6569.43,6556.38,6556.39 +6556.07,6557.88,6545.0,6545.01 +6545.0,6555.0,6543.21,6554.0 +6554.0,6575.0,6553.99,6566.42 +6566.42,6570.51,6552.66,6569.52 +6569.51,6579.09,6561.75,6579.08 +6579.08,6579.09,6560.53,6570.7 +6570.48,6642.28,6567.98,6636.2 +6636.2,6636.21,6603.88,6616.4 +6616.4,6616.41,6601.96,6609.55 +6609.56,6622.99,6609.12,6612.01 +6612.01,6640.26,6611.0,6624.0 +6624.0,6626.0,6580.0,6587.0 +6586.99,6609.4,6586.99,6603.76 +6603.76,6607.12,6589.98,6605.0 +6604.99,6609.91,6596.16,6597.63 +6597.62,6604.0,6550.0,6553.94 +6553.94,6573.98,6523.0,6566.22 +6566.22,6570.33,6549.0,6562.71 +6562.7,6621.0,6557.0,6605.13 +6605.12,6620.0,6594.81,6620.0 +6620.0,6630.0,6610.93,6625.67 +6625.66,6639.33,6608.37,6621.28 +6621.24,6623.99,6612.49,6615.01 +6615.0,6629.99,6615.0,6629.99 +6629.99,6632.99,6592.34,6592.34 +6591.87,6608.02,6591.87,6602.24 +6602.24,6608.38,6586.0,6603.94 +6603.94,6606.0,6580.53,6584.54 +6584.56,6602.8,6580.53,6602.0 +6602.01,6602.01,6583.94,6585.58 +6585.59,6598.68,6549.66,6565.88 +6565.88,6582.92,6551.0,6553.0 +6553.01,6595.38,6551.0,6592.41 +6592.41,6592.41,6510.0,6510.01 +6510.0,6546.79,6474.9,6545.0 +6544.99,6545.0,6527.19,6533.57 +6533.58,6570.0,6519.49,6556.79 +6556.79,6568.0,6547.62,6551.65 +6551.65,6578.93,6551.64,6558.14 +6559.71,6561.35,6535.0,6545.0 +6545.46,6560.31,6543.5,6550.41 +6550.41,6610.0,6547.77,6566.01 +6566.01,6573.16,6560.0,6567.03 +6567.04,6575.93,6550.42,6573.06 +6573.06,6576.18,6551.42,6555.0 +6555.0,6591.37,6554.99,6576.91 +6576.92,6576.92,6566.0,6569.98 +6569.98,6578.46,6566.7,6568.0 +6568.0,6582.22,6567.99,6578.99 +6577.88,6583.82,6570.0,6580.0 +6579.99,6579.99,6557.02,6557.02 +6557.0,6568.84,6550.0,6568.84 +6568.83,6568.84,6557.26,6560.99 +6560.99,6562.26,6540.0,6544.99 +6544.99,6558.92,6525.0,6550.05 +6550.04,6553.5,6530.54,6537.55 +6537.55,6569.33,6537.54,6548.0 +6548.0,6558.0,6536.53,6553.01 +6553.0,6553.71,6505.85,6513.53 +6513.53,6532.5,6512.14,6525.53 +6525.53,6525.54,6489.0,6507.63 +6507.63,6509.85,6452.0,6509.0 +6509.0,6545.0,6508.99,6542.4 +6542.39,6542.4,6528.51,6534.94 +6534.93,6545.0,6520.99,6522.0 +6522.0,6528.3,6515.1,6527.74 +6527.74,6537.27,6524.44,6524.45 +6524.44,6524.45,6480.64,6480.64 +6480.65,6507.95,6480.64,6507.01 +6507.0,6507.01,6473.5,6478.52 +6478.53,6486.41,6453.0,6472.98 +6472.99,6472.99,6405.68,6410.0 +6409.99,6435.81,6398.96,6426.57 +6426.56,6435.0,6421.88,6421.89 +6421.89,6430.02,6410.02,6430.02 +6430.02,6435.81,6414.48,6422.95 +6422.95,6422.96,6412.0,6418.4 +6418.4,6430.99,6417.48,6430.98 +6430.98,6460.0,6430.98,6437.51 +6437.51,6460.95,6437.51,6449.3 +6449.3,6449.31,6422.64,6426.74 +6426.73,6450.0,6425.0,6441.0 +6440.99,6493.11,6440.99,6489.37 +6489.38,6489.78,6464.8,6474.96 +6474.96,6475.39,6457.17,6467.01 +6467.01,6479.98,6456.42,6456.43 +6456.43,6456.58,6441.15,6447.61 +6447.61,6447.62,6418.11,6426.09 +6426.09,6449.99,6426.08,6446.84 +6446.83,6449.99,6414.99,6426.14 +6426.15,6439.99,6420.0,6439.99 +6439.99,6479.99,6439.98,6466.01 +6466.0,6559.99,6454.38,6540.0 +6540.0,6603.01,6540.0,6570.0 +6570.0,6571.25,6546.09,6567.28 +6567.27,6568.99,6552.03,6564.94 +6564.93,6573.5,6563.0,6570.0 +6569.99,6570.28,6548.0,6553.0 +6552.99,6553.0,6542.52,6553.0 +6553.0,6558.0,6541.0,6558.0 +6557.99,6579.16,6550.0,6555.01 +6555.0,6560.79,6551.83,6556.19 +6556.19,6565.84,6525.11,6542.86 +6542.85,6542.86,6529.76,6532.42 +6532.41,6537.68,6527.72,6534.18 +6534.17,6549.9,6534.17,6540.88 +6540.87,6545.0,6529.53,6529.54 +6529.53,6549.88,6529.53,6549.88 +6549.88,6549.99,6538.75,6543.51 +6543.57,6559.0,6539.18,6559.0 +6559.0,6569.99,6554.71,6560.0 +6560.0,6573.65,6559.99,6572.08 +6572.08,6574.0,6536.04,6543.5 +6543.5,6554.78,6520.0,6552.39 +6552.39,6560.0,6547.5,6547.51 +6547.51,6553.0,6539.43,6552.49 +6552.5,6582.0,6549.69,6577.0 +6577.0,6577.0,6520.54,6535.96 +6535.96,6540.0,6510.58,6535.39 +6535.39,6544.43,6530.0,6530.0 +6530.01,6545.44,6530.0,6534.3 +6534.3,6537.53,6527.91,6534.97 +6534.96,6552.98,6533.57,6545.26 +6545.26,6546.99,6528.74,6531.66 +6531.67,6531.67,6527.9,6527.91 +6527.9,6535.99,6525.0,6533.91 +6533.92,6538.91,6528.8,6534.24 +6534.24,6549.0,6534.23,6538.01 +6538.01,6540.29,6532.0,6538.0 +6537.99,6549.0,6534.18,6534.7 +6534.69,6549.99,6534.69,6545.65 +6545.64,6549.99,6544.81,6549.99 +6549.99,6550.0,6535.0,6538.98 +6538.99,6539.99,6530.0,6532.74 +6532.73,6539.47,6530.0,6538.01 +6538.01,6544.99,6538.0,6543.05 +6543.04,6543.05,6535.31,6538.42 +6538.42,6570.0,6535.55,6569.99 +6569.99,6641.0,6569.99,6582.01 +6582.01,6599.0,6573.01,6594.38 +6594.38,6594.39,6563.14,6576.39 +6576.4,6579.99,6570.0,6577.55 +6577.54,6578.54,6552.0,6562.25 +6562.26,6567.78,6561.81,6567.78 +6567.77,6574.34,6567.77,6569.86 +6569.85,6575.0,6569.85,6570.38 +6570.37,6575.0,6567.8,6571.22 +6571.52,6574.99,6567.26,6568.16 +6568.15,6569.0,6562.0,6563.37 +6563.37,6567.02,6563.37,6564.33 +6564.33,6571.17,6564.32,6564.32 +6564.33,6564.33,6540.0,6547.19 +6547.2,6557.32,6545.69,6550.71 +6550.7,6557.3,6540.0,6540.01 +6540.0,6548.13,6536.0,6541.75 +6541.74,6559.69,6540.22,6555.0 +6555.0,6562.15,6545.23,6545.24 +6545.24,6556.83,6545.23,6552.44 +6552.44,6552.44,6537.88,6537.89 +6537.89,6543.05,6536.0,6539.89 +6539.88,6551.89,6539.88,6551.23 +6551.23,6560.0,6546.81,6557.0 +6557.01,6557.01,6543.75,6546.0 +6546.0,6555.0,6545.99,6555.0 +6555.0,6555.0,6550.0,6553.26 +6553.27,6554.72,6545.23,6554.71 +6554.71,6558.08,6550.75,6555.0 +6554.99,6556.79,6550.41,6553.99 +6554.0,6558.57,6546.1,6548.75 +6548.75,6552.5,6544.21,6545.81 +6545.35,6547.33,6542.36,6547.32 +6547.33,6547.33,6528.08,6528.08 +6528.09,6528.09,6491.81,6516.0 +6515.99,6523.58,6515.99,6521.12 +6521.12,6526.91,6515.0,6515.0 +6515.0,6521.09,6513.28,6513.28 +6513.28,6520.0,6510.0,6518.31 +6518.31,6534.0,6518.31,6527.42 +6527.43,6530.0,6516.0,6528.7 +6528.7,6539.35,6523.32,6535.02 +6535.03,6535.03,6523.78,6526.64 +6526.64,6538.0,6526.63,6538.0 +6537.99,6538.42,6535.01,6536.99 +6536.99,6538.0,6535.01,6536.96 +6536.96,6537.81,6526.51,6530.34 +6531.02,6539.94,6527.81,6534.01 +6534.0,6536.1,6532.18,6536.0 +6536.01,6585.01,6534.79,6571.64 +6571.63,6576.75,6562.45,6568.24 +6568.24,6574.5,6559.57,6562.32 +6562.31,6563.0,6557.01,6560.22 +6560.22,6561.57,6553.5,6557.07 +6557.08,6561.75,6553.85,6557.8 +6557.8,6559.9,6548.9,6548.91 +6548.9,6553.57,6545.63,6552.19 +6552.19,6554.36,6546.2,6550.28 +6550.28,6553.62,6547.68,6548.91 +6548.9,6552.83,6548.9,6552.27 +6552.28,6613.0,6552.27,6594.56 +6594.27,6601.01,6577.4,6599.85 +6599.85,6681.19,6594.0,6620.01 +6620.0,6620.01,6595.01,6612.61 +6612.62,6619.95,6603.99,6616.02 +6616.02,6634.87,6615.84,6618.98 +6618.98,6619.0,6607.0,6608.11 +6608.12,6617.44,6608.0,6617.03 +6617.04,6617.1,6603.89,6610.08 +6610.09,6639.55,6610.0,6633.13 +6633.14,6633.81,6621.0,6622.26 +6622.26,6623.6,6610.0,6610.01 +6610.0,6611.0,6598.48,6602.19 +6602.19,6609.98,6602.17,6609.98 +6609.97,6612.86,6604.47,6604.47 +6604.48,6605.79,6596.0,6596.23 +6596.23,6604.66,6591.02,6604.66 +6604.66,6604.66,6594.0,6601.1 +6601.1,6608.48,6601.09,6608.47 +6608.48,6610.0,6595.0,6596.49 +6596.5,6596.5,6592.57,6592.58 +6592.58,6597.46,6588.78,6597.45 +6597.46,6597.46,6575.49,6588.79 +6588.79,6592.95,6582.75,6592.95 +6592.95,6592.95,6591.0,6591.65 +6591.65,6591.66,6579.3,6585.9 +6585.9,6585.91,6570.0,6571.37 +6571.37,6572.72,6552.5,6558.39 +6558.39,6584.21,6558.39,6570.65 +6570.65,6574.7,6570.65,6573.99 +6573.98,6573.99,6569.6,6572.05 +6572.04,6580.0,6572.04,6580.0 +6579.99,6588.33,6577.33,6587.99 +6587.99,6589.99,6582.97,6584.12 +6584.12,6584.12,6573.02,6578.5 +6578.5,6583.0,6572.24,6578.73 +6578.72,6596.93,6578.72,6596.93 +6596.92,6596.93,6585.0,6585.01 +6585.01,6585.09,6577.0,6579.99 +6579.99,6584.0,6562.02,6567.62 +6567.62,6569.18,6557.51,6557.52 +6557.51,6557.52,6528.0,6543.15 +6543.14,6548.03,6525.78,6525.79 +6525.78,6525.79,6445.48,6453.68 +6453.67,6492.01,6453.67,6485.01 +6485.01,6488.91,6467.9,6482.71 +6482.72,6499.0,6481.94,6496.55 +6496.55,6506.12,6490.35,6490.36 +6490.36,6493.99,6485.31,6492.43 +6492.01,6500.0,6488.57,6497.9 +6497.9,6509.06,6497.06,6505.31 +6505.31,6517.34,6504.23,6511.33 +6511.33,6512.0,6499.39,6507.53 +6507.53,6507.53,6490.84,6494.25 +6494.48,6507.92,6494.47,6507.91 +6507.91,6525.0,6505.0,6520.4 +6520.41,6549.9,6520.0,6548.21 +6548.2,6548.21,6530.97,6541.0 +6541.01,6542.91,6525.24,6525.24 +6525.24,6530.5,6508.9,6518.65 +6518.64,6533.33,6510.57,6529.98 +6529.98,6537.0,6520.63,6520.64 +6520.63,6520.77,6411.0,6411.0 +6411.0,6411.01,6033.34,6174.19 +6175.96,6225.0,6130.0,6221.99 +6221.99,6248.0,6201.0,6226.36 +6226.36,6260.38,6211.84,6226.42 +6226.43,6233.84,6185.77,6207.22 +6205.01,6210.0,6153.05,6193.14 +6193.14,6216.21,6140.98,6203.9 +6203.89,6215.64,6191.37,6202.28 +6202.28,6214.15,6195.95,6211.77 +6211.77,6216.0,6198.22,6202.51 +6202.52,6209.19,6175.0,6192.24 +6192.24,6204.88,6185.0,6185.0 +6185.01,6225.24,6105.02,6223.77 +6223.76,6234.53,6205.0,6216.98 +6216.97,6216.98,6186.3,6192.54 +6192.54,6210.16,6192.53,6208.99 +6208.99,6225.0,6207.1,6214.03 +6214.04,6218.31,6193.76,6198.77 +6198.76,6205.81,6190.03,6195.77 +6195.78,6211.0,6141.0,6201.68 +6201.67,6204.95,6190.0,6191.63 +6191.63,6198.29,6177.07,6195.47 +6195.47,6196.96,6111.0,6131.79 +6130.88,6169.91,6115.0,6161.7 +6161.71,6179.25,6151.0,6177.02 +6177.02,6188.43,6175.0,6180.07 +6180.08,6189.99,6169.0,6187.99 +6187.68,6199.99,6185.59,6195.83 +6195.84,6205.58,6189.52,6205.58 +6205.58,6220.0,6203.99,6220.0 +6219.99,6235.2,6214.78,6225.21 +6225.21,6225.22,6213.48,6218.0 +6217.99,6218.0,6201.0,6203.79 +6203.79,6215.35,6203.79,6212.81 +6212.81,6214.31,6201.01,6213.43 +6211.21,6219.54,6210.01,6219.5 +6219.51,6220.0,6199.9,6200.01 +6200.0,6212.94,6200.0,6212.93 +6212.94,6228.12,6212.93,6223.0 +6223.0,6223.0,6213.0,6216.24 +6216.23,6219.0,6188.0,6194.97 +6194.97,6205.43,6194.39,6205.07 +6205.07,6214.41,6205.06,6213.63 +6213.64,6219.01,6209.35,6219.01 +6219.01,6221.5,6206.13,6206.14 +6206.14,6206.14,6178.0,6200.0 +6200.0,6201.47,6178.0,6185.38 +6185.38,6209.66,6185.37,6194.49 +6194.5,6207.8,6194.49,6205.17 +6205.18,6206.21,6194.85,6197.12 +6197.13,6198.0,6178.01,6185.39 +6185.4,6198.79,6180.01,6198.79 +6198.78,6203.39,6198.78,6200.0 +6200.01,6201.19,6197.1,6201.18 +6201.18,6201.19,6189.38,6194.33 +6194.33,6199.36,6194.33,6194.35 +6194.35,6212.0,6194.35,6207.24 +6207.24,6210.0,6200.51,6205.7 +6205.71,6208.63,6200.0,6200.0 +6200.01,6200.01,6192.52,6199.99 +6199.98,6199.99,6192.15,6194.99 +6195.0,6205.01,6195.0,6205.01 +6205.01,6205.01,6201.11,6201.11 +6201.12,6206.08,6200.11,6203.0 +6203.0,6204.36,6200.11,6202.49 +6202.48,6202.97,6182.82,6190.0 +6190.0,6202.22,6189.99,6200.71 +6200.72,6200.72,6191.81,6192.37 +6192.36,6200.0,6192.36,6194.63 +6194.64,6203.0,6194.0,6201.75 +6201.74,6202.49,6193.43,6200.0 +6199.99,6202.0,6197.0,6199.06 +6199.06,6203.69,6199.06,6202.47 +6202.47,6205.0,6200.01,6204.99 +6205.0,6226.06,6204.99,6224.99 +6225.0,6288.45,6224.99,6274.75 +6274.75,6274.75,6242.01,6249.08 +6249.07,6254.99,6240.53,6243.92 +6243.91,6259.62,6239.0,6244.99 +6245.0,6245.0,6240.36,6241.94 +6241.52,6241.53,6226.87,6227.45 +6227.45,6231.06,6211.0,6216.97 +6216.96,6218.18,6212.25,6218.18 +6218.17,6234.8,6218.17,6230.82 +6230.83,6235.0,6221.44,6224.75 +6224.75,6228.45,6222.92,6226.98 +6226.99,6244.96,6225.08,6243.12 +6243.12,6249.66,6237.77,6241.69 +6241.69,6241.69,6235.0,6240.0 +6239.99,6244.5,6230.0,6236.76 +6236.77,6249.84,6235.46,6248.76 +6248.77,6248.77,6201.49,6219.33 +6219.34,6219.34,6202.76,6202.77 +6202.76,6211.94,6200.23,6202.94 +6202.93,6205.0,6151.0,6172.02 +6172.03,6197.24,6151.58,6195.01 +6195.01,6211.0,6193.98,6206.02 +6206.03,6207.53,6200.0,6205.62 +6205.63,6218.61,6205.62,6215.02 +6215.02,6218.0,6207.49,6214.01 +6214.0,6676.92,6214.0,6639.92 +6638.11,6810.0,6411.17,6545.21 +6544.19,6583.48,6381.94,6437.99 +6438.0,6466.55,6388.56,6399.99 +6399.99,6455.55,6360.6,6449.67 +6449.66,6452.66,6402.0,6418.91 +6418.91,6440.67,6390.76,6391.95 +6391.96,6417.37,6360.0,6378.76 +6374.98,6415.42,6374.52,6387.61 +6387.6,6394.48,6362.68,6378.47 +6378.48,6397.07,6373.0,6397.01 +6397.01,6425.62,6391.0,6420.44 +6420.45,6420.45,6400.0,6413.09 +6413.1,6420.0,6391.55,6405.69 +6405.7,6410.01,6376.37,6380.0 +6380.01,6409.0,6358.02,6397.0 +6397.0,6405.0,6385.0,6396.01 +6396.01,6448.0,6396.0,6435.0 +6435.0,6460.0,6430.0,6430.01 +6430.01,6440.0,6418.0,6440.0 +6440.0,6440.0,6421.5,6429.5 +6429.49,6435.99,6421.07,6435.91 +6435.9,6439.35,6423.0,6426.0 +6426.0,6433.57,6425.01,6427.77 +6427.91,6493.11,6426.14,6481.0 +6481.01,6481.62,6445.17,6446.98 +6446.99,6456.0,6427.56,6430.0 +6430.0,6442.0,6408.39,6438.0 +6438.0,6438.0,6430.27,6435.99 +6435.99,6443.0,6432.26,6442.0 +6442.0,6453.45,6432.57,6451.68 +6451.67,6451.68,6427.0,6447.04 +6447.04,6469.57,6443.95,6449.0 +6448.99,6449.01,6433.35,6441.0 +6441.0,6444.0,6422.77,6426.54 +6426.01,6426.55,6384.26,6413.36 +6413.35,6433.0,6413.35,6432.99 +6433.0,6438.0,6431.41,6432.36 +6432.36,6450.02,6420.66,6445.01 +6445.0,6475.5,6445.0,6446.58 +6446.57,6457.82,6442.84,6455.99 +6455.99,6458.0,6441.61,6453.0 +6452.99,6482.1,6450.0,6450.01 +6450.0,6459.7,6443.67,6459.7 +6459.7,6459.99,6442.05,6442.99 +6443.0,6443.97,6433.62,6441.32 +6442.0,6453.6,6441.86,6441.86 +6441.86,6455.0,6440.86,6455.0 +6455.0,6457.06,6437.72,6446.57 +6446.57,6450.0,6422.93,6427.01 +6427.01,6437.28,6427.01,6429.98 +6429.98,6437.28,6427.69,6432.86 +6432.87,6432.87,6417.95,6427.41 +6427.3,6427.3,6418.47,6418.73 +6418.73,6439.61,6411.19,6439.53 +6439.46,6439.46,6424.39,6428.01 +6428.01,6428.01,6416.4,6422.95 +6422.94,6440.0,6420.17,6432.04 +6432.03,6445.0,6430.0,6444.14 +6444.14,6448.46,6440.1,6448.46 +6448.45,6449.16,6439.97,6440.0 +6440.0,6443.96,6433.24,6439.09 +6439.09,6440.68,6425.11,6427.06 +6427.06,6436.0,6423.34,6435.0 +6434.99,6445.9,6434.04,6441.32 +6441.32,6448.65,6440.1,6440.29 +6440.3,6444.98,6440.16,6441.0 +6441.01,6442.5,6432.46,6437.63 +6437.64,6446.14,6436.01,6446.13 +6446.14,6450.0,6442.99,6450.0 +6450.0,6489.83,6449.99,6456.49 +6456.5,6464.76,6455.42,6455.43 +6455.42,6455.64,6445.81,6452.41 +6452.41,6452.87,6445.81,6445.84 +6445.83,6445.84,6437.99,6437.99 +6438.0,6438.0,6412.2,6435.99 +6436.0,6442.0,6435.99,6439.06 +6439.06,6443.4,6439.06,6442.99 +6442.99,6443.39,6427.23,6431.0 +6431.0,6441.91,6430.99,6433.4 +6433.4,6436.0,6428.0,6435.0 +6435.01,6441.0,6425.0,6425.0 +6425.01,6440.06,6424.81,6436.14 +6436.36,6437.45,6430.0,6435.72 +6435.73,6435.73,6355.0,6383.65 +6383.65,6406.5,6383.64,6389.61 +6389.6,6397.0,6375.5,6396.08 +6396.08,6398.59,6391.14,6392.0 +6392.01,6392.34,6375.0,6375.86 +6375.86,6386.0,6357.91,6382.44 +6382.44,6400.0,6382.44,6398.93 +6398.93,6409.61,6398.92,6402.72 +6402.73,6402.73,6387.0,6391.76 +6391.77,6404.14,6388.48,6400.78 +6400.79,6400.79,6390.49,6394.99 +6395.0,6400.4,6394.99,6398.01 +6398.01,6398.01,6355.0,6366.0 +6366.0,6375.24,6366.0,6367.55 +6367.56,6368.46,6361.69,6361.98 +6361.98,6386.02,6361.97,6376.75 +6376.76,6386.26,6376.72,6378.55 +6378.55,6390.48,6378.55,6382.56 +6382.57,6385.0,6377.36,6383.98 +6383.89,6383.89,6365.0,6382.04 +6382.05,6384.04,6379.6,6383.04 +6383.46,6385.0,6372.79,6372.8 +6372.8,6380.0,6372.79,6380.0 +6380.0,6391.6,6379.99,6389.98 +6389.98,6396.05,6387.0,6391.49 +6391.5,6397.0,6390.0,6392.03 +6392.03,6392.03,6380.0,6380.01 +6380.01,6385.0,6380.0,6384.06 +6384.06,6386.44,6380.0,6380.98 +6380.98,6386.44,6380.16,6386.44 +6386.44,6386.44,6377.77,6377.78 +6377.77,6378.01,6369.42,6370.01 +6370.0,6386.44,6369.42,6386.44 +6386.44,6388.88,6377.0,6381.71 +6381.71,6383.38,6376.08,6383.38 +6383.38,6386.42,6380.72,6381.13 +6381.14,6388.0,6379.96,6387.99 +6388.0,6420.0,6386.0,6409.54 +6409.55,6409.55,6401.26,6401.27 +6401.27,6410.68,6395.56,6405.0 +6405.0,6410.68,6402.0,6402.0 +6402.01,6403.0,6397.57,6401.28 +6401.28,6409.6,6396.67,6403.01 +6403.01,6406.0,6402.85,6405.98 +6405.99,6412.72,6405.98,6409.03 +6409.03,6409.03,6401.0,6405.0 +6405.0,6406.0,6393.21,6393.21 +6393.22,6401.14,6391.26,6393.16 +6393.16,6399.89,6390.1,6398.01 +6398.0,6399.22,6393.41,6397.07 +6397.07,6399.99,6393.41,6399.98 +6399.99,6399.99,6396.45,6397.85 +6397.81,6400.0,6396.28,6399.03 +6399.03,6414.55,6399.02,6406.5 +6406.5,6414.23,6402.41,6410.99 +6410.99,6415.01,6405.57,6413.59 +6413.59,6452.87,6413.58,6433.5 +6433.51,6443.57,6430.5,6434.86 +6434.86,6439.99,6434.85,6438.0 +6438.0,6438.89,6428.38,6431.86 +6431.87,6435.0,6425.52,6431.69 +6431.7,6435.0,6428.68,6430.88 +6430.88,6435.0,6426.0,6426.02 +6426.02,6430.0,6425.76,6429.99 +6430.0,6448.9,6429.99,6448.89 +6448.89,6448.9,6437.27,6437.27 +6437.26,6440.0,6432.52,6435.99 +6436.0,6442.41,6432.66,6438.0 +6438.0,6445.0,6437.99,6445.0 +6445.0,6450.0,6439.54,6445.0 +6445.0,6445.0,6437.9,6440.82 +6440.83,6440.83,6437.22,6438.15 +6438.16,6439.22,6431.68,6437.24 +6437.25,6439.22,6431.01,6435.64 +6435.63,6439.29,6431.03,6432.93 +6432.94,6438.3,6432.93,6438.3 +6438.29,6438.3,6428.0,6428.0 +6428.0,6428.56,6406.19,6408.39 +6408.39,6420.0,6406.69,6406.81 +6406.81,6410.0,6386.0,6403.67 +6403.67,6418.03,6403.66,6417.82 +6417.82,6418.02,6412.22,6412.26 +6412.26,6418.03,6410.0,6412.21 +6412.2,6427.63,6412.2,6420.05 +6420.05,6423.55,6420.04,6420.67 +6420.68,6420.68,6414.42,6414.42 +6414.39,6414.39,6408.99,6409.0 +6408.99,6409.0,6398.34,6400.64 +6400.65,6400.65,6400.48,6400.61 +6400.61,6400.61,6399.48,6399.98 +6399.99,6400.0,6395.03,6397.0 +6396.99,6399.19,6394.29,6398.63 +6398.64,6399.65,6377.77,6399.65 +6399.65,6399.65,6387.77,6395.92 +6395.92,6398.59,6392.23,6393.62 +6393.62,6399.89,6393.61,6399.89 +6399.89,6401.91,6397.19,6398.94 +6398.94,6398.94,6390.0,6392.37 +6392.38,6395.0,6389.0,6394.7 +6394.7,6413.49,6394.69,6412.5 +6412.5,6413.0,6403.95,6403.96 +6403.97,6408.0,6399.88,6406.51 +6406.52,6409.19,6406.1,6406.42 +6407.11,6410.02,6404.11,6408.75 +6408.75,6409.99,6407.45,6407.47 +6407.46,6407.72,6402.69,6406.81 +6406.81,6407.3,6389.05,6394.51 +6394.51,6405.59,6394.5,6405.58 +6405.59,6406.68,6402.37,6402.38 +6402.37,6402.38,6397.62,6399.99 +6399.99,6400.0,6397.75,6398.22 +6398.22,6398.23,6398.21,6398.23 +6398.23,6398.23,6379.99,6382.0 +6382.01,6385.0,6360.0,6375.9 +6375.9,6378.05,6371.02,6371.02 +6371.03,6394.72,6371.02,6393.94 +6393.95,6394.0,6388.02,6389.0 +6389.0,6389.0,6380.34,6381.68 +6381.68,6387.99,6381.68,6385.05 +6385.06,6392.0,6385.05,6391.78 +6391.78,6391.79,6384.04,6385.68 +6385.69,6390.01,6385.18,6390.0 +6390.0,6411.5,6390.0,6403.15 +6403.15,6403.15,6391.28,6393.55 +6393.55,6400.47,6391.73,6398.11 +6398.1,6399.81,6390.95,6399.07 +6399.07,6400.0,6392.44,6395.69 +6395.69,6403.48,6395.68,6401.98 +6401.98,6402.0,6398.0,6400.0 +6400.0,6401.17,6398.99,6401.17 +6401.16,6419.49,6401.16,6414.03 +6414.03,6471.0,6409.95,6452.09 +6452.09,6452.09,6435.01,6435.24 +6435.25,6440.0,6435.24,6435.25 +6435.24,6435.25,6434.0,6434.41 +6434.42,6434.42,6424.0,6424.01 +6424.0,6434.86,6424.0,6434.86 +6434.86,6441.0,6429.56,6429.56 +6429.57,6429.57,6423.22,6425.0 +6424.99,6443.74,6421.0,6431.14 +6431.13,6441.78,6430.97,6435.01 +6435.01,6436.46,6434.0,6436.46 +6436.46,6436.46,6416.0,6416.96 +6416.96,6424.0,6416.9,6416.91 +6416.91,6427.28,6416.9,6427.28 +6427.28,6428.81,6422.82,6426.12 +6426.12,6426.12,6417.0,6422.48 +6422.48,6437.05,6420.96,6425.01 +6425.01,6430.42,6424.09,6430.42 +6430.42,6430.42,6417.86,6418.36 +6418.36,6420.01,6411.19,6414.67 +6414.68,6422.0,6410.25,6408.585 +6408.59,6421.89,6402.5,6402.5 +6402.5,6402.5,6379.73,6394.32 +6394.32,6394.46,6383.08,6390.99 +6391.0,6394.69,6390.99,6393.0 +6393.0,6394.0,6386.41,6393.06 +6393.06,6400.25,6393.05,6400.0 +6399.99,6406.01,6396.73,6400.16 +6400.16,6404.08,6400.16,6400.24 +6400.23,6400.24,6394.6,6395.94 +6395.94,6395.95,6390.0,6390.01 +6390.0,6401.64,6388.53,6398.0 +6398.01,6400.61,6393.0,6397.14 +6397.14,6408.98,6397.13,6407.0 +6407.0,6408.21,6399.99,6400.0 +6400.0,6400.0,6394.25,6400.0 +6400.0,6402.85,6398.45,6398.46 +6398.46,6400.0,6396.52,6399.99 +6399.98,6415.01,6399.98,6414.0 +6414.0,6414.0,6404.58,6405.48 +6405.48,6405.49,6398.04,6400.81 +6400.8,6403.45,6393.0,6400.1 +6400.09,6417.22,6399.0,6411.02 +6411.03,6411.03,6392.59,6395.13 +6395.25,6402.9,6395.24,6397.42 +6397.42,6401.34,6392.22,6393.1 +6393.1,6394.13,6391.25,6394.12 +6394.12,6395.35,6390.0,6390.01 +6390.01,6390.01,6384.09,6387.99 +6387.99,6390.05,6387.98,6388.88 +6388.88,6390.16,6388.87,6389.18 +6389.18,6390.0,6384.0,6389.99 +6389.99,6450.0,6383.54,6422.0 +6422.0,6425.75,6411.2,6411.2 +6411.21,6419.0,6411.0,6418.99 +6419.0,6420.0,6410.0,6410.0 +6410.01,6410.01,6400.37,6406.09 +6406.09,6406.09,6392.7,6392.82 +6392.83,6405.0,6389.0,6396.01 +6396.01,6399.65,6391.5,6399.65 +6399.65,6408.0,6399.64,6407.54 +6407.54,6407.55,6405.07,6406.0 +6405.99,6407.0,6397.81,6400.0 +6400.01,6402.0,6397.7,6402.0 +6402.0,6404.0,6400.0,6400.01 +6400.01,6400.01,6392.0,6399.01 +6399.01,6409.91,6397.21,6408.43 +6408.42,6408.43,6402.35,6406.09 +6406.09,6409.94,6404.06,6408.67 +6408.67,6412.0,6407.0,6412.0 +6412.0,6416.67,6410.0,6412.41 +6412.41,6421.76,6412.4,6418.62 +6418.62,6418.62,6416.16,6417.01 +6417.01,6419.5,6416.16,6416.17 +6416.17,6416.96,6416.16,6416.96 +6416.95,6419.21,6408.91,6412.03 +6412.03,6412.27,6402.5,6404.6 +6404.59,6414.12,6403.64,6407.96 +6407.96,6412.95,6401.0,6401.81 +6401.01,6404.0,6397.3,6402.91 +6402.9,6405.14,6402.11,6404.28 +6404.28,6410.6,6397.0,6397.31 +6397.32,6400.0,6392.07,6395.86 +6395.86,6399.93,6390.25,6391.0 +6391.01,6400.0,6390.0,6400.0 +6399.99,6407.4,6399.11,6406.18 +6406.18,6407.41,6397.01,6402.84 +6403.07,6405.0,6399.99,6403.83 +6403.14,6405.0,6399.99,6405.0 +6405.0,6409.68,6402.01,6408.01 +6408.01,6414.96,6407.9,6414.81 +6414.81,6414.81,6407.9,6409.11 +6409.12,6409.12,6403.87,6406.27 +6406.19,6406.31,6403.77,6405.43 +6405.45,6406.35,6403.82,6406.35 +6406.34,6410.25,6406.34,6410.24 +6410.25,6412.29,6410.24,6410.83 +6410.84,6410.84,6410.83,6410.83 +6410.84,6410.84,6407.71,6409.47 +6409.47,6409.9,6403.84,6406.79 +6406.78,6406.79,6403.85,6403.86 +6403.86,6404.04,6403.11,6403.34 +6403.35,6403.35,6403.11,6403.11 +6403.11,6403.17,6402.0,6402.01 +6402.01,6402.39,6401.98,6402.01 +6402.31,6408.6,6402.3,6407.73 +6407.73,6407.73,6402.38,6404.54 +6404.55,6404.7,6401.18,6401.18 +6401.19,6403.83,6400.0,6402.59 +6402.52,6405.0,6401.16,6401.17 +6401.17,6403.5,6401.09,6401.42 +6402.26,6403.5,6382.47,6384.2 +6384.2,6396.98,6380.01,6395.0 +6394.99,6396.78,6389.79,6395.0 +6395.0,6398.78,6393.01,6396.35 +6396.35,6415.0,6394.1,6406.13 +6406.13,6407.68,6399.61,6407.58 +6407.58,6407.58,6396.46,6404.1 +6404.09,6414.99,6403.0,6412.98 +6412.98,6413.13,6405.01,6408.56 +6408.55,6408.56,6403.65,6403.65 +6403.66,6403.67,6403.65,6403.67 +6403.67,6403.67,6403.45,6403.46 +6403.45,6403.46,6399.02,6399.02 +6399.02,6399.03,6395.35,6395.35 +6395.35,6395.36,6382.0,6389.99 +6389.99,6390.0,6385.51,6385.51 +6385.51,6386.61,6272.43,6327.55 +6327.55,6332.05,6211.0,6266.13 +6266.13,6299.26,6250.0,6269.94 +6269.94,6274.58,6260.0,6270.0 +6270.0,6280.0,6269.99,6279.99 +6280.0,6280.0,6272.01,6273.01 +6273.0,6274.42,6265.0,6267.92 +6267.91,6271.87,6264.0,6264.01 +6264.01,6267.14,6235.14,6251.49 +6251.48,6257.7,6240.68,6243.61 +6243.6,6249.22,6235.0,6246.23 +6247.07,6270.1,6245.0,6261.0 +6261.0,6268.69,6258.68,6268.24 +6268.25,6269.97,6260.59,6264.01 +6265.3,6268.5,6256.72,6259.04 +6259.05,6265.12,6256.29,6261.02 +6261.02,6281.4,6260.97,6278.54 +6278.05,6289.0,6270.1,6284.9 +6284.9,6287.76,6270.59,6277.14 +6277.14,6280.31,6271.72,6280.3 +6280.3,6280.3,6270.5,6274.55 +6274.54,6274.55,6256.0,6256.99 +6256.99,6256.99,6251.0,6251.01 +6251.01,6253.27,6250.03,6253.27 +6253.27,6266.0,6250.0,6265.99 +6266.0,6271.62,6260.17,6264.5 +6264.5,6264.5,6258.68,6258.68 +6258.4,6261.0,6254.03,6259.44 +6259.44,6265.0,6259.02,6264.99 +6264.99,6266.0,6260.53,6261.98 +6261.99,6262.27,6257.11,6257.12 +6257.11,6257.12,6240.54,6253.5 +6253.5,6254.94,6252.4,6254.93 +6254.93,6265.19,6252.22,6265.18 +6265.19,6270.0,6264.16,6269.16 +6269.17,6285.0,6264.57,6275.41 +6275.41,6275.46,6267.62,6269.52 +6269.51,6272.0,6268.29,6271.99 +6272.0,6272.0,6261.57,6263.77 +6263.78,6267.89,6260.26,6267.89 +6267.89,6267.9,6265.01,6265.01 +6265.02,6267.01,6261.31,6266.57 +6266.56,6267.02,6264.49,6265.0 +6265.01,6265.01,6260.0,6260.01 +6260.01,6262.37,6258.91,6258.93 +6258.94,6260.61,6255.69,6255.7 +6255.7,6255.7,6253.69,6253.7 +6253.7,6264.67,6253.69,6264.67 +6264.66,6266.01,6260.0,6261.62 +6261.61,6262.65,6260.45,6260.46 +6260.46,6260.46,6252.55,6252.56 +6252.56,6254.1,6201.67,6230.0 +6230.0,6353.24,6223.96,6307.52 +6307.51,6310.12,6300.11,6306.18 +6306.18,6310.0,6293.11,6293.13 +6293.12,6304.99,6293.01,6301.49 +6301.49,6307.4,6295.6,6307.38 +6307.39,6307.39,6300.03,6301.64 +6301.64,6305.0,6296.37,6305.0 +6305.0,6313.33,6304.98,6309.79 +6309.78,6310.0,6304.17,6307.0 +6307.0,6307.85,6298.34,6304.53 +6304.53,6304.77,6301.06,6301.08 +6301.08,6304.72,6297.0,6301.99 +6301.99,6301.99,6293.5,6295.98 +6295.98,6299.58,6293.99,6299.58 +6299.58,6300.45,6294.01,6294.02 +6294.02,6305.48,6294.01,6305.47 +6305.47,6307.32,6299.37,6307.3 +6307.3,6307.32,6301.36,6303.6 +6303.6,6307.32,6303.59,6307.32 +6307.31,6308.22,6307.31,6308.21 +6308.22,6308.92,6307.9,6308.91 +6308.92,6308.92,6307.5,6307.51 +6307.5,6307.51,6303.25,6303.26 +6303.26,6307.72,6303.25,6306.5 +6306.5,6309.0,6304.81,6304.87 +6304.87,6305.0,6300.89,6304.99 +6304.98,6315.18,6304.98,6315.01 +6315.01,6315.01,6312.89,6314.0 +6313.99,6327.0,6313.99,6320.83 +6320.84,6337.37,6318.26,6337.24 +6337.24,6360.0,6330.06,6348.0 +6348.01,6348.01,6335.19,6338.1 +6338.1,6349.99,6337.97,6345.0 +6344.99,6378.77,6344.94,6366.87 +6366.87,6373.0,6366.86,6369.99 +6369.99,6369.99,6348.21,6357.23 +6357.23,6363.6,6354.01,6363.6 +6363.04,6365.7,6355.0,6355.02 +6355.02,6356.94,6355.01,6356.01 +6356.0,6356.01,6350.17,6352.06 +6351.97,6352.49,6345.84,6350.0 +6350.0,6350.0,6345.17,6345.17 +6345.17,6345.18,6333.94,6340.2 +6340.19,6343.15,6334.0,6340.0 +6340.0,6346.54,6339.99,6346.54 +6346.54,6352.47,6341.27,6352.44 +6352.44,6360.93,6352.44,6357.44 +6357.44,6370.0,6357.0,6370.0 +6370.0,6372.61,6359.67,6363.43 +6363.43,6365.0,6350.83,6354.4 +6354.4,6358.79,6348.22,6354.42 +6354.42,6354.42,6350.0,6351.16 +6351.16,6357.31,6347.93,6353.72 +6353.72,6355.0,6350.0,6354.01 +6353.92,6354.99,6350.01,6351.53 +6351.28,6354.5,6340.59,6345.33 +6345.34,6353.53,6341.44,6347.04 +6347.04,6350.82,6343.39,6346.11 +6346.11,6351.7,6345.0,6350.0 +6350.0,6350.0,6341.27,6347.41 +6347.41,6347.41,6341.01,6341.71 +6341.75,6342.48,6334.74,6339.45 +6339.45,6343.37,6337.0,6340.69 +6340.69,6343.37,6340.35,6342.03 +6341.42,6343.48,6340.32,6343.0 +6343.0,6346.66,6341.38,6342.59 +6342.59,6342.59,6315.91,6327.96 +6327.96,6334.61,6325.0,6334.01 +6333.99,6333.99,6325.55,6328.78 +6328.78,6340.31,6326.87,6330.73 +6330.74,6331.33,6318.0,6324.99 +6325.0,6329.78,6324.94,6327.67 +6327.68,6330.0,6326.65,6328.2 +6328.21,6329.9,6326.74,6329.89 +6329.9,6330.0,6326.01,6326.09 +6326.74,6329.89,6325.0,6329.01 +6329.01,6337.53,6329.0,6337.39 +6337.38,6340.0,6336.17,6340.0 +6340.0,6340.0,6329.0,6332.61 +6333.54,6335.93,6332.56,6335.62 +6335.62,6336.5,6329.47,6329.85 +6329.85,6330.29,6313.17,6326.78 +6326.77,6331.13,6326.62,6329.04 +6329.04,6333.29,6329.03,6333.15 +6333.14,6333.15,6331.01,6331.64 +6331.65,6332.66,6330.03,6331.0 +6331.0,6336.0,6329.44,6336.0 +6336.0,6345.0,6332.21,6337.71 +6337.72,6341.51,6337.71,6337.72 +6337.72,6342.2,6337.71,6342.05 +6342.04,6342.05,6335.32,6335.72 +6335.73,6340.0,6335.72,6338.99 +6338.99,6344.39,6338.99,6344.24 +6344.24,6345.03,6344.23,6345.0 +6345.0,6350.0,6342.05,6350.0 +6350.0,6351.82,6341.29,6351.81 +6351.81,6440.0,6351.81,6408.99 +6408.98,6417.5,6401.33,6404.23 +6404.22,6419.99,6404.22,6419.99 +6419.99,6464.15,6419.98,6435.0 +6435.0,6440.0,6426.81,6427.0 +6426.99,6427.38,6411.05,6417.58 +6417.59,6419.74,6413.0,6413.57 +6413.58,6417.11,6411.0,6412.04 +6412.03,6425.0,6412.03,6425.0 +6425.0,6439.99,6424.99,6439.99 +6439.99,6439.99,6416.44,6416.44 +6416.44,6421.09,6413.01,6421.08 +6421.09,6421.2,6406.5,6408.02 +6408.02,6408.02,6406.4,6407.46 +6407.46,6408.97,6406.5,6408.9 +6408.9,6414.97,6408.9,6413.23 +6413.23,6414.95,6410.28,6410.28 +6410.28,6410.28,6388.0,6397.87 +6397.88,6402.39,6395.83,6398.04 +6398.04,6401.5,6392.84,6396.63 +6396.63,6400.0,6396.0,6398.81 +6398.81,6410.01,6398.02,6405.95 +6405.95,6422.39,6405.93,6411.8 +6411.81,6417.5,6402.0,6407.0 +6407.0,6417.45,6404.43,6406.01 +6406.01,6406.01,6400.0,6400.01 +6400.0,6400.01,6385.72,6390.03 +6390.03,6390.03,6372.0,6375.0 +6374.99,6386.0,6374.99,6386.0 +6386.0,6400.03,6385.53,6397.14 +6397.14,6400.0,6397.13,6399.99 +6399.99,6404.0,6388.17,6403.99 +6403.99,6405.0,6395.74,6405.0 +6405.0,6409.99,6404.83,6404.99 +6405.0,6409.0,6403.0,6407.37 +6407.37,6407.37,6390.01,6390.01 +6390.02,6394.96,6387.82,6394.01 +6394.01,6399.74,6389.0,6399.74 +6399.74,6400.78,6395.0,6396.05 +6396.06,6404.99,6396.06,6401.74 +6401.74,6403.47,6398.14,6398.5 +6398.49,6421.3,6398.45,6417.07 +6417.06,6449.65,6413.32,6435.18 +6435.17,6435.17,6409.44,6411.96 +6411.95,6415.0,6393.43,6398.56 +6398.28,6418.47,6398.04,6408.5 +6408.5,6420.11,6405.62,6416.12 +6416.12,6419.98,6415.02,6418.01 +6418.0,6437.0,6418.0,6427.41 +6427.41,6427.41,6417.88,6425.0 +6424.99,6425.04,6421.65,6422.44 +6422.44,6430.0,6422.44,6423.78 +6423.78,6423.78,6416.82,6416.82 +6416.82,6419.2,6416.11,6418.55 +6418.55,6422.0,6418.54,6422.0 +6421.99,6445.0,6421.99,6437.0 +6437.0,6449.99,6436.61,6449.99 +6449.99,6540.0,6449.98,6511.37 +6511.36,6528.44,6505.68,6525.01 +6525.01,6532.35,6517.02,6517.35 +6517.36,6528.35,6506.0,6509.35 +6509.34,6509.56,6494.85,6507.48 +6507.48,6509.0,6498.01,6501.93 +6501.93,6506.74,6500.01,6506.74 +6506.73,6513.65,6502.0,6507.91 +6507.91,6526.81,6507.9,6521.01 +6521.0,6521.01,6507.75,6507.76 +6507.76,6509.04,6502.0,6509.04 +6509.03,6509.04,6490.88,6507.97 +6507.97,6507.97,6501.01,6502.03 +6502.02,6519.05,6502.0,6514.95 +6514.94,6514.95,6494.0,6495.0 +6495.01,6498.83,6490.1,6497.99 +6498.0,6509.18,6497.99,6509.18 +6509.18,6510.0,6509.17,6509.99 +6509.98,6513.98,6509.98,6513.61 +6513.61,6514.0,6511.0,6511.01 +6511.0,6511.01,6501.12,6501.13 +6501.13,6501.13,6499.8,6499.83 +6499.82,6501.01,6494.07,6497.19 +6497.18,6504.99,6495.39,6504.98 +6504.97,6511.88,6503.32,6504.9 +6504.89,6506.5,6492.35,6493.83 +6493.82,6500.0,6454.1,6461.37 +6461.38,6467.0,6441.0,6448.75 +6448.75,6457.07,6446.97,6455.45 +6455.45,6457.0,6450.0,6451.22 +6451.21,6451.22,6450.28,6450.29 +6450.28,6457.72,6450.28,6457.72 +6457.72,6460.23,6451.0,6451.0 +6451.0,6451.93,6450.0,6451.92 +6451.92,6462.0,6451.92,6461.99 +6461.82,6464.99,6452.5,6455.5 +6455.5,6473.98,6455.5,6469.11 +6469.1,6482.41,6464.3,6475.38 +6475.37,6490.34,6470.63,6485.94 +6485.94,6485.95,6388.0,6415.38 +6415.38,6431.47,6403.25,6427.0 +6426.99,6430.27,6408.88,6428.5 +6428.49,6429.61,6415.44,6415.45 +6415.44,6420.28,6415.13,6420.28 +6420.27,6427.36,6419.05,6426.71 +6426.7,6428.18,6418.94,6418.94 +6418.63,6424.98,6410.0,6410.02 +6410.01,6410.03,6402.0,6406.25 +6406.25,6415.0,6406.24,6412.0 +6411.99,6414.51,6406.0,6409.92 +6409.91,6409.99,6393.01,6399.77 +6399.77,6405.35,6395.52,6405.0 +6404.99,6405.0,6401.0,6404.37 +6404.37,6404.37,6402.42,6402.43 +6402.42,6402.47,6402.42,6402.46 +6402.46,6405.0,6402.46,6404.99 +6404.99,6405.35,6398.01,6398.01 +6398.0,6398.01,6335.62,6350.22 +6350.21,6357.32,6350.21,6354.99 +6354.98,6358.0,6352.55,6355.46 +6355.46,6361.2,6355.45,6361.0 +6361.0,6361.01,6332.45,6354.03 +6354.03,6354.03,6311.46,6338.94 +6338.94,6348.0,6335.18,6342.71 +6342.7,6349.99,6341.66,6349.99 +6349.98,6349.99,6345.51,6345.51 +6345.52,6345.52,6331.0,6331.01 +6331.0,6340.0,6331.0,6340.0 +6340.0,6342.07,6330.0,6330.01 +6330.01,6332.36,6305.0,6323.61 +6323.61,6324.5,6320.94,6324.01 +6324.01,6334.98,6324.0,6334.76 +6334.77,6336.69,6327.46,6336.01 +6336.0,6340.0,6336.0,6340.0 +6340.0,6346.06,6339.99,6341.3 +6341.29,6344.76,6341.06,6344.69 +6344.69,6350.0,6342.85,6349.99 +6349.99,6357.16,6348.11,6357.16 +6357.16,6359.99,6353.55,6353.56 +6353.55,6359.99,6353.55,6358.17 +6358.16,6358.96,6354.2,6354.21 +6354.2,6354.99,6350.6,6350.61 +6350.6,6350.61,6341.5,6343.56 +6343.55,6359.99,6343.55,6359.99 +6359.98,6367.54,6359.98,6367.54 +6367.54,6368.57,6363.25,6363.26 +6363.26,6364.46,6359.23,6364.46 +6364.45,6365.0,6360.68,6362.84 +6362.84,6370.0,6362.83,6370.0 +6369.99,6374.0,6368.0,6368.71 +6368.7,6368.71,6359.0,6359.3 +6359.3,6360.98,6355.67,6358.4 +6358.4,6365.0,6358.39,6365.0 +6364.99,6367.27,6360.86,6361.27 +6361.26,6365.0,6360.43,6364.83 +6364.0,6364.99,6347.41,6350.02 +6350.02,6358.6,6350.0,6357.0 +6357.0,6360.0,6356.47,6360.0 +6359.99,6360.0,6353.31,6353.32 +6353.31,6354.24,6347.43,6352.98 +6352.98,6354.75,6350.0,6352.39 +6352.39,6353.53,6347.57,6351.9 +6351.46,6357.54,6350.67,6357.53 +6356.51,6359.99,6355.64,6359.73 +6359.73,6359.99,6357.16,6358.06 +6358.06,6358.07,6347.0,6347.01 +6347.0,6355.0,6345.13,6347.41 +6347.41,6350.0,6343.0,6343.43 +6343.42,6345.0,6342.32,6344.99 +6345.0,6347.91,6329.64,6334.78 +6334.97,6339.39,6330.34,6337.06 +6337.06,6337.06,6271.15,6308.99 +6308.98,6322.18,6305.0,6309.01 +6309.01,6320.0,6306.28,6315.0 +6315.0,6323.42,6310.17,6323.42 +6323.42,6330.0,6321.22,6325.27 +6325.98,6329.99,6325.01,6326.6 +6326.6,6328.21,6314.74,6316.66 +6316.44,6316.88,6310.0,6312.94 +6312.94,6383.59,6311.0,6383.59 +6383.59,6383.59,6365.0,6373.0 +6373.0,6373.0,6359.31,6364.51 +6364.51,6376.67,6364.5,6374.27 +6374.27,6374.27,6356.12,6360.0 +6360.0,6368.25,6359.99,6364.69 +6364.68,6364.7,6362.99,6364.7 +6364.7,6364.7,6344.07,6353.78 +6353.79,6353.79,6342.0,6343.61 +6343.61,6356.75,6341.99,6356.75 +6356.75,6359.09,6356.6,6359.09 +6359.09,6359.09,6335.14,6348.85 +6348.85,6354.73,6348.83,6354.73 +6354.81,6360.66,6354.81,6360.66 +6360.65,6370.0,6360.65,6369.99 +6369.41,6373.8,6364.48,6366.07 +6366.07,6366.07,6347.7,6352.43 +6352.43,6352.43,6339.49,6339.5 +6339.5,6339.5,6333.29,6333.29 +6333.29,6333.3,6318.1,6318.11 +6318.11,6335.0,6316.19,6334.53 +6334.54,6334.54,6330.01,6332.0 +6332.0,6332.0,6305.95,6306.02 +6306.01,6320.0,6306.0,6319.99 +6320.0,6328.59,6313.3,6325.26 +6325.01,6328.22,6313.05,6317.16 +6317.16,6319.94,6252.5,6259.89 +6259.89,6295.82,6259.89,6292.15 +6292.36,6310.98,6292.36,6303.67 +6303.67,6311.4,6300.0,6300.01 +6300.01,6305.0,6295.9,6304.0 +6304.0,6311.4,6298.92,6298.93 +6298.93,6308.0,6286.66,6307.75 +6307.75,6307.76,6273.21,6281.76 +6281.76,6285.0,6276.43,6285.0 +6285.0,6285.02,6280.99,6282.83 +6282.85,6299.02,6281.95,6292.67 +6292.67,6297.34,6289.42,6292.0 +6292.0,6304.48,6282.99,6287.89 +6288.41,6290.48,6276.35,6283.67 +6283.67,6293.81,6283.01,6284.61 +6284.61,6306.09,6283.3,6300.29 +6300.28,6310.01,6295.79,6303.53 +6303.53,6304.51,6261.34,6277.99 +6278.0,6279.99,6259.17,6278.64 +6278.63,6293.94,6277.93,6286.81 +6286.82,6286.82,6278.5,6278.51 +6278.5,6280.03,6268.41,6270.32 +6270.32,6273.05,6237.4,6239.61 +6239.61,6260.39,6239.6,6255.99 +6255.99,6276.01,6255.0,6275.05 +6275.04,6275.05,6262.72,6264.7 +6264.7,6269.46,6259.01,6264.01 +6264.01,6269.99,6263.56,6268.85 +6268.84,6293.38,6268.84,6292.63 +6292.63,6293.38,6281.36,6281.37 +6281.36,6284.93,6277.21,6283.99 +6283.98,6289.64,6268.47,6268.48 +6268.47,6275.0,6228.86,6242.37 +6242.36,6246.65,6160.99,6178.01 +6178.0,6222.18,6176.01,6222.18 +6222.17,6222.18,6200.01,6204.01 +6204.01,6207.11,6188.13,6188.96 +6189.15,6191.68,6143.71,6162.23 +6162.22,6172.0,6037.54,6080.71 +6080.7,6080.71,5558.59,5613.13 +5613.13,5744.99,5532.76,5705.69 +5705.69,5732.94,5531.95,5639.99 +5639.98,5670.0,5374.64,5466.91 +5466.91,5466.91,5280.93,5396.64 +5393.35,5620.0,5385.01,5521.5 +5521.5,5541.23,5490.0,5513.02 +5513.02,5615.38,5513.02,5576.05 +5576.05,5645.0,5558.62,5563.19 +5567.98,5606.72,5556.57,5572.07 +5572.07,5580.0,5490.61,5546.09 +5546.08,5574.4,5526.63,5536.71 +5534.9,5560.0,5470.75,5551.3 +5553.93,5565.54,5528.23,5555.32 +5558.05,5558.05,5506.43,5538.83 +5538.83,5583.03,5535.53,5583.03 +5583.03,5583.03,5531.0,5549.98 +5546.98,5567.0,5542.2,5545.13 +5542.2,5542.2,5349.79,5396.46 +5396.46,5434.45,5378.05,5408.24 +5407.8,5447.61,5378.04,5383.77 +5383.78,5415.0,5348.3,5351.17 +5351.17,5392.25,5188.0,5292.19 +5292.19,5506.71,5292.19,5420.86 +5420.86,5548.46,5351.87,5510.01 +5510.01,5560.48,5461.33,5488.31 +5488.31,5530.0,5470.02,5508.22 +5508.21,5550.0,5489.89,5535.0 +5535.0,5543.76,5456.08,5460.0 +5460.0,5480.0,5413.11,5476.48 +5476.48,5507.81,5429.35,5488.32 +5488.31,5587.25,5483.24,5558.13 +5559.94,5609.91,5542.34,5552.65 +5552.65,5553.73,5516.63,5538.59 +5538.58,5566.0,5538.58,5556.4 +5556.4,5580.0,5550.57,5562.66 +5562.65,5563.82,5540.0,5547.93 +5545.0,5560.0,5529.62,5537.8 +5537.79,5556.0,5521.93,5556.0 +5556.0,5556.18,5501.01,5528.05 +5528.06,5533.04,5510.24,5524.87 +5524.87,5530.52,5470.16,5506.72 +5506.72,5561.37,5506.72,5556.04 +5556.03,5571.88,5526.38,5526.39 +5526.39,5541.78,5522.69,5531.73 +5531.61,5570.0,5531.56,5559.0 +5558.76,5565.0,5547.35,5554.0 +5553.99,5554.0,5531.0,5533.68 +5533.68,5557.0,5531.75,5549.44 +5549.44,5557.58,5525.53,5527.43 +5527.43,5535.0,5525.62,5528.96 +5528.95,5534.93,5487.18,5489.89 +5489.88,5514.26,5484.76,5503.98 +5503.98,5503.98,5436.59,5460.0 +5459.99,5460.78,5410.0,5421.22 +5423.41,5525.32,5421.01,5499.99 +5499.99,5512.0,5481.0,5484.17 +5484.17,5499.99,5482.31,5482.32 +5482.32,5485.0,5457.97,5475.56 +5474.99,5482.02,5456.33,5463.28 +5462.31,5479.99,5450.84,5472.19 +5472.19,5475.55,5456.77,5466.0 +5465.99,5477.27,5461.4,5463.04 +5464.92,5505.24,5462.6,5491.73 +5491.73,5496.3,5478.0,5487.84 +5487.9,5495.29,5482.9,5488.29 +5488.29,5488.88,5461.77,5471.97 +5470.79,5503.44,5467.43,5489.96 +5489.96,5489.96,5477.67,5483.14 +5483.14,5505.19,5482.73,5487.52 +5487.42,5494.55,5469.7,5490.09 +5490.09,5494.11,5480.61,5484.2 +5484.19,5544.0,5478.7,5514.28 +5514.28,5514.28,5475.0,5475.5 +5475.5,5493.59,5475.0,5490.44 +5490.43,5497.86,5489.0,5493.08 +5493.08,5507.99,5489.0,5507.01 +5507.01,5507.01,5482.0,5482.01 +5482.01,5503.96,5477.01,5494.72 +5494.72,5510.67,5494.7,5510.01 +5510.01,5524.98,5510.0,5520.0 +5520.01,5520.01,5506.95,5514.05 +5514.05,5545.0,5514.04,5535.0 +5535.0,5554.87,5535.0,5546.76 +5546.75,5550.0,5525.0,5529.31 +5528.88,5548.76,5528.35,5543.54 +5543.55,5550.56,5543.55,5547.51 +5547.51,5549.13,5518.34,5528.44 +5528.44,5532.42,5525.0,5530.46 +5530.46,5533.43,5520.91,5524.25 +5524.52,5524.52,5510.01,5515.41 +5515.42,5519.65,5510.43,5518.99 +5518.99,5532.02,5518.98,5527.01 +5527.01,5529.95,5516.24,5520.17 +5521.07,5532.0,5515.0,5531.96 +5531.96,5536.37,5523.77,5531.03 +5531.03,5546.24,5531.02,5536.97 +5536.97,5541.98,5532.6,5535.0 +5534.99,5665.0,5530.0,5587.29 +5587.29,5588.0,5535.0,5539.77 +5539.77,5549.98,5523.57,5523.57 +5523.58,5547.0,5523.58,5540.44 +5540.44,5551.6,5529.0,5551.6 +5551.6,5560.0,5544.5,5550.63 +5552.36,5554.0,5515.0,5519.9 +5519.68,5527.39,5457.34,5510.58 +5510.05,5517.4,5465.79,5500.37 +5500.37,5518.34,5500.37,5514.49 +5514.48,5514.5,5477.72,5480.0 +5480.01,5483.96,5306.94,5410.36 +5410.36,5420.0,5369.94,5386.39 +5386.33,5393.52,5312.07,5312.07 +5312.07,5314.03,5170.61,5266.31 +5266.31,5340.85,5173.21,5309.0 +5308.99,5316.88,5250.74,5280.84 +5280.85,5291.85,5235.34,5266.7 +5266.7,5275.0,5213.61,5216.41 +5219.03,5219.04,5082.01,5130.0 +5131.5,5139.18,5054.87,5098.32 +5098.31,5168.57,5074.34,5116.76 +5116.48,5134.88,4950.0,5067.32 +5067.33,5070.0,5005.26,5021.17 +5021.17,5045.0,4911.11,4930.0 +4929.99,5040.0,4863.01,4985.09 +4985.08,5000.0,4871.59,4890.0 +4890.07,4898.82,4670.05,4780.0 +4779.99,4839.04,4740.01,4793.35 +4793.35,4833.08,4716.0,4769.0 +4769.0,4847.68,4749.92,4800.0 +4800.0,4825.0,4784.71,4810.89 +4810.88,4889.0,4810.88,4841.01 +4841.0,4841.29,4782.97,4802.99 +4802.99,4820.63,4619.0,4661.0 +4661.0,4666.64,4550.02,4574.06 +4572.17,4614.97,4484.0,4567.1 +4567.1,4653.45,4501.0,4505.75 +4505.75,4520.0,4218.27,4388.48 +4383.57,4461.39,4351.64,4409.26 +4409.26,4483.55,4375.02,4379.1 +4379.1,4408.0,4314.44,4370.01 +4370.01,4444.0,4346.62,4391.09 +4394.26,4424.81,4353.0,4395.0 +4394.99,4698.36,4394.99,4633.03 +4633.03,4759.32,4590.02,4700.52 +4700.52,4700.52,4635.0,4653.45 +4653.44,4653.45,4451.14,4489.83 +4489.83,4573.0,4482.12,4562.47 +4562.47,4562.48,4371.0,4372.29 +4372.28,4384.93,4035.0,4268.85 +4268.87,4431.14,4257.79,4382.14 +4382.14,4390.0,4180.01,4215.01 +4215.0,4396.36,4193.33,4335.58 +4335.59,4381.0,4285.86,4332.05 +4332.13,4365.22,4239.01,4355.86 +4354.09,4403.83,4319.17,4354.39 +4354.3,4500.0,4335.35,4402.98 +4402.96,4466.0,4373.38,4440.82 +4437.89,4444.04,4298.0,4321.13 +4321.37,4438.34,4319.79,4402.27 +4402.27,4477.91,4392.55,4450.34 +4450.34,4627.55,4443.01,4571.25 +4571.25,4624.0,4521.29,4535.73 +4535.74,4567.52,4485.57,4552.58 +4552.69,4572.15,4486.57,4526.56 +4523.06,4562.61,4501.01,4545.02 +4545.02,4548.76,4409.0,4417.37 +4417.37,4464.35,4380.0,4455.11 +4453.58,4547.13,4426.24,4524.37 +4523.31,4527.06,4470.08,4484.0 +4483.99,4484.0,4360.0,4408.04 +4408.04,4464.99,4387.38,4392.64 +4392.64,4438.33,4375.0,4410.36 +4409.44,4485.75,4401.13,4403.4 +4403.4,4495.42,4335.58,4495.42 +4495.41,4504.57,4452.66,4484.88 +4484.88,4576.14,4484.87,4554.24 +4553.3,4553.8,4503.96,4517.88 +4517.88,4589.0,4516.0,4558.94 +4558.94,4567.87,4531.39,4544.14 +4544.14,4548.19,4505.83,4537.99 +4537.99,4549.48,4495.0,4521.0 +4521.0,4535.35,4508.11,4531.98 +4531.98,4532.0,4479.95,4501.16 +4501.16,4527.16,4483.81,4526.53 +4526.09,4527.16,4502.16,4502.16 +4502.16,4505.15,4423.29,4454.12 +4454.12,4482.64,4433.31,4465.0 +4465.0,4475.92,4408.05,4433.33 +4432.0,4455.04,4363.61,4393.22 +4393.21,4438.5,4383.37,4431.45 +4431.44,4483.14,4430.0,4455.65 +4455.64,4472.28,4436.0,4438.81 +4438.8,4462.78,4427.68,4458.5 +4458.4,4465.38,4449.0,4459.69 +4459.69,4459.69,4430.85,4430.85 +4430.58,4430.58,4389.81,4420.01 +4420.01,4481.02,4405.0,4447.15 +4447.15,4450.0,4423.5,4436.34 +4436.34,4444.0,4381.79,4401.02 +4401.02,4401.02,4238.69,4286.8 +4286.81,4320.0,4217.0,4220.89 +4222.78,4251.52,4132.0,4154.39 +4154.39,4281.08,4154.38,4259.02 +4259.02,4259.3,4200.0,4209.91 +4209.91,4227.29,4105.0,4108.2 +4108.2,4240.47,4085.73,4206.77 +4207.16,4260.0,4205.19,4243.65 +4243.65,4294.4,4228.06,4244.64 +4243.08,4366.05,4227.07,4327.86 +4327.87,4359.97,4303.9,4327.5 +4327.49,4338.73,4287.33,4301.24 +4301.27,4308.0,4265.0,4297.22 +4297.22,4297.22,4238.13,4265.69 +4265.74,4283.83,4233.13,4268.93 +4268.48,4300.0,4251.82,4272.11 +4270.7,4303.04,4259.19,4268.7 +4270.76,4270.82,4189.0,4216.0 +4216.0,4234.64,4172.8,4215.27 +4215.27,4244.0,4203.45,4220.84 +4220.83,4278.02,4212.92,4230.1 +4229.97,4241.03,4208.1,4224.28 +4224.28,4275.0,4224.27,4248.34 +4248.06,4335.79,4237.4,4313.89 +4313.88,4313.88,4278.35,4295.04 +4295.04,4370.78,4295.04,4339.01 +4339.01,4349.99,4315.02,4349.99 +4349.98,4349.99,4294.83,4297.05 +4299.15,4315.86,4294.32,4309.53 +4308.2,4322.57,4275.12,4283.24 +4283.24,4286.02,4256.92,4279.49 +4279.49,4283.46,4256.92,4257.97 +4257.96,4272.99,4239.0,4272.6 +4272.54,4295.62,4269.52,4283.65 +4283.66,4312.16,4264.32,4286.09 +4284.85,4296.0,4252.37,4262.01 +4261.55,4274.29,4239.0,4260.01 +4260.0,4260.98,4215.0,4253.12 +4253.12,4256.48,4236.01,4246.1 +4246.1,4262.9,4241.0,4242.93 +4242.93,4242.93,4211.01,4211.02 +4211.02,4225.4,4190.0,4195.35 +4191.64,4214.99,4187.21,4204.01 +4203.98,4220.04,4203.98,4205.5 +4205.5,4212.44,4129.2,4140.37 +4140.24,4164.44,4118.29,4144.45 +4144.45,4144.45,3753.0,3761.84 +3765.66,3796.4,3650.84,3737.94 +3737.97,3999.0,3725.0,3787.0 +3787.0,3818.21,3743.48,3759.7 +3755.7,3807.93,3748.39,3763.83 +3763.64,3773.58,3690.43,3733.55 +3733.52,3734.69,3615.0,3623.27 +3622.45,3695.48,3587.81,3642.01 +3642.01,3686.86,3604.26,3686.35 +3686.03,3698.51,3644.0,3665.57 +3665.58,3712.43,3660.0,3687.18 +3686.74,3715.62,3674.92,3685.57 +3685.28,3689.88,3580.0,3602.25 +3602.65,3910.0,3457.81,3791.87 +3791.85,3857.57,3723.44,3731.2 +3731.22,3838.04,3723.44,3765.64 +3765.5,3879.73,3759.52,3816.56 +3813.85,3830.54,3777.67,3783.28 +3783.27,3790.0,3692.27,3735.35 +3738.15,3738.27,3671.0,3706.71 +3706.71,3723.99,3627.0,3717.39 +3717.52,3717.52,3675.38,3710.87 +3710.32,3865.0,3707.11,3797.99 +3798.0,4023.73,3788.21,3902.82 +3902.82,4120.0,3892.52,4024.97 +4024.83,4090.0,3933.59,3958.76 +3958.73,3983.52,3910.15,3972.57 +3972.53,4047.99,3960.0,3960.0 +3960.01,3974.64,3899.0,3903.99 +3904.0,3988.97,3903.0,3988.43 +3988.98,3998.21,3945.0,3963.92 +3963.85,3980.0,3919.0,3919.17 +3919.04,3994.46,3910.44,3962.57 +3962.57,4076.25,3961.33,4028.67 +4028.31,4037.63,3953.32,3958.44 +3959.27,3974.8,3872.0,3908.97 +3908.97,3928.05,3838.0,3903.07 +3903.08,3949.0,3899.43,3900.0 +3898.22,3957.1,3890.75,3922.2 +3922.2,3925.0,3876.78,3911.63 +3912.27,3919.81,3823.78,3830.01 +3830.01,3830.01,3688.31,3725.01 +3725.0,3760.72,3593.14,3593.34 +3593.34,3796.58,3508.0,3725.35 +3725.35,3814.13,3711.37,3725.99 +3725.62,3828.79,3708.3,3783.8 +3783.8,3869.46,3757.18,3760.02 +3760.02,3768.38,3581.0,3651.4 +3651.71,3686.51,3557.69,3655.0 +3655.0,3710.0,3610.66,3622.99 +3622.99,3750.6,3622.99,3712.36 +3713.32,3776.29,3682.35,3725.24 +3725.24,3737.62,3641.07,3657.07 +3657.45,3746.51,3650.01,3734.72 +3734.71,3740.0,3666.08,3670.55 +3670.04,3725.99,3655.99,3701.26 +3701.27,3762.84,3698.13,3722.79 +3722.9,3800.0,3708.15,3772.84 +3769.11,3774.38,3718.15,3734.07 +3734.85,3740.0,3613.6,3644.33 +3645.09,3690.61,3634.7,3659.76 +3659.77,3740.0,3562.9,3681.1 +3681.1,3697.06,3630.0,3644.58 +3644.17,3709.59,3637.58,3703.84 +3703.04,3749.69,3658.82,3705.12 +3705.12,3735.0,3671.64,3680.99 +3681.0,3687.27,3636.01,3644.49 +3644.5,3710.0,3640.53,3681.36 +3681.36,3719.99,3670.5,3683.42 +3683.32,3734.27,3673.52,3722.0 +3722.0,3763.46,3691.51,3696.86 +3697.47,3729.99,3678.58,3717.32 +3717.33,3787.0,3692.87,3760.02 +3760.03,3830.0,3741.98,3779.64 +3779.75,3794.5,3758.33,3786.97 +3786.96,3837.94,3779.46,3795.41 +3795.41,3815.0,3785.9,3810.02 +3810.02,3833.0,3802.0,3818.89 +3818.89,3863.59,3812.02,3833.34 +3833.34,4072.95,3827.89,4036.9 +4038.78,4044.76,3975.33,3991.24 +3991.24,4012.0,3975.42,3977.14 +3977.14,4039.83,3968.28,4026.7 +4026.7,4026.71,3951.55,3970.69 +3970.69,3985.0,3962.07,3966.13 +3966.13,4026.9,3966.12,4018.01 +4018.01,4021.98,3980.27,3989.51 +3989.51,4151.65,3987.63,4119.98 +4119.98,4175.46,4112.0,4130.01 +4130.0,4239.0,4130.0,4176.5 +4176.5,4245.0,4140.07,4180.0 +4180.01,4200.0,4134.97,4146.51 +4146.51,4227.0,4146.5,4199.56 +4202.31,4284.99,4193.01,4269.66 +4269.66,4350.0,4251.0,4270.45 +4270.44,4365.0,4270.44,4285.01 +4285.01,4307.77,4209.11,4209.11 +4209.1,4213.99,4151.0,4199.36 +4199.37,4246.99,4180.0,4235.74 +4235.74,4237.04,4196.25,4203.37 +4203.37,4203.37,4077.88,4136.68 +4136.68,4160.0,4104.22,4150.41 +4150.41,4156.87,4091.87,4099.2 +4099.12,4155.0,4099.11,4139.52 +4139.26,4208.82,4136.09,4199.0 +4198.99,4200.0,4160.0,4173.71 +4173.71,4178.0,4125.0,4172.9 +4172.9,4241.0,4163.12,4241.0 +4241.0,4377.05,4233.09,4339.89 +4337.7,4339.89,4286.36,4315.0 +4314.99,4410.52,4314.99,4345.01 +4345.0,4352.09,4226.0,4226.23 +4226.23,4295.0,4194.09,4290.0 +4290.0,4315.0,4257.0,4283.48 +4283.49,4291.0,4221.69,4251.54 +4251.38,4325.0,4247.01,4319.01 +4319.0,4348.0,4263.94,4290.01 +4290.01,4310.0,4195.01,4210.0 +4210.0,4211.0,4144.73,4181.74 +4180.91,4227.68,4158.99,4175.01 +4175.01,4193.15,4110.0,4168.98 +4168.98,4242.0,4160.25,4242.0 +4242.0,4261.0,4219.9,4236.65 +4236.65,4238.98,4180.2,4191.0 +4191.0,4220.0,4171.84,4220.0 +4220.0,4290.0,4214.23,4263.07 +4263.07,4269.99,4242.01,4242.01 +4243.1,4295.0,4231.01,4295.0 +4295.0,4297.71,4255.0,4264.55 +4264.12,4279.33,4161.51,4167.52 +4167.52,4181.56,4136.04,4159.23 +4159.23,4196.78,4145.58,4151.67 +4152.0,4186.15,4132.0,4149.33 +4151.19,4159.08,3930.13,3944.4 +3944.4,3981.63,3931.0,3950.21 +3950.21,3990.04,3869.0,3960.99 +3960.99,4020.0,3940.13,3940.13 +3940.09,3988.02,3932.73,3959.01 +3959.01,3977.3,3906.33,3963.41 +3963.41,4020.0,3952.0,4007.42 +4007.42,4012.49,3985.0,3989.79 +3991.33,4003.42,3964.68,3976.31 +3976.28,3997.0,3936.36,3955.9 +3955.67,3982.0,3955.0,3961.47 +3960.25,3973.2,3870.0,3920.42 +3920.43,3959.71,3900.0,3953.25 +3953.19,3990.0,3940.0,3965.59 +3965.59,3984.27,3946.64,3973.01 +3972.94,3994.47,3960.0,3962.83 +3962.65,3972.15,3937.0,3946.46 +3946.46,3974.0,3940.02,3960.47 +3960.47,3963.56,3925.0,3955.0 +3955.0,3955.0,3913.49,3952.44 +3951.88,3951.92,3910.08,3927.14 +3927.14,3964.0,3920.53,3964.0 +3964.0,3983.39,3946.06,3957.61 +3957.61,3974.0,3957.3,3970.3 +3970.3,4146.99,3970.29,4118.78 +4116.95,4182.07,4110.0,4181.81 +4181.9,4184.99,4129.88,4142.45 +4141.66,4167.91,4122.09,4125.0 +4125.0,4162.0,4122.0,4148.91 +4148.91,4250.0,4135.0,4237.23 +4239.99,4277.0,4230.0,4240.59 +4242.08,4249.0,4199.14,4225.15 +4225.14,4236.0,4194.64,4215.0 +4214.99,4238.38,4205.82,4234.53 +4234.53,4234.54,4120.28,4159.99 +4161.45,4180.0,4135.01,4170.01 +4170.0,4195.0,4165.0,4173.59 +4169.76,4184.81,4134.99,4154.97 +4154.97,4180.0,4154.97,4174.39 +4174.39,4238.38,4162.0,4222.0 +4222.0,4264.57,4155.24,4159.75 +4159.75,4167.92,4113.0,4152.42 +4152.42,4152.42,4061.0,4071.47 +4071.47,4100.0,4055.67,4059.79 +4059.79,4106.09,4055.07,4080.2 +4080.01,4140.0,4075.0,4105.66 +4105.85,4172.0,4095.58,4166.84 +4166.38,4180.0,4127.17,4127.17 +4127.06,4127.06,4040.0,4057.78 +4057.78,4097.53,4036.0,4088.3 +4088.31,4119.0,4068.35,4112.6 +4112.6,4112.6,4055.31,4080.03 +4080.01,4133.0,4076.05,4111.16 +4111.17,4141.0,4077.73,4108.21 +4108.21,4128.65,4092.84,4092.84 +4092.8,4105.73,4069.68,4091.04 +4091.05,4110.0,4086.0,4100.7 +4100.71,4124.99,4080.91,4121.0 +4121.0,4185.0,4111.0,4166.59 +4166.59,4184.19,4140.31,4149.78 +4149.66,4150.98,4091.91,4138.0 +4138.0,4138.01,4066.2,4099.4 +4099.39,4100.0,4047.62,4081.48 +4081.48,4104.55,4059.01,4066.25 +4068.53,4068.53,3904.99,3945.01 +3945.01,3965.0,3936.42,3955.01 +3955.01,3975.93,3937.0,3964.01 +3963.25,3975.0,3943.15,3943.26 +3943.26,3962.09,3926.79,3950.17 +3950.18,3971.74,3935.0,3968.07 +3968.07,3988.0,3910.0,3972.1 +3972.04,3988.64,3967.56,3978.5 +3978.5,3995.0,3962.0,3963.67 +3963.26,3974.0,3952.91,3974.0 +3974.0,4018.43,3974.0,3986.59 +3986.6,3990.0,3965.09,3986.28 +3986.29,3995.08,3831.6,3839.25 +3839.28,3862.02,3789.06,3825.0 +3825.0,3825.78,3742.01,3820.01 +3820.01,3849.98,3807.04,3841.59 +3841.59,3841.59,3824.0,3838.32 +3838.01,3838.11,3809.84,3813.79 +3813.79,3829.84,3790.0,3824.09 +3823.73,3885.0,3823.55,3866.8 +3866.8,3869.0,3843.4,3848.8 +3848.8,3862.22,3825.01,3827.91 +3827.9,3872.38,3794.67,3858.14 +3858.12,3878.92,3848.08,3851.67 +3850.73,3851.98,3831.0,3836.01 +3836.0,3839.85,3774.01,3812.0 +3811.99,3834.0,3799.8,3809.79 +3809.8,3841.66,3732.43,3830.19 +3830.19,3976.0,3830.19,3936.59 +3935.05,3980.0,3932.01,3963.33 +3963.16,3964.96,3940.64,3959.18 +3959.1,3993.0,3947.18,3974.56 +3975.97,3976.67,3931.28,3947.27 +3947.27,3956.02,3930.0,3955.0 +3955.0,3957.0,3938.68,3941.01 +3941.01,3975.52,3938.0,3958.04 +3958.91,4035.1,3955.0,4027.73 +4028.0,4028.0,3946.0,3948.19 +3948.2,3955.0,3918.0,3918.01 +3918.0,3920.0,3885.74,3906.92 +3907.82,3918.45,3886.0,3908.74 +3908.71,3924.24,3895.46,3901.83 +3901.65,3908.52,3856.0,3865.98 +3865.98,3913.2,3860.66,3890.24 +3890.24,3904.26,3872.35,3893.09 +3891.12,3908.87,3878.13,3901.86 +3901.85,3912.53,3897.44,3906.18 +3906.18,3906.18,3845.54,3860.01 +3860.0,3872.0,3821.79,3850.25 +3850.25,3857.78,3818.55,3830.02 +3830.02,3833.4,3804.49,3825.2 +3825.2,3853.99,3821.1,3840.02 +3840.01,3854.83,3831.0,3845.66 +3845.66,3848.54,3779.5,3796.43 +3796.43,3825.0,3793.77,3815.87 +3818.53,3844.9,3800.01,3836.07 +3835.76,3859.28,3832.54,3835.0 +3835.01,3875.28,3817.33,3861.28 +3861.29,3875.65,3851.0,3856.45 +3856.45,3875.26,3825.59,3827.54 +3829.01,3833.29,3786.62,3825.0 +3825.0,3827.99,3803.51,3816.19 +3816.19,3816.19,3660.0,3692.22 +3692.21,3723.0,3676.0,3707.1 +3707.1,3735.09,3700.0,3713.15 +3715.26,3727.45,3698.0,3718.44 +3718.64,3736.06,3703.08,3727.01 +3727.0,3749.6,3703.0,3712.69 +3712.69,3721.64,3710.14,3720.0 +3720.0,3740.0,3675.49,3720.5 +3720.5,3740.85,3710.19,3725.01 +3725.01,3744.24,3715.25,3724.0 +3722.4,3725.72,3678.9,3711.99 +3711.98,3724.97,3705.5,3722.0 +3722.01,3757.21,3628.62,3757.21 +3756.85,3849.0,3755.0,3820.04 +3820.04,3822.72,3797.0,3805.02 +3805.02,3815.98,3799.1,3815.98 +3815.98,3825.0,3810.0,3811.66 +3811.66,3839.99,3811.66,3815.59 +3815.58,3815.59,3759.53,3771.81 +3771.8,3779.71,3761.7,3779.71 +3779.7,3785.0,3716.04,3726.5 +3726.5,3730.47,3646.78,3660.7 +3660.71,3718.39,3563.11,3658.36 +3658.36,3658.36,3577.68,3601.0 +3600.45,3641.86,3542.46,3575.0 +3575.01,3615.94,3554.0,3584.24 +3584.24,3604.17,3539.34,3584.36 +3584.09,3634.0,3576.24,3616.75 +3616.75,3633.7,3609.0,3632.1 +3632.0,3632.0,3584.15,3594.02 +3594.01,3624.26,3568.0,3611.96 +3611.96,3611.96,3378.18,3418.26 +3418.25,3478.91,3311.0,3375.68 +3375.6,3386.91,3310.0,3373.52 +3373.52,3383.39,3290.99,3318.86 +3318.86,3353.0,3300.0,3339.37 +3339.37,3370.22,3330.34,3336.69 +3337.22,3422.61,3335.62,3384.26 +3383.91,3391.07,3353.18,3377.31 +3377.32,3400.0,3365.22,3371.83 +3371.71,3398.0,3337.34,3338.23 +3338.13,3381.09,3338.13,3366.61 +3366.61,3395.0,3345.62,3371.67 +3371.69,3414.99,3361.0,3364.98 +3364.96,3404.55,3364.25,3370.01 +3370.01,3395.0,3370.0,3387.67 +3387.67,3419.89,3382.53,3397.89 +3397.89,3402.96,3306.47,3336.91 +3336.9,3340.0,3220.0,3238.46 +3238.46,3267.5,3212.0,3262.5 +3263.03,3269.05,3230.59,3252.89 +3252.89,3550.0,3252.89,3432.31 +3432.32,3443.99,3313.0,3342.33 +3342.32,3392.1,3314.18,3364.99 +3364.99,3408.0,3351.27,3385.99 +3385.99,3391.0,3358.02,3380.15 +3380.15,3471.19,3380.15,3438.86 +3438.85,3456.72,3422.31,3432.29 +3432.29,3435.42,3390.49,3425.54 +3425.53,3455.0,3425.53,3440.02 +3440.02,3495.0,3436.0,3442.5 +3442.5,3466.0,3420.92,3426.58 +3426.58,3437.0,3401.13,3437.0 +3436.99,3444.86,3408.0,3408.01 +3408.01,3420.7,3369.57,3380.0 +3380.0,3414.56,3370.75,3397.84 +3397.02,3414.26,3376.09,3396.03 +3396.03,3416.96,3385.52,3389.11 +3389.11,3392.11,3325.0,3352.45 +3352.44,3360.0,3310.0,3330.12 +3330.12,3349.99,3323.2,3345.76 +3345.75,3393.21,3339.41,3368.7 +3368.7,3397.0,3342.35,3350.01 +3350.01,3375.81,3346.41,3362.96 +3362.97,3410.0,3355.78,3368.5 +3368.49,3380.96,3333.81,3343.22 +3341.91,3348.73,3320.02,3348.73 +3347.73,3347.73,3253.66,3274.5 +3274.39,3449.0,3256.97,3416.71 +3416.71,3424.04,3380.0,3389.99 +3390.0,3423.59,3390.0,3400.0 +3400.0,3425.42,3394.83,3405.01 +3405.01,3425.04,3403.6,3423.01 +3423.01,3423.01,3393.28,3398.06 +3399.81,3412.83,3398.74,3408.72 +3409.06,3410.0,3394.58,3403.09 +3403.1,3425.0,3390.87,3414.86 +3414.77,3434.0,3399.95,3404.32 +3404.31,3414.69,3399.72,3414.69 +3413.97,3418.97,3393.51,3398.65 +3398.65,3400.32,3367.79,3393.3 +3393.3,3450.0,3376.0,3429.13 +3429.12,3440.73,3418.0,3426.31 +3424.75,3512.24,3422.34,3492.43 +3488.92,3535.0,3484.35,3503.0 +3503.0,3578.79,3488.41,3545.95 +3545.95,3624.92,3539.1,3624.91 +3624.91,3642.51,3550.55,3574.41 +3574.41,3592.0,3562.36,3578.41 +3578.41,3578.41,3542.0,3568.55 +3569.34,3588.0,3562.0,3577.0 +3577.0,3578.54,3509.33,3521.35 +3521.66,3548.12,3507.69,3528.57 +3528.57,3555.0,3518.08,3540.94 +3540.91,3573.99,3540.69,3569.49 +3569.49,3590.71,3556.09,3567.17 +3567.17,3567.17,3520.77,3521.0 +3521.0,3549.85,3514.11,3532.5 +3532.5,3544.18,3517.7,3540.55 +3540.55,3542.58,3525.0,3525.01 +3525.01,3525.01,3455.17,3467.25 +3467.24,3500.0,3462.02,3493.28 +3493.28,3493.28,3441.16,3447.07 +3447.06,3489.86,3445.08,3484.04 +3484.04,3498.94,3476.01,3496.46 +3496.46,3517.67,3475.75,3482.23 +3482.23,3482.99,3462.54,3482.99 +3482.99,3495.0,3475.0,3485.01 +3485.01,3485.01,3401.0,3401.01 +3401.0,3523.25,3377.0,3469.95 +3469.95,3477.71,3437.12,3443.45 +3443.71,3448.09,3406.01,3417.01 +3417.0,3430.0,3392.38,3411.77 +3411.77,3415.0,3354.97,3382.32 +3382.98,3419.41,3360.17,3397.29 +3397.28,3423.46,3382.0,3383.76 +3383.76,3420.21,3382.2,3414.0 +3414.0,3422.09,3393.23,3394.83 +3394.67,3408.25,3379.48,3383.37 +3383.37,3388.78,3371.0,3378.16 +3378.16,3389.0,3376.0,3382.01 +3382.01,3410.0,3378.0,3400.13 +3400.13,3419.0,3390.26,3400.1 +3400.11,3420.52,3396.59,3420.52 +3420.52,3424.92,3394.03,3394.03 +3394.02,3398.74,3372.08,3388.9 +3387.82,3407.99,3385.01,3399.58 +3399.78,3415.0,3388.0,3393.0 +3393.0,3395.02,3328.13,3338.8 +3338.8,3359.97,3326.91,3342.42 +3342.52,3347.02,3327.0,3336.52 +3335.72,3353.13,3332.33,3335.52 +3335.52,3345.14,3308.91,3338.48 +3338.82,3343.8,3311.0,3316.76 +3316.76,3339.0,3293.49,3328.9 +3328.9,3362.95,3325.0,3345.01 +3345.01,3350.22,3331.04,3337.99 +3337.99,3343.76,3326.0,3331.7 +3331.71,3391.67,3329.21,3375.0 +3374.91,3389.91,3359.0,3371.53 +3371.53,3373.64,3359.0,3372.69 +3372.46,3374.0,3329.01,3339.02 +3339.97,3344.18,3327.0,3329.92 +3329.92,3339.92,3325.58,3339.25 +3339.25,3352.27,3337.5,3347.1 +3347.5,3350.0,3335.0,3335.0 +3335.0,3346.0,3333.14,3346.0 +3345.99,3361.29,3342.9,3349.81 +3349.81,3375.0,3344.1,3367.97 +3367.87,3391.84,3366.0,3380.16 +3380.17,3383.72,3368.28,3372.24 +3372.56,3391.19,3371.84,3385.1 +3385.1,3430.63,3385.1,3429.26 +3428.83,3450.0,3405.01,3406.63 +3405.99,3416.79,3393.34,3396.69 +3396.7,3414.0,3391.01,3404.8 +3404.97,3418.8,3381.4,3392.34 +3392.35,3482.98,3386.98,3449.51 +3449.51,3486.16,3438.53,3447.78 +3447.79,3448.82,3419.66,3437.01 +3437.01,3449.99,3427.79,3434.01 +3434.01,3442.5,3429.78,3435.97 +3435.98,3441.57,3433.15,3439.1 +3439.1,3459.02,3430.53,3433.98 +3433.98,3437.63,3406.98,3407.01 +3407.0,3437.01,3407.0,3425.21 +3425.21,3439.63,3416.0,3417.24 +3417.25,3420.2,3372.92,3384.99 +3385.0,3391.1,3378.93,3379.99 +3379.99,3384.96,3375.0,3375.01 +3375.01,3377.89,3361.75,3367.93 +3367.93,3372.94,3335.0,3364.21 +3364.21,3366.99,3355.0,3363.01 +3363.0,3375.4,3355.5,3370.49 +3368.31,3405.1,3356.32,3383.91 +3383.91,3400.0,3377.99,3381.36 +3381.35,3387.5,3377.91,3382.76 +3380.99,3385.36,3354.89,3367.45 +3367.44,3412.95,3357.49,3400.95 +3400.95,3410.0,3386.98,3391.29 +3391.29,3399.43,3377.0,3377.01 +3377.01,3406.06,3377.01,3404.0 +3403.99,3404.0,3368.36,3368.37 +3367.89,3375.79,3360.39,3372.64 +3372.65,3380.0,3368.22,3375.0 +3375.01,3375.01,3300.0,3322.31 +3322.31,3323.26,3227.96,3250.01 +3250.01,3272.02,3241.1,3259.22 +3259.22,3273.08,3245.0,3264.89 +3264.93,3272.49,3250.24,3250.24 +3250.23,3294.9,3203.32,3280.01 +3280.01,3280.5,3261.79,3261.79 +3261.78,3264.8,3241.0,3256.05 +3256.05,3258.69,3230.35,3250.57 +3250.56,3266.69,3247.7,3265.93 +3265.93,3265.93,3252.23,3255.0 +3255.15,3276.0,3255.15,3268.31 +3268.31,3270.0,3255.31,3265.1 +3265.11,3280.0,3248.57,3249.81 +3250.0,3264.8,3250.0,3256.55 +3257.37,3272.57,3256.56,3269.63 +3269.01,3269.64,3242.82,3265.6 +3265.6,3276.52,3261.86,3267.39 +3267.11,3267.12,3232.13,3241.78 +3240.5,3258.57,3238.11,3247.36 +3247.36,3247.39,3211.96,3220.62 +3220.62,3227.4,3160.67,3169.21 +3170.0,3188.88,3170.0,3178.0 +3178.0,3181.54,3169.0,3174.26 +3174.26,3188.35,3171.93,3181.5 +3181.5,3185.68,3153.63,3168.36 +3168.95,3213.39,3135.0,3204.53 +3204.54,3244.38,3195.26,3212.08 +3212.07,3212.07,3187.52,3191.92 +3191.93,3218.09,3191.93,3209.42 +3211.37,3215.48,3200.23,3200.23 +3200.24,3217.33,3195.0,3215.27 +3215.27,3225.0,3210.35,3217.08 +3217.08,3228.69,3212.23,3216.01 +3216.01,3217.5,3205.11,3215.95 +3215.95,3217.9,3203.77,3205.64 +3205.64,3205.64,3193.09,3200.23 +3200.23,3209.1,3197.21,3198.07 +3198.07,3198.61,3145.51,3151.53 +3151.52,3160.0,3130.29,3152.82 +3153.45,3183.63,3153.45,3168.63 +3168.63,3175.45,3152.8,3162.73 +3162.73,3162.73,3132.44,3146.5 +3146.44,3161.71,3136.3,3147.81 +3149.25,3153.93,3128.89,3146.11 +3146.11,3157.48,3138.67,3152.2 +3152.2,3154.64,3142.32,3149.69 +3149.69,3154.03,3143.94,3149.07 +3149.06,3175.0,3149.05,3166.61 +3166.6,3194.46,3165.0,3180.24 +3180.25,3220.17,3180.24,3204.28 +3204.3,3205.88,3186.0,3186.01 +3186.0,3192.0,3181.24,3187.87 +3188.16,3192.78,3183.0,3192.51 +3191.06,3192.68,3181.24,3187.59 +3187.6,3240.0,3187.59,3222.17 +3222.17,3256.87,3222.17,3247.79 +3247.79,3249.5,3232.87,3233.99 +3234.0,3240.26,3232.45,3240.25 +3240.26,3245.0,3232.03,3234.5 +3234.5,3234.52,3212.5,3215.38 +3215.38,3222.0,3203.37,3213.2 +3213.2,3225.19,3210.89,3225.19 +3225.19,3240.54,3224.41,3230.01 +3230.01,3240.0,3224.33,3235.02 +3235.01,3258.0,3227.14,3228.25 +3228.25,3229.14,3217.25,3217.26 +3217.26,3217.26,3200.0,3204.27 +3204.27,3216.0,3194.44,3214.99 +3215.0,3225.51,3210.0,3214.39 +3214.39,3214.39,3204.0,3204.01 +3204.0,3211.0,3200.01,3205.5 +3205.69,3240.0,3203.69,3225.76 +3225.75,3228.91,3212.95,3217.56 +3217.56,3219.61,3198.0,3198.01 +3198.01,3202.67,3183.44,3201.01 +3201.01,3202.56,3185.0,3196.0 +3196.0,3220.0,3195.99,3207.12 +3207.13,3212.42,3190.0,3192.37 +3192.37,3203.87,3184.28,3202.68 +3202.68,3206.42,3197.54,3197.54 +3197.54,3209.61,3196.18,3205.81 +3205.81,3213.63,3202.3,3211.01 +3211.0,3222.0,3210.26,3213.77 +3213.77,3256.77,3213.77,3247.7 +3247.69,3248.4,3230.18,3233.01 +3233.0,3241.49,3230.13,3232.12 +3232.0,3241.38,3223.01,3236.94 +3236.77,3243.61,3227.15,3243.61 +3243.76,3447.49,3243.76,3410.0 +3410.0,3418.8,3370.01,3396.52 +3396.52,3412.05,3380.01,3391.0 +3390.99,3418.18,3379.0,3402.02 +3402.2,3434.89,3398.15,3421.02 +3421.46,3439.37,3411.0,3426.36 +3426.99,3575.0,3426.42,3558.34 +3558.48,3565.0,3511.85,3533.82 +3533.83,3585.95,3532.36,3540.01 +3540.01,3540.01,3481.27,3494.99 +3495.0,3513.72,3468.58,3484.76 +3484.77,3512.55,3481.6,3511.55 +3511.7,3530.61,3494.04,3498.02 +3498.01,3505.0,3485.0,3505.0 +3504.99,3517.84,3496.0,3504.38 +3504.68,3540.0,3503.86,3525.19 +3525.19,3532.0,3510.6,3511.49 +3511.5,3511.5,3480.06,3495.09 +3495.09,3497.41,3484.09,3488.05 +3488.06,3510.37,3488.05,3495.13 +3495.13,3498.09,3440.3,3444.01 +3444.01,3453.4,3436.5,3445.77 +3448.01,3468.0,3446.88,3461.38 +3461.39,3488.0,3443.6,3470.03 +3470.02,3484.1,3459.46,3471.0 +3471.0,3547.7,3471.0,3522.3 +3522.3,3571.92,3521.37,3561.66 +3561.66,3561.66,3511.0,3525.0 +3525.0,3535.0,3514.99,3530.41 +3531.0,3531.0,3493.3,3500.0 +3499.99,3500.0,3475.05,3494.5 +3494.5,3547.0,3494.0,3539.92 +3539.92,3550.0,3498.0,3518.0 +3518.0,3549.99,3517.99,3549.72 +3549.71,3568.0,3522.45,3561.0 +3561.0,3716.29,3561.0,3660.13 +3660.12,3672.5,3642.17,3663.91 +3664.49,3720.45,3664.49,3678.0 +3681.82,3745.65,3678.37,3722.67 +3722.67,3780.0,3722.66,3752.0 +3750.26,3760.0,3708.92,3718.75 +3718.76,3755.7,3716.52,3750.35 +3750.35,3764.66,3695.0,3700.57 +3700.57,3719.07,3685.0,3715.58 +3715.25,3725.04,3700.01,3720.3 +3720.31,3765.0,3720.31,3732.01 +3731.49,3791.51,3726.51,3775.71 +3775.71,3828.49,3775.7,3790.69 +3790.9,3847.46,3790.0,3842.5 +3842.5,3928.15,3833.56,3841.12 +3841.11,3850.0,3776.19,3799.08 +3797.54,3822.27,3745.08,3777.49 +3777.48,3809.31,3766.99,3793.4 +3793.4,3820.0,3770.0,3774.08 +3774.08,3810.0,3766.59,3792.49 +3792.49,3810.0,3736.0,3736.01 +3736.02,3745.13,3702.04,3722.78 +3722.77,3726.0,3637.17,3663.89 +3663.22,3723.0,3663.07,3718.35 +3718.85,3719.9,3664.46,3671.0 +3671.0,3720.32,3661.5,3709.0 +3709.01,3750.0,3702.22,3749.01 +3749.01,3762.42,3711.32,3712.41 +3712.41,3742.0,3706.95,3724.06 +3724.06,3743.0,3714.54,3738.21 +3738.2,3741.0,3680.58,3685.61 +3683.01,3733.26,3680.0,3696.28 +3696.29,3790.59,3696.28,3790.59 +3790.86,4072.92,3785.02,4055.25 +4055.26,4112.7,4000.0,4041.8 +4043.08,4082.29,4018.19,4082.29 +4082.28,4116.52,4005.92,4060.93 +4060.92,4111.19,4018.38,4027.4 +4027.41,4038.72,3973.11,4014.19 +4014.19,4073.43,3981.3,4050.01 +4050.01,4068.0,3982.67,4006.62 +4006.62,4175.0,4006.62,4152.42 +4152.41,4155.44,4040.0,4057.99 +4058.0,4079.9,4025.0,4054.45 +4053.14,4060.0,4031.44,4037.19 +4037.06,4037.06,3878.0,3923.85 +3923.84,4040.0,3922.7,4028.29 +4028.0,4085.0,4020.33,4059.85 +4059.21,4093.5,4025.5,4040.0 +4039.99,4064.98,4017.65,4049.28 +4049.28,4162.27,4028.03,4111.01 +4111.0,4111.01,4001.0,4013.84 +4012.81,4050.0,3980.0,4036.77 +4036.77,4047.0,4002.97,4025.78 +4025.78,4025.78,3896.09,3960.0 +3958.65,4022.13,3940.96,4009.99 +4007.75,4050.0,3961.39,4038.58 +4040.69,4070.0,3990.0,3991.3 +3991.3,4029.86,3962.69,3980.99 +3981.0,4029.0,3955.57,4022.11 +4022.11,4040.25,3991.38,4010.49 +4008.78,4098.54,3976.88,4058.0 +4058.0,4076.88,4006.66,4015.0 +4015.0,4063.01,4010.38,4019.27 +4019.0,4019.0,3958.69,3987.33 +3987.18,3995.0,3922.07,3957.62 +3957.62,3988.59,3899.38,3909.39 +3909.16,3950.0,3903.3,3942.0 +3942.0,3955.0,3795.0,3823.42 +3825.0,3833.93,3775.0,3785.74 +3785.19,3866.0,3784.98,3841.88 +3841.88,3847.32,3808.01,3812.5 +3812.51,3860.0,3807.5,3860.0 +3860.0,3862.0,3808.01,3820.45 +3819.96,3830.0,3810.0,3819.01 +3819.01,3842.83,3808.01,3831.42 +3831.42,3842.0,3815.5,3831.2 +3831.2,3834.26,3790.77,3812.34 +3812.91,3829.69,3790.16,3826.23 +3826.22,3841.0,3821.3,3833.96 +3833.97,3847.95,3819.66,3841.51 +3841.51,3855.98,3826.17,3843.5 +3843.51,3927.76,3843.5,3913.04 +3913.03,3918.7,3893.6,3904.33 +3904.32,3904.33,3868.0,3875.34 +3875.33,3875.34,3818.99,3826.63 +3826.63,3850.2,3811.85,3814.99 +3813.99,3835.0,3793.0,3822.86 +3822.86,3845.0,3818.48,3825.01 +3825.01,3884.9,3809.18,3844.95 +3844.95,3861.0,3831.0,3853.76 +3853.5,3880.59,3847.15,3868.03 +3868.4,3912.98,3852.02,3904.97 +3904.97,3918.78,3880.0,3901.02 +3902.91,3910.0,3850.1,3861.97 +3861.67,3909.33,3846.81,3909.33 +3909.32,4005.0,3903.65,3992.34 +3992.33,4022.37,3960.01,3992.35 +3992.36,4011.0,3972.5,3993.84 +3992.98,3992.98,3963.3,3973.01 +3973.01,4035.32,3973.0,4016.0 +4016.0,4025.73,3992.45,3998.71 +3998.71,4017.49,3982.0,3996.34 +3996.35,4007.69,3985.0,3985.01 +3985.01,3990.0,3954.95,3984.85 +3984.85,3990.0,3973.03,3987.16 +3987.16,4000.0,3981.65,3988.53 +3988.53,4050.0,3972.43,4015.97 +4015.77,4033.0,4010.49,4031.76 +4029.43,4030.47,4000.0,4009.9 +4009.9,4024.0,3982.69,3993.73 +3993.73,3995.62,3917.01,3926.97 +3926.97,3943.44,3910.98,3925.0 +3925.0,3970.0,3924.99,3958.29 +3958.24,3967.24,3936.13,3951.98 +3951.98,3995.33,3951.01,3975.23 +3977.38,3982.0,3935.41,3944.22 +3943.99,3960.01,3930.0,3955.02 +3955.02,3974.0,3939.88,3941.33 +3941.33,3954.6,3904.87,3942.7 +3942.7,3985.34,3928.14,3978.66 +3978.46,4215.0,3967.9,4153.77 +4153.15,4200.0,4151.0,4169.73 +4169.73,4197.0,4157.34,4173.71 +4173.69,4188.45,4164.0,4168.32 +4167.87,4182.97,4159.73,4182.97 +4182.98,4236.32,4175.0,4228.64 +4228.64,4228.89,4163.0,4189.35 +4189.34,4206.32,4184.0,4201.81 +4201.81,4213.96,4182.07,4185.48 +4184.97,4213.12,4179.34,4200.73 +4200.74,4200.74,4105.02,4125.0 +4124.97,4147.44,4115.0,4121.7 +4120.69,4137.5,4116.75,4128.77 +4128.77,4159.79,4128.76,4142.01 +4140.83,4219.63,4132.0,4205.48 +4205.48,4239.37,4023.1,4080.76 +4080.65,4093.0,4057.25,4090.29 +4090.29,4099.0,4041.45,4063.16 +4063.16,4089.0,4041.71,4047.39 +4047.39,4047.39,3981.01,4045.96 +4044.61,4046.0,4016.4,4027.79 +4027.79,4069.67,4027.79,4061.0 +4061.0,4075.53,4049.0,4059.55 +4059.54,4065.0,4025.0,4034.95 +4036.12,4036.12,3786.52,3823.9 +3823.89,3845.28,3790.29,3845.28 +3845.28,3849.99,3809.81,3833.2 +3833.2,3833.98,3703.0,3746.0 +3746.0,3779.5,3740.93,3778.11 +3778.11,3799.53,3770.87,3785.1 +3787.85,3793.5,3756.11,3793.5 +3793.5,3816.86,3746.93,3777.97 +3776.14,3780.71,3736.6,3758.89 +3758.39,3790.64,3745.07,3781.84 +3781.22,3781.23,3745.0,3762.64 +3761.42,3780.0,3709.0,3747.85 +3747.85,3780.0,3745.09,3760.65 +3760.65,3788.96,3742.79,3758.63 +3758.63,3770.0,3725.53,3748.89 +3746.8,3760.0,3676.15,3743.49 +3743.3,3760.0,3717.92,3718.08 +3718.22,3733.68,3688.01,3712.34 +3712.34,3750.12,3701.96,3745.0 +3745.01,3791.64,3724.78,3783.01 +3783.0,3814.49,3751.95,3783.0 +3782.98,3801.56,3770.0,3801.55 +3801.55,3815.0,3765.29,3775.2 +3775.21,3781.5,3735.0,3767.2 +3767.2,3789.0,3756.0,3789.0 +3789.0,3849.2,3788.99,3800.73 +3800.73,3846.0699999999997,3803.05,3812.46 +3812.46,3842.94,3817.11,3824.19 +3824.19,3838.81,3817.11,3824.16 +3824.16,3837.45,3818.08,3835.28 +3835.28,3835.37,3777.84,3778.01 +3778.01,3790.0,3753.62,3771.85 +3771.88,3772.37,3738.43,3757.77 +3757.51,3764.68,3725.0,3734.18 +3735.4,3754.05,3728.75,3745.01 +3745.01,3759.0,3741.59,3745.01 +3745.01,3769.77,3743.31,3766.18 +3766.17,3784.08,3748.0,3748.01 +3748.0,3748.01,3685.02,3737.0 +3736.98,3753.0,3718.11,3720.15 +3720.16,3768.08,3719.45,3758.54 +3758.54,3765.0,3738.01,3753.01 +3753.01,3808.9,3741.71,3796.09 +3796.09,3818.34,3783.84,3800.08 +3800.09,3800.09,3754.4,3760.72 +3760.72,3780.8,3745.0,3780.8 +3780.79,3829.91,3770.4,3807.0 +3807.0,3827.0,3787.43,3794.13 +3794.6,3841.21,3784.01,3826.52 +3826.01,3827.5,3741.81,3754.82 +3754.99,3764.0,3728.0,3757.7 +3757.69,3759.99,3734.0,3752.5 +3753.61,3755.03,3740.77,3740.77 +3740.49,3745.0,3700.0,3740.42 +3741.37,3750.0,3732.27,3750.0 +3750.0,3753.62,3727.25,3750.04 +3750.04,3759.99,3725.93,3735.0 +3735.0,3756.86,3734.99,3751.85 +3751.85,3766.11,3725.14,3738.16 +3738.17,3753.42,3714.31,3750.2 +3750.2,3754.68,3740.0,3744.35 +3744.35,3773.99,3742.51,3747.69 +3747.69,3756.67,3734.0,3748.86 +3748.85,3750.58,3723.35,3744.65 +3744.64,3768.69,3740.0,3740.0 +3740.01,3751.48,3740.0,3740.01 +3740.01,3749.5,3610.5,3612.61 +3612.6,3639.0,3588.0,3600.01 +3600.0,3602.2,3569.01,3590.0 +3590.0,3604.49,3582.44,3589.8 +3589.98,3594.0,3575.55,3590.04 +3590.04,3617.02,3567.0,3610.01 +3610.01,3612.0,3592.35,3609.92 +3608.7,3609.45,3591.02,3606.48 +3606.48,3606.57,3598.12,3606.41 +3606.41,3607.99,3592.76,3597.95 +3597.92,3599.0,3591.52,3598.98 +3598.98,3603.45,3596.92,3599.98 +3599.98,3600.69,3576.12,3600.0 +3600.0,3616.0,3600.0,3604.14 +3604.62,3633.46,3604.62,3616.33 +3616.33,3625.0,3604.77,3612.25 +3612.25,3617.01,3610.34,3615.58 +3616.62,3638.95,3614.99,3620.01 +3620.01,3620.4,3603.79,3608.65 +3608.65,3615.0,3602.0,3614.44 +3614.44,3615.0,3605.01,3615.0 +3614.99,3899.99,3612.13,3863.01 +3863.0,3881.44,3838.0,3846.91 +3846.91,3862.13,3834.27,3858.01 +3858.01,3971.58,3843.05,3934.35 +3934.49,3946.85,3865.74,3878.6 +3878.6,3911.86,3875.0,3890.27 +3890.27,3925.0,3886.98,3893.91 +3893.85,3899.71,3852.55,3873.84 +3873.84,3893.21,3865.79,3888.01 +3888.01,3919.5,3888.0,3888.01 +3888.01,3909.61,3888.0,3896.01 +3896.01,3896.85,3872.0,3881.0 +3881.0,3894.06,3880.02,3884.45 +3884.45,3894.38,3869.0,3890.01 +3890.01,3890.01,3878.0,3878.0 +3878.0,3900.0,3875.0,3897.67 +3897.66,3918.17,3881.83,3900.0 +3899.99,3937.67,3896.78,3910.55 +3911.62,3911.62,3870.93,3880.0 +3880.01,3884.15,3840.04,3860.96 +3860.96,3880.1,3856.98,3862.25 +3860.96,3888.49,3853.08,3874.0 +3874.01,3889.32,3867.61,3886.01 +3886.01,3886.01,3852.17,3865.53 +3866.4,3882.19,3813.13,3825.55 +3825.18,3847.93,3825.0,3833.02 +3833.02,3845.43,3820.0,3840.89 +3840.79,3843.52,3825.0,3832.1 +3832.11,3843.52,3827.57,3843.51 +3843.52,3873.71,3842.66,3857.45 +3857.45,3931.76,3857.44,3904.0 +3903.99,3909.46,3892.21,3896.66 +3896.66,3944.33,3706.0,3744.99 +3744.99,3745.0,3691.01,3724.08 +3724.08,3742.3,3722.11,3737.02 +3737.54,3745.0,3734.66,3740.0 +3739.97,3741.1,3733.6,3737.0 +3737.0,3767.79,3736.99,3760.0 +3760.0,3763.21,3749.0,3758.27 +3758.27,3766.4,3753.74,3757.13 +3757.13,3762.75,3752.0,3756.3 +3756.59,3804.18,3753.42,3786.39 +3786.27,3858.07,3779.99,3839.53 +3839.53,3848.93,3823.3,3833.27 +3833.27,3838.42,3819.71,3834.42 +3834.41,3863.06,3739.73,3813.0 +3813.01,3815.91,3775.37,3795.45 +3795.45,3832.96,3794.36,3819.25 +3819.26,3820.0,3792.44,3806.01 +3806.09,3810.0,3794.41,3809.22 +3809.23,3819.99,3802.46,3819.99 +3819.99,3819.99,3803.66,3817.09 +3817.09,3831.71,3760.54,3799.83 +3799.82,3825.1,3798.76,3817.64 +3817.64,3856.53,3790.91,3819.08 +3819.08,3825.0,3810.02,3821.0 +3820.99,3844.26,3810.0,3828.11 +3828.12,3829.1,3783.25,3796.9 +3798.65,3812.55,3781.0,3792.49 +3792.5,3793.96,3760.0,3772.5 +3772.5,3790.0,3772.5,3790.0 +3790.0,3790.0,3781.45,3784.13 +3784.13,3786.0,3772.96,3780.62 +3780.61,3783.0,3778.1,3782.92 +3782.92,3788.94,3772.96,3772.96 +3772.95,3782.68,3772.05,3782.55 +3782.55,3815.0,3780.0,3795.0 +3795.01,3802.66,3795.0,3795.0 +3795.01,3795.01,3704.0,3740.44 +3740.22,3763.31,3738.93,3763.31 +3761.93,3762.39,3748.56,3750.78 +3750.78,3797.48,3733.0,3754.72 +3756.29,3788.23,3750.58,3761.93 +3761.92,3765.0,3742.57,3753.91 +3753.88,3755.09,3729.18,3746.32 +3746.32,3755.76,3743.25,3746.32 +3746.32,3746.85,3625.0,3674.95 +3673.9,3686.0,3668.86,3681.98 +3681.98,3681.98,3661.13,3664.37 +3664.37,3696.05,3664.14,3692.24 +3692.23,3698.34,3671.6,3686.01 +3686.01,3701.73,3680.63,3688.59 +3689.5,3693.67,3672.87,3678.0 +3678.0,3679.0,3666.4,3678.9 +3678.9,3684.0,3678.13,3683.99 +3684.0,3700.0,3679.14,3685.61 +3685.61,3690.0,3684.62,3690.0 +3690.0,3695.0,3689.0,3692.84 +3692.85,3715.0,3692.84,3706.0 +3706.01,3721.86,3700.94,3709.01 +3709.01,3713.05,3690.0,3695.37 +3695.37,3709.51,3695.36,3709.51 +3709.51,3716.02,3699.0,3699.01 +3699.01,3716.05,3699.01,3715.67 +3715.66,3745.0,3690.0,3710.48 +3710.48,3710.48,3681.2,3685.92 +3685.31,3689.75,3671.36,3677.84 +3677.82,3695.0,3677.1,3691.36 +3691.4,3702.4,3680.0,3687.02 +3687.02,3687.02,3651.02,3672.5 +3672.5,3718.0,3672.0,3713.99 +3713.99,3737.09,3709.66,3733.01 +3733.0,3733.01,3715.0,3723.02 +3723.02,3723.02,3712.57,3719.99 +3719.99,3841.17,3719.98,3820.0 +3820.0,3831.44,3790.6,3805.99 +3806.0,3806.0,3790.85,3796.64 +3796.64,3809.99,3791.95,3801.24 +3801.18,3807.66,3795.45,3796.12 +3795.51,3803.03,3790.29,3799.05 +3799.05,3801.2,3795.05,3795.06 +3795.06,3799.13,3770.07,3796.72 +3797.04,3804.41,3781.0,3800.0 +3799.01,3809.99,3789.9,3799.0 +3799.0,3800.87,3789.0,3792.5 +3792.5,3810.0,3789.96,3801.02 +3801.02,3830.02,3798.46,3800.74 +3800.73,3821.41,3799.0,3817.1 +3817.1,3853.0,3817.1,3835.02 +3835.02,3835.02,3817.05,3829.01 +3829.01,3829.99,3810.0,3817.96 +3817.95,3886.64,3813.0,3847.4 +3847.4,3864.95,3840.01,3840.01 +3840.01,3850.0,3837.0,3847.39 +3847.31,3848.0,3820.12,3843.14 +3843.14,3880.46,3839.56,3868.24 +3868.23,3899.0,3858.43,3881.94 +3881.94,3916.57,3877.0,3903.21 +3902.89,3915.0,3886.87,3890.0 +3890.0,3893.8,3863.01,3871.0 +3870.99,3875.0,3851.0,3871.14 +3871.13,3874.78,3860.0,3866.59 +3866.58,3876.37,3866.58,3873.21 +3873.21,3881.57,3863.01,3867.39 +3866.54,3866.54,3832.0,3851.16 +3851.16,3852.26,3841.0,3848.5 +3848.5,3858.51,3845.27,3846.51 +3846.51,3850.0,3826.0,3831.0 +3831.0,3837.5,3815.2,3837.5 +3837.49,3843.0,3831.95,3831.95 +3831.41,3836.35,3823.72,3833.5 +3833.5,3850.99,3827.08,3848.01 +3848.01,3851.0,3837.25,3837.44 +3837.45,3844.43,3826.0,3838.82 +3838.82,3845.0,3835.0,3835.51 +3835.01,3835.95,3758.07,3772.95 +3772.95,3788.12,3770.5,3774.45 +3774.72,3787.27,3767.0,3784.0 +3784.0,3784.9,3771.01,3782.92 +3782.92,3801.56,3782.91,3795.0 +3794.99,3801.27,3784.06,3787.22 +3786.16,3797.84,3780.01,3792.83 +3792.82,3792.83,3763.87,3770.0 +3770.0,3777.79,3752.98,3777.79 +3777.78,3790.0,3772.51,3781.8 +3781.81,3782.0,3773.61,3776.71 +3776.71,3819.55,3775.69,3797.68 +3797.68,3799.46,3782.58,3798.43 +3798.43,3799.99,3786.68,3797.29 +3797.29,3813.16,3795.67,3805.73 +3805.73,3819.73,3802.85,3810.16 +3810.16,3816.5,3776.0,3778.0 +3778.0,3788.99,3778.0,3783.74 +3783.74,3797.02,3779.5,3791.58 +3791.58,3802.08,3778.26,3792.78 +3792.13,3792.74,3755.94,3781.87 +3781.87,3785.0,3774.29,3780.87 +3781.33,3782.39,3730.0,3748.66 +3748.66,3752.9,3745.0,3751.0 +3751.0,3774.26,3750.78,3770.08 +3770.08,3770.82,3763.0,3767.54 +3767.54,3769.48,3755.0,3758.9 +3758.91,3765.8,3755.01,3756.48 +3756.48,3810.0,3756.4,3795.93 +3795.94,3849.0,3795.18,3837.1 +3837.1,3837.1,3816.87,3827.84 +3827.83,3832.47,3820.0,3823.54 +3823.54,3874.12,3823.53,3853.25 +3853.25,3853.25,3830.12,3848.0 +3848.0,3850.0,3837.0,3840.33 +3840.32,3850.0,3835.55,3846.5 +3846.5,3849.85,3842.0,3847.45 +3847.45,3861.36,3845.49,3856.99 +3856.99,3857.01,3827.41,3832.0 +3832.0,3835.0,3820.66,3826.42 +3826.42,3836.03,3824.47,3830.46 +3830.46,3834.25,3824.0,3824.01 +3824.01,3833.0,3813.79,3829.14 +3829.14,3848.71,3828.83,3841.0 +3839.01,3845.0,3825.0,3829.33 +3828.14,3832.56,3825.0,3825.01 +3825.01,3831.54,3823.09,3829.99 +3829.99,3850.49,3819.77,3829.53 +3830.45,3840.0,3825.51,3835.33 +3835.33,3842.84,3831.0,3835.42 +3835.41,3848.89,3831.44,3845.01 +3845.01,3853.83,3837.5,3837.5 +3837.51,3843.83,3824.5,3838.56 +3838.18,3839.25,3830.55,3830.97 +3830.98,3832.37,3775.0,3798.57 +3798.57,3802.01,3790.0,3797.36 +3797.36,3806.0,3792.74,3802.89 +3802.89,3804.0,3756.01,3785.66 +3785.66,3797.0,3785.65,3797.0 +3797.0,3801.0,3796.95,3797.81 +3797.81,3800.38,3785.56,3800.0 +3799.99,3806.55,3797.81,3798.29 +3798.28,3801.96,3795.31,3795.9 +3795.9,3798.0,3786.0,3789.07 +3788.28,3798.0,3787.06,3798.0 +3798.0,3800.02,3797.99,3798.86 +3798.87,3832.16,3795.94,3830.0 +3830.0,3835.11,3814.49,3833.92 +3833.92,3833.92,3805.14,3810.01 +3810.02,3824.69,3810.01,3817.0 +3817.0,3823.93,3811.99,3823.93 +3823.93,3836.0,3823.92,3826.09 +3827.74,3849.99,3825.58,3842.22 +3844.47,4088.0,3841.0,4056.49 +4056.64,4070.0,4033.46,4056.0 +4056.0,4060.07,4050.39,4059.4 +4059.4,4060.0,4030.06,4033.27 +4033.26,4043.0,4023.0,4038.8 +4038.83,4044.63,4022.5,4037.92 +4037.93,4066.47,4037.93,4062.74 +4062.73,4070.0,4048.18,4048.18 +4048.01,4049.53,4022.01,4032.02 +4032.02,4037.49,4020.0,4032.51 +4032.52,4039.97,4030.78,4039.96 +4039.97,4040.0,4026.0,4027.23 +4028.23,4040.0,4027.0,4033.11 +4034.03,4043.93,4030.0,4036.01 +4036.01,4042.04,4032.0,4042.04 +4042.03,4053.03,4035.0,4042.17 +4043.44,4049.06,3968.79,4018.75 +4018.73,4027.04,4000.01,4008.01 +4008.0,4020.0,4008.0,4019.5 +4019.5,4022.52,3998.11,4010.5 +4010.49,4023.58,4001.17,4018.52 +4018.51,4036.0,4018.51,4029.86 +4029.87,4034.84,4004.0,4010.99 +4011.0,4026.0,4010.99,4020.07 +4020.07,4023.52,3976.05,4020.93 +4020.94,4029.52,4011.77,4019.01 +4019.01,4025.0,4016.86,4016.99 +4017.0,4020.0,4000.0,4013.5 diff --git a/jesse/rl/main.py b/jesse/rl/main.py new file mode 100644 index 000000000..f225cec82 --- /dev/null +++ b/jesse/rl/main.py @@ -0,0 +1,218 @@ +from prettytable import PrettyTable as PrettyTable +from jesse.rl.utils import load_data, print_stats, plot_multiple_conf_interval +import random +import os +#from google.colab import drive +#drive.mount('/content/drive') +from Environment import Environment +from Agent import Agent + + + +def main(): + #----------------------------- LOAD DATA --------------------------------------------------------------------------- + path = './jesse/rl/' + df = load_data(path) + + + # ----------------------------- AGENTS COMPARISON -------------------------------- + REPLAY_MEM_SIZE = 10000 + BATCH_SIZE = 40 + GAMMA = 0.98 + EPS_START = 1 + EPS_END = 0.12 + EPS_STEPS = 300 + LEARNING_RATE = 0.001 + INPUT_DIM = 24 + HIDDEN_DIM = 120 + ACTION_NUMBER = 3 + TARGET_UPDATE = 10 + N_TEST = 10 + TRADING_PERIOD = 4000 + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=False) + + double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=True) + + dueling_double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='ddqn', + DOUBLE=True) + + train_size = int(TRADING_PERIOD * 0.8) + profit_dqn_return = [] + sharpe_dqn_return = [] + profit_ddqn_return = [] + sharpe_ddqn_return = [] + profit_dueling_ddqn_return = [] + sharpe_dueling_ddqn_return = [] + + #profit_train_env = Environment(df[index:index + train_size], "profit") + sharpe_train_env = Environment(df[index:index + train_size], "sr") + + # ProfitDQN + #cr_profit_dqn = dqn_agent.train(profit_train_env, path) + #profit_train_env.reset() + + # Profit Double DQN + #cr_profit_ddqn = double_dqn_agent.train(profit_train_env, path) + #profit_train_env.reset() + + # Profit Dueling Double DQN + #cr_profit_dueling_ddqn = dueling_double_dqn_agent.train(profit_train_env, path) + #profit_train_env.reset() + + i = 0 + while i < N_TEST: + print("Test nr. %s" % str(i+1)) + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + profit_test_env = Environment(df[index + train_size:index + TRADING_PERIOD], "profit") + + # ProfitDQN + cr_profit_dqn_test, _ = dqn_agent.test(profit_test_env, model_name="profit_reward_dqn_model" , path=path) + profit_dqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + # Profit Double DQN + cr_profit_ddqn_test, _ = double_dqn_agent.test(profit_test_env, model_name="profit_reward_double_dqn_model" , path=path) + profit_ddqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + # Profit Dueling Double DQN + cr_profit_dueling_ddqn_test, _ = dueling_double_dqn_agent.test(profit_test_env, model_name="profit_reward_double_ddqn_model" , path=path) + profit_dueling_ddqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + i += 1 + + dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=False) + + double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=True) + + dueling_double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='ddqn', + DOUBLE=True) + + # SharpeDQN + #cr_sharpe_dqn = dqn_agent.train(sharpe_train_env, path) + #sharpe_train_env.reset() + + # Sharpe Double DQN + #cr_sharpe_ddqn = double_dqn_agent.train(sharpe_train_env, path) + #sharpe_train_env.reset() + + # Sharpe Dueling Double DQN + #cr_sharpe_dueling_ddqn = dueling_double_dqn_agent.train(sharpe_train_env, path) + #sharpe_train_env.reset() + + i = 0 + while i < N_TEST: + print("Test nr. %s"%str(i+1)) + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + sharpe_test_env = Environment(df[index + train_size:index + TRADING_PERIOD], "sr") + + # SharpeDQN + cr_sharpe_dqn_test, _ = dqn_agent.test(sharpe_test_env, model_name="sr_reward_dqn_model", path=path) + sharpe_dqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + # Sharpe Double DQN + cr_sharpe_ddqn_test, _ = double_dqn_agent.test(sharpe_test_env, model_name="sr_reward_double_dqn_model" , path=path) + sharpe_ddqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + # Sharpe Dueling Double DQN + cr_sharpe_dueling_ddqn_test, _ = dueling_double_dqn_agent.test(sharpe_test_env, model_name="sr_reward_double_ddqn_model" , path=path) + sharpe_dueling_ddqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + i += 1 + + #--------------------------------------- Print Test Stats --------------------------------------------------------- + t = PrettyTable(["Trading System", "Avg. Return (%)", "Max Return (%)", "Min Return (%)", "Std. Dev."]) + print_stats("ProfitDQN", profit_dqn_return, t) + print_stats("SharpeDQN", sharpe_dqn_return, t) + print_stats("ProfitDDQN", profit_ddqn_return, t) + print_stats("SharpeDDQN", sharpe_ddqn_return, t) + print_stats("ProfitD-DDQN", profit_dueling_ddqn_return, t) + print_stats("SharpeD-DDQN", sharpe_dueling_ddqn_return, t) + + print(t) + plot_multiple_conf_interval(["ProfitDQN", "SharpeDQN", "ProfitDDQN","SharpeDDQN","ProfitD-DDQN","SharpeD-DDQN"], + [profit_dqn_return,sharpe_dqn_return,profit_ddqn_return,sharpe_ddqn_return, + profit_dueling_ddqn_return,sharpe_dueling_ddqn_return]) + + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/jesse/rl/models.py b/jesse/rl/models.py new file mode 100644 index 000000000..3332e9955 --- /dev/null +++ b/jesse/rl/models.py @@ -0,0 +1,133 @@ +from torch import nn + +# Definition of the netwroks +class DQN(nn.Module): + # Deep Q Network + def __init__(self, obs_len, hidden_size, actions_n): + super(DQN, self).__init__() + # we might want Conv1d ? + self.fc_val = nn.Sequential( + nn.Linear(obs_len, hidden_size), + nn.LeakyReLU(), + nn.Linear(hidden_size, hidden_size), + nn.LeakyReLU(), + nn.Linear(hidden_size, actions_n) + ) + + def forward(self, x): + h = self.fc_val(x) + return h + + + +class DuelingDQN(nn.Module): + # Linear Dueling Deep Q Network + def __init__(self, obs_len, hidden_size, actions_n): + super(DuelingDQN, self).__init__() + + self.feauture_layer = nn.Sequential( + nn.Linear(obs_len, hidden_size), + nn.LeakyReLU(), + nn.Linear(hidden_size, hidden_size), + nn.LeakyReLU(), + ) + + self.value_stream = nn.Sequential( + nn.Linear(hidden_size, hidden_size), + nn.LeakyReLU(), + nn.Linear(hidden_size, 1), + ) + + self.advantage_stream = nn.Sequential( + nn.Linear(hidden_size, hidden_size), + nn.LeakyReLU(), + nn.Linear(hidden_size, actions_n) + ) + + def forward(self, state): + features = self.feauture_layer(state) + values = self.value_stream(features) + advantages = self.advantage_stream(features) + qvals = values + (advantages - advantages.mean()) + + return qvals + + +# Convolutional DQN +class ConvDQN(nn.Module): + def __init__(self, seq_len_in, actions_n, kernel_size=8): + super(ConvDQN, self).__init__() + n_filters = 64 + max_pool_kernel = 2 + self.conv1 = nn.Conv1d(1, n_filters, kernel_size) + self.maxPool = nn.MaxPool1d(max_pool_kernel, stride=1) + self.LRelu = nn.LeakyReLU() + self.conv2 = nn.Conv1d(n_filters, n_filters, kernel_size // 2) + + self.hidden_dim = n_filters * (((( + seq_len_in - kernel_size + 1) - max_pool_kernel + 1) - kernel_size // 2 + 1) - max_pool_kernel + 1) + + self.out_layer = nn.Linear(self.hidden_dim, actions_n) + + def forward(self, x): + c1_out = self.conv1(x) + max_pool_1 = self.maxPool(self.LRelu(c1_out)) + c2_out = self.conv2(max_pool_1) + max_pool_2 = self.maxPool(self.LRelu(c2_out)) + # print("c1_out:\t%s"%str(c1_out.shape)) + # print("max_pool_1:\t%s"%str(max_pool_1.shape)) + # print("c2_out:\t%s"%str(c2_out.shape)) + # print("max_pool_2:\t%s"%str(max_pool_2.shape)) + + max_pool_2 = max_pool_2.view(-1, self.hidden_dim) + # print("max_pool_2_view:\t%s"%str(max_pool_2.shape)) + + return self.LRelu(self.out_layer(max_pool_2)) + + +# Convolutional Dueling DQN +class ConvDuelingDQN(nn.Module): + def __init__(self, seq_len_in, actions_n, kernel_size=8): + super(ConvDuelingDQN, self).__init__() + n_filters = 64 + max_pool_kernel = 2 + self.conv1 = nn.Conv1d(1, n_filters, kernel_size) + self.maxPool = nn.MaxPool1d(max_pool_kernel, stride=1) + self.LRelu = nn.LeakyReLU() + self.conv2 = nn.Conv1d(n_filters, n_filters, kernel_size // 2) + self.hidden_dim = n_filters * (((( + seq_len_in - kernel_size + 1) - max_pool_kernel + 1) - kernel_size // 2 + 1) - max_pool_kernel + 1) + paper_hidden_dim = 120 + self.split_layer = nn.Linear(self.hidden_dim, paper_hidden_dim) + + self.value_stream = nn.Sequential( + nn.Linear(paper_hidden_dim, paper_hidden_dim), + nn.LeakyReLU(), + nn.Linear(paper_hidden_dim, 1), + ) + + self.advantage_stream = nn.Sequential( + nn.Linear(paper_hidden_dim, paper_hidden_dim), + nn.LeakyReLU(), + nn.Linear(paper_hidden_dim, actions_n) + ) + + def forward(self, x): + c1_out = self.conv1(x) + max_pool_1 = self.maxPool(self.LRelu(c1_out)) + c2_out = self.conv2(max_pool_1) + max_pool_2 = self.maxPool(self.LRelu(c2_out)) + # DEBUG code: + # print("c1_out:\t%s"%str(c1_out.shape)) + # print("max_pool_1:\t%s"%str(max_pool_1.shape)) + # print("c2_out:\t%s"%str(c2_out.shape)) + # print("max_pool_2:\t%s"%str(max_pool_2.shape)) + + max_pool_2 = max_pool_2.view(-1, self.hidden_dim) + # print("max_pool_2_view:\t%s"%str(max_pool_2.shape)) + + split = self.split_layer(max_pool_2) + values = self.value_stream(split) + advantages = self.advantage_stream(split) + qvals = values + (advantages - advantages.mean()) + return qvals diff --git a/jesse/rl/profit_reward_double_ddqn_model b/jesse/rl/profit_reward_double_ddqn_model new file mode 100644 index 000000000..d79aaf38a Binary files /dev/null and b/jesse/rl/profit_reward_double_ddqn_model differ diff --git a/jesse/rl/profit_reward_double_dqn_model b/jesse/rl/profit_reward_double_dqn_model new file mode 100644 index 000000000..364a5dc0d Binary files /dev/null and b/jesse/rl/profit_reward_double_dqn_model differ diff --git a/jesse/rl/profit_reward_dqn_model b/jesse/rl/profit_reward_dqn_model new file mode 100644 index 000000000..85612dcbf Binary files /dev/null and b/jesse/rl/profit_reward_dqn_model differ diff --git a/jesse/rl/sr_reward_double_ddqn_model b/jesse/rl/sr_reward_double_ddqn_model new file mode 100644 index 000000000..726910825 Binary files /dev/null and b/jesse/rl/sr_reward_double_ddqn_model differ diff --git a/jesse/rl/sr_reward_double_dqn_model b/jesse/rl/sr_reward_double_dqn_model new file mode 100644 index 000000000..db99f4326 Binary files /dev/null and b/jesse/rl/sr_reward_double_dqn_model differ diff --git a/jesse/rl/sr_reward_dqn_model b/jesse/rl/sr_reward_dqn_model new file mode 100644 index 000000000..815d53177 Binary files /dev/null and b/jesse/rl/sr_reward_dqn_model differ diff --git a/jesse/rl/train_test.py b/jesse/rl/train_test.py new file mode 100644 index 000000000..2fa8a52ff --- /dev/null +++ b/jesse/rl/train_test.py @@ -0,0 +1,219 @@ +from prettytable import PrettyTable as PrettyTable +from jesse.rl.utils import load_data, print_stats, plot_multiple_conf_interval +import random +import warnings +# from google.colab import drive +# drive.mount('/content/drive') +from jesse.rl.Environment import Environment +from jesse.rl.Agent import Agent + + +def main(): + # ----------------------------- LOAD DATA --------------------------------------------------------------------------- + path = 'jesse/rl/' + df = load_data(path) + + # ----------------------------- AGENTS COMPARISON -------------------------------- + REPLAY_MEM_SIZE = 10000 + BATCH_SIZE = 40 + GAMMA = 0.98 + EPS_START = 1 + EPS_END = 0.12 + EPS_STEPS = 300 + LEARNING_RATE = 0.001 + INPUT_DIM = 24 + HIDDEN_DIM = 120 + ACTION_NUMBER = 3 + TARGET_UPDATE = 10 + N_TEST = 10 + TRADING_PERIOD = 4000 + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=False) + if str(dqn_agent.device) == "cpu": + warnings.warn("Device is set to CPU. This will lead to a very slow training. Consider to run pretained models by" + "executing main.py script instead of train_test.py!") + + + double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=True) + + dueling_double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='ddqn', + DOUBLE=True) + + train_size = int(TRADING_PERIOD * 0.8) + profit_dqn_return = [] + sharpe_dqn_return = [] + profit_ddqn_return = [] + sharpe_ddqn_return = [] + profit_dueling_ddqn_return = [] + sharpe_dueling_ddqn_return = [] + + profit_train_env = Environment(df[index:index + train_size], "profit") + sharpe_train_env = Environment(df[index:index + train_size], "sr") + + # ProfitDQN + cr_profit_dqn = dqn_agent.train(profit_train_env, path) + profit_train_env.reset() + + # Profit Double DQN + cr_profit_ddqn = double_dqn_agent.train(profit_train_env, path) + profit_train_env.reset() + + # Profit Dueling Double DQN + cr_profit_dueling_ddqn = dueling_double_dqn_agent.train(profit_train_env, path) + profit_train_env.reset() + + i = 0 + while i < N_TEST: + print("Test nr. %s" % str(i + 1)) + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + profit_test_env = Environment(df[index + train_size:index + TRADING_PERIOD], "profit") + + # ProfitDQN + cr_profit_dqn_test, _ = dqn_agent.test(profit_test_env) + profit_dqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + # Profit Double DQN + cr_profit_ddqn_test, _ = double_dqn_agent.test(profit_test_env) + profit_ddqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + # Profit Dueling Double DQN + cr_profit_dueling_ddqn_test, _ = dueling_double_dqn_agent.test(profit_test_env) + profit_dueling_ddqn_return.append(profit_test_env.cumulative_return) + profit_test_env.reset() + + i += 1 + + dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=False) + + double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='dqn', + DOUBLE=True) + + dueling_double_dqn_agent = Agent(REPLAY_MEM_SIZE, + BATCH_SIZE, + GAMMA, + EPS_START, + EPS_END, + EPS_STEPS, + LEARNING_RATE, + INPUT_DIM, + HIDDEN_DIM, + ACTION_NUMBER, + TARGET_UPDATE, + MODEL='ddqn', + DOUBLE=True) + + # SharpeDQN + cr_sharpe_dqn = dqn_agent.train(sharpe_train_env, path) + sharpe_train_env.reset() + + # Sharpe Double DQN + cr_sharpe_ddqn = double_dqn_agent.train(sharpe_train_env, path) + sharpe_train_env.reset() + + # Sharpe Dueling Double DQN + cr_sharpe_dueling_ddqn = dueling_double_dqn_agent.train(sharpe_train_env, path) + sharpe_train_env.reset() + + i = 0 + while i < N_TEST: + print("Test nr. %s" % str(i + 1)) + index = random.randrange(len(df) - TRADING_PERIOD - 1) + + sharpe_test_env = Environment(df[index + train_size:index + TRADING_PERIOD], "sr") + + # SharpeDQN + cr_sharpe_dqn_test, _ = dqn_agent.test(sharpe_test_env) + sharpe_dqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + # Sharpe Double DQN + cr_sharpe_ddqn_test, _ = double_dqn_agent.test(sharpe_test_env) + sharpe_ddqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + # Sharpe Dueling Double DQN + cr_sharpe_dueling_ddqn_test, _ = dueling_double_dqn_agent.test(sharpe_test_env) + sharpe_dueling_ddqn_return.append(sharpe_test_env.cumulative_return) + sharpe_test_env.reset() + + i += 1 + + # --------------------------------------- Print Test Stats --------------------------------------------------------- + t = PrettyTable(["Trading System", "Avg. Return (%)", "Max Return (%)", "Min Return (%)", "Std. Dev."]) + print_stats("ProfitDQN", profit_dqn_return, t) + print_stats("SharpeDQN", sharpe_dqn_return, t) + print_stats("ProfitDDQN", profit_ddqn_return, t) + print_stats("SharpeDDQN", sharpe_ddqn_return, t) + print_stats("ProfitD-DDQN", profit_dueling_ddqn_return, t) + print_stats("SharpeD-DDQN", sharpe_dueling_ddqn_return, t) + + print(t) + plot_multiple_conf_interval(["ProfitDQN", "SharpeDQN", "ProfitDDQN", "SharpeDDQN", "ProfitD-DDQN", "SharpeD-DDQN"], + [profit_dqn_return, sharpe_dqn_return, profit_ddqn_return, sharpe_ddqn_return, + profit_dueling_ddqn_return, sharpe_dueling_ddqn_return]) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/jesse/rl/utils.py b/jesse/rl/utils.py new file mode 100644 index 000000000..b4f3942fe --- /dev/null +++ b/jesse/rl/utils.py @@ -0,0 +1,115 @@ +# It essentially maps (state, action) pairs to their (next_state, reward) result, +# with the state being the current stock price +from collections import namedtuple +import random +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import os + +Transition = namedtuple('Transition', ('state', 'action', 'next_state', 'reward') ) + + +class ReplayMemory(object): + + def __init__(self, capacity): + self.capacity = capacity + self.memory = [] + self.position = 0 + + def push(self, *args): + """Saves a transition.""" + if len(self.memory) < self.capacity: + self.memory.append(None) + self.memory[self.position] = Transition(*args) + self.position = (self.position + 1) % self.capacity + + def sample(self, batch_size): + return random.sample(self.memory, batch_size) + + def __len__(self): + return len(self.memory) + + + +def print_stats(model, c_return, t): + c_return = np.array(c_return).flatten() + t.add_row([str(model), "%.2f" % np.mean(c_return), "%.2f" % np.amax(c_return), "%.2f" % np.amin(c_return), + "%.2f" % np.std(c_return)]) + + +def plot_conf_interval(name, cum_returns ): + """ NB. cum_returns must be 2-dim """ + # Mean + M = np.mean(np.array(cum_returns), axis=0) + # std dev + S = np.std(np.array(cum_returns), axis=0) + # upper and lower limit of confidence intervals + LL = M - 0.95 * S + UL = M + 0.95 * S + + plt.figure(figsize=(20, 5)) + plt.xlabel("Trading Instant (h)") + plt.ylabel(name) + plt.legend(['Cumulative Averadge Return (%)'], loc='upper left') + plt.grid(True) + plt.ylim(-5, 15) + plt.plot(range(len(M)), M, linewidth=2) # mean curve. + plt.fill_between(range(len(M)), LL, UL, color='b', alpha=.2) # std curves. + plt.show() + +def plot_multiple_conf_interval(names, cum_returns_list ): + """ NB. cum_returns[i] must be 2-dim """ + i = 1 + + for cr in cum_returns_list: + plt.subplot(len(cum_returns_list), 2, i) + # Mean + M = np.mean(np.array(cr), axis=0) + # std dev + S = np.std(np.array(cr), axis=0) + # upper and lower limit of confidence intervals + LL = M - 0.95 * S + UL = M + 0.95 * S + + plt.xlabel("Trading Instant (h)") + plt.ylabel(names[i-1]) + plt.title('Cumulative Averadge Return (%)') + plt.grid(True) + plt.plot(range(len(M)), M, linewidth=2) # mean curve. + plt.fill_between(range(len(M)), LL, UL, color='b', alpha=.2) # std curves. + i += 1 + + plt.show() + + + + +def load_data(path): + print("Loading data...") + print("Path: " + path) + if os.path.isfile(path + 'hourly_aggregated_dataset.csv'): + df = pd.read_csv(path + 'hourly_aggregated_dataset.csv') + else: + # Aggregate the dataset hourly by picking the value at first row for Open, + # the max within an hour for High, the minimum for Low, the last value for Close + + df = pd.read_csv(path + 'coinbaseUSD_1-min_data_2014-12-01_to_2019-01-09.csv') + df_hourly_aggregated = pd.DataFrame() + + for count in range(0, len(df) - 60, 60): + hour_interval = pd.DataFrame(df.iloc[count:count + 60]) + df_hourly_aggregated = df_hourly_aggregated.append(pd.DataFrame([[hour_interval['Open'].iloc[0], + hour_interval['High'].max(), + hour_interval['Low'].min(), + hour_interval['Close'].iloc[ + len(hour_interval) - 1]]])) + + df_hourly_aggregated.columns = ['Open', 'High', 'Low', 'Close'] + df_hourly_aggregated.index = np.arange(1, len(df_hourly_aggregated) + 1) + df_hourly_aggregated.interpolate(inplace=True) + df_hourly_aggregated.fillna(method='bfill', axis=0, inplace=True) + df_hourly_aggregated.to_csv(path + 'hourly_aggregated_dataset.csv', index=False) + df = df_hourly_aggregated + del df_hourly_aggregated + return df \ No newline at end of file diff --git a/jesse/services/cache.py b/jesse/services/cache.py index c83545de6..059aab29c 100644 --- a/jesse/services/cache.py +++ b/jesse/services/cache.py @@ -21,7 +21,7 @@ def __init__(self, path: str) -> None: with open(f"{self.path}cache_database.pickle", 'rb') as f: try: self.db = pickle.load(f) - except EOFError: + except (EOFError, pickle.UnpicklingError, UnicodeDecodeError): # File got broken self.db = {} # if not, create a dict object. We'll create the file when using set_value() @@ -57,7 +57,16 @@ def get_value(self, key: str) -> Any: # if expired, remove file, and database record if item['expire_at'] is not None and time() > item['expire_at']: - os.remove(item['path']) + try: + os.remove(item['path']) + except FileNotFoundError: + pass + del self.db[key] + self._update_db() + return False + + # If the cache file doesn't exist, remove the database record + if not os.path.exists(item['path']): del self.db[key] self._update_db() return False @@ -70,8 +79,15 @@ def get_value(self, key: str) -> Any: try: with open(item['path'], 'rb') as f: cache_value = pickle.load(f) - except (EOFError, pickle.UnpicklingError): - cache_value = False + except (EOFError, pickle.UnpicklingError, FileNotFoundError): + # If there's any error reading the file, remove the record and return False + try: + os.remove(item['path']) + except FileNotFoundError: + pass + del self.db[key] + self._update_db() + return False return cache_value @@ -84,12 +100,19 @@ def flush(self) -> None: if self.driver is None: return - for key, item in self.db.items(): + # Create a list of keys to remove to avoid modifying dict during iteration + keys_to_remove = list(self.db.keys()) + + for key in keys_to_remove: + item = self.db[key] try: os.remove(item['path']) except FileNotFoundError: pass - self.db = {} + del self.db[key] + + # Update the database file after clearing + self._update_db() cache = Cache("storage/temp/") diff --git a/jesse/services/candle.py b/jesse/services/candle.py index 5075da0a7..c1d472d62 100644 --- a/jesse/services/candle.py +++ b/jesse/services/candle.py @@ -4,6 +4,8 @@ from jesse.exceptions import CandleNotFoundInDatabase import jesse.helpers as jh from jesse.services import logger +from jesse.models import Candle +from typing import List, Dict def generate_candle_from_one_minutes( @@ -257,22 +259,19 @@ def _get_candles_from_db( key = jh.key(exchange, symbol) cache_key = f"{start_date_timestamp}-{finish_date_timestamp}-{key}" cached_value = cache.get_value(cache_key) - else: - cached_value = None - - # if cache exists use cache_value - if cached_value: - candles_tuple = cached_value - else: - candles_tuple = Candle.select( - Candle.timestamp, Candle.open, Candle.close, Candle.high, Candle.low, - Candle.volume - ).where( - Candle.exchange == exchange, - Candle.symbol == symbol, - Candle.timeframe == '1m' or Candle.timeframe.is_null(), - Candle.timestamp.between(start_date_timestamp, finish_date_timestamp) - ).order_by(Candle.timestamp.asc()).tuples() + if cached_value: + return np.array(cached_value) + + # Always materialize the database results immediately + candles_tuple = list(Candle.select( + Candle.timestamp, Candle.open, Candle.close, Candle.high, Candle.low, + Candle.volume + ).where( + Candle.exchange == exchange, + Candle.symbol == symbol, + Candle.timeframe == '1m' or Candle.timeframe.is_null(), + Candle.timestamp.between(start_date_timestamp, finish_date_timestamp) + ).order_by(Candle.timestamp.asc()).tuples()) # validate the dates if start_date_timestamp == finish_date_timestamp: @@ -284,7 +283,7 @@ def _get_candles_from_db( if caching: # cache for 1 week it for near future calls - cache.set_value(cache_key, tuple(candles_tuple), expire_seconds=60 * 60 * 24 * 7) + cache.set_value(cache_key, candles_tuple, expire_seconds=60 * 60 * 24 * 7) return np.array(candles_tuple) @@ -305,3 +304,55 @@ def _get_generated_candles(timeframe, trading_candles) -> np.ndarray: ) return np.array(generated_candles) + + +def get_existing_candles() -> List[Dict]: + """ + Returns a list of all existing candles grouped by exchange and symbol + """ + results = [] + + # Get unique exchange-symbol combinations + pairs = Candle.select( + Candle.exchange, + Candle.symbol + ).distinct().tuples() + + for exchange, symbol in pairs: + # Get first and last candle for this pair + first = Candle.select( + Candle.timestamp + ).where( + Candle.exchange == exchange, + Candle.symbol == symbol + ).order_by( + Candle.timestamp.asc() + ).first() + + last = Candle.select( + Candle.timestamp + ).where( + Candle.exchange == exchange, + Candle.symbol == symbol + ).order_by( + Candle.timestamp.desc() + ).first() + + if first and last: + results.append({ + 'exchange': exchange, + 'symbol': symbol, + 'start_date': arrow.get(first.timestamp / 1000).format('YYYY-MM-DD'), + 'end_date': arrow.get(last.timestamp / 1000).format('YYYY-MM-DD') + }) + + return results + +def delete_candles(exchange: str, symbol: str) -> None: + """ + Deletes all candles for the given exchange and symbol + """ + Candle.delete().where( + Candle.exchange == exchange, + Candle.symbol == symbol + ).execute() diff --git a/jesse/services/charts.py b/jesse/services/charts.py index f013cc163..1b76c251d 100644 --- a/jesse/services/charts.py +++ b/jesse/services/charts.py @@ -1,11 +1,4 @@ -import os from datetime import datetime, timedelta -import numpy as np -import pandas as pd -from matplotlib import pyplot as plt -from pandas.plotting import register_matplotlib_converters -import jesse.helpers as jh -from jesse.config import config from jesse.routes import router from jesse.store import store from jesse.services.candle import get_candles @@ -73,135 +66,3 @@ def equity_curve(benchmark: bool = False) -> list: result.append(_calculate_equity_curve(daily_balance_benchmark, start_date, r.symbol, colors[(i + 1) % len(colors)])) return result - - -def portfolio_vs_asset_returns(study_name: str = None) -> str: - if jh.is_unit_testing(): - return 'charts' - - if store.completed_trades.count == 0: - return None - - register_matplotlib_converters() - trades = store.completed_trades.trades - # create a plot figure - plt.figure(figsize=(26, 16)) - - # daily balance - plt.subplot(2, 1, 1) - start_date = datetime.fromtimestamp(store.app.starting_time / 1000) - date_list = [start_date + timedelta(days=x) for x in range(len(store.app.daily_balance))] - plt.xlabel('date') - plt.ylabel('balance') - if study_name: - plt.title(f'Portfolio Daily Return - {study_name}') - else: - plt.title('Portfolio Daily Return') - - start_balance_arr = np.full(len(store.app.daily_balance), store.app.daily_balance[0]) - plt.fill_between(date_list, store.app.daily_balance, start_balance_arr, - where=start_balance_arr < store.app.daily_balance, color='green', alpha=0.5) - plt.fill_between(date_list, start_balance_arr, store.app.daily_balance, - where=start_balance_arr > store.app.daily_balance, color='red', alpha=0.7) - plt.plot(date_list, store.app.daily_balance, linewidth='4') - - # price change% - plt.subplot(2, 1, 2) - price_dict = {} - for r in router.routes: - key = jh.key(r.exchange, r.symbol) - price_dict[key] = { - 'indexes': {}, - 'prices': [] - } - dates = [] - prices = [] - candles = store.candles.get_candles(r.exchange, r.symbol, '1m') - max_timeframe = jh.max_timeframe(config['app']['considering_timeframes']) - pre_candles_count = jh.timeframe_to_one_minutes(max_timeframe) * jh.get_config( - 'env.data.warmup_candles_num', 210 - ) - for i, c in enumerate(candles): - # do not plot prices for required_initial_candles period - if i < pre_candles_count: - continue - - dates.append(datetime.fromtimestamp(c[0] / 1000)) - prices.append(c[2]) - # save index of the price instead of the actual price - price_dict[key]['indexes'][str(int(c[0]))] = len(prices) - 1 - - # price => %returns - price_returns = pd.Series(prices).pct_change(1) * 100 - cumsum_returns = np.cumsum(price_returns) - if len(router.routes) == 1: - plt.plot(dates, cumsum_returns, label=r.symbol, c='grey') - else: - plt.plot(dates, cumsum_returns, label=r.symbol) - price_dict[key]['prices'] = cumsum_returns - - # buy and sell plots - buy_x = [] - buy_y = [] - sell_x = [] - sell_y = [] - for index, t in enumerate(trades): - key = jh.key(t.exchange, t.symbol) - - # dirty fix for an issue with last trade being an open trade at the end of backtest - if index == len(trades) - 1 and store.app.total_open_trades > 0: - continue - - if t.type == 'long': - # Buy - if str(int(t.opened_at)) in price_dict[key]['indexes']: - # add price change% - buy_y.append( - price_dict[key]['prices'][price_dict[key]['indexes'][str(int(t.opened_at))]] - ) - # add datetime - buy_x.append(datetime.fromtimestamp(t.opened_at / 1000)) - - # Sell: only generate data point if this trade wasn't after the last candle (open position at end) - if str(int(t.closed_at)) in price_dict[key]['indexes']: - # add price change% - sell_y.append( - price_dict[key]['prices'][price_dict[key]['indexes'][str(int(t.closed_at))]] - ) - # add datetime - sell_x.append(datetime.fromtimestamp(t.closed_at / 1000)) - - elif t.type == 'short': - # Buy: only generate data point if this trade wasn't after the last candle (open position at end) - if str(int(t.closed_at)) in price_dict[key]['indexes']: - # add price change% - buy_y.append( - price_dict[key]['prices'][price_dict[key]['indexes'][str(int(t.closed_at))]] - ) - # add datetime - buy_x.append(datetime.fromtimestamp(t.closed_at / 1000)) - - # Sell - if str(int(t.opened_at)) in price_dict[key]['indexes']: - # add price change% - sell_y.append( - price_dict[key]['prices'][price_dict[key]['indexes'][str(int(t.opened_at))]] - ) - # add datetime - sell_x.append(datetime.fromtimestamp(t.opened_at / 1000)) - - plt.plot(buy_x, np.array(buy_y) * 0.99, '^', color='blue', markersize=7) - plt.plot(sell_x, np.array(sell_y) * 1.01, 'v', color='red', markersize=7) - - plt.xlabel('date') - plt.ylabel('price change %') - plt.title('Asset Daily Return') - plt.legend(loc='upper left') - - # store final result - # make sure directories exist - os.makedirs('./storage/charts', exist_ok=True) - file_path = f'storage/charts/{jh.get_session_id()}.png' - plt.savefig(file_path) - - return file_path diff --git a/jesse/services/color.py b/jesse/services/color.py new file mode 100644 index 000000000..e06e597d3 --- /dev/null +++ b/jesse/services/color.py @@ -0,0 +1,22 @@ +import random + + +_generated_colors = set() + + +def generate_unique_hex_color(): + def random_color(): + return "#{:06x}".format(random.randint(0, 0xFFFFFF)) + + def luminance(hex_color): + hex_color = hex_color.lstrip('#') + r, g, b = int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) + return 0.2126 * r + 0.7152 * g + 0.0722 * b + + while True: + color = random_color() + if color not in _generated_colors: + lum = luminance(color) + if 50 < lum < 200: # Ensuring the color is neither too dark nor too light + _generated_colors.add(color) + return color diff --git a/jesse/services/general_info.py b/jesse/services/general_info.py index b24cfb633..6edfb88cd 100644 --- a/jesse/services/general_info.py +++ b/jesse/services/general_info.py @@ -36,7 +36,7 @@ def get_general_info(has_live=False) -> dict: limits = plan_info['limits'] strategies_path = os.getcwd() + "/strategies/" - strategies = list(sorted([name for name in os.listdir(strategies_path) if os.path.isdir(strategies_path + name)])) + strategies = list(sorted([name for name in os.listdir(strategies_path) if os.path.isdir(strategies_path + name) and not name.startswith('.')])) if "__pycache__" in strategies: strategies.remove("__pycache__") diff --git a/jesse/services/jesse_trade.py b/jesse/services/jesse_trade.py index 5560016b2..54146953b 100644 --- a/jesse/services/jesse_trade.py +++ b/jesse/services/jesse_trade.py @@ -37,7 +37,7 @@ def report_exception( path_log = f'storage/logs/backtest-mode/{session_id}.txt' elif mode == 'live': path_log = f'storage/logs/live-mode/{session_id}.txt' - path_exchange_log = 'storage/logs/exchange-streams.txt' + path_exchange_log = f'storage/logs/live-mode/{session_id}-raw-exchange-logs.txt' else: raise ValueError('Invalid mode') diff --git a/jesse/services/logger.py b/jesse/services/logger.py index 2b921738e..ce6edc0a3 100644 --- a/jesse/services/logger.py +++ b/jesse/services/logger.py @@ -17,8 +17,6 @@ def _init_main_logger(): if jh.is_live(): filename = f'storage/logs/live-mode/{session_id}.txt' - elif jh.is_collecting_data(): - filename = f'storage/logs/collect-mode/{session_id}.txt' elif jh.is_optimizing(): filename = f'storage/logs/optimize-mode/{session_id}.txt' elif jh.is_backtesting(): @@ -32,21 +30,12 @@ def _init_main_logger(): LOGGERS[jh.app_mode()] = new_logger -def create_disposable_logger(name): - log_file = f"storage/logs/{name}.txt" - os.makedirs('storage/logs', exist_ok=True) - new_logger = logging.getLogger(name) - new_logger.setLevel(logging.INFO) - new_logger.addHandler(logging.FileHandler(log_file, mode='w')) - LOGGERS[name] = new_logger - - def create_logger_file(name): + """Creates a logger file that appends to existing logs""" log_file = f"storage/logs/{name}.txt" - os.makedirs('storage/logs', exist_ok=True) + os.makedirs(os.path.dirname(log_file), exist_ok=True) new_logger = logging.getLogger(name) new_logger.setLevel(logging.INFO) - # should add to the end of file new_logger.addHandler(logging.FileHandler(log_file, mode='a')) LOGGERS[name] = new_logger @@ -71,7 +60,7 @@ def info(msg: str, send_notification=False, webhook=None) -> None: store.logs.info.append(log_dict) - if jh.is_collecting_data() or jh.is_live(): + if jh.is_live(): sync_publish('info_log', log_dict) if jh.is_live() or (jh.is_backtesting() and jh.is_debugging()): @@ -106,7 +95,7 @@ def error(msg: str, send_notification=True) -> None: if jh.is_live() and jh.get_config('env.notifications.events.errors', True) and send_notification: notify(f'ERROR:\n{msg}') - if (jh.is_backtesting() and jh.is_debugging()) or jh.is_collecting_data() or jh.is_live(): + if (jh.is_backtesting() and jh.is_debugging()) or jh.is_live(): sync_publish('error_log', log_dict) store.logs.errors.append(log_dict) @@ -129,10 +118,19 @@ def log_exchange_message(exchange, message): formatted_time = jh.timestamp_to_time(jh.now())[:19] message = f'[{formatted_time} - {exchange}]: ' + message - if 'exchange-streams' not in LOGGERS: - create_disposable_logger('exchange-streams') - - LOGGERS['exchange-streams'].info(message) + session_id = jh.get_session_id() + logger_name = f'live-mode/{session_id}-raw-exchange-logs' + + if logger_name not in LOGGERS: + # Create the logger with write mode to clear previous session's logs + log_file = f"storage/logs/{logger_name}.txt" + os.makedirs(os.path.dirname(log_file), exist_ok=True) + new_logger = logging.getLogger(logger_name) + new_logger.setLevel(logging.INFO) + new_logger.addHandler(logging.FileHandler(log_file, mode='w')) + LOGGERS[logger_name] = new_logger + + LOGGERS[logger_name].info(message) def log_optimize_mode(message): diff --git a/jesse/services/metrics.py b/jesse/services/metrics.py index 36a38e3f8..9674bc1fd 100644 --- a/jesse/services/metrics.py +++ b/jesse/services/metrics.py @@ -1,9 +1,8 @@ -from datetime import datetime, timedelta -from typing import Any, List, Union +from datetime import datetime +from typing import List import numpy as np import pandas as pd -from quantstats import stats import jesse.helpers as jh from jesse.models import ClosedTrade @@ -51,6 +50,210 @@ def routes(routes_arr: list) -> list: } for r in routes_arr] +def _prepare_returns(returns, rf=0.0, periods=252): + """ + Helper function to prepare returns data by converting to pandas Series and + adjusting for risk-free rate if provided + """ + if rf != 0: + returns = returns - (rf / periods) + + if isinstance(returns, pd.DataFrame): + returns = returns[returns.columns[0]] + + return returns + +def sharpe_ratio(returns, rf=0.0, periods=365, annualize=True, smart=False): + """ + Calculates the sharpe ratio of access returns + """ + returns = _prepare_returns(returns, rf, periods) + divisor = returns.std(ddof=1) + + if smart: + divisor = divisor * autocorr_penalty(returns) + + res = returns.mean() / divisor + + if annualize: + res = res * np.sqrt(1 if periods is None else periods) + + # Always convert to pandas Series + return pd.Series([res]) + + +def sortino_ratio(returns, rf=0, periods=365, annualize=True, smart=False): + """ + Calculates the sortino ratio of access returns + """ + returns = _prepare_returns(returns, rf, periods) + + downside = np.sqrt((returns[returns < 0] ** 2).sum() / len(returns)) + + # Handle division by zero + if downside == 0: + res = np.inf if returns.mean() > 0 else -np.inf + else: + if smart: + downside = downside * autocorr_penalty(returns) + + res = returns.mean() / downside + + if annualize: + res = res * np.sqrt(1 if periods is None else periods) + + # Always convert to pandas Series + return pd.Series([res]) + + +def autocorr_penalty(returns): + """ + Calculates the autocorrelation penalty for returns + """ + num = len(returns) + coef = np.abs(np.corrcoef(returns[:-1], returns[1:])[0, 1]) + corr = [((num - x) / num) * coef**x for x in range(1, num)] + return np.sqrt(1 + 2 * np.sum(corr)) + + +def calmar_ratio(returns): + """ + Calculates the calmar ratio (CAGR% / MaxDD%) + """ + # Get daily returns + returns = _prepare_returns(returns) + + # Calculate CAGR exactly as in cagr() function + first_value = 1 + last_value = (1 + returns).prod() + days = (returns.index[-1] - returns.index[0]).days + years = float(days) / 365 + + if years == 0: + return pd.Series([0.0]) + + cagr_ratio = (last_value / first_value) ** (1 / years) - 1 + + # Calculate Max Drawdown using cumulative returns + cum_returns = (1 + returns).cumprod() + rolling_max = cum_returns.expanding(min_periods=1).max() + drawdown = cum_returns / rolling_max - 1 + max_dd = abs(drawdown.min()) + + # Calculate Calmar + result = cagr_ratio / max_dd if max_dd != 0 else 0 + + # Always convert to pandas Series + return pd.Series([result]) + + +def max_drawdown(returns): + """ + Calculates the maximum drawdown + """ + prices = (returns + 1).cumprod() + result = (prices / prices.expanding(min_periods=0).max()).min() - 1 + + # Always convert to pandas Series + return pd.Series([result]) + + +def cagr(returns, rf=0.0, compounded=True, periods=365): + """ + Calculates the communicative annualized growth return (CAGR%) + """ + returns = _prepare_returns(returns, rf) + + # Get first and last values of cumulative returns + first_value = 1 + last_value = (1 + returns).prod() + + # Calculate years exactly as quantstats does + days = (returns.index[-1] - returns.index[0]).days + years = float(days) / 365 + + # Handle edge case + if years == 0: + return pd.Series([0.0]) + + # Calculate CAGR using quantstats formula + result = (last_value / first_value) ** (1 / years) - 1 + + return pd.Series([result]) + + +def omega_ratio(returns, rf=0.0, required_return=0.0, periods=365): + """ + Determines the Omega ratio of a strategy + """ + returns = _prepare_returns(returns, rf, periods) + + if periods == 1: + return_threshold = required_return + else: + return_threshold = (1 + required_return) ** (1.0 / periods) - 1 + + returns_less_thresh = returns - return_threshold + numer = returns_less_thresh[returns_less_thresh > 0.0].sum() + denom = -1.0 * returns_less_thresh[returns_less_thresh < 0.0].sum() + + result = numer / denom if denom > 0.0 else np.nan + + # Always convert to pandas Series + return pd.Series([result]) + + +def serenity_index(returns, rf=0): + """ + Calculates the serenity index score + """ + dd = to_drawdown_series(returns) + pitfall = -conditional_value_at_risk(dd) / returns.std() + result = (returns.sum() - rf) / (ulcer_index(returns) * pitfall) + + # Always convert to pandas Series + return pd.Series([result]) + + +def ulcer_index(returns): + """ + Calculates the ulcer index score (downside risk measurement) + """ + dd = to_drawdown_series(returns) + return np.sqrt(np.divide((dd**2).sum(), returns.shape[0] - 1)) + + +def to_drawdown_series(returns): + """ + Convert returns series to drawdown series + """ + prices = (1 + returns).cumprod() + dd = prices / np.maximum.accumulate(prices) - 1.0 + return dd.replace([np.inf, -np.inf, -0], 0) + + +def conditional_value_at_risk(returns, sigma=1, confidence=0.95): + """ + Calculates the conditional daily value-at-risk (aka expected shortfall) + """ + if len(returns) < 2: + return 0 + + returns = _prepare_returns(returns) + # Sort returns from worst to best + sorted_returns = np.sort(returns) + # Find the index based on confidence level + index = int((1 - confidence) * len(sorted_returns)) + + # Handle empty slice warning + if index == 0: + return sorted_returns[0] if len(sorted_returns) > 0 else 0 + + # Calculate CVaR as the mean of worst losses + c_var = sorted_returns[:index].mean() + return c_var if ~np.isnan(c_var) else 0 + + def trades(trades_list: List[ClosedTrade], daily_balance: list, final: bool = True) -> dict: starting_balance = 0 current_balance = 0 @@ -117,72 +320,65 @@ def trades(trades_list: List[ClosedTrade], daily_balance: list, final: bool = Tr total_open_trades = store.app.total_open_trades open_pl = store.app.total_open_pl - - max_drawdown = np.nan - annual_return = np.nan - sharpe_ratio = np.nan - calmar_ratio = np.nan - sortino_ratio = np.nan - omega_ratio = np.nan - serenity_index = np.nan - smart_sharpe = np.nan - smart_sortino = np.nan - - if len(daily_return) > 2: - max_drawdown = stats.max_drawdown(daily_return).values[0] * 100 - annual_return = stats.cagr(daily_return).values[0] * 100 - sharpe_ratio = stats.sharpe(daily_return, periods=365).values[0] - calmar_ratio = stats.calmar(daily_return).values[0] - sortino_ratio = stats.sortino(daily_return, periods=365).values[0] - omega_ratio = stats.omega(daily_return, periods=365) - serenity_index = stats.serenity_index(daily_return).values[0] - # As those calculations are slow they are only done for the final report and not at self.metrics in the strategy. - if final: - smart_sharpe = stats.smart_sharpe(daily_return, periods=365).values[0] - smart_sortino = stats.smart_sortino(daily_return, periods=365).values[0] + # Helper function to safely convert values + def safe_convert(value, convert_type=float): + try: + if isinstance(value, pd.Series): + value = value.iloc[0] + if np.isnan(value): + return np.nan + return convert_type(value) + except: + return np.nan + + # Calculate metrics using 365 days for crypto markets + max_dd = np.nan if len(daily_return) < 2 else max_drawdown(daily_return).iloc[0] * 100 + annual_return = np.nan if len(daily_return) < 2 else cagr(daily_return, periods=365).iloc[0] * 100 + sharpe = np.nan if len(daily_return) < 2 else sharpe_ratio(daily_return, periods=365).iloc[0] + calmar = np.nan if len(daily_return) < 2 else calmar_ratio(daily_return).iloc[0] + sortino = np.nan if len(daily_return) < 2 else sortino_ratio(daily_return, periods=365).iloc[0] + omega = np.nan if len(daily_return) < 2 else omega_ratio(daily_return, periods=365).iloc[0] + serenity = np.nan if len(daily_return) < 2 else serenity_index(daily_return).iloc[0] return { - 'total': np.nan if np.isnan(total_completed) else total_completed, - 'total_winning_trades': np.nan if np.isnan(total_winning_trades) else total_winning_trades, - 'total_losing_trades': np.nan if np.isnan(total_losing_trades) else total_losing_trades, - 'starting_balance': np.nan if np.isnan(starting_balance) else starting_balance, - 'finishing_balance': np.nan if np.isnan(current_balance) else current_balance, - 'win_rate': np.nan if np.isnan(win_rate) else win_rate, - 'ratio_avg_win_loss': np.nan if np.isnan(ratio_avg_win_loss) else ratio_avg_win_loss, - 'longs_count': np.nan if np.isnan(longs_count) else longs_count, - 'longs_percentage': np.nan if np.isnan(longs_percentage) else longs_percentage, - 'shorts_percentage': np.nan if np.isnan(shorts_percentage) else shorts_percentage, - 'shorts_count': np.nan if np.isnan(shorts_count) else shorts_count, - 'fee': np.nan if np.isnan(fee) else fee, - 'net_profit': np.nan if np.isnan(net_profit) else net_profit, - 'net_profit_percentage': np.nan if np.isnan(net_profit_percentage) else net_profit_percentage, - 'average_win': np.nan if np.isnan(average_win) else average_win, - 'average_loss': np.nan if np.isnan(average_loss) else average_loss, - 'expectancy': np.nan if np.isnan(expectancy) else expectancy, - 'expectancy_percentage': np.nan if np.isnan(expectancy_percentage) else expectancy_percentage, - 'expected_net_profit_every_100_trades': np.nan if np.isnan( - expected_net_profit_every_100_trades) else expected_net_profit_every_100_trades, - 'average_holding_period': average_holding_period, - 'average_winning_holding_period': average_winning_holding_period, - 'average_losing_holding_period': average_losing_holding_period, - 'gross_profit': gross_profit, - 'gross_loss': gross_loss, - 'max_drawdown': np.nan if np.isnan(max_drawdown) else max_drawdown, - 'annual_return': np.nan if np.isnan(annual_return) else annual_return, - 'sharpe_ratio': np.nan if np.isnan(sharpe_ratio) else sharpe_ratio, - 'calmar_ratio': np.nan if np.isnan(calmar_ratio) else calmar_ratio, - 'sortino_ratio': np.nan if np.isnan(sortino_ratio) else sortino_ratio, - 'omega_ratio': np.nan if np.isnan(omega_ratio) else omega_ratio, - 'serenity_index': np.nan if np.isnan(serenity_index) else serenity_index, - 'smart_sharpe': np.nan if np.isnan(smart_sharpe) else smart_sharpe, - 'smart_sortino': np.nan if np.isnan(smart_sortino) else smart_sortino, - 'total_open_trades': total_open_trades, - 'open_pl': open_pl, - 'winning_streak': winning_streak, - 'losing_streak': losing_streak, - 'largest_losing_trade': largest_losing_trade, - 'largest_winning_trade': largest_winning_trade, - 'current_streak': current_streak[-1], + 'total': safe_convert(total_completed, int), + 'total_winning_trades': safe_convert(total_winning_trades, int), + 'total_losing_trades': safe_convert(total_losing_trades, int), + 'starting_balance': safe_convert(starting_balance), + 'finishing_balance': safe_convert(current_balance), + 'win_rate': safe_convert(win_rate), + 'ratio_avg_win_loss': safe_convert(ratio_avg_win_loss), + 'longs_count': safe_convert(longs_count, int), + 'longs_percentage': safe_convert(longs_percentage), + 'shorts_percentage': safe_convert(shorts_percentage), + 'shorts_count': safe_convert(shorts_count, int), + 'fee': safe_convert(fee), + 'net_profit': safe_convert(net_profit), + 'net_profit_percentage': safe_convert(net_profit_percentage), + 'average_win': safe_convert(average_win), + 'average_loss': safe_convert(average_loss), + 'expectancy': safe_convert(expectancy), + 'expectancy_percentage': safe_convert(expectancy_percentage), + 'expected_net_profit_every_100_trades': safe_convert(expected_net_profit_every_100_trades), + 'average_holding_period': safe_convert(average_holding_period), + 'average_winning_holding_period': safe_convert(average_winning_holding_period), + 'average_losing_holding_period': safe_convert(average_losing_holding_period), + 'gross_profit': safe_convert(gross_profit), + 'gross_loss': safe_convert(gross_loss), + 'max_drawdown': safe_convert(max_dd), + 'annual_return': safe_convert(annual_return), + 'sharpe_ratio': safe_convert(sharpe), + 'calmar_ratio': safe_convert(calmar), + 'sortino_ratio': safe_convert(sortino), + 'omega_ratio': safe_convert(omega), + 'serenity_index': safe_convert(serenity), + 'total_open_trades': safe_convert(total_open_trades, int), + 'open_pl': safe_convert(open_pl), + 'winning_streak': safe_convert(winning_streak, int), + 'losing_streak': safe_convert(losing_streak, int), + 'largest_losing_trade': safe_convert(largest_losing_trade), + 'largest_winning_trade': safe_convert(largest_winning_trade), + 'current_streak': safe_convert(current_streak[-1], int), } diff --git a/jesse/services/multiprocessing.py b/jesse/services/multiprocessing.py index a301408ca..bcb9f97b1 100644 --- a/jesse/services/multiprocessing.py +++ b/jesse/services/multiprocessing.py @@ -1,3 +1,5 @@ +import threading +import time from typing import List import multiprocessing as mp import traceback @@ -5,6 +7,8 @@ from jesse.services.failure import terminate_session import jesse.helpers as jh from jesse.services.env import ENV_VALUES +import os +import signal # set multiprocessing process type to spawn mp.set_start_method('spawn', force=True) @@ -41,7 +45,14 @@ def __init__(self): self._workers: List[Process] = [] self._pid_to_client_id_map = {} self.client_id_to_pid_to_map = {} - self._active_workers_key = f"{ENV_VALUES['APP_PORT']}|active-processes" + try: + port = ENV_VALUES.get('APP_PORT', '9000') + except: + port = '9000' + + self._active_workers_key = f"{port}|active-processes" + self._cleanup_thread = threading.Thread(target=self._cleanup_finished_workers, daemon=True) + self._cleanup_thread.start() def _reset(self): self._workers = [] @@ -76,7 +87,6 @@ def get_client_id(self, pid): client_id: str = self._pid_to_client_id_map[self._prefixed_pid(pid)] except KeyError: return None - # return after "|" because we add them before sending it to multiprocessing return jh.string_after_character(client_id, '|') def get_pid(self, client_id): @@ -87,10 +97,37 @@ def cancel_process(self, client_id): def flush(self): for w in self._workers: - w.terminate() - w.join() - w.close() - process_manager._reset() + try: + # Try terminate first + w.terminate() + # Give it a moment to terminate gracefully + w.join(timeout=3) + + # If still alive, wait a brief moment then force kill + if w.is_alive(): + time.sleep(0.5) # Give terminate a chance to complete + os.kill(w.pid, signal.SIGKILL) + + w.close() + except Exception as e: + jh.debug(f"Error while terminating process: {str(e)}") + + self._reset() + + def _cleanup_finished_workers(self): + while True: + try: + for w in self._workers[:]: # Create a copy of the list to avoid modification during iteration + if not w.is_alive(): + try: + w.join(timeout=1) + w.close() + self._workers.remove(w) + except Exception as e: + jh.debug(f"Error during worker cleanup: {str(e)}") + except Exception as e: + jh.debug(f"Error in cleanup thread: {str(e)}") + time.sleep(5) @property def active_workers(self) -> set: diff --git a/jesse/services/quantstats.py b/jesse/services/quantstats.py deleted file mode 100644 index 685021287..000000000 --- a/jesse/services/quantstats.py +++ /dev/null @@ -1,265 +0,0 @@ -import os -from datetime import datetime - -import arrow -import pandas as pd -import quantstats as qs - -from jesse.config import config -from jesse.store import store -import jesse.helpers as jh - - -def quantstats_tearsheet(buy_and_hold_returns: pd.Series, study_name: str) -> str: - daily_returns = pd.Series(store.app.daily_balance).pct_change(1).values - - start_date = datetime.fromtimestamp(store.app.starting_time / 1000) - date_index = pd.date_range(start=start_date, periods=len(store.app.daily_balance)) - - returns_time_series = pd.Series(daily_returns, index=date_index) - - mode = config['app']['trading_mode'] - modes = { - 'backtest': ['BT', 'Backtest'], - 'livetrade': ['LT', 'LiveTrade'], - 'papertrade': ['PT', 'PaperTrade'] - } - - os.makedirs('./storage/full-reports', exist_ok=True) - - file_path = f'storage/full-reports/{jh.get_session_id()}.html'.replace(":", "-") - - title = f"{modes[mode][1]} → {arrow.utcnow().strftime('%d %b, %Y %H:%M:%S')} → {study_name}" - - try: - qs.reports.html(returns=returns_time_series, periods_per_year=365, benchmark=buy_and_hold_returns, title=title, output=file_path) - except IndexError: - qs.reports.html(returns=returns_time_series, periods_per_year=365, title=title, output=file_path) - except: - raise - - return file_path - - -# from datetime import timedelta -# import quantstats.plots as _plots -# import quantstats.stats as _stats -# import quantstats.utils as _utils -# from quantstats.reports import _get_trading_periods, metrics -# import numpy as np -# def quantstats_api(benchmark: pd.Series) -> dict: -# click.clear() -# -# daily_returns = pd.Series(store.app.daily_balance).pct_change(1).values -# -# start_date = datetime.fromtimestamp(store.app.starting_time / 1000) -# -# date_index = pd.date_range(start=start_date, periods=len(store.app.daily_balance)) -# -# returns = pd.Series(daily_returns, index=date_index) -# -# data = {} -# periods_per_year = 365 -# rf = 0. -# compounded = True -# -# win_year, win_half_year = _get_trading_periods() -# -# # prepare timeseries -# returns = _utils._prepare_returns(returns) -# -# date_range = returns.index.strftime('%e %b, %Y') -# -# data['date_range'] = f'{date_range[0]} - {date_range[-1]}' -# -# if benchmark is not None: -# benchmark = _utils._prepare_benchmark(benchmark, returns.index, rf) -# -# mtrx = metrics(returns=returns, benchmark=benchmark, -# rf=rf, display=False, mode='full', -# sep=True, internal="True", -# compounded=compounded, -# periods_per_year=periods_per_year, -# prepare_returns=False)[2:] -# -# mtrx.index.name = 'Metric' -# data['metrics'] = mtrx -# -# if benchmark is not None: -# yoy = _stats.compare( -# returns, benchmark, "A", compounded=compounded, -# prepare_returns=False) -# yoy.columns = ['Benchmark', 'Strategy', 'Multiplier', 'Won'] -# yoy.index.name = 'Year' -# else: -# # pct multiplier -# yoy = pd.DataFrame( -# _utils.group_returns(returns, returns.index.year) * 100) -# yoy.columns = ['Return'] -# yoy['Cumulative'] = _utils.group_returns( -# returns, returns.index.year, True) -# yoy['Return'] = yoy['Return'].round(2).astype(str) + '%' -# yoy['Cumulative'] = (yoy['Cumulative'] * -# 100).round(2).astype(str) + '%' -# yoy.index.name = 'Year' -# -# data['yoy'] = yoy -# -# dd = _stats.to_drawdown_series(returns) -# dd_info = _stats.drawdown_details(dd).sort_values( -# by='max drawdown', ascending=True)[:10] -# -# dd_info = dd_info[['start', 'end', 'max drawdown', 'days']] -# dd_info.columns = ['Started', 'Recovered', 'Drawdown', 'Days'] -# -# data['dd_info'] = dd_info -# -# data['monthly_returns'] = _stats.monthly_returns(returns, eoy=False, -# compounded=compounded) * 100 -# -# plot_returns = _plots.returns(returns, benchmark, -# figsize=(8, 5), subtitle=False, -# show=False, ylabel=False, cumulative=compounded, -# prepare_returns=False) -# -# # Get the data from the figure -# data['plot_returns_strategy'] = plot_returns.get_axes()[0].get_lines()[0].get_data() -# -# if benchmark is not None: -# data['plot_returns_benchmark'] = plot_returns.get_axes()[0].get_lines()[1].get_data() -# -# plot_log_returns = _plots.log_returns(returns, benchmark, -# figsize=(8, 4), subtitle=False, -# show=False, ylabel=False, cumulative=compounded, -# prepare_returns=False) -# -# # Get the data from the figure -# data['plot_log_returns_strategy'] = plot_log_returns.get_axes()[0].get_lines()[0].get_data() -# -# if benchmark is not None: -# data['plot_log_returns_benchmark'] = plot_log_returns.get_axes()[0].get_lines()[1].get_data() -# -# if benchmark is not None: -# vol_returns = _plots.returns(returns, benchmark, match_volatility=True, figsize=(8, 4), subtitle=False, -# show=False, ylabel=False, cumulative=compounded, -# prepare_returns=False) -# # Get the data from the figure -# data['plot_vol_returns_strategy'] = vol_returns.get_axes()[0].get_lines()[0].get_data() -# data['plot_vol_returns_benchmark'] = vol_returns.get_axes()[0].get_lines()[1].get_data() -# -# yearly_returns = _plots.yearly_returns(returns, benchmark, figsize=(8, 4), subtitle=False, -# show=False, ylabel=False, compounded=compounded, -# prepare_returns=False) -# ax = yearly_returns.gca() -# -# data['plot_yearly_returns_labels'] = [l.get_text() for l in ax.get_xticklabels()] -# values = [rect.get_height() for rect in ax.patches] -# if benchmark is not None: -# split = [values[i:i + len(data['plot_yearly_returns_labels'])] for i in range(0, len(values), len(data['plot_yearly_returns_labels']))] -# -# data['plot_yearly_returns_strategy'] = split[1::2][0] # Start at second element, then every other. -# data['plot_yearly_returns_benchmark'] = split[::2][0] # Start at first element, then every other. -# else: -# data['plot_yearly_returns_strategy'] = values -# -# data['plot_yearly_returns_mean'] = yearly_returns.get_axes()[0].get_lines()[0].get_ydata()[0] -# -# histogram = _plots.histogram(returns, figsize=(8, 4), subtitle=False, -# show=False, ylabel=False, compounded=compounded, -# prepare_returns=False) -# # Get the data from the figure -# data['plot_distribution_kde'] = histogram.get_axes()[0].get_lines()[2].get_data() -# -# ax = histogram.gca() -# y_values = [rect.get_height() for rect in ax.patches] -# x_values = [rect.get_x() for rect in ax.patches] -# -# data['plot_distribution_mean'] = histogram.get_axes()[0].get_lines()[0].get_xdata()[0] -# data['plot_distribution_density'] = y_values -# data['plot_distribution_percentage'] = x_values -# -# daily_returns = _plots.daily_returns(returns, -# figsize=(8, 3), subtitle=False, -# show=False, ylabel=False, -# prepare_returns=False) -# data['plot_daily_returns'] = daily_returns.get_axes()[0].get_lines()[0].get_data() -# -# if benchmark is not None: -# rolling_beta = _plots.rolling_beta(returns, benchmark, -# figsize=(8, 3), subtitle=False, -# window1=win_half_year, window2=win_year, -# show=False, ylabel=False, -# prepare_returns=False) -# data['plot_rolling_beta_6m'] = rolling_beta.get_axes()[0].get_lines()[0].get_data() -# data['plot_rolling_beta_12m'] = rolling_beta.get_axes()[0].get_lines()[1].get_data() -# data['plot_rolling_beta_mean'] = rolling_beta.get_axes()[0].get_lines()[2].get_ydata()[0] -# -# rolling_volatility = _plots.rolling_volatility(returns, benchmark, -# figsize=(8, 3), subtitle=False, -# show=False, ylabel=False, period=win_half_year, -# periods_per_year=win_year) -# -# # Get the data from the figure -# data['plot_rolling_volatility_strategy'] = rolling_volatility.get_axes()[0].get_lines()[0].get_data() -# -# if benchmark is not None: -# data['plot_rolling_volatility_benchmark'] = rolling_volatility.get_axes()[0].get_lines()[1].get_data() -# -# data['plot_rolling_volatility_mean'] = rolling_volatility.get_axes()[0].get_lines()[2].get_ydata()[0] -# -# rolling_sharpe = _plots.rolling_sharpe(returns, -# figsize=(8, 3), subtitle=False, -# show=False, ylabel=False, period=win_half_year, -# periods_per_year=win_year) -# -# data['plot_rolling_sharpe'] = rolling_sharpe.get_axes()[0].get_lines()[0].get_data() -# -# data['plot_rolling_sharpe_mean'] = rolling_sharpe.get_axes()[0].get_lines()[1].get_ydata()[0] -# -# rolling_sortino = _plots.rolling_sortino(returns, -# figsize=(8, 3), subtitle=False, -# show=False, ylabel=False, period=win_half_year, -# periods_per_year=win_year) -# -# data['plot_rolling_sortino'] = rolling_sortino.get_axes()[0].get_lines()[0].get_data() -# -# data['plot_rolling_sortino_mean'] = rolling_sortino.get_axes()[0].get_lines()[1].get_ydata()[0] -# -# drawdowns_periods = _plots.drawdowns_periods(returns, figsize=(8, 4), subtitle=False, -# show=False, ylabel=False, compounded=compounded, -# prepare_returns=False) -# -# data['plot_drawdowns_periods'] = drawdowns_periods.get_axes()[0].get_lines()[0].get_data() -# -# under_water = _plots.drawdown(returns, -# figsize=(8, 3), subtitle=False, -# show=False, ylabel=False) -# -# data['plot_under_water'] = under_water.get_axes()[0].get_lines()[0].get_data() -# -# data['plot_under_water_mean'] = under_water.get_axes()[0].get_lines()[1].get_ydata()[0] -# -# port = pd.DataFrame(returns.fillna(0)) -# port.columns = ['Daily'] -# -# apply_fnc = _stats.comp if compounded else np.sum -# -# port['Weekly'] = port['Daily'].resample( -# 'W-MON').apply(apply_fnc) -# port['Weekly'].ffill(inplace=True) -# -# port['Monthly'] = port['Daily'].resample( -# 'M').apply(apply_fnc) -# port['Monthly'].ffill(inplace=True) -# -# port['Quarterly'] = port['Daily'].resample( -# 'Q').apply(apply_fnc) -# port['Quarterly'].ffill(inplace=True) -# -# port['Yearly'] = port['Daily'].resample( -# 'A').apply(apply_fnc) -# -# data['quantile'] = port -# -# return data -# diff --git a/jesse/services/redis.py b/jesse/services/redis.py index 0f18196d6..29d340742 100644 --- a/jesse/services/redis.py +++ b/jesse/services/redis.py @@ -5,6 +5,7 @@ import jesse.helpers as jh from jesse.libs.custom_json import NpEncoder import os +import base64 from jesse.services.env import ENV_VALUES @@ -27,24 +28,39 @@ async def init_redis(): ) -def sync_publish(event: str, msg): +def sync_publish(event: str, msg, compression: bool = False): if jh.is_unit_testing(): raise EnvironmentError('sync_publish() should be NOT called during testing. There must be something wrong') + if compression: + msg = jh.gzip_compress(msg) + # Encode the compressed message using Base64 + msg = base64.b64encode(msg).decode('utf-8') + sync_redis.publish( f"{ENV_VALUES['APP_PORT']}:channel:1", json.dumps({ 'id': os.getpid(), 'event': f'{jh.app_mode()}.{event}', + 'is_compressed': compression, 'data': msg }, ignore_nan=True, cls=NpEncoder) ) -async def async_publish(event: str, msg): +async def async_publish(event: str, msg, compression: bool = False): + if jh.is_unit_testing(): + raise EnvironmentError('sync_publish() should be NOT called during testing. There must be something wrong') + + if compression: + msg = jh.gzip_compress(msg) + # Encode the compressed message using Base64 + msg = base64.b64encode(msg).decode('utf-8') + await async_redis.publish( f"{ENV_VALUES['APP_PORT']}:channel:1", json.dumps({ 'id': os.getpid(), 'event': f'{jh.app_mode()}.{event}', + 'is_compressed': compression, 'data': msg }, ignore_nan=True, cls=NpEncoder) ) @@ -54,7 +70,4 @@ def is_process_active(client_id: str) -> bool: if jh.is_unit_testing(): return False - # print them for debugging - from jesse.services.multiprocessing import process_manager - return sync_redis.sismember(f"{ENV_VALUES['APP_PORT']}|active-processes", client_id) diff --git a/jesse/services/report.py b/jesse/services/report.py index 8a11ba4c1..e3a4bb38d 100644 --- a/jesse/services/report.py +++ b/jesse/services/report.py @@ -33,8 +33,8 @@ def positions() -> list: 'leverage': p.leverage, 'opened_at': p.opened_at, 'qty': p.qty, - 'value': jh.round_or_none(p.value, 2), - 'entry': jh.round_or_none(p.entry_price, 2) if p.is_open else None, + 'value': p.value, + 'entry': p.entry_price, 'current_price': p.current_price, 'liquidation_price': p.liquidation_price, 'pnl': p.pnl, @@ -156,6 +156,12 @@ def portfolio_metrics() -> Union[dict, None]: return stats.trades(store.completed_trades.trades, store.app.daily_balance) +def trades() -> List[dict]: + if store.completed_trades.count == 0: + return [] + return [t.to_dict_with_orders for t in store.completed_trades.trades] + + def info() -> List[List[Union[str, Any]]]: return [ [ @@ -183,7 +189,15 @@ def watch_list() -> List[List[Union[str, str]]]: if not store.candles.are_all_initiated: return [] - watch_list_array = strategy.watch_list() + try: + watch_list_array = strategy.watch_list() + except Exception as e: + import traceback + + watch_list_array = [ + ('', "The watch list is not available because an error occurred while getting it. Please check your strategy code's watch_list() method."), + ('', f'ERROR: ```{traceback.format_exc()}```') + ] # loop through the watch list and convert each item into a string for index, value in enumerate(watch_list_array): diff --git a/jesse/services/strategy_maker/ExampleStrategy/__init__.py b/jesse/services/strategy_handler/ExampleStrategy/__init__.py similarity index 75% rename from jesse/services/strategy_maker/ExampleStrategy/__init__.py rename to jesse/services/strategy_handler/ExampleStrategy/__init__.py index 577d1b5b1..bfb8a3ce8 100644 --- a/jesse/services/strategy_maker/ExampleStrategy/__init__.py +++ b/jesse/services/strategy_handler/ExampleStrategy/__init__.py @@ -1,4 +1,4 @@ -from jesse.strategies import Strategy, cached +from jesse.strategies import Strategy import jesse.indicators as ta from jesse import utils @@ -7,16 +7,13 @@ class ExampleStrategy(Strategy): def should_long(self) -> bool: return False - def go_long(self): - pass - def should_short(self) -> bool: # For futures trading only return False + + def go_long(self): + pass def go_short(self): # For futures trading only pass - - def should_cancel_entry(self) -> bool: - return True diff --git a/jesse/services/strategy_handler/__init__.py b/jesse/services/strategy_handler/__init__.py new file mode 100644 index 000000000..cb7715db1 --- /dev/null +++ b/jesse/services/strategy_handler/__init__.py @@ -0,0 +1,106 @@ +import os +import shutil +from starlette.responses import JSONResponse + + +def generate(name: str) -> JSONResponse: + path = f'strategies/{name}' + + # validation for name duplication + exists = os.path.isdir(path) + if exists: + return JSONResponse({ + 'status': 'error', + 'message': f'Strategy "{name}" already exists.' + }, status_code=409) + + # generate from ExampleStrategy + dirname, filename = os.path.split(os.path.abspath(__file__)) + + shutil.copytree(f'{dirname}/ExampleStrategy', path) + + # replace 'ExampleStrategy' with the name of the new strategy + with open(f"{path}/__init__.py", "rt") as fin: + data = fin.read() + data = data.replace('ExampleStrategy', name) + with open(f"{path}/__init__.py", "wt") as fin: + fin.write(data) + # return the location of generated strategy directory + return JSONResponse({ + 'status': 'success', + 'message': path + }) + + +def get_strategies() -> JSONResponse: + path = 'strategies' + directories = [] + + # Iterate through the items in the specified path + for item in os.listdir(path): + # Construct full path + full_path = os.path.join(path, item) + # Check if the item is a directory + if os.path.isdir(full_path): + directories.append(item) + + return JSONResponse({ + 'status': 'success', + 'strategies': directories + }) + + +def get_strategy(name: str) -> JSONResponse: + path = f'strategies/{name}' + exists = os.path.isdir(path) + + if not exists: + return JSONResponse({ + 'status': 'error', + 'message': f'Strategy "{name}" does not exist.' + }, status_code=404) + + with open(f"{path}/__init__.py", "rt") as fin: + content = fin.read() + + return JSONResponse({ + 'status': 'success', + 'content': content + }) + + +def save_strategy(name: str, content: str) -> JSONResponse: + path = f'strategies/{name}' + exists = os.path.isdir(path) + + if not exists: + return JSONResponse({ + 'status': 'error', + 'message': f'Strategy "{name}" does not exist.' + }, status_code=404) + + with open(f"{path}/__init__.py", "wt") as fin: + fin.write(content) + + return JSONResponse({ + 'status': 'success', + 'message': f'Strategy "{name}" has been saved.' + }) + + +def delete_strategy(name: str) -> JSONResponse: + path = f'strategies/{name}' + exists = os.path.isdir(path) + + if not exists: + return JSONResponse({ + 'status': 'error', + 'message': f'Strategy "{name}" does not exist.' + }, status_code=404) + + shutil.rmtree(path) + + return JSONResponse({ + 'status': 'success', + 'message': f'Strategy "{name}" has been deleted.' + }) diff --git a/jesse/services/strategy_maker/__init__.py b/jesse/services/strategy_maker/__init__.py deleted file mode 100644 index 9ad76dd0a..000000000 --- a/jesse/services/strategy_maker/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import shutil -from starlette.responses import JSONResponse - - -def generate(name: str) -> JSONResponse: - path = f'strategies/{name}' - - # validation for name duplication - exists = os.path.isdir(path) - if exists: - return JSONResponse({ - 'status': 'error', - 'message': f'Strategy "{name}" already exists.' - }) - - # generate from ExampleStrategy - dirname, filename = os.path.split(os.path.abspath(__file__)) - - shutil.copytree(f'{dirname}/ExampleStrategy', path) - - # replace 'ExampleStrategy' with the name of the new strategy - with open(f"{path}/__init__.py", "rt") as fin: - data = fin.read() - data = data.replace('ExampleStrategy', name) - with open(f"{path}/__init__.py", "wt") as fin: - fin.write(data) - # return the location of generated strategy directory - return JSONResponse({ - 'status': 'success', - 'message': path - }) diff --git a/jesse/services/web.py b/jesse/services/web.py index aad8e54c1..70215bcfa 100644 --- a/jesse/services/web.py +++ b/jesse/services/web.py @@ -32,7 +32,6 @@ class BacktestRequestJson(BaseModel): export_json: bool export_chart: bool export_tradingview: bool - export_full_reports: bool fast_mode: bool benchmark: bool @@ -143,6 +142,19 @@ class NewStrategyRequestJson(BaseModel): name: str +class GetStrategyRequestJson(BaseModel): + name: str + + +class SaveStrategyRequestJson(BaseModel): + name: str + content: str + + +class DeleteStrategyRequestJson(BaseModel): + name: str + + class FeedbackRequestJson(BaseModel): description: str email: Optional[str] = None @@ -155,3 +167,8 @@ class ReportExceptionRequestJson(BaseModel): attach_logs: bool session_id: Optional[str] = None email: Optional[str] = None + + +class DeleteCandlesRequestJson(BaseModel): + exchange: str + symbol: str diff --git a/jesse/static/200.html b/jesse/static/200.html index f91a0c59f..ce1381ce1 100644 --- a/jesse/static/200.html +++ b/jesse/static/200.html @@ -1,18 +1,17 @@ - + - - - - - - - - + + - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/jesse/static/404.html b/jesse/static/404.html index f91a0c59f..ce1381ce1 100644 --- a/jesse/static/404.html +++ b/jesse/static/404.html @@ -1,18 +1,17 @@ - + - - - - - - - - + + - - - -
- \ No newline at end of file + + + + + + + + +
+ \ No newline at end of file diff --git a/jesse/static/_nuxt/1sxhQl7t.js b/jesse/static/_nuxt/1sxhQl7t.js deleted file mode 100644 index 94c433be3..000000000 --- a/jesse/static/_nuxt/1sxhQl7t.js +++ /dev/null @@ -1 +0,0 @@ -import{o as s,c as l,a as t,g as U,x as w,t as $,n as v,k as a,p as ee,f as te,_ as T,C as oe,D as I,E as z,G as J,X as D,H as se,I as ae,J as N,K as ne,L as y,M as f,O as i,N as B,d as P,F as L,i as R,j,an as re,ao as le,a3 as ie,P as de,a9 as ce,r as A,b as c,w as M,S as ue,l as pe,v as ge,a5 as me,V as S,ai as fe,ab as he,Z as be,$ as ve,ac as ye,W as ke}from"./BLm-LuZL.js";function _e(e,o){return s(),l("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.666 3.888A2.25 2.25 0 0 0 13.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 0 1-.75.75H9a.75.75 0 0 1-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 0 1-2.25 2.25H6.75A2.25 2.25 0 0 1 4.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 0 1 1.927-.184"})])}function we(e,o){return s(),l("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3 3v1.5M3 21v-6m0 0 2.77-.693a9 9 0 0 1 6.208.682l.108.054a9 9 0 0 0 6.086.71l3.114-.732a48.524 48.524 0 0 1-.005-10.499l-3.11.732a9 9 0 0 1-6.085-.711l-.108-.054a9 9 0 0 0-6.208-.682L3 4.5M3 15V4.5"})])}function $e(e,o){return s(),l("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[t("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m9.75 9.75 4.5 4.5m0-4.5-4.5 4.5M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"})])}const xe={wrapper:"w-full relative overflow-hidden",inner:"w-0 flex-1",title:"text-sm font-medium",description:"mt-1 text-sm leading-4 opacity-90",actions:"flex items-center gap-2 mt-3 flex-shrink-0",shadow:"",rounded:"rounded-lg",padding:"p-4",gap:"gap-3",icon:{base:"flex-shrink-0 w-5 h-5"},avatar:{base:"flex-shrink-0 self-center",size:"md"},color:{white:{solid:"text-gray-900 dark:text-white bg-white dark:bg-gray-900 ring-1 ring-gray-200 dark:ring-gray-800"}},variant:{solid:"bg-{color}-500 dark:bg-{color}-400 text-white dark:text-gray-900",outline:"text-{color}-500 dark:text-{color}-400 ring-1 ring-inset ring-{color}-500 dark:ring-{color}-400",soft:"bg-{color}-50 dark:bg-{color}-400 dark:bg-opacity-10 text-{color}-500 dark:text-{color}-400",subtle:"bg-{color}-50 dark:bg-{color}-400 dark:bg-opacity-10 text-{color}-500 dark:text-{color}-400 ring-1 ring-inset ring-{color}-500 dark:ring-{color}-400 ring-opacity-25 dark:ring-opacity-25"},default:{color:"white",variant:"solid",icon:null,closeButton:null,actionButton:{size:"xs",color:"primary",variant:"link"}}},Ce=e=>(ee("data-v-88f4951a"),e=e(),te(),e),Be=Ce(()=>t("div",{class:"left-half-clipper"},[t("div",{class:"first50-bar"}),t("div",{class:"value-bar"})],-1)),Me=U({__name:"CircleProgressbar",props:{progress:{}},setup(e){const o=e,d=w(()=>{let u="progress-circle";return o.progress>50&&(u+=" over50"),u+=` p${Math.round(o.progress)}`,u});return(u,x)=>(s(),l("div",{class:v(a(d))},[t("span",null,$(u.progress)+"%",1),Be],2))}}),nt=T(Me,[["__scopeId","data-v-88f4951a"]]),h=oe(I.ui.strategy,I.ui.alert,xe),Ve=U({components:{UIcon:z,UAvatar:J,UButton:D},inheritAttrs:!1,props:{title:{type:String,default:null},description:{type:String,default:null},icon:{type:String,default:()=>h.default.icon},avatar:{type:Object,default:null},closeButton:{type:Object,default:()=>h.default.closeButton},actions:{type:Array,default:()=>[]},color:{type:String,default:()=>h.default.color,validator(e){return[...I.ui.colors,...Object.keys(h.color)].includes(e)}},variant:{type:String,default:()=>h.default.variant,validator(e){return[...Object.keys(h.variant),...Object.values(h.color).flatMap(o=>Object.keys(o))].includes(e)}},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})}},emits:["close"],setup(e){const{ui:o,attrs:d}=se("alert",ae(e,"ui"),h),u=w(()=>{var k,g;const n=((g=(k=o.value.color)==null?void 0:k[e.color])==null?void 0:g[e.variant])||o.value.variant[e.variant];return N(ne(o.value.wrapper,o.value.rounded,o.value.shadow,o.value.padding,n==null?void 0:n.replaceAll("{color}",e.color)),e.class)});function x(n){n.click&&n.click()}return{ui:o,attrs:d,alertClass:u,onAction:x,twMerge:N}}});function Se(e,o,d,u,x,n){const k=z,g=J,b=D;return s(),l("div",B({class:e.alertClass},e.attrs),[t("div",{class:v(["flex",[e.ui.gap,{"items-start":e.description||e.$slots.description,"items-center":!e.description&&!e.$slots.description}]])},[y(e.$slots,"icon",{icon:e.icon},()=>[e.icon?(s(),f(k,{key:0,name:e.icon,ui:e.ui.icon.base},null,8,["name","ui"])):i("",!0)]),y(e.$slots,"avatar",{avatar:e.avatar},()=>[e.avatar?(s(),f(g,B({key:0},{size:e.ui.avatar.size,...e.avatar},{class:e.ui.avatar.base}),null,16,["class"])):i("",!0)]),t("div",{class:v(e.ui.inner)},[e.title||e.$slots.title?(s(),l("p",{key:0,class:v(e.ui.title)},[y(e.$slots,"title",{title:e.title},()=>[P($(e.title),1)])],2)):i("",!0),e.description||e.$slots.description?(s(),l("p",{key:1,class:v(e.twMerge(e.ui.description,!(e.title&&e.$slots.title)&&"mt-0 leading-5"))},[y(e.$slots,"description",{description:e.description},()=>[P($(e.description),1)])],2)):i("",!0),(e.description||e.$slots.description)&&e.actions.length?(s(),l("div",{key:2,class:v(e.ui.actions)},[(s(!0),l(L,null,R(e.actions,(p,C)=>(s(),f(b,B({key:C},{...e.ui.default.actionButton||{},...p},{onClick:j(V=>e.onAction(p),["stop"])}),null,16,["onClick"]))),128))],2)):i("",!0)],2),e.closeButton||!e.description&&!e.$slots.description&&e.actions.length?(s(),l("div",{key:0,class:v(e.twMerge(e.ui.actions,"mt-0"))},[!e.description&&!e.$slots.description&&e.actions.length?(s(!0),l(L,{key:0},R(e.actions,(p,C)=>(s(),f(b,B({key:C},{...e.ui.default.actionButton||{},...p},{onClick:j(V=>e.onAction(p),["stop"])}),null,16,["onClick"]))),128)):i("",!0),e.closeButton?(s(),f(b,B({key:1,"aria-label":"Close"},{...e.ui.default.closeButton||{},...e.closeButton},{onClick:o[0]||(o[0]=j(p=>e.$emit("close"),["stop"]))}),null,16)):i("",!0)],2)):i("",!0)],2)],16)}const Ue=T(Ve,[["render",Se]]),je={class:"w-full flex justify-between items-center"},Ae=["textContent"],Ie=t("div",{class:"w-full flex items-center","aria-hidden":"true"},[t("div",{class:"w-full border-t-2 border-dashed border-gray-300 dark:border-gray-600"})],-1),Le={class:"whitespace-nowrap ml-2"},Te=U({__name:"DividerWithButtons",props:{title:{}},setup(e){return(o,d)=>(s(),l("div",je,[t("span",{class:"pr-3 bg-gray-50 dark:bg-backdrop-dark text-lg font-semibold text-gray-900 dark:text-gray-200",textContent:$(o.title)},null,8,Ae),Ie,t("span",Le,[y(o.$slots,"default")])]))}}),De={key:0,class:"mb-4"},Oe=t("p",null," If the exception you're seeing is not clear and you think it might be a bug, please send us a report to help us debugging and fixing it in a future release. ",-1),Ee=t("br",null,null,-1),He=t("label",{class:"font-semibold"},"Exception:",-1),Ne=["innerHTML"],Pe={class:"flex justify-end"},Re=t("span",null,"Report",-1),ze={class:"rounded-md bg-red-50 p-4 my-4 select-text"},Je={class:"flex"},Fe={class:"flex-shrink-0"},We={class:"ml-3 overflow-hidden w-full"},Ge=["textContent"],Ze=["innerHTML"],qe=["value"],rt=U({__name:"Exception",props:re({title:String,content:{type:String,default:""},mode:String,debugMode:{type:Boolean,default:!1}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:["update:modelValue"],setup(e){const o=e,d=le(e,"modelValue"),u=w(()=>ie().params.id),x=de(),n=ce({description:"",attachLogs:!0,email:""}),k=A(!1),g=A(!1),b=A(!1),p=w(()=>o.mode==="backtest"&&!o.debugMode?{message:'It is highly recommended to attach log files with reports. To do that, press cancel, enable "Debug Mode", and run again. ',type:"warning"}:{message:"",type:""}),C=w(()=>o.mode==="backtest"&&o.debugMode||o.mode==="live"),V=w(()=>x.hasLivePluginInstalled),F=async()=>{b.value=!0;const{data:O,error:r}=await me("/report-exception",{description:n.description,email:n.email,traceback:o.content,mode:o.mode,attach_logs:n.attachLogs,session_id:u},!0);if(b.value=!1,r.value&&r.value.statusCode!==200){S("error",`[${r.value.statusCode}]: ${r.value.message}`);return}const _=O.value;_.data.status==="success"?(n.description="",n.email="",S("success",_.data.message),d.value=!1):_.data.status==="error"&&S("error",_.data.message)},W=()=>{navigator.clipboard.writeText(o.content),S("success","Copied successfully"),g.value=!0,setTimeout(()=>{g.value=!1},2e3)},G=()=>{d.value=!0};return(O,r)=>{const _=Ue,Z=fe,E=he,q=be,K=ve,H=D,X=ye,Q=ke,Y=Te;return s(),l(L,null,[c(Q,{modelValue:d.value,"onUpdate:modelValue":r[5]||(r[5]=m=>d.value=m),title:"Report"},{default:M(()=>[a(p).message?(s(),l("div",De,[c(_,{color:"teal",icon:"i-heroicons-check-circle",title:a(p).message,"close-button":{icon:"i-heroicons-x-mark-20-solid",color:"white",variant:"link"},onClose:r[0]||(r[0]=m=>a(p).message="")},null,8,["title"])])):i("",!0),Oe,Ee,He,t("pre",{class:"break-all lg:break-normal mt-2 text-sm whitespace-pre-line px-6 py-6 rounded-md bg-gray-50 dark:bg-gray-700 text-gray-700 dark:text-gray-300 dark:border-gray-800 border border-gray-200",innerHTML:e.content},null,8,Ne),c(X,{state:a(n),class:"space-y-4 mt-4",onSubmit:F},{default:M(()=>[c(E,{label:"Description (optional):",name:"Description (optional):"},{default:M(()=>[c(Z,{modelValue:a(n).description,"onUpdate:modelValue":r[1]||(r[1]=m=>a(n).description=m),rows:10,placeholder:"Describe how the exception occurred..."},null,8,["modelValue"])]),_:1}),a(V)?i("",!0):(s(),f(E,{key:0,label:"Email (must be registered with on Jesse.Trade)",help:"Enter your email address for us to know who sent the feedback and possibly reply back to you. It must be the email address of your account on Jesse.Trade",required:""},{default:M(()=>[c(q,{modelValue:a(n).email,"onUpdate:modelValue":r[2]||(r[2]=m=>a(n).email=m),placeholder:"Email address...",type:"email"},null,8,["modelValue"])]),_:1})),a(C)?(s(),f(K,{key:1,modelValue:a(n).attachLogs,"onUpdate:modelValue":r[3]||(r[3]=m=>a(n).attachLogs=m),title:"Attach Debugging Logs",help:"Attach the log file of this session along with this report which helps Jesse's team"},null,8,["modelValue"])):i("",!0),t("div",Pe,[c(H,{id:"feedback-cancel-button",color:"gray",variant:"link",class:"mr-8",label:"Cancel",onClick:r[4]||(r[4]=m=>d.value=!1)}),c(H,{id:"feedback-submit-button",type:"submit",class:"w-48 flex justify-center",label:"Submit",loading:a(b),disabled:!a(n).description.length||!a(n).email.length&&!a(V)},null,8,["loading","disabled"])])]),_:1},8,["state"])]),_:1},8,["modelValue"]),c(Y,{title:"Exception"},{default:M(()=>[t("button",{type:"button",class:"inline-flex items-center shadow-sm px-4 py-1.5 border border-gray-300 dark:border-gray-600 text-sm leading-5 font-medium rounded-l-full text-gray-700 dark:text-gray-100 bg-white dark:bg-backdrop-dark hover:bg-gray-50 dark:hover:bg-gray-800 focus:outline-none",onClick:G},[c(a(we),{class:"-ml-1.5 mr-1 h-5 w-5 text-gray-400","aria-hidden":"true"}),Re]),t("button",{type:"button",class:"inline-flex items-center shadow-sm px-4 py-1.5 border border-gray-300 dark:border-gray-600 text-sm leading-5 font-medium rounded-r-full text-gray-700 dark:text-gray-100 bg-white dark:bg-backdrop-dark hover:bg-gray-50 dark:hover:bg-gray-800 focus:outline-none",onClick:W},[a(g)?(s(),f(a(ue),{key:0,class:"-ml-1.5 mr-1 h-5 w-5 text-gray-400","aria-hidden":"true"})):(s(),f(a(_e),{key:1,class:"-ml-1.5 mr-1 h-5 w-5 text-gray-400","aria-hidden":"true"})),t("span",null,$(a(g)?"Copied":"Copy"),1)])]),_:1}),t("div",ze,[t("div",Je,[t("div",Fe,[c(a($e),{class:"h-5 w-5 text-red-400","aria-hidden":"true"})]),t("div",We,[t("h3",{class:"text-base font-medium text-red-800 mb-6",textContent:$(e.title)},null,8,Ge),e.content?(s(),l("pre",{key:0,class:"mt-2 text-sm text-red-700 whitespace-pre-line px-6 py-6 rounded-md border-2 border-dashed border-red-200",innerHTML:e.content},null,8,Ze)):i("",!0)])]),pe(t("textarea",{id:"exception-info",value:e.content,class:"fixed left-0 bottom-0 opacity-0"},null,8,qe),[[ge,a(k)]])])],64)}}}),Ke={},Xe={class:"grid grid-cols-1 gap-4 items-start lg:grid-cols-3 p-6"},Qe={class:"grid grid-cols-1 gap-4 lg:col-span-2 px-1"},Ye={"aria-labelledby":"section-1-title"},et={class:"rounded-lg"},tt={class:"grid grid-cols-1 gap-4"},ot={"aria-labelledby":"section-2-title"};function st(e,o){return s(),l("div",Xe,[t("div",Qe,[t("section",Ye,[t("div",et,[y(e.$slots,"left")])])]),t("div",tt,[t("section",ot,[y(e.$slots,"right")])])])}const lt=T(Ke,[["render",st]]);export{nt as _,rt as a,lt as b,Ue as c,Te as d,_e as r}; diff --git a/jesse/static/_nuxt/2oJWbEOo.js b/jesse/static/_nuxt/2oJWbEOo.js new file mode 100644 index 000000000..bec254074 --- /dev/null +++ b/jesse/static/_nuxt/2oJWbEOo.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={comments:{lineComment:"#"},brackets:[["[","]"],["<",">"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}],surroundingPairs:[{open:"[",close:"]"},{open:"<",close:">"},{open:"(",close:")"}]},o={defaultToken:"",tokenPostfix:".pla",brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"<",close:">",token:"delimiter.angle"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:[".i",".o",".mv",".ilb",".ob",".label",".type",".phase",".pair",".symbolic",".symbolic-output",".kiss",".p",".e",".end"],comment:/#.*$/,identifier:/[a-zA-Z]+[a-zA-Z0-9_\-]*/,plaContent:/[01\-~\|]+/,tokenizer:{root:[{include:"@whitespace"},[/@comment/,"comment"],[/\.([a-zA-Z_\-]+)/,{cases:{"@eos":{token:"keyword.$1"},"@keywords":{cases:{".type":{token:"keyword.$1",next:"@type"},"@default":{token:"keyword.$1",next:"@keywordArg"}}},"@default":{token:"keyword.$1"}}}],[/@identifier/,"identifier"],[/@plaContent/,"string"]],whitespace:[[/[ \t\r\n]+/,""]],type:[{include:"@whitespace"},[/\w+/,{token:"type",next:"@pop"}]],keywordArg:[[/[ \t\r\n]+/,{cases:{"@eos":{token:"",next:"@pop"},"@default":""}}],[/@comment/,"comment","@pop"],[/[<>()\[\]]/,{cases:{"@eos":{token:"@brackets",next:"@pop"},"@default":"@brackets"}}],[/\-?\d+/,{cases:{"@eos":{token:"number",next:"@pop"},"@default":"number"}}],[/@identifier/,{cases:{"@eos":{token:"identifier",next:"@pop"},"@default":"identifier"}}],[/[;=]/,{cases:{"@eos":{token:"delimiter",next:"@pop"},"@default":"delimiter"}}]]}};export{e as conf,o as language}; diff --git a/jesse/static/_nuxt/3TATJI7h.js b/jesse/static/_nuxt/3TATJI7h.js new file mode 100644 index 000000000..1bdf822ec --- /dev/null +++ b/jesse/static/_nuxt/3TATJI7h.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"<",close:">"}],folding:{markers:{start:new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:))")}}},t={defaultToken:"",tokenPostfix:".java",keywords:["abstract","continue","for","new","switch","assert","default","goto","package","synchronized","boolean","do","if","private","this","break","double","implements","protected","throw","byte","else","import","public","throws","case","enum","instanceof","return","transient","catch","extends","int","short","try","char","final","interface","static","void","class","finally","long","strictfp","volatile","const","float","native","super","while","true","false","yield","record","sealed","non-sealed","permits"],operators:["=",">","<","!","~","?",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/@\s*[a-zA-Z_\$][\w\$]*/,"annotation"],[/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/,"number.float"],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/,"number.float"],[/0[xX](@hexdigits)[Ll]?/,"number.hex"],[/0(@octaldigits)[Ll]?/,"number.octal"],[/0[bB](@binarydigits)[Ll]?/,"number.binary"],[/(@digits)[fFdD]/,"number.float"],[/(@digits)[lL]?/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"""/,"string","@multistring"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@javadoc"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],javadoc:[[/[^\/*]+/,"comment.doc"],[/\/\*/,"comment.doc.invalid"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],multistring:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"""/,"string","@pop"],[/./,"string"]]}};export{e as conf,t as language}; diff --git a/jesse/static/_nuxt/412CFEuT.js b/jesse/static/_nuxt/412CFEuT.js new file mode 100644 index 000000000..6e9393047 --- /dev/null +++ b/jesse/static/_nuxt/412CFEuT.js @@ -0,0 +1 @@ +import{ah as Re,g as Z,ai as Y,h as T,aj as ve,v as oe,x as De,ak as Te,al as ge,am as d,an as H,ao as V,ap as _e,aq as te,ar as Fe,as as ye,at as ke,au as N,av as de,aw as ce,F as J,r as O,ax as He,ay as me,az as ze,aA as W,aB as Ge,aC as Ke,aD as qe,aE as Je,aF as Qe,aG as We,aH as be,aI as _,aJ as L,aK as pe,a9 as Ie,aa as ae,a as Ae,j as le,k as M,o as b,w as U,d as B,l as x,c as D,m as E,B as K,b as P,aL as we,ab as Q,y as Ze,ac as Oe,ad as ne,aM as fe,aN as Xe,i as Pe,aO as Ye,aP as et,aQ as Ue,p as se,q as he,t as q,aR as je,H as tt,e as at,aS as nt,aT as re,aU as Ce,R as ot,O as lt,Z as st,A as rt,a5 as $e,a6 as Ee,S as it,D as ie,a0 as G}from"./qzODIPNV.js";import{_ as ut}from"./DYor4oMg.js";import{_ as xe}from"./DXz61R3a.js";const dt={wrapper:"relative overflow-x-auto",base:"min-w-full table-fixed",divide:"divide-y divide-gray-300 dark:divide-gray-700",thead:"relative",tbody:"divide-y divide-gray-200 dark:divide-gray-800",tr:{base:"",selected:"bg-gray-50 dark:bg-gray-800/50",active:"hover:bg-gray-50 dark:hover:bg-gray-800/50 cursor-pointer"},th:{base:"text-left rtl:text-right",padding:"px-4 py-3.5",color:"text-gray-900 dark:text-white",font:"font-semibold",size:"text-sm"},td:{base:"whitespace-nowrap",padding:"px-4 py-4",color:"text-gray-500 dark:text-gray-400",font:"",size:"text-sm"},checkbox:{padding:"ps-4"},loadingState:{wrapper:"flex flex-col items-center justify-center flex-1 px-6 py-14 sm:px-14",label:"text-sm text-center text-gray-900 dark:text-white",icon:"w-6 h-6 mx-auto text-gray-400 dark:text-gray-500 mb-4 animate-spin"},emptyState:{wrapper:"flex flex-col items-center justify-center flex-1 px-6 py-14 sm:px-14",label:"text-sm text-center text-gray-900 dark:text-white",icon:"w-6 h-6 mx-auto text-gray-400 dark:text-gray-500 mb-4"},progress:{wrapper:"absolute inset-x-0 -bottom-[0.5px] p-0"},default:{sortAscIcon:"i-heroicons-bars-arrow-up-20-solid",sortDescIcon:"i-heroicons-bars-arrow-down-20-solid",sortButton:{icon:"i-heroicons-arrows-up-down-20-solid",trailing:!0,square:!0,color:"gray",variant:"ghost",class:"-m-1.5"},progress:{color:"primary",animation:"carousel"},loadingState:{icon:"i-heroicons-arrow-path-20-solid",label:"Loading..."},emptyState:{icon:"i-heroicons-circle-stack-20-solid",label:"No items."}}},ct={wrapper:"relative",container:"z-50 group",trigger:"inline-flex w-full",width:"",background:"bg-white dark:bg-gray-900",shadow:"shadow-lg",rounded:"rounded-md",ring:"ring-1 ring-gray-200 dark:ring-gray-800",base:"overflow-hidden focus:outline-none relative",transition:{enterActiveClass:"transition ease-out duration-200",enterFromClass:"opacity-0 translate-y-1",enterToClass:"opacity-100 translate-y-0",leaveActiveClass:"transition ease-in duration-150",leaveFromClass:"opacity-100 translate-y-0",leaveToClass:"opacity-0 translate-y-1"},overlay:{base:"fixed inset-0 transition-opacity z-50",background:"bg-gray-200/75 dark:bg-gray-800/75",transition:{enterActiveClass:"ease-out duration-200",enterFromClass:"opacity-0",enterToClass:"opacity-100",leaveActiveClass:"ease-in duration-150",leaveFromClass:"opacity-100",leaveToClass:"opacity-0"}},popper:{strategy:"fixed"},default:{openDelay:0,closeDelay:0},arrow:Re};var pt=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(pt||{});let Ve=Symbol("PopoverContext");function Se(e){let c=be(Ve,null);if(c===null){let w=new Error(`<${e} /> is missing a parent <${Me.name} /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(w,Se),w}return c}let ft=Symbol("PopoverGroupContext");function Le(){return be(ft,null)}let Ne=Symbol("PopoverPanelContext");function vt(){return be(Ne,null)}let Me=Z({name:"Popover",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"}},setup(e,{slots:c,attrs:w,expose:F}){var C;let $=O(null);F({el:$,$el:$});let t=O(1),o=O(null),f=O(null),v=O(null),s=O(null),h=T(()=>ve($)),S=T(()=>{var a,i;if(!d(o)||!d(s))return!1;for(let z of document.querySelectorAll("body > *"))if(Number(z==null?void 0:z.contains(d(o)))^Number(z==null?void 0:z.contains(d(s))))return!0;let p=me(),u=p.indexOf(d(o)),A=(u+p.length-1)%p.length,j=(u+1)%p.length,X=p[A],ee=p[j];return!((a=d(s))!=null&&a.contains(X))&&!((i=d(s))!=null&&i.contains(ee))}),k={popoverState:t,buttonId:O(null),panelId:O(null),panel:s,button:o,isPortalled:S,beforePanelSentinel:f,afterPanelSentinel:v,togglePopover(){t.value=W(t.value,{0:1,1:0})},closePopover(){t.value!==1&&(t.value=1)},close(a){k.closePopover();let i=a?a instanceof HTMLElement?a:a.value instanceof HTMLElement?d(a):d(k.button):d(k.button);i==null||i.focus()}};Te(Ve,k),ze(T(()=>W(t.value,{0:te.Open,1:te.Closed})));let I={buttonId:k.buttonId,panelId:k.panelId,close(){k.closePopover()}},l=Le(),r=l==null?void 0:l.registerPopover,[g,y]=Ge(),m=Ke({mainTreeNodeRef:l==null?void 0:l.mainTreeNodeRef,portals:g,defaultContainers:[o,s]});function n(){var a,i,p,u;return(u=l==null?void 0:l.isFocusWithinPopoverGroup())!=null?u:((a=h.value)==null?void 0:a.activeElement)&&(((i=d(o))==null?void 0:i.contains(h.value.activeElement))||((p=d(s))==null?void 0:p.contains(h.value.activeElement)))}return ge(()=>r==null?void 0:r(I)),qe((C=h.value)==null?void 0:C.defaultView,"focus",a=>{var i,p;a.target!==window&&a.target instanceof HTMLElement&&t.value===0&&(n()||o&&s&&(m.contains(a.target)||(i=d(k.beforePanelSentinel))!=null&&i.contains(a.target)||(p=d(k.afterPanelSentinel))!=null&&p.contains(a.target)||k.closePopover()))},!0),Je(m.resolveContainers,(a,i)=>{var p;k.closePopover(),Qe(i,We.Loose)||(a.preventDefault(),(p=d(o))==null||p.focus())},T(()=>t.value===0)),()=>{let a={open:t.value===0,close:k.close};return N(J,[N(y,{},()=>ye({theirProps:{...e,...w},ourProps:{ref:$},slot:a,slots:c,attrs:w,name:"Popover"})),N(m.MainTreeNode)])}}}),gt=Z({name:"PopoverButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(e,{attrs:c,slots:w,expose:F}){var C;let $=(C=e.id)!=null?C:`headlessui-popover-button-${Y()}`,t=Se("PopoverButton"),o=T(()=>ve(t.button));F({el:t.button,$el:t.button}),oe(()=>{t.buttonId.value=$}),De(()=>{t.buttonId.value=null});let f=Le(),v=f==null?void 0:f.closeOthers,s=vt(),h=T(()=>s===null?!1:s.value===t.panelId.value),S=O(null),k=`headlessui-focus-sentinel-${Y()}`;h.value||ge(()=>{t.button.value=d(S)});let I=He(T(()=>({as:e.as,type:c.type})),S);function l(a){var i,p,u,A,j;if(h.value){if(t.popoverState.value===1)return;switch(a.key){case _.Space:case _.Enter:a.preventDefault(),(p=(i=a.target).click)==null||p.call(i),t.closePopover(),(u=d(t.button))==null||u.focus();break}}else switch(a.key){case _.Space:case _.Enter:a.preventDefault(),a.stopPropagation(),t.popoverState.value===1&&(v==null||v(t.buttonId.value)),t.togglePopover();break;case _.Escape:if(t.popoverState.value!==0)return v==null?void 0:v(t.buttonId.value);if(!d(t.button)||(A=o.value)!=null&&A.activeElement&&!((j=d(t.button))!=null&&j.contains(o.value.activeElement)))return;a.preventDefault(),a.stopPropagation(),t.closePopover();break}}function r(a){h.value||a.key===_.Space&&a.preventDefault()}function g(a){var i,p;e.disabled||(h.value?(t.closePopover(),(i=d(t.button))==null||i.focus()):(a.preventDefault(),a.stopPropagation(),t.popoverState.value===1&&(v==null||v(t.buttonId.value)),t.togglePopover(),(p=d(t.button))==null||p.focus()))}function y(a){a.preventDefault(),a.stopPropagation()}let m=Fe();function n(){let a=d(t.panel);if(!a)return;function i(){W(m.value,{[L.Forwards]:()=>H(a,V.First),[L.Backwards]:()=>H(a,V.Last)})===pe.Error&&H(me().filter(p=>p.dataset.headlessuiFocusGuard!=="true"),W(m.value,{[L.Forwards]:V.Next,[L.Backwards]:V.Previous}),{relativeTo:d(t.button)})}i()}return()=>{let a=t.popoverState.value===0,i={open:a},{...p}=e,u=h.value?{ref:S,type:I.value,onKeydown:l,onClick:g}:{ref:S,id:$,type:I.value,"aria-expanded":t.popoverState.value===0,"aria-controls":d(t.panel)?t.panelId.value:void 0,disabled:e.disabled?!0:void 0,onKeydown:l,onKeyup:r,onClick:g,onMousedown:y};return N(J,[ye({ourProps:u,theirProps:{...c,...p},slot:i,attrs:c,slots:w,name:"PopoverButton"}),a&&!h.value&&t.isPortalled.value&&N(de,{id:k,features:ce.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:n})])}}}),yt=Z({name:"PopoverPanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},focus:{type:Boolean,default:!1},id:{type:String,default:null}},inheritAttrs:!1,setup(e,{attrs:c,slots:w,expose:F}){var C;let $=(C=e.id)!=null?C:`headlessui-popover-panel-${Y()}`,{focus:t}=e,o=Se("PopoverPanel"),f=T(()=>ve(o.panel)),v=`headlessui-focus-sentinel-before-${Y()}`,s=`headlessui-focus-sentinel-after-${Y()}`;F({el:o.panel,$el:o.panel}),oe(()=>{o.panelId.value=$}),De(()=>{o.panelId.value=null}),Te(Ne,o.panelId),ge(()=>{var y,m;if(!t||o.popoverState.value!==0||!o.panel)return;let n=(y=f.value)==null?void 0:y.activeElement;(m=d(o.panel))!=null&&m.contains(n)||H(d(o.panel),V.First)});let h=_e(),S=T(()=>h!==null?(h.value&te.Open)===te.Open:o.popoverState.value===0);function k(y){var m,n;switch(y.key){case _.Escape:if(o.popoverState.value!==0||!d(o.panel)||f.value&&!((m=d(o.panel))!=null&&m.contains(f.value.activeElement)))return;y.preventDefault(),y.stopPropagation(),o.closePopover(),(n=d(o.button))==null||n.focus();break}}function I(y){var m,n,a,i,p;let u=y.relatedTarget;u&&d(o.panel)&&((m=d(o.panel))!=null&&m.contains(u)||(o.closePopover(),((a=(n=d(o.beforePanelSentinel))==null?void 0:n.contains)!=null&&a.call(n,u)||(p=(i=d(o.afterPanelSentinel))==null?void 0:i.contains)!=null&&p.call(i,u))&&u.focus({preventScroll:!0})))}let l=Fe();function r(){let y=d(o.panel);if(!y)return;function m(){W(l.value,{[L.Forwards]:()=>{var n;H(y,V.First)===pe.Error&&((n=d(o.afterPanelSentinel))==null||n.focus())},[L.Backwards]:()=>{var n;(n=d(o.button))==null||n.focus({preventScroll:!0})}})}m()}function g(){let y=d(o.panel);if(!y)return;function m(){W(l.value,{[L.Forwards]:()=>{let n=d(o.button),a=d(o.panel);if(!n)return;let i=me(),p=i.indexOf(n),u=i.slice(0,p+1),A=[...i.slice(p+1),...u];for(let j of A.slice())if(j.dataset.headlessuiFocusGuard==="true"||a!=null&&a.contains(j)){let X=A.indexOf(j);X!==-1&&A.splice(X,1)}H(A,V.First,{sorted:!1})},[L.Backwards]:()=>{var n;H(y,V.Previous)===pe.Error&&((n=d(o.button))==null||n.focus())}})}m()}return()=>{let y={open:o.popoverState.value===0,close:o.close},{focus:m,...n}=e,a={ref:o.panel,id:$,onKeydown:k,onFocusout:t&&o.popoverState.value===0?I:void 0,tabIndex:-1};return ye({ourProps:a,theirProps:{...c,...n},attrs:c,slot:y,slots:{...w,default:(...i)=>{var p;return[N(J,[S.value&&o.isPortalled.value&&N(de,{id:v,ref:o.beforePanelSentinel,features:ce.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:r}),(p=w.default)==null?void 0:p.call(w,...i),S.value&&o.isPortalled.value&&N(de,{id:s,ref:o.afterPanelSentinel,features:ce.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:g})])]}},features:ke.RenderStrategy|ke.Static,visible:S.value,name:"PopoverPanel"})}}});const ue=Ie(ae.ui.strategy,ae.ui.popover,ct),mt=Z({components:{HPopover:Me,HPopoverButton:gt,HPopoverPanel:yt},inheritAttrs:!1,props:{mode:{type:String,default:"click",validator:e=>["click","hover"].includes(e)},open:{type:Boolean,default:void 0},disabled:{type:Boolean,default:!1},openDelay:{type:Number,default:()=>ue.default.openDelay},closeDelay:{type:Number,default:()=>ue.default.closeDelay},overlay:{type:Boolean,default:!1},popper:{type:Object,default:()=>({})},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})}},emits:["update:open"],setup(e,{emit:c}){const{ui:w,attrs:F}=Oe("popover",ne(e,"ui"),ue,ne(e,"class")),C=T(()=>fe(e.mode==="hover"?{offsetDistance:0}:{},e.popper,w.value.popper)),[$,t]=Xe(C.value),o=O(null),f=O(null);let v=null,s=null;oe(()=>{var g,y;const l=(g=o.value)==null?void 0:g.$.provides;if(!l)return;const r=Object.getOwnPropertySymbols(l);f.value=r.length&&l[r[0]],e.open&&((y=f.value)==null||y.togglePopover())});const h=T(()=>{var y,m,n;if(e.mode!=="hover")return{};const l=((y=e.popper)==null?void 0:y.offsetDistance)||((m=w.value.popper)==null?void 0:m.offsetDistance)||8,r=(n=C.value.placement)==null?void 0:n.split("-")[0],g=`${l}px`;return r==="top"||r==="bottom"?{paddingTop:g,paddingBottom:g}:r==="left"||r==="right"?{paddingLeft:g,paddingRight:g}:{paddingTop:g,paddingBottom:g,paddingLeft:g,paddingRight:g}});function S(){f.value&&(f.value.popoverState===0?f.value.closePopover():f.value.togglePopover())}function k(){e.mode!=="hover"||!f.value||(s&&(clearTimeout(s),s=null),f.value.popoverState!==0&&(v=v||setTimeout(()=>{f.value.togglePopover&&f.value.togglePopover(),v=null},e.openDelay)))}function I(){e.mode!=="hover"||!f.value||(v&&(clearTimeout(v),v=null),f.value.popoverState!==1&&(s=s||setTimeout(()=>{f.value.closePopover&&f.value.closePopover(),s=null},e.closeDelay)))}return Pe(()=>e.open,(l,r)=>{f.value&&(r===void 0||l===r||(l?f.value.popoverState=0:f.value.closePopover()))}),Pe(()=>{var l;return(l=f.value)==null?void 0:l.popoverState},(l,r)=>{r===void 0||l===r||c("update:open",l===0)}),Ye(()=>et()),{ui:w,attrs:F,popover:o,popper:C,trigger:$,container:t,containerStyle:h,onTouchStart:S,onMouseEnter:k,onMouseLeave:I}}}),bt=["disabled"];function ht(e,c,w,F,C,$){const t=le("HPopoverButton"),o=le("HPopoverPanel"),f=le("HPopover");return b(),M(f,Q({ref:"popover",class:e.ui.wrapper},e.attrs,{onMouseleave:e.onMouseLeave}),{default:U(({open:v,close:s})=>[B(t,{ref:"trigger",as:"div",disabled:e.disabled,class:E(e.ui.trigger),role:"button",onMouseenter:e.onMouseEnter,onTouchstartPassive:e.onTouchStart},{default:U(()=>[K(e.$slots,"default",{open:v,close:s},()=>[P("button",{disabled:e.disabled}," Open ",8,bt)])]),_:2},1032,["disabled","class","onMouseenter","onTouchstartPassive"]),e.overlay?(b(),M(we,Q({key:0,appear:""},e.ui.overlay.transition),{default:U(()=>[v?(b(),D("div",{key:0,class:E([e.ui.overlay.base,e.ui.overlay.background])},null,2)):x("",!0)]),_:2},1040)):x("",!0),v?(b(),D("div",{key:1,ref:"container",class:E([e.ui.container,e.ui.width]),style:Ze(e.containerStyle)},[B(we,Q({appear:""},e.ui.transition),{default:U(()=>[P("div",null,[e.popper.arrow?(b(),D("div",{key:0,"data-popper-arrow":"",class:E(Object.values(e.ui.arrow))},null,2)):x("",!0),B(o,{class:E([e.ui.base,e.ui.background,e.ui.ring,e.ui.rounded,e.ui.shadow]),static:""},{default:U(()=>[K(e.$slots,"panel",{open:v,close:s})]),_:2},1032,["class"])])]),_:2},1040)],6)):x("",!0)]),_:3},16,["class","onMouseleave"])}const St=Ae(mt,[["render",ht]]);function kt(e){return e?e[0].toUpperCase()+e.slice(1):""}const R=Ie(ae.ui.strategy,ae.ui.table,dt);function wt(e,c){return e===c}function Be(e,c,w){return e===c?0:w==="asc"?ec?-1:1}const Pt=Z({components:{UIcon:je,UButton:he,UProgress:xe,UCheckbox:Ue},inheritAttrs:!1,props:{modelValue:{type:Array,default:null},by:{type:[String,Function],default:()=>wt},rows:{type:Array,default:()=>[]},columns:{type:Array,default:null},columnAttribute:{type:String,default:"label"},sort:{type:Object,default:()=>({})},sortMode:{type:String,default:"auto"},sortButton:{type:Object,default:()=>R.default.sortButton},sortAscIcon:{type:String,default:()=>R.default.sortAscIcon},sortDescIcon:{type:String,default:()=>R.default.sortDescIcon},loading:{type:Boolean,default:!1},loadingState:{type:Object,default:()=>R.default.loadingState},emptyState:{type:Object,default:()=>R.default.emptyState},progress:{type:Object,default:()=>R.default.progress},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})}},emits:["update:modelValue","update:sort"],setup(e,{emit:c,attrs:w}){const{ui:F,attrs:C}=Oe("table",ne(e,"ui"),R,ne(e,"class")),$=T(()=>e.columns??Object.keys(e.rows[0]??{}).map(n=>({key:n,label:kt(n),sortable:!1,class:void 0,sort:Be}))),t=nt(e,"sort",c,{passive:!0,defaultValue:fe({},e.sort,{column:null,direction:"asc"})}),o={column:t.value.column,direction:null},f=T(()=>{var i;if(!((i=t.value)!=null&&i.column)||e.sortMode==="manual")return e.rows;const{column:n,direction:a}=t.value;return e.rows.slice().sort((p,u)=>{var ee;const A=re(p,n),j=re(u,n);return(((ee=$.value.find(z=>z.key===n))==null?void 0:ee.sort)??Be)(A,j,a)})}),v=T({get(){return e.modelValue},set(n){c("update:modelValue",n)}}),s=T(()=>v.value&&v.value.length>0&&v.value.lengthe.emptyState===null?null:{...F.value.default.emptyState,...e.emptyState}),S=T(()=>e.loadingState===null?null:{...F.value.default.loadingState,...e.loadingState});function k(n,a){if(typeof e.by=="string"){const i=e.by;return(n==null?void 0:n[i])===(a==null?void 0:a[i])}return e.by(n,a)}function I(n){return e.modelValue?v.value.some(a=>k(Ce(a),Ce(n))):!1}function l(n){if(t.value.column===n.key){const a=!n.direction||n.direction==="asc"?"desc":"asc";t.value.direction===a?t.value=fe({},o,{column:null,direction:"asc"}):t.value={column:t.value.column,direction:t.value.direction==="asc"?"desc":"asc"}}else t.value={column:n.key,direction:n.direction||"asc"}}function r(n){w.onSelect&&w.onSelect(n)}function g(){e.rows.forEach(n=>{I(n)||v.value.push(n)})}function y(n){n.target.checked?g():v.value=[]}function m(n,a,i=""){return re(n,a,i)}return{ui:F,attrs:C,sort:t,columns:$,rows:f,selected:v,indeterminate:s,emptyState:h,loadingState:S,isSelected:I,onSort:l,onSelect:r,onChange:y,getRowData:m}}}),Ct={key:1},$t={key:0},Et={key:0},Bt=["colspan"],Dt={key:1},Tt=["colspan"],Ft=["onClick"];function It(e,c,w,F,C,$){const t=Ue,o=he,f=xe,v=je;return b(),D("div",Q({class:e.ui.wrapper},e.attrs),[P("table",{class:E([e.ui.base,e.ui.divide])},[P("thead",{class:E(e.ui.thead)},[P("tr",{class:E(e.ui.tr.base)},[e.modelValue?(b(),D("th",{key:0,scope:"col",class:E(e.ui.checkbox.padding)},[B(t,{"model-value":e.indeterminate||e.selected.length===e.rows.length,indeterminate:e.indeterminate,"aria-label":"Select all",onChange:e.onChange},null,8,["model-value","indeterminate","onChange"])],2)):x("",!0),(b(!0),D(J,null,se(e.columns,(s,h)=>(b(),D("th",{key:h,scope:"col",class:E([e.ui.th.base,e.ui.th.padding,e.ui.th.color,e.ui.th.font,e.ui.th.size,s.class])},[K(e.$slots,`${s.key}-header`,{column:s,sort:e.sort,onSort:e.onSort},()=>[s.sortable?(b(),M(o,Q({key:0,ref_for:!0},{...e.ui.default.sortButton||{},...e.sortButton},{icon:!e.sort.column||e.sort.column!==s.key?e.sortButton.icon||e.ui.default.sortButton.icon:e.sort.direction==="asc"?e.sortAscIcon:e.sortDescIcon,label:s[e.columnAttribute],onClick:S=>e.onSort(s)}),null,16,["icon","label","onClick"])):(b(),D("span",Ct,q(s[e.columnAttribute]),1))])],2))),128))],2),e.loading&&e.progress?(b(),D("tr",$t,[P("td",{colspan:0,class:E(e.ui.progress.wrapper)},[B(f,Q({...e.ui.default.progress||{},...e.progress},{size:"2xs"}),null,16)],2)])):x("",!0)],2),P("tbody",{class:E(e.ui.tbody)},[e.loadingState&&e.loading&&!e.rows.length?(b(),D("tr",Et,[P("td",{colspan:e.columns.length+(e.modelValue?1:0)},[K(e.$slots,"loading-state",{},()=>[P("div",{class:E(e.ui.loadingState.wrapper)},[e.loadingState.icon?(b(),M(v,{key:0,name:e.loadingState.icon,class:E(e.ui.loadingState.icon),"aria-hidden":"true"},null,8,["name","class"])):x("",!0),P("p",{class:E(e.ui.loadingState.label)},q(e.loadingState.label),3)],2)])],8,Bt)])):e.emptyState&&!e.rows.length?(b(),D("tr",Dt,[P("td",{colspan:e.columns.length+(e.modelValue?1:0)},[K(e.$slots,"empty-state",{},()=>[P("div",{class:E(e.ui.emptyState.wrapper)},[e.emptyState.icon?(b(),M(v,{key:0,name:e.emptyState.icon,class:E(e.ui.emptyState.icon),"aria-hidden":"true"},null,8,["name","class"])):x("",!0),P("p",{class:E(e.ui.emptyState.label)},q(e.emptyState.label),3)],2)])],8,Tt)])):(b(!0),D(J,{key:2},se(e.rows,(s,h)=>(b(),D("tr",{key:h,class:E([e.ui.tr.base,e.isSelected(s)&&e.ui.tr.selected,e.$attrs.onSelect&&e.ui.tr.active,s==null?void 0:s.class]),onClick:()=>e.onSelect(s)},[e.modelValue?(b(),D("td",{key:0,class:E(e.ui.checkbox.padding)},[B(t,{modelValue:e.selected,"onUpdate:modelValue":c[0]||(c[0]=S=>e.selected=S),value:s,"aria-label":"Select row",onClick:c[1]||(c[1]=tt(()=>{},["stop"]))},null,8,["modelValue","value"])],2)):x("",!0),(b(!0),D(J,null,se(e.columns,(S,k)=>{var I;return b(),D("td",{key:k,class:E([e.ui.td.base,e.ui.td.padding,e.ui.td.color,e.ui.td.font,e.ui.td.size,(I=s[S.key])==null?void 0:I.class])},[K(e.$slots,`${S.key}-data`,{column:S,row:s,index:h,getRowData:l=>e.getRowData(s,S.key,l)},()=>[at(q(e.getRowData(s,S.key)),1)])],2)}),128))],10,Ft))),128))],2)],2)],16)}const At=Ae(Pt,[["render",It]]),Ot={class:"container my-8 pb-24"},Ut={class:"flex justify-between items-center mb-6"},jt={class:"flex gap-4 mb-6"},xt={class:"flex flex-col items-center justify-center py-12 gap-4"},Vt={key:0},Lt={class:"flex flex-col items-center gap-2"},Nt={key:1},Mt={class:"flex items-center gap-2"},Rt={class:"p-4 space-y-4"},_t={class:"flex justify-end gap-2"},Kt=Z({__name:"manage",setup(e){const c=ot(),w=lt(),F=O(!1),C=O(!1),$=O(new Set),t=O({exchange:"",symbol:""}),o=[{key:"exchange",label:"Exchange"},{key:"symbol",label:"Symbol"},{key:"start_date",label:"Start Date"},{key:"end_date",label:"End Date"},{key:"actions",label:"Actions"}],f=T(()=>{let l=c.existingCandles;return t.value.exchange&&(l=l.filter(r=>r.exchange.toLowerCase().includes(t.value.exchange.toLowerCase()))),t.value.symbol&&(l=l.filter(r=>r.symbol.toLowerCase().includes(t.value.symbol.toLowerCase()))),l}),v=T(()=>F.value||C.value),s=l=>`${l.exchange}-${l.symbol}`;async function h(){G("success","Fetching latest candle details. This process might take from a few seconds up to a few minutes depending on the database size."),C.value=!0;try{await c.fetchExistingCandles()}finally{C.value=!1,G("success","Candles information updated successfully")}}async function S(l){const r=s(l);$.value.add(r);try{await c.deleteCandles(l.exchange,l.symbol),G("success","Candles deleted successfully")}catch{G("error","Failed to delete candles")}finally{$.value.delete(r)}}async function k(l){try{await c.updateCandles(l.exchange,l.symbol,l.start_date),G("success",`Started updating candles for ${l.symbol} on ${l.exchange}`)}catch{G("error","Failed to start candle update")}}const I=l=>w.backtestingExchangeNames.includes(l);return oe(async()=>{if(!c.existingCandles.length){F.value=!0;try{await c.fetchExistingCandles()}finally{F.value=!1}}}),(l,r)=>{const g=he,y=st,m=ut,n=it,a=St,i=At,p=rt;return b(),D("div",Ot,[P("div",Ut,[B(g,{class:"shadow-sm",icon:"i-heroicons-arrow-left",variant:"outline",to:"/candles",label:"Back"}),B(g,{class:"shadow-sm",icon:"i-heroicons-arrow-path",loading:C.value,label:"Refresh",onClick:h},null,8,["loading"])]),P("div",jt,[B(y,{modelValue:t.value.exchange,"onUpdate:modelValue":r[1]||(r[1]=u=>t.value.exchange=u),class:"w-64",icon:"i-heroicons-magnifying-glass",placeholder:"Filter by Exchange",ui:{icon:{trailing:{pointer:""}}}},{trailing:U(()=>[$e(B(g,{color:"gray",variant:"link",icon:"i-heroicons-x-mark-20-solid",padded:!1,onClick:r[0]||(r[0]=u=>t.value.exchange="")},null,512),[[Ee,t.value.exchange!==""]])]),_:1},8,["modelValue"]),B(y,{modelValue:t.value.symbol,"onUpdate:modelValue":r[3]||(r[3]=u=>t.value.symbol=u),icon:"i-heroicons-magnifying-glass",placeholder:"Filter by Symbol",class:"w-64",ui:{icon:{trailing:{pointer:""}}}},{trailing:U(()=>[$e(B(g,{color:"gray",variant:"link",icon:"i-heroicons-x-mark-20-solid",padded:!1,onClick:r[2]||(r[2]=u=>t.value.symbol="")},null,512),[[Ee,t.value.symbol!==""]])]),_:1},8,["modelValue"])]),F.value?(b(),M(m,{key:0,icon:"i-heroicons-information-circle",color:"gray",title:"Loading candles...",description:"This process might take from a few seconds up to a few minutes.",class:"mb-6"})):x("",!0),B(p,null,{default:U(()=>[B(i,{rows:f.value,columns:o,loading:v.value,"loading-state":{icon:"i-heroicons-arrow-path-20-solid",label:"Loading candles..."},progress:{color:"primary",animation:"carousel"}},{"empty-state":U(()=>[P("div",xt,[ie(c).existingCandles.length===0?(b(),D("div",Vt,[r[5]||(r[5]=P("span",{class:"text-gray-500 dark:text-gray-400 mb-4 block"}," Click the button below to fetch existing candles from the database ",-1)),P("div",Lt,[B(g,{icon:"i-heroicons-arrow-path",label:"Fetch Candles",onClick:h}),r[4]||(r[4]=P("p",{class:"text-sm text-gray-500 dark:text-gray-400 mt-2"}," Note: This process might take a few minutes depending on the database size ",-1))])])):(b(),D("div",Nt,r[6]||(r[6]=[P("span",{class:"text-gray-500 dark:text-gray-400"}," No candles found matching your filters ",-1)])))])]),"actions-data":U(({row:u})=>[P("div",Mt,[I(u.exchange)?(b(),M(g,{key:1,color:"teal",variant:"soft",icon:"i-heroicons-arrow-path",size:"xs",label:"Update",loading:ie(c).isSymbolUpdating(u.exchange,u.symbol),disabled:!I(u.exchange),onClick:A=>k(u)},null,8,["loading","disabled","onClick"])):(b(),M(n,{key:0,text:"This exchange doesn't support backtesting"},{default:U(()=>[B(g,{color:"teal",variant:"soft",icon:"i-heroicons-arrow-path",size:"xs",label:"Update",loading:ie(c).isSymbolUpdating(u.exchange,u.symbol),disabled:!I(u.exchange),onClick:A=>k(u)},null,8,["loading","disabled","onClick"])]),_:2},1024)),B(a,{popper:{placement:"bottom-end"}},{panel:U(({close:A})=>[P("div",Rt,[P("p",null,'Are you sure you want to delete all candles for "'+q(u.symbol)+'" on "'+q(u.exchange)+'"?',1),P("div",_t,[B(g,{color:"gray",variant:"soft",label:"Cancel",onClick:A},null,8,["onClick"]),B(g,{color:"red",variant:"soft",label:"Delete",onClick:()=>{S(u),A()}},null,8,["onClick"])])])]),default:U(()=>[B(g,{color:"red",variant:"soft",icon:"i-heroicons-trash",size:"xs",loading:$.value.has(s(u)),label:"Delete"},null,8,["loading"])]),_:2},1024)])]),_:1},8,["rows","loading"])]),_:1})])}}});export{Kt as default}; diff --git a/jesse/static/_nuxt/53NdJUAN.js b/jesse/static/_nuxt/53NdJUAN.js new file mode 100644 index 000000000..b17079165 --- /dev/null +++ b/jesse/static/_nuxt/53NdJUAN.js @@ -0,0 +1 @@ +import{a as t,c as o,o as s,B as a,b as n}from"./qzODIPNV.js";const d={},c={class:"text-center rounded border-2 border-dashed border-gray-300 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 py-4 text-sm"};function _(r,e){return s(),o("div",c,[a(r.$slots,"default",{},()=>[e[0]||(e[0]=n("span",{class:"text-gray-400"}," Empty ",-1))])])}const p=t(d,[["render",_]]);export{p as _}; diff --git a/jesse/static/_nuxt/6GW7wvnw.js b/jesse/static/_nuxt/6GW7wvnw.js deleted file mode 100644 index aa19f45a5..000000000 --- a/jesse/static/_nuxt/6GW7wvnw.js +++ /dev/null @@ -1 +0,0 @@ -import{g as M,h as W,r as _,o as i,c as d,a as u,F as D,i as A,j as J,b as a,w as S,t as I,n as z,k as o,l as X,v as Y,m as Z,a2 as C,e as G,P as H,q as K,x as k,R as Q,y as ee,z as te,O as v,T as h,U as B,M as L,d as se,V as $,X as oe,Y as re,Z as ne,a3 as ae,a1 as le}from"./BLm-LuZL.js";import{r as ie}from"./Cri_WUA5.js";import{_ as ue,a as de,c as ce,b as me}from"./1sxhQl7t.js";import{_ as pe}from"./fSx662--.js";import{u as ge}from"./CJ4140l3.js";const fe={class:"mb-4"},be={class:"hidden sm:block"},ye={class:"relative rounded-lg shadow flex divide-x divide-gray-200 dark:divide-gray-700","aria-label":"props.Tabs"},ve=["onMouseup"],he=["data-cy","onClick"],_e={class:"absolute right-[1em] focus:outline-none"},ke=u("span",{"aria-hidden":"true",class:"absolute inset-x-0 bottom-0 h-0.5 bg-transparent dark:bg-gray-600"},null,-1),xe=M({__name:"CandleTabs",props:{tabs:{}},emits:["close"],setup(x,{emit:l}){const c=W(),p=_(c.params.id),g=l,f=x;function b(s){if(s.results.exception.error&&s.results.executing)return"Error";let r="";return s.form.exchange&&(r+=`${s.form.exchange} • `),s.form.symbol&&(r+=`${s.form.symbol.toUpperCase()} • `),s.form.start_date&&(r+=`${s.form.start_date}`),r=r.endsWith(" • ")?r.slice(0,-3):r,s.results.executing?`${r} | ${s.results.progressbar.current}%`:r}return(s,r)=>{const y=G;return i(),d("div",fe,[u("div",be,[u("nav",ye,[(i(!0),d(D,null,A(f.tabs,(m,N,T)=>(i(),d("div",{key:m.id,class:"relative group min-w-0 flex-1 overflow-hidden text-center flex items-center",onMouseup:J(V=>g("close",m.id),["middle"])},[a(y,{to:`/candles/${m.id}`,class:z([m.id===o(p)?"text-gray-900 dark:text-gray-100 font-bold ":"text-gray-500 dark:text-gray-300 hover:text-gray-700 font-medium ","py-3 px-4 inline-block select-none cursor-pointer focus:outline-none w-full text-xs bg-gray-50 dark:bg-backdrop-dark"])},{default:S(()=>[u("span",null,I(b(m)),1),u("span",{"aria-hidden":"true",class:z([m.id===o(p)&&Object.keys(f.tabs).length>1?"bg-indigo-400":"bg-transparent dark:bg-gray-600","absolute inset-x-0 bottom-0 h-0.5"])},null,2)]),_:2},1032,["to","class"]),X(u("button",{"data-cy":"tab-close-button"+T,class:"absolute right-[1em] focus:outline-none",onClick:V=>g("close",m.id)},[a(o(Z),{class:"h-5 w-5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 hover:bg-gray-200 bg-gray-100 dark:bg-gray-700 rounded-full","aria-hidden":"true"})],8,he),[[Y,Object.keys(f.tabs).length>1]])],40,ve))),128)),u("div",{class:"select-none cursor-pointer text-gray-400 dark:text-gray-100 hover:text-gray-600 focus:outline-none group relative w-14 overflow-hidden bg-gray-50 dark:bg-backdrop-dark py-3 px-4 font-medium hover:bg-gray-50 dark:hover:bg-gray-800 flex items-center justify-center",onClick:r[0]||(r[0]=m=>o(C)().addTab())},[u("button",_e,[a(o(ie),{class:"h-6 w-6 rounded-full","aria-hidden":"true"})]),ke])])])])}}}),we={key:0,class:"flex flex-col items-center justify-center select-none mt-[10%]"},$e=["textContent"],Se={class:"mt-8"},Ce={key:1,class:"mx-auto container mt-8"},Te={key:0,class:"mb-8"},Ve={key:1,class:"pb-4"},Re={key:0},Ee={key:0},Me={key:1},Ne=M({__name:"CandlesTab",props:{form:{},results:{}},setup(x){const l=x,c=_([]),p=_(""),g=C(),f=H(),b=K(),s=_([]);async function r(){s.value=await f.getExchangeSupportedSymbols(l.form.exchange),s.value.includes(l.form.symbol)||(l.form.symbol=s.value[0])}const y=_(!1),m=k(()=>f.backtestingExchangeNames);l.form.exchange=l.form.exchange||m.value[0];const N=k(()=>Q.remainingTimeText(l.results.progressbar.estimated_remaining_seconds)),T=e=>{U()&&g.start(e)},V=e=>{U()&&g.startInNewTab(e)};function U(){const e={mustContainDashErrorMessage:'Symbol parameter must contain "-" character!',emptySymbolErrorMessage:"Symbol parameter cannot be empty"};return l.form.exchange?l.form.symbol?l.form.symbol.includes("-")?l.form.start_date?!0:($("error","Start date parameter cannot be empty"),!1):($("error",e.mustContainDashErrorMessage),!1):($("error",e.emptySymbolErrorMessage),!1):($("error","Exchange parameter cannot be empty"),!1)}return ee(()=>p.value,e=>{if(e.length==0){c.value=[];return}const t=[];for(const w of s.value){if(t.length>50)break;w.toLowerCase().startsWith(e.toLowerCase())&&t.push(w)}c.value=t}),te(()=>{setTimeout(()=>{r()},100)}),(e,t)=>{const w=ue,R=oe,O=de,q=ce,E=re,j=pe,P=ne,F=me;return!e.form.debug_mode&&e.results.executing&&!e.results.showResults?(i(),d("div",we,[u("div",null,[a(w,{progress:e.results.progressbar.current},null,8,["progress"])]),e.results.exception.error?v("",!0):(i(),d("h3",{key:0,class:"mt-8 animate-pulse",textContent:I(o(N))},null,8,$e)),u("div",Se,[a(R,{color:"gray",ui:{color:{gray:{solid:"text-rose-500 dark:text-rose-400"}}},class:"w-64 flex justify-center",icon:"i-heroicons-no-symbol",size:"xl",variant:"solid",label:"Cancel",trailing:!1,onClick:t[0]||(t[0]=n=>o(g).cancel((e._.provides[h]||e.$route).params.id))})]),e.results.exception.error&&e.results.executing?(i(),d("div",Ce,[a(O,{modelValue:o(y),"onUpdate:modelValue":t[1]||(t[1]=n=>B(y)?y.value=n:null),title:e.results.exception.error,content:e.results.exception.traceback,mode:"candles"},null,8,["modelValue","title","content"])])):v("",!0)])):(i(),L(F,{key:1},{left:S(()=>[e.results.alert.message?(i(),d("div",Te,[a(q,{color:"teal",icon:"i-heroicons-check-circle",variant:"soft",title:e.results.alert.message,"close-button":{icon:"i-heroicons-x-mark-20-solid",color:"white",variant:"link"},onClose:t[2]||(t[2]=n=>e.results.alert.message="")},null,8,["title"])])):v("",!0),!e.results.executing&&!e.results.showResults?(i(),d("div",Ve,[a(E,{title:"Exchange"}),a(j,{modelValue:e.form.exchange,"onUpdate:modelValue":t[3]||(t[3]=n=>e.form.exchange=n),searchable:"",placeholder:"Select an exchange...",options:o(m),size:"lg",class:"mt-2",onChange:r},null,8,["modelValue","options"]),a(E,{title:"Symbol",class:"mt-16"}),a(j,{modelValue:e.form.symbol,"onUpdate:modelValue":t[4]||(t[4]=n=>e.form.symbol=n),query:o(p),"onUpdate:query":t[5]||(t[5]=n=>B(p)?p.value=n:null),"clear-search-on-close":"",class:"mt-2",searchable:"",size:"lg",options:o(c),placeholder:"Select a symbol...",onChange:t[6]||(t[6]=n=>p.value="")},{empty:S(()=>[se("Start typing...")]),_:1},8,["modelValue","query","options"]),a(E,{title:"Start Date",class:"mt-16"}),a(P,{modelValue:e.form.start_date,"onUpdate:modelValue":t[7]||(t[7]=n=>e.form.start_date=n),type:"date",size:"lg",class:"mt-2"},null,8,["modelValue"])])):v("",!0)]),right:S(()=>[e.results.executing?v("",!0):(i(),d("div",Re,[e.results.showResults?(i(),d("div",Ee,[u("button",{class:"font-medium select-none items-center px-2.5 py-1.5 border border-transparent rounded shadow-sm text-white bg-indigo-600 dark:bg-indigo-400 hover:bg-indigo-700 dark:hover:bg-indigo-300 focus:outline-none dark:text-black text-base tracking-wide text-center block w-full mb-4",onClick:t[8]||(t[8]=n=>o(b).rerun((e._.provides[h]||e.$route).params.id))}," Rerun "),u("button",{class:"btn-secondary text-center block w-full mb-4",onClick:t[9]||(t[9]=n=>o(b).newBacktest((e._.provides[h]||e.$route).params.id))}," New backtest ")])):(i(),d("div",Me,[a(R,{class:"w-full flex justify-center",icon:"i-heroicons-bolt",size:"xl",variant:"solid",label:"Start",trailing:!1,onClick:t[10]||(t[10]=n=>T((e._.provides[h]||e.$route).params.id))}),a(R,{class:"w-full flex justify-center mt-4",color:"gray",icon:"i-heroicons-plus",size:"xl",variant:"solid",label:"Start in a new tab",trailing:!1,onClick:t[11]||(t[11]=n=>V((e._.provides[h]||e.$route).params.id))})]))]))]),_:1}))}}}),Ue={class:"w-full"},Le=M({__name:"[id]",setup(x){ge({title:"Candles - Jesse"});const l=C(),c=k(()=>l.tabs),p=ae(),g=k(()=>p.params.id),f=k(()=>{if(!c.value[g.value]){const b=Object.keys(c.value);if(b.length>0){const s=c.value[b[0]];return le().push(`/candles/${s.id}`),s}else C().addTab()}return c.value[g.value]});return(b,s)=>{const r=xe,y=Ne;return i(),d(D,null,[u("div",Ue,[a(r,{"page-id":o(g),tabs:o(c),onClose:o(l).closeTab},null,8,["page-id","tabs","onClose"])]),o(f)?(i(),L(y,{key:0,form:o(f).form,results:o(f).results},null,8,["form","results"])):v("",!0)],64)}}});export{Le as default}; diff --git a/jesse/static/_nuxt/7dp8lURo.js b/jesse/static/_nuxt/7dp8lURo.js new file mode 100644 index 000000000..e7cc776eb --- /dev/null +++ b/jesse/static/_nuxt/7dp8lURo.js @@ -0,0 +1 @@ +import{g as d,c as l,d as s,b as t,w as o,D as m,bC as c,q as _,o as p,e as r}from"./qzODIPNV.js";import{_ as u}from"./DM4_BxFW.js";import{_ as g}from"./DHYbZzGT.js";import{u as f}from"./COHuXcGT.js";const x={class:"grid items-start lg:grid-cols-5"},b={class:"grid grid-cols-1 lg:col-span-4 bg-backdrop dark:bg-backdrop-dark"},k={class:"flex items-center justify-center select-none",style:{height:"calc(100vh - 4rem - 4px)"}},v={class:"text-center"},S={class:"mb-4"},N=d({__name:"index",setup(y){return f({title:"Strategies - Jesse"}),(n,e)=>{const a=_,i=u;return p(),l("section",x,[s(g),t("div",b,[t("div",k,[t("div",v,[e[4]||(e[4]=t("h1",{class:"font-semibold mb-16 text-5xl"}," Strategies ",-1)),t("div",S,[s(a,{icon:"i-heroicons-plus",onClick:e[0]||(e[0]=B=>("useTempStore"in n?n.useTempStore:m(c))().makeStrategy=!0)},{default:o(()=>e[1]||(e[1]=[r(" Create a new strategy ")])),_:1}),s(i,{class:"my-6 text-xs"},{default:o(()=>e[2]||(e[2]=[r(" OR ")])),_:1}),s(a,{icon:"i-heroicons-link",color:"gray",to:"https://jesse.trade/strategies",target:"_blank"},{default:o(()=>e[3]||(e[3]=[r(" Browse free and premium strategies ")])),_:1})])])])])])}}});export{N as default}; diff --git a/jesse/static/_nuxt/ADNCW-ol.js b/jesse/static/_nuxt/ADNCW-ol.js new file mode 100644 index 000000000..911cd7394 --- /dev/null +++ b/jesse/static/_nuxt/ADNCW-ol.js @@ -0,0 +1,9 @@ +import{m as ft}from"./Bgthz7Nd.js";import"./qzODIPNV.js";/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var lt=Object.defineProperty,gt=Object.getOwnPropertyDescriptor,ht=Object.getOwnPropertyNames,pt=Object.prototype.hasOwnProperty,vt=(e,r,i,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of ht(r))!pt.call(e,t)&&t!==i&<(e,t,{get:()=>r[t],enumerable:!(n=gt(r,t))||n.enumerable});return e},mt=(e,r,i)=>(vt(e,r,"default"),i),c={};mt(c,ft);var _t=2*60*1e3,Qe=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>_t&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=c.editor.createWebWorker({moduleId:"vs/language/html/htmlWorker",createData:{languageSettings:this._defaults.options,languageId:this._defaults.languageId},label:this._defaults.languageId}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let r;return this._getClient().then(i=>{r=i}).then(i=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(i=>r)}},J;(function(e){function r(i){return typeof i=="string"}e.is=r})(J||(J={}));var S;(function(e){function r(i){return typeof i=="string"}e.is=r})(S||(S={}));var Y;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function r(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=r})(Y||(Y={}));var M;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function r(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=r})(M||(M={}));var b;(function(e){function r(n,t){return n===Number.MAX_VALUE&&(n=M.MAX_VALUE),t===Number.MAX_VALUE&&(t=M.MAX_VALUE),{line:n,character:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&o.uinteger(t.line)&&o.uinteger(t.character)}e.is=i})(b||(b={}));var h;(function(e){function r(n,t,a,s){if(o.uinteger(n)&&o.uinteger(t)&&o.uinteger(a)&&o.uinteger(s))return{start:b.create(n,t),end:b.create(a,s)};if(b.is(n)&&b.is(t))return{start:n,end:t};throw new Error(`Range#create called with invalid arguments[${n}, ${t}, ${a}, ${s}]`)}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&b.is(t.start)&&b.is(t.end)}e.is=i})(h||(h={}));var C;(function(e){function r(n,t){return{uri:n,range:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.range)&&(o.string(t.uri)||o.undefined(t.uri))}e.is=i})(C||(C={}));var Z;(function(e){function r(n,t,a,s){return{targetUri:n,targetRange:t,targetSelectionRange:a,originSelectionRange:s}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.targetRange)&&o.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||o.undefined(t.originSelectionRange))}e.is=i})(Z||(Z={}));var O;(function(e){function r(n,t,a,s){return{red:n,green:t,blue:a,alpha:s}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.numberRange(t.red,0,1)&&o.numberRange(t.green,0,1)&&o.numberRange(t.blue,0,1)&&o.numberRange(t.alpha,0,1)}e.is=i})(O||(O={}));var K;(function(e){function r(n,t){return{range:n,color:t}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&h.is(t.range)&&O.is(t.color)}e.is=i})(K||(K={}));var ee;(function(e){function r(n,t,a){return{label:n,textEdit:t,additionalTextEdits:a}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.string(t.label)&&(o.undefined(t.textEdit)||E.is(t))&&(o.undefined(t.additionalTextEdits)||o.typedArray(t.additionalTextEdits,E.is))}e.is=i})(ee||(ee={}));var A;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(A||(A={}));var te;(function(e){function r(n,t,a,s,u,l){const d={startLine:n,endLine:t};return o.defined(a)&&(d.startCharacter=a),o.defined(s)&&(d.endCharacter=s),o.defined(u)&&(d.kind=u),o.defined(l)&&(d.collapsedText=l),d}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.uinteger(t.startLine)&&o.uinteger(t.startLine)&&(o.undefined(t.startCharacter)||o.uinteger(t.startCharacter))&&(o.undefined(t.endCharacter)||o.uinteger(t.endCharacter))&&(o.undefined(t.kind)||o.string(t.kind))}e.is=i})(te||(te={}));var U;(function(e){function r(n,t){return{location:n,message:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&C.is(t.location)&&o.string(t.message)}e.is=i})(U||(U={}));var x;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(x||(x={}));var ne;(function(e){e.Unnecessary=1,e.Deprecated=2})(ne||(ne={}));var re;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&o.string(n.href)}e.is=r})(re||(re={}));var F;(function(e){function r(n,t,a,s,u,l){let d={range:n,message:t};return o.defined(a)&&(d.severity=a),o.defined(s)&&(d.code=s),o.defined(u)&&(d.source=u),o.defined(l)&&(d.relatedInformation=l),d}e.create=r;function i(n){var t;let a=n;return o.defined(a)&&h.is(a.range)&&o.string(a.message)&&(o.number(a.severity)||o.undefined(a.severity))&&(o.integer(a.code)||o.string(a.code)||o.undefined(a.code))&&(o.undefined(a.codeDescription)||o.string((t=a.codeDescription)===null||t===void 0?void 0:t.href))&&(o.string(a.source)||o.undefined(a.source))&&(o.undefined(a.relatedInformation)||o.typedArray(a.relatedInformation,U.is))}e.is=i})(F||(F={}));var I;(function(e){function r(n,t,...a){let s={title:n,command:t};return o.defined(a)&&a.length>0&&(s.arguments=a),s}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.title)&&o.string(t.command)}e.is=i})(I||(I={}));var E;(function(e){function r(a,s){return{range:a,newText:s}}e.replace=r;function i(a,s){return{range:{start:a,end:a},newText:s}}e.insert=i;function n(a){return{range:a,newText:""}}e.del=n;function t(a){const s=a;return o.objectLiteral(s)&&o.string(s.newText)&&h.is(s.range)}e.is=t})(E||(E={}));var V;(function(e){function r(n,t,a){const s={label:n};return t!==void 0&&(s.needsConfirmation=t),a!==void 0&&(s.description=a),s}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.string(t.label)&&(o.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(o.string(t.description)||t.description===void 0)}e.is=i})(V||(V={}));var L;(function(e){function r(i){const n=i;return o.string(n)}e.is=r})(L||(L={}));var ie;(function(e){function r(a,s,u){return{range:a,newText:s,annotationId:u}}e.replace=r;function i(a,s,u){return{range:{start:a,end:a},newText:s,annotationId:u}}e.insert=i;function n(a,s){return{range:a,newText:"",annotationId:s}}e.del=n;function t(a){const s=a;return E.is(s)&&(V.is(s.annotationId)||L.is(s.annotationId))}e.is=t})(ie||(ie={}));var W;(function(e){function r(n,t){return{textDocument:n,edits:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&B.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(W||(W={}));var H;(function(e){function r(n,t,a){let s={kind:"create",uri:n};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),a!==void 0&&(s.annotationId=a),s}e.create=r;function i(n){let t=n;return t&&t.kind==="create"&&o.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||o.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||o.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(H||(H={}));var X;(function(e){function r(n,t,a,s){let u={kind:"rename",oldUri:n,newUri:t};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(u.options=a),s!==void 0&&(u.annotationId=s),u}e.create=r;function i(n){let t=n;return t&&t.kind==="rename"&&o.string(t.oldUri)&&o.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||o.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||o.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(X||(X={}));var $;(function(e){function r(n,t,a){let s={kind:"delete",uri:n};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),a!==void 0&&(s.annotationId=a),s}e.create=r;function i(n){let t=n;return t&&t.kind==="delete"&&o.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||o.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||o.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})($||($={}));var z;(function(e){function r(i){let n=i;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(t=>o.string(t.kind)?H.is(t)||X.is(t)||$.is(t):W.is(t)))}e.is=r})(z||(z={}));var ae;(function(e){function r(n){return{uri:n}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)}e.is=i})(ae||(ae={}));var oe;(function(e){function r(n,t){return{uri:n,version:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&o.integer(t.version)}e.is=i})(oe||(oe={}));var B;(function(e){function r(n,t){return{uri:n,version:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&(t.version===null||o.integer(t.version))}e.is=i})(B||(B={}));var se;(function(e){function r(n,t,a,s){return{uri:n,languageId:t,version:a,text:s}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&o.string(t.languageId)&&o.integer(t.version)&&o.string(t.text)}e.is=i})(se||(se={}));var q;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function r(i){const n=i;return n===e.PlainText||n===e.Markdown}e.is=r})(q||(q={}));var P;(function(e){function r(i){const n=i;return o.objectLiteral(i)&&q.is(n.kind)&&o.string(n.value)}e.is=r})(P||(P={}));var p;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(p||(p={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var ue;(function(e){e.Deprecated=1})(ue||(ue={}));var ce;(function(e){function r(n,t,a){return{newText:n,insert:t,replace:a}}e.create=r;function i(n){const t=n;return t&&o.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(ce||(ce={}));var de;(function(e){e.asIs=1,e.adjustIndentation=2})(de||(de={}));var fe;(function(e){function r(i){const n=i;return n&&(o.string(n.detail)||n.detail===void 0)&&(o.string(n.description)||n.description===void 0)}e.is=r})(fe||(fe={}));var le;(function(e){function r(i){return{label:i}}e.create=r})(le||(le={}));var ge;(function(e){function r(i,n){return{items:i||[],isIncomplete:!!n}}e.create=r})(ge||(ge={}));var y;(function(e){function r(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=r;function i(n){const t=n;return o.string(t)||o.objectLiteral(t)&&o.string(t.language)&&o.string(t.value)}e.is=i})(y||(y={}));var he;(function(e){function r(i){let n=i;return!!n&&o.objectLiteral(n)&&(P.is(n.contents)||y.is(n.contents)||o.typedArray(n.contents,y.is))&&(i.range===void 0||h.is(i.range))}e.is=r})(he||(he={}));var pe;(function(e){function r(i,n){return n?{label:i,documentation:n}:{label:i}}e.create=r})(pe||(pe={}));var ve;(function(e){function r(i,n,...t){let a={label:i};return o.defined(n)&&(a.documentation=n),o.defined(t)?a.parameters=t:a.parameters=[],a}e.create=r})(ve||(ve={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var me;(function(e){function r(i,n){let t={range:i};return o.number(n)&&(t.kind=n),t}e.create=r})(me||(me={}));var v;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(v||(v={}));var _e;(function(e){e.Deprecated=1})(_e||(_e={}));var we;(function(e){function r(i,n,t,a,s){let u={name:i,kind:n,location:{uri:a,range:t}};return s&&(u.containerName=s),u}e.create=r})(we||(we={}));var be;(function(e){function r(i,n,t,a){return a!==void 0?{name:i,kind:n,location:{uri:t,range:a}}:{name:i,kind:n,location:{uri:t}}}e.create=r})(be||(be={}));var ke;(function(e){function r(n,t,a,s,u,l){let d={name:n,detail:t,kind:a,range:s,selectionRange:u};return l!==void 0&&(d.children=l),d}e.create=r;function i(n){let t=n;return t&&o.string(t.name)&&o.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||o.string(t.detail))&&(t.deprecated===void 0||o.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ke||(ke={}));var xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(xe||(xe={}));var j;(function(e){e.Invoked=1,e.Automatic=2})(j||(j={}));var Ie;(function(e){function r(n,t,a){let s={diagnostics:n};return t!=null&&(s.only=t),a!=null&&(s.triggerKind=a),s}e.create=r;function i(n){let t=n;return o.defined(t)&&o.typedArray(t.diagnostics,F.is)&&(t.only===void 0||o.typedArray(t.only,o.string))&&(t.triggerKind===void 0||t.triggerKind===j.Invoked||t.triggerKind===j.Automatic)}e.is=i})(Ie||(Ie={}));var Ee;(function(e){function r(n,t,a){let s={title:n},u=!0;return typeof t=="string"?(u=!1,s.kind=t):I.is(t)?s.command=t:s.edit=t,u&&a!==void 0&&(s.kind=a),s}e.create=r;function i(n){let t=n;return t&&o.string(t.title)&&(t.diagnostics===void 0||o.typedArray(t.diagnostics,F.is))&&(t.kind===void 0||o.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||I.is(t.command))&&(t.isPreferred===void 0||o.boolean(t.isPreferred))&&(t.edit===void 0||z.is(t.edit))}e.is=i})(Ee||(Ee={}));var Le;(function(e){function r(n,t){let a={range:n};return o.defined(t)&&(a.data=t),a}e.create=r;function i(n){let t=n;return o.defined(t)&&h.is(t.range)&&(o.undefined(t.command)||I.is(t.command))}e.is=i})(Le||(Le={}));var Ae;(function(e){function r(n,t){return{tabSize:n,insertSpaces:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.uinteger(t.tabSize)&&o.boolean(t.insertSpaces)}e.is=i})(Ae||(Ae={}));var Re;(function(e){function r(n,t,a){return{range:n,target:t,data:a}}e.create=r;function i(n){let t=n;return o.defined(t)&&h.is(t.range)&&(o.undefined(t.target)||o.string(t.target))}e.is=i})(Re||(Re={}));var Pe;(function(e){function r(n,t){return{range:n,parent:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Pe||(Pe={}));var De;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(De||(De={}));var Me;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Me||(Me={}));var Ce;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}e.is=r})(Ce||(Ce={}));var Fe;(function(e){function r(n,t){return{range:n,text:t}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&o.string(t.text)}e.is=i})(Fe||(Fe={}));var ye;(function(e){function r(n,t,a){return{range:n,variableName:t,caseSensitiveLookup:a}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&o.boolean(t.caseSensitiveLookup)&&(o.string(t.variableName)||t.variableName===void 0)}e.is=i})(ye||(ye={}));var je;(function(e){function r(n,t){return{range:n,expression:t}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&(o.string(t.expression)||t.expression===void 0)}e.is=i})(je||(je={}));var Ne;(function(e){function r(n,t){return{frameId:n,stoppedLocation:t}}e.create=r;function i(n){const t=n;return o.defined(t)&&h.is(n.stoppedLocation)}e.is=i})(Ne||(Ne={}));var T;(function(e){e.Type=1,e.Parameter=2;function r(i){return i===1||i===2}e.is=r})(T||(T={}));var G;(function(e){function r(n){return{value:n}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&(t.tooltip===void 0||o.string(t.tooltip)||P.is(t.tooltip))&&(t.location===void 0||C.is(t.location))&&(t.command===void 0||I.is(t.command))}e.is=i})(G||(G={}));var Se;(function(e){function r(n,t,a){const s={position:n,label:t};return a!==void 0&&(s.kind=a),s}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&b.is(t.position)&&(o.string(t.label)||o.typedArray(t.label,G.is))&&(t.kind===void 0||T.is(t.kind))&&t.textEdits===void 0||o.typedArray(t.textEdits,E.is)&&(t.tooltip===void 0||o.string(t.tooltip)||P.is(t.tooltip))&&(t.paddingLeft===void 0||o.boolean(t.paddingLeft))&&(t.paddingRight===void 0||o.boolean(t.paddingRight))}e.is=i})(Se||(Se={}));var Oe;(function(e){function r(i){return{kind:"snippet",value:i}}e.createSnippet=r})(Oe||(Oe={}));var Ue;(function(e){function r(i,n,t,a){return{insertText:i,filterText:n,range:t,command:a}}e.create=r})(Ue||(Ue={}));var Ve;(function(e){function r(i){return{items:i}}e.create=r})(Ve||(Ve={}));var We;(function(e){e.Invoked=0,e.Automatic=1})(We||(We={}));var He;(function(e){function r(i,n){return{range:i,text:n}}e.create=r})(He||(He={}));var Xe;(function(e){function r(i,n){return{triggerKind:i,selectedCompletionInfo:n}}e.create=r})(Xe||(Xe={}));var $e;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&S.is(n.uri)&&o.string(n.name)}e.is=r})($e||($e={}));var ze;(function(e){function r(a,s,u,l){return new wt(a,s,u,l)}e.create=r;function i(a){let s=a;return!!(o.defined(s)&&o.string(s.uri)&&(o.undefined(s.languageId)||o.string(s.languageId))&&o.uinteger(s.lineCount)&&o.func(s.getText)&&o.func(s.positionAt)&&o.func(s.offsetAt))}e.is=i;function n(a,s){let u=a.getText(),l=t(s,(g,_)=>{let w=g.range.start.line-_.range.start.line;return w===0?g.range.start.character-_.range.start.character:w}),d=u.length;for(let g=l.length-1;g>=0;g--){let _=l[g],w=a.offsetAt(_.range.start),f=a.offsetAt(_.range.end);if(f<=d)u=u.substring(0,w)+_.newText+u.substring(f,u.length);else throw new Error("Overlapping edit");d=w}return u}e.applyEdits=n;function t(a,s){if(a.length<=1)return a;const u=a.length/2|0,l=a.slice(0,u),d=a.slice(u);t(l,s),t(d,s);let g=0,_=0,w=0;for(;g0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),i=0,n=r.length;if(n===0)return b.create(0,e);for(;ie?n=a:i=a+1}let t=i-1;return b.create(t,e-r[t])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let i=r[e.line],n=e.line+1"u"}e.undefined=n;function t(f){return f===!0||f===!1}e.boolean=t;function a(f){return r.call(f)==="[object String]"}e.string=a;function s(f){return r.call(f)==="[object Number]"}e.number=s;function u(f,N,dt){return r.call(f)==="[object Number]"&&N<=f&&f<=dt}e.numberRange=u;function l(f){return r.call(f)==="[object Number]"&&-2147483648<=f&&f<=2147483647}e.integer=l;function d(f){return r.call(f)==="[object Number]"&&0<=f&&f<=2147483647}e.uinteger=d;function g(f){return r.call(f)==="[object Function]"}e.func=g;function _(f){return f!==null&&typeof f=="object"}e.objectLiteral=_;function w(f,N){return Array.isArray(f)&&f.every(N)}e.typedArray=w})(o||(o={}));var jt=class{constructor(e,r,i){this._languageId=e,this._worker=r,this._disposables=[],this._listener=Object.create(null);const n=a=>{let s=a.getLanguageId();if(s!==this._languageId)return;let u;this._listener[a.uri.toString()]=a.onDidChangeContent(()=>{window.clearTimeout(u),u=window.setTimeout(()=>this._doValidate(a.uri,s),500)}),this._doValidate(a.uri,s)},t=a=>{c.editor.setModelMarkers(a,this._languageId,[]);let s=a.uri.toString(),u=this._listener[s];u&&(u.dispose(),delete this._listener[s])};this._disposables.push(c.editor.onDidCreateModel(n)),this._disposables.push(c.editor.onWillDisposeModel(t)),this._disposables.push(c.editor.onDidChangeModelLanguage(a=>{t(a.model),n(a.model)})),this._disposables.push(i(a=>{c.editor.getModels().forEach(s=>{s.getLanguageId()===this._languageId&&(t(s),n(s))})})),this._disposables.push({dispose:()=>{c.editor.getModels().forEach(t);for(let a in this._listener)this._listener[a].dispose()}}),c.editor.getModels().forEach(n)}dispose(){this._disposables.forEach(e=>e&&e.dispose()),this._disposables.length=0}_doValidate(e,r){this._worker(e).then(i=>i.doValidation(e.toString())).then(i=>{const n=i.map(a=>kt(e,a));let t=c.editor.getModel(e);t&&t.getLanguageId()===r&&c.editor.setModelMarkers(t,r,n)}).then(void 0,i=>{console.error(i)})}};function bt(e){switch(e){case x.Error:return c.MarkerSeverity.Error;case x.Warning:return c.MarkerSeverity.Warning;case x.Information:return c.MarkerSeverity.Info;case x.Hint:return c.MarkerSeverity.Hint;default:return c.MarkerSeverity.Info}}function kt(e,r){let i=typeof r.code=="number"?String(r.code):r.code;return{severity:bt(r.severity),startLineNumber:r.range.start.line+1,startColumn:r.range.start.character+1,endLineNumber:r.range.end.line+1,endColumn:r.range.end.character+1,message:r.message,code:i,source:r.source}}var xt=class{constructor(e,r){this._worker=e,this._triggerCharacters=r}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.doComplete(t.toString(),k(r))).then(a=>{if(!a)return;const s=e.getWordUntilPosition(r),u=new c.Range(r.lineNumber,s.startColumn,r.lineNumber,s.endColumn),l=a.items.map(d=>{const g={label:d.label,insertText:d.insertText||d.label,sortText:d.sortText,filterText:d.filterText,documentation:d.documentation,detail:d.detail,command:Lt(d.command),range:u,kind:Et(d.kind)};return d.textEdit&&(It(d.textEdit)?g.range={insert:m(d.textEdit.insert),replace:m(d.textEdit.replace)}:g.range=m(d.textEdit.range),g.insertText=d.textEdit.newText),d.additionalTextEdits&&(g.additionalTextEdits=d.additionalTextEdits.map(D)),d.insertTextFormat===Q.Snippet&&(g.insertTextRules=c.languages.CompletionItemInsertTextRule.InsertAsSnippet),g});return{isIncomplete:a.isIncomplete,suggestions:l}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function Te(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function m(e){if(e)return new c.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function It(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function Et(e){const r=c.languages.CompletionItemKind;switch(e){case p.Text:return r.Text;case p.Method:return r.Method;case p.Function:return r.Function;case p.Constructor:return r.Constructor;case p.Field:return r.Field;case p.Variable:return r.Variable;case p.Class:return r.Class;case p.Interface:return r.Interface;case p.Module:return r.Module;case p.Property:return r.Property;case p.Unit:return r.Unit;case p.Value:return r.Value;case p.Enum:return r.Enum;case p.Keyword:return r.Keyword;case p.Snippet:return r.Snippet;case p.Color:return r.Color;case p.File:return r.File;case p.Reference:return r.Reference}return r.Property}function D(e){if(e)return{range:m(e.range),text:e.newText}}function Lt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var Ge=class{constructor(e){this._worker=e}provideHover(e,r,i){let n=e.uri;return this._worker(n).then(t=>t.doHover(n.toString(),k(r))).then(t=>{if(t)return{range:m(t.range),contents:Rt(t.contents)}})}};function At(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function Be(e){return typeof e=="string"?{value:e}:At(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+` +`+e.value+"\n```\n"}}function Rt(e){if(e)return Array.isArray(e)?e.map(Be):[Be(e)]}var Je=class{constructor(e){this._worker=e}provideDocumentHighlights(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.findDocumentHighlights(n.toString(),k(r))).then(t=>{if(t)return t.map(a=>({range:m(a.range),kind:Pt(a.kind)}))})}};function Pt(e){switch(e){case R.Read:return c.languages.DocumentHighlightKind.Read;case R.Write:return c.languages.DocumentHighlightKind.Write;case R.Text:return c.languages.DocumentHighlightKind.Text}return c.languages.DocumentHighlightKind.Text}var Nt=class{constructor(e){this._worker=e}provideDefinition(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.findDefinition(n.toString(),k(r))).then(t=>{if(t)return[Ye(t)]})}};function Ye(e){return{uri:c.Uri.parse(e.uri),range:m(e.range)}}var St=class{constructor(e){this._worker=e}provideReferences(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.findReferences(t.toString(),k(r))).then(a=>{if(a)return a.map(Ye)})}},Ze=class{constructor(e){this._worker=e}provideRenameEdits(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.doRename(t.toString(),k(r),i)).then(a=>Dt(a))}};function Dt(e){if(!e||!e.changes)return;let r=[];for(let i in e.changes){const n=c.Uri.parse(i);for(let t of e.changes[i])r.push({resource:n,versionId:void 0,textEdit:{range:m(t.range),text:t.newText}})}return{edits:r}}var Ke=class{constructor(e){this._worker=e}provideDocumentSymbols(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentSymbols(i.toString())).then(n=>{if(n)return n.map(t=>Mt(t)?et(t):{name:t.name,detail:"",containerName:t.containerName,kind:tt(t.kind),range:m(t.location.range),selectionRange:m(t.location.range),tags:[]})})}};function Mt(e){return"children"in e}function et(e){return{name:e.name,detail:e.detail??"",kind:tt(e.kind),range:m(e.range),selectionRange:m(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(r=>et(r))}}function tt(e){let r=c.languages.SymbolKind;switch(e){case v.File:return r.File;case v.Module:return r.Module;case v.Namespace:return r.Namespace;case v.Package:return r.Package;case v.Class:return r.Class;case v.Method:return r.Method;case v.Property:return r.Property;case v.Field:return r.Field;case v.Constructor:return r.Constructor;case v.Enum:return r.Enum;case v.Interface:return r.Interface;case v.Function:return r.Function;case v.Variable:return r.Variable;case v.Constant:return r.Constant;case v.String:return r.String;case v.Number:return r.Number;case v.Boolean:return r.Boolean;case v.Array:return r.Array}return r.Function}var nt=class{constructor(e){this._worker=e}provideLinks(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentLinks(i.toString())).then(n=>{if(n)return{links:n.map(t=>({range:m(t.range),url:t.target}))}})}},rt=class{constructor(e){this._worker=e}provideDocumentFormattingEdits(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.format(n.toString(),null,at(r)).then(a=>{if(!(!a||a.length===0))return a.map(D)}))}},it=class{constructor(e){this._worker=e,this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.format(t.toString(),Te(r),at(i)).then(s=>{if(!(!s||s.length===0))return s.map(D)}))}};function at(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var Ot=class{constructor(e){this._worker=e}provideDocumentColors(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentColors(i.toString())).then(n=>{if(n)return n.map(t=>({color:t.color,range:m(t.range)}))})}provideColorPresentations(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getColorPresentations(n.toString(),r.color,Te(r.range))).then(t=>{if(t)return t.map(a=>{let s={label:a.label};return a.textEdit&&(s.textEdit=D(a.textEdit)),a.additionalTextEdits&&(s.additionalTextEdits=a.additionalTextEdits.map(D)),s})})}},ot=class{constructor(e){this._worker=e}provideFoldingRanges(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getFoldingRanges(n.toString(),r)).then(t=>{if(t)return t.map(a=>{const s={start:a.startLine+1,end:a.endLine+1};return typeof a.kind<"u"&&(s.kind=Ct(a.kind)),s})})}};function Ct(e){switch(e){case A.Comment:return c.languages.FoldingRangeKind.Comment;case A.Imports:return c.languages.FoldingRangeKind.Imports;case A.Region:return c.languages.FoldingRangeKind.Region}}var st=class{constructor(e){this._worker=e}provideSelectionRanges(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getSelectionRanges(n.toString(),r.map(k))).then(t=>{if(t)return t.map(a=>{const s=[];for(;a;)s.push({range:m(a.range)}),a=a.parent;return s})})}},ut=class extends xt{constructor(e){super(e,[".",":","<",'"',"=","/"])}};function Ut(e){const r=new Qe(e),i=(...t)=>r.getLanguageServiceWorker(...t);let n=e.languageId;c.languages.registerCompletionItemProvider(n,new ut(i)),c.languages.registerHoverProvider(n,new Ge(i)),c.languages.registerDocumentHighlightProvider(n,new Je(i)),c.languages.registerLinkProvider(n,new nt(i)),c.languages.registerFoldingRangeProvider(n,new ot(i)),c.languages.registerDocumentSymbolProvider(n,new Ke(i)),c.languages.registerSelectionRangeProvider(n,new st(i)),c.languages.registerRenameProvider(n,new Ze(i)),n==="html"&&(c.languages.registerDocumentFormattingEditProvider(n,new rt(i)),c.languages.registerDocumentRangeFormattingEditProvider(n,new it(i)))}function Vt(e){const r=[],i=[],n=new Qe(e);r.push(n);const t=(...s)=>n.getLanguageServiceWorker(...s);function a(){const{languageId:s,modeConfiguration:u}=e;ct(i),u.completionItems&&i.push(c.languages.registerCompletionItemProvider(s,new ut(t))),u.hovers&&i.push(c.languages.registerHoverProvider(s,new Ge(t))),u.documentHighlights&&i.push(c.languages.registerDocumentHighlightProvider(s,new Je(t))),u.links&&i.push(c.languages.registerLinkProvider(s,new nt(t))),u.documentSymbols&&i.push(c.languages.registerDocumentSymbolProvider(s,new Ke(t))),u.rename&&i.push(c.languages.registerRenameProvider(s,new Ze(t))),u.foldingRanges&&i.push(c.languages.registerFoldingRangeProvider(s,new ot(t))),u.selectionRanges&&i.push(c.languages.registerSelectionRangeProvider(s,new st(t))),u.documentFormattingEdits&&i.push(c.languages.registerDocumentFormattingEditProvider(s,new rt(t))),u.documentRangeFormattingEdits&&i.push(c.languages.registerDocumentRangeFormattingEditProvider(s,new it(t)))}return a(),r.push(qe(i)),qe(r)}function qe(e){return{dispose:()=>ct(e)}}function ct(e){for(;e.length;)e.pop().dispose()}export{xt as CompletionAdapter,Nt as DefinitionAdapter,jt as DiagnosticsAdapter,Ot as DocumentColorAdapter,rt as DocumentFormattingEditProvider,Je as DocumentHighlightAdapter,nt as DocumentLinkAdapter,it as DocumentRangeFormattingEditProvider,Ke as DocumentSymbolAdapter,ot as FoldingRangeAdapter,Ge as HoverAdapter,St as ReferenceAdapter,Ze as RenameAdapter,st as SelectionRangeAdapter,Qe as WorkerManager,k as fromPosition,Te as fromRange,Vt as setupMode,Ut as setupMode1,m as toRange,D as toTextEdit}; diff --git a/jesse/static/_nuxt/B-lZjTdr.js b/jesse/static/_nuxt/B-lZjTdr.js new file mode 100644 index 000000000..1c918416d --- /dev/null +++ b/jesse/static/_nuxt/B-lZjTdr.js @@ -0,0 +1,303 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var g={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]};function e(i){let o=[];const a=i.split(/\t+|\r+|\n+| +/);for(let r=0;r0&&o.push(a[r]);return o}var s=e("true false"),c=e(` + alias + break + case + const + const_assert + continue + continuing + default + diagnostic + discard + else + enable + fn + for + if + let + loop + override + requires + return + struct + switch + var + while + `),m=e(` + NULL + Self + abstract + active + alignas + alignof + as + asm + asm_fragment + async + attribute + auto + await + become + binding_array + cast + catch + class + co_await + co_return + co_yield + coherent + column_major + common + compile + compile_fragment + concept + const_cast + consteval + constexpr + constinit + crate + debugger + decltype + delete + demote + demote_to_helper + do + dynamic_cast + enum + explicit + export + extends + extern + external + fallthrough + filter + final + finally + friend + from + fxgroup + get + goto + groupshared + highp + impl + implements + import + inline + instanceof + interface + layout + lowp + macro + macro_rules + match + mediump + meta + mod + module + move + mut + mutable + namespace + new + nil + noexcept + noinline + nointerpolation + noperspective + null + nullptr + of + operator + package + packoffset + partition + pass + patch + pixelfragment + precise + precision + premerge + priv + protected + pub + public + readonly + ref + regardless + register + reinterpret_cast + require + resource + restrict + self + set + shared + sizeof + smooth + snorm + static + static_assert + static_cast + std + subroutine + super + target + template + this + thread_local + throw + trait + try + type + typedef + typeid + typename + typeof + union + unless + unorm + unsafe + unsized + use + using + varying + virtual + volatile + wgsl + where + with + writeonly + yield + `),l=e(` + read write read_write + function private workgroup uniform storage + perspective linear flat + center centroid sample + vertex_index instance_index position front_facing frag_depth + local_invocation_id local_invocation_index + global_invocation_id workgroup_id num_workgroups + sample_index sample_mask + rgba8unorm + rgba8snorm + rgba8uint + rgba8sint + rgba16uint + rgba16sint + rgba16float + r32uint + r32sint + r32float + rg32uint + rg32sint + rg32float + rgba32uint + rgba32sint + rgba32float + bgra8unorm +`),u=e(` + bool + f16 + f32 + i32 + sampler sampler_comparison + texture_depth_2d + texture_depth_2d_array + texture_depth_cube + texture_depth_cube_array + texture_depth_multisampled_2d + texture_external + texture_external + u32 + `),p=e(` + array + atomic + mat2x2 + mat2x3 + mat2x4 + mat3x2 + mat3x3 + mat3x4 + mat4x2 + mat4x3 + mat4x4 + ptr + texture_1d + texture_2d + texture_2d_array + texture_3d + texture_cube + texture_cube_array + texture_multisampled_2d + texture_storage_1d + texture_storage_2d + texture_storage_2d_array + texture_storage_3d + vec2 + vec3 + vec4 + `),d=e(` + vec2i vec3i vec4i + vec2u vec3u vec4u + vec2f vec3f vec4f + vec2h vec3h vec4h + mat2x2f mat2x3f mat2x4f + mat3x2f mat3x3f mat3x4f + mat4x2f mat4x3f mat4x4f + mat2x2h mat2x3h mat2x4h + mat3x2h mat3x3h mat3x4h + mat4x2h mat4x3h mat4x4h + `),x=e(` + bitcast all any select arrayLength abs acos acosh asin asinh atan atanh atan2 + ceil clamp cos cosh countLeadingZeros countOneBits countTrailingZeros cross + degrees determinant distance dot exp exp2 extractBits faceForward firstLeadingBit + firstTrailingBit floor fma fract frexp inverseBits inverseSqrt ldexp length + log log2 max min mix modf normalize pow quantizeToF16 radians reflect refract + reverseBits round saturate sign sin sinh smoothstep sqrt step tan tanh transpose + trunc dpdx dpdxCoarse dpdxFine dpdy dpdyCoarse dpdyFine fwidth fwidthCoarse fwidthFine + textureDimensions textureGather textureGatherCompare textureLoad textureNumLayers + textureNumLevels textureNumSamples textureSample textureSampleBias textureSampleCompare + textureSampleCompareLevel textureSampleGrad textureSampleLevel textureSampleBaseClampToEdge + textureStore atomicLoad atomicStore atomicAdd atomicSub atomicMax atomicMin + atomicAnd atomicOr atomicXor atomicExchange atomicCompareExchangeWeak pack4x8snorm + pack4x8unorm pack2x16snorm pack2x16unorm pack2x16float unpack4x8snorm unpack4x8unorm + unpack2x16snorm unpack2x16unorm unpack2x16float storageBarrier workgroupBarrier + workgroupUniformLoad +`),f=e(` + & + && + -> + / + = + == + != + > + >= + < + <= + % + - + -- + + + ++ + | + || + * + << + >> + += + -= + *= + /= + %= + &= + |= + ^= + >>= + <<= + `),_=/enable|requires|diagnostic/,n=new RegExp("[_\\p{XID_Start}]\\p{XID_Continue}*","u"),t="variable.predefined",h={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:s,keywords:c,reserved:m,predeclared_enums:l,predeclared_types:u,predeclared_type_generators:p,predeclared_type_aliases:d,predeclared_intrinsics:x,operators:f,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[_,"keyword","@directive"],[n,{cases:{"@atoms":t,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":t,"@predeclared_types":t,"@predeclared_type_generators":t,"@predeclared_type_aliases":t,"@predeclared_intrinsics":t,"@default":"identifier"}}],{include:"@commentOrSpace"},{include:"@numbers"},[/[{}()\[\]]/,"@brackets"],["@","annotation","@attribute"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/./,"invalid"]],commentOrSpace:[[/\s+/,"white"],[/\/\*/,"comment","@blockComment"],[/\/\/.*$/,"comment"]],blockComment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],attribute:[{include:"@commentOrSpace"},[/\w+/,"annotation","@pop"]],directive:[{include:"@commentOrSpace"},[/[()]/,"@brackets"],[/,/,"delimiter"],[n,"meta.content"],[/;/,"delimiter","@pop"]],numbers:[[/0[fh]/,"number.float"],[/[1-9][0-9]*[fh]/,"number.float"],[/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+[eE][+-]?[0-9]+[fh]?/,"number.float"],[/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,"number.hex"],[/0[xX][0-9a-fA-F]+[iu]?/,"number.hex"],[/[1-9][0-9]*[iu]?/,"number"],[/0[iu]?/,"number"]]}};export{g as conf,h as language}; diff --git a/jesse/static/_nuxt/B1ryN6Xn.js b/jesse/static/_nuxt/B1ryN6Xn.js new file mode 100644 index 000000000..c1f5bd500 --- /dev/null +++ b/jesse/static/_nuxt/B1ryN6Xn.js @@ -0,0 +1,6 @@ +import{g as Qs,c as Dt,o as It,F as Xs,p as qs,b as Oi,t as ki}from"./qzODIPNV.js";function S(n){var t=n.width,i=n.height;if(t<0)throw new Error("Negative width is not allowed for Size");if(i<0)throw new Error("Negative height is not allowed for Size");return{width:t,height:i}}function F(n,t){return n.width===t.width&&n.height===t.height}var Js=function(){function n(t){var i=this;this._resolutionListener=function(){return i._onResolutionChanged()},this._resolutionMediaQueryList=null,this._observers=[],this._window=t,this._installResolutionListener()}return n.prototype.dispose=function(){this._uninstallResolutionListener(),this._window=null},Object.defineProperty(n.prototype,"value",{get:function(){return this._window.devicePixelRatio},enumerable:!1,configurable:!0}),n.prototype.subscribe=function(t){var i=this,s={next:t};return this._observers.push(s),{unsubscribe:function(){i._observers=i._observers.filter(function(e){return e!==s})}}},n.prototype._installResolutionListener=function(){if(this._resolutionMediaQueryList!==null)throw new Error("Resolution listener is already installed");var t=this._window.devicePixelRatio;this._resolutionMediaQueryList=this._window.matchMedia("all and (resolution: ".concat(t,"dppx)")),this._resolutionMediaQueryList.addListener(this._resolutionListener)},n.prototype._uninstallResolutionListener=function(){this._resolutionMediaQueryList!==null&&(this._resolutionMediaQueryList.removeListener(this._resolutionListener),this._resolutionMediaQueryList=null)},n.prototype._reinstallResolutionListener=function(){this._uninstallResolutionListener(),this._installResolutionListener()},n.prototype._onResolutionChanged=function(){var t=this;this._observers.forEach(function(i){return i.next(t._window.devicePixelRatio)}),this._reinstallResolutionListener()},n}();function Ks(n){return new Js(n)}var Gs=function(){function n(t,i,s){var e;this._canvasElement=null,this._bitmapSizeChangedListeners=[],this._suggestedBitmapSize=null,this._suggestedBitmapSizeChangedListeners=[],this._devicePixelRatioObservable=null,this._canvasElementResizeObserver=null,this._canvasElement=t,this._canvasElementClientSize=S({width:this._canvasElement.clientWidth,height:this._canvasElement.clientHeight}),this._transformBitmapSize=i??function(h){return h},this._allowResizeObserver=(e=s==null?void 0:s.allowResizeObserver)!==null&&e!==void 0?e:!0,this._chooseAndInitObserver()}return n.prototype.dispose=function(){var t,i;if(this._canvasElement===null)throw new Error("Object is disposed");(t=this._canvasElementResizeObserver)===null||t===void 0||t.disconnect(),this._canvasElementResizeObserver=null,(i=this._devicePixelRatioObservable)===null||i===void 0||i.dispose(),this._devicePixelRatioObservable=null,this._suggestedBitmapSizeChangedListeners.length=0,this._bitmapSizeChangedListeners.length=0,this._canvasElement=null},Object.defineProperty(n.prototype,"canvasElement",{get:function(){if(this._canvasElement===null)throw new Error("Object is disposed");return this._canvasElement},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"canvasElementClientSize",{get:function(){return this._canvasElementClientSize},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"bitmapSize",{get:function(){return S({width:this.canvasElement.width,height:this.canvasElement.height})},enumerable:!1,configurable:!0}),n.prototype.resizeCanvasElement=function(t){this._canvasElementClientSize=S(t),this.canvasElement.style.width="".concat(this._canvasElementClientSize.width,"px"),this.canvasElement.style.height="".concat(this._canvasElementClientSize.height,"px"),this._invalidateBitmapSize()},n.prototype.subscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners.push(t)},n.prototype.unsubscribeBitmapSizeChanged=function(t){this._bitmapSizeChangedListeners=this._bitmapSizeChangedListeners.filter(function(i){return i!==t})},Object.defineProperty(n.prototype,"suggestedBitmapSize",{get:function(){return this._suggestedBitmapSize},enumerable:!1,configurable:!0}),n.prototype.subscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners.push(t)},n.prototype.unsubscribeSuggestedBitmapSizeChanged=function(t){this._suggestedBitmapSizeChangedListeners=this._suggestedBitmapSizeChangedListeners.filter(function(i){return i!==t})},n.prototype.applySuggestedBitmapSize=function(){if(this._suggestedBitmapSize!==null){var t=this._suggestedBitmapSize;this._suggestedBitmapSize=null,this._resizeBitmap(t),this._emitSuggestedBitmapSizeChanged(t,this._suggestedBitmapSize)}},n.prototype._resizeBitmap=function(t){var i=this.bitmapSize;F(i,t)||(this.canvasElement.width=t.width,this.canvasElement.height=t.height,this._emitBitmapSizeChanged(i,t))},n.prototype._emitBitmapSizeChanged=function(t,i){var s=this;this._bitmapSizeChangedListeners.forEach(function(e){return e.call(s,t,i)})},n.prototype._suggestNewBitmapSize=function(t){var i=this._suggestedBitmapSize,s=S(this._transformBitmapSize(t,this._canvasElementClientSize)),e=F(this.bitmapSize,s)?null:s;i===null&&e===null||i!==null&&e!==null&&F(i,e)||(this._suggestedBitmapSize=e,this._emitSuggestedBitmapSizeChanged(i,e))},n.prototype._emitSuggestedBitmapSizeChanged=function(t,i){var s=this;this._suggestedBitmapSizeChangedListeners.forEach(function(e){return e.call(s,t,i)})},n.prototype._chooseAndInitObserver=function(){var t=this;if(!this._allowResizeObserver){this._initDevicePixelRatioObservable();return}ie().then(function(i){return i?t._initResizeObserver():t._initDevicePixelRatioObservable()})},n.prototype._initDevicePixelRatioObservable=function(){var t=this;if(this._canvasElement!==null){var i=Ti(this._canvasElement);if(i===null)throw new Error("No window is associated with the canvas");this._devicePixelRatioObservable=Ks(i),this._devicePixelRatioObservable.subscribe(function(){return t._invalidateBitmapSize()}),this._invalidateBitmapSize()}},n.prototype._invalidateBitmapSize=function(){var t,i;if(this._canvasElement!==null){var s=Ti(this._canvasElement);if(s!==null){var e=(i=(t=this._devicePixelRatioObservable)===null||t===void 0?void 0:t.value)!==null&&i!==void 0?i:s.devicePixelRatio,h=this._canvasElement.getClientRects(),r=h[0]!==void 0?se(h[0],e):S({width:this._canvasElementClientSize.width*e,height:this._canvasElementClientSize.height*e});this._suggestNewBitmapSize(r)}}},n.prototype._initResizeObserver=function(){var t=this;this._canvasElement!==null&&(this._canvasElementResizeObserver=new ResizeObserver(function(i){var s=i.find(function(r){return r.target===t._canvasElement});if(!(!s||!s.devicePixelContentBoxSize||!s.devicePixelContentBoxSize[0])){var e=s.devicePixelContentBoxSize[0],h=S({width:e.inlineSize,height:e.blockSize});t._suggestNewBitmapSize(h)}}),this._canvasElementResizeObserver.observe(this._canvasElement,{box:"device-pixel-content-box"}))},n}();function te(n,t){return new Gs(n,t.transform,t.options)}function Ti(n){return n.ownerDocument.defaultView}function ie(){return new Promise(function(n){var t=new ResizeObserver(function(i){n(i.every(function(s){return"devicePixelContentBoxSize"in s})),t.disconnect()});t.observe(document.body,{box:"device-pixel-content-box"})}).catch(function(){return!1})}function se(n,t){return S({width:Math.round(n.left*t+n.width*t)-Math.round(n.left*t),height:Math.round(n.top*t+n.height*t)-Math.round(n.top*t)})}var ee=function(){function n(t,i,s){if(i.width===0||i.height===0)throw new TypeError("Rendering target could only be created on a media with positive width and height");if(this._mediaSize=i,s.width===0||s.height===0)throw new TypeError("Rendering target could only be created using a bitmap with positive integer width and height");this._bitmapSize=s,this._context=t}return n.prototype.useMediaCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),this._context.scale(this._horizontalPixelRatio,this._verticalPixelRatio),t({context:this._context,mediaSize:this._mediaSize})}finally{this._context.restore()}},n.prototype.useBitmapCoordinateSpace=function(t){try{return this._context.save(),this._context.setTransform(1,0,0,1,0,0),t({context:this._context,mediaSize:this._mediaSize,bitmapSize:this._bitmapSize,horizontalPixelRatio:this._horizontalPixelRatio,verticalPixelRatio:this._verticalPixelRatio})}finally{this._context.restore()}},Object.defineProperty(n.prototype,"_horizontalPixelRatio",{get:function(){return this._bitmapSize.width/this._mediaSize.width},enumerable:!1,configurable:!0}),Object.defineProperty(n.prototype,"_verticalPixelRatio",{get:function(){return this._bitmapSize.height/this._mediaSize.height},enumerable:!1,configurable:!0}),n}();function H(n,t){var i=n.canvasElementClientSize;if(i.width===0||i.height===0)return null;var s=n.bitmapSize;if(s.width===0||s.height===0)return null;var e=n.canvasElement.getContext("2d",t);return e===null?null:new ee(e,i,s)}/*! + * @license + * TradingView Lightweight Charts™ v4.1.3 + * Copyright (c) 2024 TradingView, Inc. + * Licensed under Apache License 2.0 https://www.apache.org/licenses/LICENSE-2.0 + */const ne={upColor:"#26a69a",downColor:"#ef5350",wickVisible:!0,borderVisible:!0,borderColor:"#378658",borderUpColor:"#26a69a",borderDownColor:"#ef5350",wickColor:"#737375",wickUpColor:"#26a69a",wickDownColor:"#ef5350"},he={upColor:"#26a69a",downColor:"#ef5350",openVisible:!0,thinBars:!0},re={color:"#2196f3",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},le={topColor:"rgba( 46, 220, 135, 0.4)",bottomColor:"rgba( 40, 221, 100, 0)",invertFilledArea:!1,lineColor:"#33D778",lineStyle:0,lineWidth:3,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},oe={baseValue:{type:"price",price:0},topFillColor1:"rgba(38, 166, 154, 0.28)",topFillColor2:"rgba(38, 166, 154, 0.05)",topLineColor:"rgba(38, 166, 154, 1)",bottomFillColor1:"rgba(239, 83, 80, 0.05)",bottomFillColor2:"rgba(239, 83, 80, 0.28)",bottomLineColor:"rgba(239, 83, 80, 1)",lineWidth:3,lineStyle:0,lineType:0,lineVisible:!0,crosshairMarkerVisible:!0,crosshairMarkerRadius:4,crosshairMarkerBorderColor:"",crosshairMarkerBorderWidth:2,crosshairMarkerBackgroundColor:"",lastPriceAnimation:0,pointMarkersVisible:!1},ue={color:"#26a69a",base:0},ys={color:"#2196f3"},Ms={title:"",visible:!0,lastValueVisible:!0,priceLineVisible:!0,priceLineSource:0,priceLineWidth:1,priceLineColor:"",priceLineStyle:2,baseLineVisible:!0,baseLineWidth:1,baseLineColor:"#B2B5BE",baseLineStyle:0,priceFormat:{type:"price",precision:2,minMove:.01}};var Ni,Ri;function j(n,t){const i={0:[],1:[n.lineWidth,n.lineWidth],2:[2*n.lineWidth,2*n.lineWidth],3:[6*n.lineWidth,6*n.lineWidth],4:[n.lineWidth,4*n.lineWidth]}[t];n.setLineDash(i)}function zs(n,t,i,s){n.beginPath();const e=n.lineWidth%2?.5:0;n.moveTo(i,t+e),n.lineTo(s,t+e),n.stroke()}function A(n,t){if(!n)throw new Error("Assertion failed"+(t?": "+t:""))}function O(n){if(n===void 0)throw new Error("Value is undefined");return n}function b(n){if(n===null)throw new Error("Value is null");return n}function X(n){return b(O(n))}(function(n){n[n.Simple=0]="Simple",n[n.WithSteps=1]="WithSteps",n[n.Curved=2]="Curved"})(Ni||(Ni={})),function(n){n[n.Solid=0]="Solid",n[n.Dotted=1]="Dotted",n[n.Dashed=2]="Dashed",n[n.LargeDashed=3]="LargeDashed",n[n.SparseDotted=4]="SparseDotted"}(Ri||(Ri={}));const Bi={khaki:"#f0e68c",azure:"#f0ffff",aliceblue:"#f0f8ff",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",gray:"#808080",green:"#008000",honeydew:"#f0fff0",floralwhite:"#fffaf0",lightblue:"#add8e6",lightcoral:"#f08080",lemonchiffon:"#fffacd",hotpink:"#ff69b4",lightyellow:"#ffffe0",greenyellow:"#adff2f",lightgoldenrodyellow:"#fafad2",limegreen:"#32cd32",linen:"#faf0e6",lightcyan:"#e0ffff",magenta:"#f0f",maroon:"#800000",olive:"#808000",orange:"#ffa500",oldlace:"#fdf5e6",mediumblue:"#0000cd",transparent:"#0000",lime:"#0f0",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",midnightblue:"#191970",orchid:"#da70d6",mediumorchid:"#ba55d3",mediumturquoise:"#48d1cc",orangered:"#ff4500",royalblue:"#4169e1",powderblue:"#b0e0e6",red:"#f00",coral:"#ff7f50",turquoise:"#40e0d0",white:"#fff",whitesmoke:"#f5f5f5",wheat:"#f5deb3",teal:"#008080",steelblue:"#4682b4",bisque:"#ffe4c4",aquamarine:"#7fffd4",aqua:"#0ff",sienna:"#a0522d",silver:"#c0c0c0",springgreen:"#00ff7f",antiquewhite:"#faebd7",burlywood:"#deb887",brown:"#a52a2a",beige:"#f5f5dc",chocolate:"#d2691e",chartreuse:"#7fff00",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cadetblue:"#5f9ea0",tomato:"#ff6347",fuchsia:"#f0f",blue:"#00f",salmon:"#fa8072",blanchedalmond:"#ffebcd",slateblue:"#6a5acd",slategray:"#708090",thistle:"#d8bfd8",tan:"#d2b48c",cyan:"#0ff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",blueviolet:"#8a2be2",black:"#000",darkmagenta:"#8b008b",darkslateblue:"#483d8b",darkkhaki:"#bdb76b",darkorchid:"#9932cc",darkorange:"#ff8c00",darkgreen:"#006400",darkred:"#8b0000",dodgerblue:"#1e90ff",darkslategray:"#2f4f4f",dimgray:"#696969",deepskyblue:"#00bfff",firebrick:"#b22222",forestgreen:"#228b22",indigo:"#4b0082",ivory:"#fffff0",lavenderblush:"#fff0f5",feldspar:"#d19275",indianred:"#cd5c5c",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightskyblue:"#87cefa",lightslategray:"#789",lightslateblue:"#8470ff",snow:"#fffafa",lightseagreen:"#20b2aa",lightsalmon:"#ffa07a",darksalmon:"#e9967a",darkviolet:"#9400d3",mediumpurple:"#9370d8",mediumaquamarine:"#66cdaa",skyblue:"#87ceeb",lavender:"#e6e6fa",lightsteelblue:"#b0c4de",mediumvioletred:"#c71585",mintcream:"#f5fffa",navajowhite:"#ffdead",navy:"#000080",olivedrab:"#6b8e23",palevioletred:"#d87093",violetred:"#d02090",yellow:"#ff0",yellowgreen:"#9acd32",lawngreen:"#7cfc00",pink:"#ffc0cb",paleturquoise:"#afeeee",palegoldenrod:"#eee8aa",darkolivegreen:"#556b2f",darkseagreen:"#8fbc8f",darkturquoise:"#00ced1",peachpuff:"#ffdab9",deeppink:"#ff1493",violet:"#ee82ee",palegreen:"#98fb98",mediumseagreen:"#3cb371",peru:"#cd853f",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",purple:"#800080",seagreen:"#2e8b57",seashell:"#fff5ee",papayawhip:"#ffefd5",mediumslateblue:"#7b68ee",plum:"#dda0dd",mediumspringgreen:"#00fa9a"};function N(n){return n<0?0:n>255?255:Math.round(n)||0}function xs(n){return n<=0||n>0?n<0?0:n>1?1:Math.round(1e4*n)/1e4:0}const ae=/^#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])?$/i,ce=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/i,fe=/^rgb\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*\)$/,de=/^rgba\(\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?\d{1,10})\s*,\s*(-?[\d]{0,10}(?:\.\d+)?)\s*\)$/;function zt(n){(n=n.toLowerCase())in Bi&&(n=Bi[n]);{const t=de.exec(n)||fe.exec(n);if(t)return[N(parseInt(t[1],10)),N(parseInt(t[2],10)),N(parseInt(t[3],10)),xs(t.length<5?1:parseFloat(t[4]))]}{const t=ce.exec(n);if(t)return[N(parseInt(t[1],16)),N(parseInt(t[2],16)),N(parseInt(t[3],16)),1]}{const t=ae.exec(n);if(t)return[N(17*parseInt(t[1],16)),N(17*parseInt(t[2],16)),N(17*parseInt(t[3],16)),1]}throw new Error(`Cannot parse color: ${n}`)}function Et(n){const t=zt(n);return{t:`rgb(${t[0]}, ${t[1]}, ${t[2]})`,i:(i=t,.199*i[0]+.687*i[1]+.114*i[2]>160?"black":"white")};var i}class M{constructor(){this.h=[]}l(t,i,s){const e={o:t,_:i,u:s===!0};this.h.push(e)}v(t){const i=this.h.findIndex(s=>t===s.o);i>-1&&this.h.splice(i,1)}p(t){this.h=this.h.filter(i=>i._!==t)}m(t,i,s){const e=[...this.h];this.h=this.h.filter(h=>!h.u),e.forEach(h=>h.o(t,i,s))}M(){return this.h.length>0}S(){this.h=[]}}function R(n,...t){for(const i of t)for(const s in i)i[s]!==void 0&&(typeof i[s]!="object"||n[s]===void 0||Array.isArray(i[s])?n[s]=i[s]:R(n[s],i[s]));return n}function P(n){return typeof n=="number"&&isFinite(n)}function rt(n){return typeof n=="number"&&n%1==0}function at(n){return typeof n=="string"}function dt(n){return typeof n=="boolean"}function W(n){const t=n;if(!t||typeof t!="object")return t;let i,s,e;for(s in i=Array.isArray(t)?[]:{},t)t.hasOwnProperty(s)&&(e=t[s],i[s]=e&&typeof e=="object"?W(e):e);return i}function me(n){return n!==null}function lt(n){return n===null?void 0:n}const fi="-apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif";function K(n,t,i){return t===void 0&&(t=fi),`${i=i!==void 0?`${i} `:""}${n}px ${t}`}class pe{constructor(t){this.k={C:1,T:5,P:NaN,R:"",D:"",O:"",A:"",V:0,B:0,I:0,L:0,N:0},this.F=t}W(){const t=this.k,i=this.j(),s=this.H();return t.P===i&&t.D===s||(t.P=i,t.D=s,t.R=K(i,s),t.L=2.5/12*i,t.V=t.L,t.B=i/12*t.T,t.I=i/12*t.T,t.N=0),t.O=this.$(),t.A=this.U(),this.k}$(){return this.F.W().layout.textColor}U(){return this.F.q()}j(){return this.F.W().layout.fontSize}H(){return this.F.W().layout.fontFamily}}class di{constructor(){this.Y=[]}X(t){this.Y=t}K(t,i,s){this.Y.forEach(e=>{e.K(t,i,s)})}}class B{K(t,i,s){t.useBitmapCoordinateSpace(e=>this.Z(e,i,s))}}class be extends B{constructor(){super(...arguments),this.G=null}J(t){this.G=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:s}){if(this.G===null||this.G.tt===null)return;const e=this.G.tt,h=this.G,r=Math.max(1,Math.floor(i))%2/2,l=o=>{t.beginPath();for(let u=e.to-1;u>=e.from;--u){const a=h.it[u],c=Math.round(a.nt*i)+r,f=a.st*s,d=o*s+r;t.moveTo(c,f),t.arc(c,f,d,0,2*Math.PI)}t.fill()};h.et>0&&(t.fillStyle=h.rt,l(h.ht+h.et)),t.fillStyle=h.lt,l(h.ht)}}function ge(){return{it:[{nt:0,st:0,ot:0,_t:0}],lt:"",rt:"",ht:0,et:0,tt:null}}const ve={from:0,to:1};class we{constructor(t,i){this.ut=new di,this.ct=[],this.dt=[],this.ft=!0,this.F=t,this.vt=i,this.ut.X(this.ct)}bt(t){const i=this.F.wt();i.length!==this.ct.length&&(this.dt=i.map(ge),this.ct=this.dt.map(s=>{const e=new be;return e.J(s),e}),this.ut.X(this.ct)),this.ft=!0}gt(){return this.ft&&(this.Mt(),this.ft=!1),this.ut}Mt(){const t=this.vt.W().mode===2,i=this.F.wt(),s=this.vt.xt(),e=this.F.St();i.forEach((h,r)=>{var l;const o=this.dt[r],u=h.kt(s);if(t||u===null||!h.yt())return void(o.tt=null);const a=b(h.Ct());o.lt=u.Tt,o.ht=u.ht,o.et=u.Pt,o.it[0]._t=u._t,o.it[0].st=h.Dt().Rt(u._t,a.Ot),o.rt=(l=u.At)!==null&&l!==void 0?l:this.F.Vt(o.it[0].st/h.Dt().Bt()),o.it[0].ot=s,o.it[0].nt=e.It(s),o.tt=ve})}}class _e extends B{constructor(t){super(),this.zt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:s,verticalPixelRatio:e}){if(this.zt===null)return;const h=this.zt.Lt.yt,r=this.zt.Et.yt;if(!h&&!r)return;const l=Math.round(this.zt.nt*s),o=Math.round(this.zt.st*e);t.lineCap="butt",h&&l>=0&&(t.lineWidth=Math.floor(this.zt.Lt.et*s),t.strokeStyle=this.zt.Lt.O,t.fillStyle=this.zt.Lt.O,j(t,this.zt.Lt.Nt),function(u,a,c,f){u.beginPath();const d=u.lineWidth%2?.5:0;u.moveTo(a+d,c),u.lineTo(a+d,f),u.stroke()}(t,l,0,i.height)),r&&o>=0&&(t.lineWidth=Math.floor(this.zt.Et.et*e),t.strokeStyle=this.zt.Et.O,t.fillStyle=this.zt.Et.O,j(t,this.zt.Et.Nt),zs(t,o,0,i.width))}}class Se{constructor(t){this.ft=!0,this.Ft={Lt:{et:1,Nt:0,O:"",yt:!1},Et:{et:1,Nt:0,O:"",yt:!1},nt:0,st:0},this.Wt=new _e(this.Ft),this.jt=t}bt(){this.ft=!0}gt(){return this.ft&&(this.Mt(),this.ft=!1),this.Wt}Mt(){const t=this.jt.yt(),i=b(this.jt.Ht()),s=i.$t().W().crosshair,e=this.Ft;if(s.mode===2)return e.Et.yt=!1,void(e.Lt.yt=!1);e.Et.yt=t&&this.jt.Ut(i),e.Lt.yt=t&&this.jt.qt(),e.Et.et=s.horzLine.width,e.Et.Nt=s.horzLine.style,e.Et.O=s.horzLine.color,e.Lt.et=s.vertLine.width,e.Lt.Nt=s.vertLine.style,e.Lt.O=s.vertLine.color,e.nt=this.jt.Yt(),e.st=this.jt.Xt()}}function ye(n,t,i,s,e,h){n.fillRect(t+h,i,s-2*h,h),n.fillRect(t+h,i+e-h,s-2*h,h),n.fillRect(t,i,h,e),n.fillRect(t+s-h,i,h,e)}function Ot(n,t,i,s,e,h){n.save(),n.globalCompositeOperation="copy",n.fillStyle=h,n.fillRect(t,i,s,e),n.restore()}function Li(n,t){return n.map(i=>i===0?i:i+t)}function Vt(n,t,i,s,e,h){n.beginPath(),n.lineTo(t+s-h[1],i),h[1]!==0&&n.arcTo(t+s,i,t+s,i+h[1],h[1]),n.lineTo(t+s,i+e-h[2]),h[2]!==0&&n.arcTo(t+s,i+e,t+s-h[2],i+e,h[2]),n.lineTo(t+h[3],i+e),h[3]!==0&&n.arcTo(t,i+e,t,i+e-h[3],h[3]),n.lineTo(t,i+h[0]),h[0]!==0&&n.arcTo(t,i,t+h[0],i,h[0])}function Pi(n,t,i,s,e,h,r=0,l=[0,0,0,0],o=""){if(n.save(),!r||!o||o===h)return Vt(n,t,i,s,e,l),n.fillStyle=h,n.fill(),void n.restore();const u=r/2;h!=="transparent"&&(Vt(n,t+r,i+r,s-2*r,e-2*r,Li(l,-r)),n.fillStyle=h,n.fill()),o!=="transparent"&&(Vt(n,t+u,i+u,s-r,e-r,Li(l,-u)),n.lineWidth=r,n.strokeStyle=o,n.closePath(),n.stroke()),n.restore()}function Cs(n,t,i,s,e,h,r){n.save(),n.globalCompositeOperation="copy";const l=n.createLinearGradient(0,0,0,e);l.addColorStop(0,h),l.addColorStop(1,r),n.fillStyle=l,n.fillRect(t,i,s,e),n.restore()}class Wi{constructor(t,i){this.J(t,i)}J(t,i){this.zt=t,this.Kt=i}Bt(t,i){return this.zt.yt?t.P+t.L+t.V:0}K(t,i,s,e){if(!this.zt.yt||this.zt.Zt.length===0)return;const h=this.zt.O,r=this.Kt.t,l=t.useBitmapCoordinateSpace(o=>{const u=o.context;u.font=i.R;const a=this.Gt(o,i,s,e),c=a.Jt,f=(d,m)=>{a.Qt?Pi(u,c.ti,c.ii,c.ni,c.si,d,c.ei,[c.ht,0,0,c.ht],m):Pi(u,c.ri,c.ii,c.ni,c.si,d,c.ei,[0,c.ht,c.ht,0],m)};return f(r,"transparent"),this.zt.hi&&(u.fillStyle=h,u.fillRect(c.ri,c.li,c.ai-c.ri,c.oi)),f("transparent",r),this.zt._i&&(u.fillStyle=i.A,u.fillRect(a.Qt?c.ui-c.ei:0,c.ii,c.ei,c.ci-c.ii)),a});t.useMediaCoordinateSpace(({context:o})=>{const u=l.di;o.font=i.R,o.textAlign=l.Qt?"right":"left",o.textBaseline="middle",o.fillStyle=h,o.fillText(this.zt.Zt,u.fi,(u.ii+u.ci)/2+u.vi)})}Gt(t,i,s,e){var h;const{context:r,bitmapSize:l,mediaSize:o,horizontalPixelRatio:u,verticalPixelRatio:a}=t,c=this.zt.hi||!this.zt.pi?i.T:0,f=this.zt.mi?i.C:0,d=i.L+this.Kt.bi,m=i.V+this.Kt.wi,p=i.B,g=i.I,v=this.zt.Zt,w=i.P,y=s.gi(r,v),_=Math.ceil(s.Mi(r,v)),z=w+d+m,T=i.C+p+g+_+c,E=Math.max(1,Math.floor(a));let C=Math.round(z*a);C%2!=E%2&&(C+=1);const I=f>0?Math.max(1,Math.floor(f*u)):0,Y=Math.round(T*u),zi=Math.round(c*u),Ys=(h=this.Kt.xi)!==null&&h!==void 0?h:this.Kt.Si,xi=Math.round(Ys*a)-Math.floor(.5*a),Bt=Math.floor(xi+E/2-C/2),Ci=Bt+C,ft=e==="right",Ei=ft?o.width-f:f,tt=ft?l.width-I:I;let Lt,Pt,Wt;return ft?(Lt=tt-Y,Pt=tt-zi,Wt=Ei-c-p-f):(Lt=tt+Y,Pt=tt+zi,Wt=Ei+c+p),{Qt:ft,Jt:{ii:Bt,li:xi,ci:Ci,ni:Y,si:C,ht:2*u,ei:I,ti:Lt,ri:tt,ai:Pt,oi:E,ui:l.width},di:{ii:Bt/a,ci:Ci/a,fi:Wt,vi:y}}}}class kt{constructor(t){this.ki={Si:0,t:"#000",wi:0,bi:0},this.yi={Zt:"",yt:!1,hi:!0,pi:!1,At:"",O:"#FFF",_i:!1,mi:!1},this.Ci={Zt:"",yt:!1,hi:!1,pi:!0,At:"",O:"#FFF",_i:!0,mi:!0},this.ft=!0,this.Ti=new(t||Wi)(this.yi,this.ki),this.Pi=new(t||Wi)(this.Ci,this.ki)}Zt(){return this.Ri(),this.yi.Zt}Si(){return this.Ri(),this.ki.Si}bt(){this.ft=!0}Bt(t,i=!1){return Math.max(this.Ti.Bt(t,i),this.Pi.Bt(t,i))}Di(){return this.ki.xi||0}Oi(t){this.ki.xi=t}Ai(){return this.Ri(),this.yi.yt||this.Ci.yt}Vi(){return this.Ri(),this.yi.yt}gt(t){return this.Ri(),this.yi.hi=this.yi.hi&&t.W().ticksVisible,this.Ci.hi=this.Ci.hi&&t.W().ticksVisible,this.Ti.J(this.yi,this.ki),this.Pi.J(this.Ci,this.ki),this.Ti}Bi(){return this.Ri(),this.Ti.J(this.yi,this.ki),this.Pi.J(this.Ci,this.ki),this.Pi}Ri(){this.ft&&(this.yi.hi=!0,this.Ci.hi=!1,this.Ii(this.yi,this.Ci,this.ki))}}class Me extends kt{constructor(t,i,s){super(),this.jt=t,this.zi=i,this.Li=s}Ii(t,i,s){if(t.yt=!1,this.jt.W().mode===2)return;const e=this.jt.W().horzLine;if(!e.labelVisible)return;const h=this.zi.Ct();if(!this.jt.yt()||this.zi.Ei()||h===null)return;const r=Et(e.labelBackgroundColor);s.t=r.t,t.O=r.i;const l=2/12*this.zi.P();s.bi=l,s.wi=l;const o=this.Li(this.zi);s.Si=o.Si,t.Zt=this.zi.Ni(o._t,h),t.yt=!0}}const ze=/[1-9]/g;class Es{constructor(){this.zt=null}J(t){this.zt=t}K(t,i){if(this.zt===null||this.zt.yt===!1||this.zt.Zt.length===0)return;const s=t.useMediaCoordinateSpace(({context:f})=>(f.font=i.R,Math.round(i.Fi.Mi(f,b(this.zt).Zt,ze))));if(s<=0)return;const e=i.Wi,h=s+2*e,r=h/2,l=this.zt.ji;let o=this.zt.Si,u=Math.floor(o-r)+.5;u<0?(o+=Math.abs(0-u),u=Math.floor(o-r)+.5):u+h>l&&(o-=Math.abs(l-(u+h)),u=Math.floor(o-r)+.5);const a=u+h,c=Math.ceil(0+i.C+i.T+i.L+i.P+i.V);t.useBitmapCoordinateSpace(({context:f,horizontalPixelRatio:d,verticalPixelRatio:m})=>{const p=b(this.zt);f.fillStyle=p.t;const g=Math.round(u*d),v=Math.round(0*m),w=Math.round(a*d),y=Math.round(c*m),_=Math.round(2*d);if(f.beginPath(),f.moveTo(g,v),f.lineTo(g,y-_),f.arcTo(g,y,g+_,y,_),f.lineTo(w-_,y),f.arcTo(w,y,w,y-_,_),f.lineTo(w,v),f.fill(),p.hi){const z=Math.round(p.Si*d),T=v,E=Math.round((T+i.T)*m);f.fillStyle=p.O;const C=Math.max(1,Math.floor(d)),I=Math.floor(.5*d);f.fillRect(z-I,T,C,E-T)}}),t.useMediaCoordinateSpace(({context:f})=>{const d=b(this.zt),m=0+i.C+i.T+i.L+i.P/2;f.font=i.R,f.textAlign="left",f.textBaseline="middle",f.fillStyle=d.O;const p=i.Fi.gi(f,"Apr0");f.translate(u+e,m+p),f.fillText(d.Zt,0,0)})}}class xe{constructor(t,i,s){this.ft=!0,this.Wt=new Es,this.Ft={yt:!1,t:"#4c525e",O:"white",Zt:"",ji:0,Si:NaN,hi:!0},this.vt=t,this.Hi=i,this.Li=s}bt(){this.ft=!0}gt(){return this.ft&&(this.Mt(),this.ft=!1),this.Wt.J(this.Ft),this.Wt}Mt(){const t=this.Ft;if(t.yt=!1,this.vt.W().mode===2)return;const i=this.vt.W().vertLine;if(!i.labelVisible)return;const s=this.Hi.St();if(s.Ei())return;t.ji=s.ji();const e=this.Li();if(e===null)return;t.Si=e.Si;const h=s.$i(this.vt.xt());t.Zt=s.Ui(b(h)),t.yt=!0;const r=Et(i.labelBackgroundColor);t.t=r.t,t.O=r.i,t.hi=s.W().ticksVisible}}class mi{constructor(){this.qi=null,this.Yi=0}Xi(){return this.Yi}Ki(t){this.Yi=t}Dt(){return this.qi}Zi(t){this.qi=t}Gi(t){return[]}Ji(){return[]}yt(){return!0}}var hi;(function(n){n[n.Normal=0]="Normal",n[n.Magnet=1]="Magnet",n[n.Hidden=2]="Hidden"})(hi||(hi={}));class Ce extends mi{constructor(t,i){super(),this.Qi=null,this.tn=NaN,this.nn=0,this.sn=!0,this.en=new Map,this.rn=!1,this.hn=NaN,this.ln=NaN,this.an=NaN,this.on=NaN,this.Hi=t,this._n=i,this.un=new we(t,this),this.cn=((e,h)=>r=>{const l=h(),o=e();if(r===b(this.Qi).dn())return{_t:o,Si:l};{const u=b(r.Ct());return{_t:r.fn(l,u),Si:l}}})(()=>this.tn,()=>this.ln);const s=((e,h)=>()=>{const r=this.Hi.St().vn(e()),l=h();return r&&Number.isFinite(l)?{ot:r,Si:l}:null})(()=>this.nn,()=>this.Yt());this.pn=new xe(this,t,s),this.mn=new Se(this)}W(){return this._n}bn(t,i){this.an=t,this.on=i}wn(){this.an=NaN,this.on=NaN}gn(){return this.an}Mn(){return this.on}xn(t,i,s){this.rn||(this.rn=!0),this.sn=!0,this.Sn(t,i,s)}xt(){return this.nn}Yt(){return this.hn}Xt(){return this.ln}yt(){return this.sn}kn(){this.sn=!1,this.yn(),this.tn=NaN,this.hn=NaN,this.ln=NaN,this.Qi=null,this.wn()}Cn(t){return this.Qi!==null?[this.mn,this.un]:[]}Ut(t){return t===this.Qi&&this._n.horzLine.visible}qt(){return this._n.vertLine.visible}Tn(t,i){this.sn&&this.Qi===t||this.en.clear();const s=[];return this.Qi===t&&s.push(this.Pn(this.en,i,this.cn)),s}Ji(){return this.sn?[this.pn]:[]}Ht(){return this.Qi}Rn(){this.mn.bt(),this.en.forEach(t=>t.bt()),this.pn.bt(),this.un.bt()}Dn(t){return t&&!t.dn().Ei()?t.dn():null}Sn(t,i,s){this.On(t,i,s)&&this.Rn()}On(t,i,s){const e=this.hn,h=this.ln,r=this.tn,l=this.nn,o=this.Qi,u=this.Dn(s);this.nn=t,this.hn=isNaN(t)?NaN:this.Hi.St().It(t),this.Qi=s;const a=u!==null?u.Ct():null;return u!==null&&a!==null?(this.tn=i,this.ln=u.Rt(i,a)):(this.tn=NaN,this.ln=NaN),e!==this.hn||h!==this.ln||l!==this.nn||r!==this.tn||o!==this.Qi}yn(){const t=this.Hi.wt().map(s=>s.Vn().An()).filter(me),i=t.length===0?null:Math.max(...t);this.nn=i!==null?i:NaN}Pn(t,i,s){let e=t.get(i);return e===void 0&&(e=new Me(this,i,s),t.set(i,e)),e}}function Tt(n){return n==="left"||n==="right"}class x{constructor(t){this.Bn=new Map,this.In=[],this.zn=t}Ln(t,i){const s=function(e,h){return e===void 0?h:{En:Math.max(e.En,h.En),Nn:e.Nn||h.Nn}}(this.Bn.get(t),i);this.Bn.set(t,s)}Fn(){return this.zn}Wn(t){const i=this.Bn.get(t);return i===void 0?{En:this.zn}:{En:Math.max(this.zn,i.En),Nn:i.Nn}}jn(){this.Hn(),this.In=[{$n:0}]}Un(t){this.Hn(),this.In=[{$n:1,Ot:t}]}qn(t){this.Yn(),this.In.push({$n:5,Ot:t})}Hn(){this.Yn(),this.In.push({$n:6})}Xn(){this.Hn(),this.In=[{$n:4}]}Kn(t){this.Hn(),this.In.push({$n:2,Ot:t})}Zn(t){this.Hn(),this.In.push({$n:3,Ot:t})}Gn(){return this.In}Jn(t){for(const i of t.In)this.Qn(i);this.zn=Math.max(this.zn,t.zn),t.Bn.forEach((i,s)=>{this.Ln(s,i)})}static ts(){return new x(2)}static ns(){return new x(3)}Qn(t){switch(t.$n){case 0:this.jn();break;case 1:this.Un(t.Ot);break;case 2:this.Kn(t.Ot);break;case 3:this.Zn(t.Ot);break;case 4:this.Xn();break;case 5:this.qn(t.Ot);break;case 6:this.Yn()}}Yn(){const t=this.In.findIndex(i=>i.$n===5);t!==-1&&this.In.splice(t,1)}}const Di=".";function D(n,t){if(!P(n))return"n/a";if(!rt(t))throw new TypeError("invalid length");if(t<0||t>16)throw new TypeError("invalid length");return t===0?n.toString():("0000000000000000"+n.toString()).slice(-t)}class Nt{constructor(t,i){if(i||(i=1),P(t)&&rt(t)||(t=100),t<0)throw new TypeError("invalid base");this.zi=t,this.ss=i,this.es()}format(t){const i=t<0?"−":"";return t=Math.abs(t),i+this.rs(t)}es(){if(this.hs=0,this.zi>0&&this.ss>0){let t=this.zi;for(;t>1;)t/=10,this.hs++}}rs(t){const i=this.zi/this.ss;let s=Math.floor(t),e="";const h=this.hs!==void 0?this.hs:NaN;if(i>1){let r=+(Math.round(t*i)-s*i).toFixed(this.hs);r>=i&&(r-=i,s+=1),e=Di+D(+r.toFixed(this.hs)*this.ss,h)}else s=Math.round(s*i)/i,h>0&&(e=Di+D(0,h));return s.toFixed(0)+e}}class Os extends Nt{constructor(t=100){super(t)}format(t){return`${super.format(t)}%`}}class Ee{constructor(t){this.ls=t}format(t){let i="";return t<0&&(i="-",t=-t),t<995?i+this.os(t):t<999995?i+this.os(t/1e3)+"K":t<999999995?(t=1e3*Math.round(t/1e3),i+this.os(t/1e6)+"M"):(t=1e6*Math.round(t/1e6),i+this.os(t/1e9)+"B")}os(t){let i;const s=Math.pow(10,this.ls);return i=(t=Math.round(t*s)/s)>=1e-15&&t<1?t.toFixed(this.ls).replace(/\.?0+$/,""):String(t),i.replace(/(\.[1-9]*)0+$/,(e,h)=>h)}}function ks(n,t,i,s,e,h,r){if(t.length===0||s.from>=t.length||s.to<=0)return;const{context:l,horizontalPixelRatio:o,verticalPixelRatio:u}=n,a=t[s.from];let c=h(n,a),f=a;if(s.to-s.from<2){const d=e/2;l.beginPath();const m={nt:a.nt-d,st:a.st},p={nt:a.nt+d,st:a.st};l.moveTo(m.nt*o,m.st*u),l.lineTo(p.nt*o,p.st*u),r(n,c,m,p)}else{const d=(p,g)=>{r(n,c,f,g),l.beginPath(),c=p,f=g};let m=f;l.beginPath(),l.moveTo(a.nt*o,a.st*u);for(let p=s.from+1;p=m.from;--T){const E=f[T];if(E){const C=p(c,E);C!==y&&(w.beginPath(),y!==null&&w.fill(),w.fillStyle=C,y=C);const I=Math.round(E.nt*g)+_,Y=E.st*v;w.moveTo(I,Y),w.arc(I,Y,z,0,2*Math.PI)}}w.fill()}(t,i,o,s,a)}}class Bs extends Rs{Ps(t,i){return i.lt}}function Ls(n,t,i,s,e=0,h=t.length){let r=h-e;for(;0>1,o=e+l;s(t[o],i)===n?(e=o+1,r-=l+1):r=l}return e}const ct=Ls.bind(null,!0),Ps=Ls.bind(null,!1);function Re(n,t){return n.ot0&&h=s&&(l=h-1),r>0&&rObject.assign(Object.assign({},t),this.Is.js().Ws(t.ot)))}Hs(){this.Bs=null}Es(){this.Os&&(this.$s(),this.Os=!1),this.As&&(this.Fs(),this.As=!1),this.Ds&&(this.Us(),this.Ds=!1)}Us(){const t=this.Is.Dt(),i=this.zs.St();if(this.Hs(),i.Ei()||t.Ei())return;const s=i.qs();if(s===null||this.Is.Vn().Ys()===0)return;const e=this.Is.Ct();e!==null&&(this.Bs=Ws(this.Vs,s,this.Ls),this.Xs(t,i,e.Ot),this.Ks())}}class Rt extends bi{constructor(t,i){super(t,i,!0)}Xs(t,i,s){i.Zs(this.Vs,lt(this.Bs)),t.Gs(this.Vs,s,lt(this.Bs))}Js(t,i){return{ot:t,_t:i,nt:NaN,st:NaN}}$s(){const t=this.Is.js();this.Vs=this.Is.Vn().Qs().map(i=>{const s=i.Ot[3];return this.te(i.ie,s,t)})}}class Le extends Rt{constructor(t,i){super(t,i),this.Ns=new di,this.ne=new Te,this.se=new Bs,this.Ns.X([this.ne,this.se])}te(t,i,s){return Object.assign(Object.assign({},this.Js(t,i)),s.Ws(t))}Ks(){const t=this.Is.W();this.ne.J({us:t.lineType,it:this.Vs,Nt:t.lineStyle,et:t.lineWidth,cs:null,ds:t.invertFilledArea,tt:this.Bs,_s:this.zs.St().ee()}),this.se.J({us:t.lineVisible?t.lineType:void 0,it:this.Vs,Nt:t.lineStyle,et:t.lineWidth,tt:this.Bs,_s:this.zs.St().ee(),Ts:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0})}}class Pe extends B{constructor(){super(...arguments),this.zt=null,this.re=0,this.he=0}J(t){this.zt=t}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:s}){if(this.zt===null||this.zt.Vn.length===0||this.zt.tt===null)return;this.re=this.le(i),this.re>=2&&Math.max(1,Math.floor(i))%2!=this.re%2&&this.re--,this.he=this.zt.ae?Math.min(this.re,Math.floor(i)):this.re;let e=null;const h=this.he<=this.re&&this.zt.ee>=Math.floor(1.5*i);for(let r=this.zt.tt.from;rp+v-1&&(C=p+v-1,E=C-c+1),t.fillRect(T,E,a-T,C-E+1)}const y=u+w;let _=Math.max(p,Math.round(l.fe*s)-o),z=_+c-1;z>p+v-1&&(z=p+v-1,_=z-c+1),t.fillRect(f+1,_,y-f,z-_+1)}}}le(t){const i=Math.floor(t);return Math.max(i,Math.floor(function(s,e){return Math.floor(.3*s*e)}(b(this.zt).ee,t)))}}class Ds extends bi{constructor(t,i){super(t,i,!1)}Xs(t,i,s){i.Zs(this.Vs,lt(this.Bs)),t.ve(this.Vs,s,lt(this.Bs))}pe(t,i,s){return{ot:t,me:i.Ot[0],be:i.Ot[1],we:i.Ot[2],ge:i.Ot[3],nt:NaN,de:NaN,_e:NaN,ue:NaN,fe:NaN}}$s(){const t=this.Is.js();this.Vs=this.Is.Vn().Qs().map(i=>this.te(i.ie,i,t))}}class We extends Ds{constructor(){super(...arguments),this.Ns=new Pe}te(t,i,s){return Object.assign(Object.assign({},this.pe(t,i,s)),s.Ws(t))}Ks(){const t=this.Is.W();this.Ns.J({Vn:this.Vs,ee:this.zs.St().ee(),ce:t.openVisible,ae:t.thinBars,tt:this.Bs})}}class De extends Ts{constructor(){super(...arguments),this.ks=new pi}fs(t,i){const s=this.G;return this.ks.vs(t,{bs:i.Me,ws:i.xe,gs:i.Se,Ms:i.ke,xs:t.bitmapSize.height,cs:s.cs})}}class Ie extends Rs{constructor(){super(...arguments),this.ye=new pi}Ps(t,i){const s=this.G;return this.ye.vs(t,{bs:i.Ce,ws:i.Ce,gs:i.Te,Ms:i.Te,xs:t.bitmapSize.height,cs:s.cs})}}class Ve extends Rt{constructor(t,i){super(t,i),this.Ns=new di,this.Pe=new De,this.Re=new Ie,this.Ns.X([this.Pe,this.Re])}te(t,i,s){return Object.assign(Object.assign({},this.Js(t,i)),s.Ws(t))}Ks(){const t=this.Is.Ct();if(t===null)return;const i=this.Is.W(),s=this.Is.Dt().Rt(i.baseValue.price,t.Ot),e=this.zs.St().ee();this.Pe.J({it:this.Vs,et:i.lineWidth,Nt:i.lineStyle,us:i.lineType,cs:s,ds:!1,tt:this.Bs,_s:e}),this.Re.J({it:this.Vs,et:i.lineWidth,Nt:i.lineStyle,us:i.lineVisible?i.lineType:void 0,Ts:i.pointMarkersVisible?i.pointMarkersRadius||i.lineWidth/2+2:void 0,cs:s,tt:this.Bs,_s:e})}}class Ae extends B{constructor(){super(...arguments),this.zt=null,this.re=0}J(t){this.zt=t}Z(t){if(this.zt===null||this.zt.Vn.length===0||this.zt.tt===null)return;const{horizontalPixelRatio:i}=t;this.re=function(h,r){if(h>=2.5&&h<=4)return Math.floor(3*r);const l=1-.2*Math.atan(Math.max(4,h)-4)/(.5*Math.PI),o=Math.floor(h*l*r),u=Math.floor(h*r),a=Math.min(o,u);return Math.max(Math.floor(r),a)}(this.zt.ee,i),this.re>=2&&Math.floor(i)%2!=this.re%2&&this.re--;const s=this.zt.Vn;this.zt.De&&this.Oe(t,s,this.zt.tt),this.zt._i&&this.Ae(t,s,this.zt.tt);const e=this.Ve(i);(!this.zt._i||this.re>2*e)&&this.Be(t,s,this.zt.tt)}Oe(t,i,s){if(this.zt===null)return;const{context:e,horizontalPixelRatio:h,verticalPixelRatio:r}=t;let l="",o=Math.min(Math.floor(h),Math.floor(this.zt.ee*h));o=Math.max(Math.floor(h),Math.min(o,this.re));const u=Math.floor(.5*o);let a=null;for(let c=s.from;c2*o)ye(e,f,m,d-f+1,p-m+1,o);else{const g=d-f+1;e.fillRect(f,m,g,p-m+1)}u=d}}Be(t,i,s){if(this.zt===null)return;const{context:e,horizontalPixelRatio:h,verticalPixelRatio:r}=t;let l="";const o=this.Ve(h);for(let u=s.from;uf||e.fillRect(d,c,m-d+1,f-c+1)}}}class $e extends Ds{constructor(){super(...arguments),this.Ns=new Ae}te(t,i,s){return Object.assign(Object.assign({},this.pe(t,i,s)),s.Ws(t))}Ks(){const t=this.Is.W();this.Ns.J({Vn:this.Vs,ee:this.zs.St().ee(),De:t.wickVisible,_i:t.borderVisible,tt:this.Bs})}}class Fe{constructor(t,i){this.Le=t,this.zi=i}K(t,i,s){this.Le.draw(t,this.zi,i,s)}}class $t extends bi{constructor(t,i,s){super(t,i,!1),this.mn=s,this.Ns=new Fe(this.mn.renderer(),e=>{const h=t.Ct();return h===null?null:t.Dt().Rt(e,h.Ot)})}Ee(t){return this.mn.priceValueBuilder(t)}Ne(t){return this.mn.isWhitespace(t)}$s(){const t=this.Is.js();this.Vs=this.Is.Vn().Qs().map(i=>Object.assign(Object.assign({ot:i.ie,nt:NaN},t.Ws(i.ie)),{Fe:i.We}))}Xs(t,i){i.Zs(this.Vs,lt(this.Bs))}Ks(){this.mn.update({bars:this.Vs.map(He),barSpacing:this.zs.St().ee(),visibleRange:this.Bs},this.Is.W())}}function He(n){return{x:n.nt,time:n.ot,originalData:n.Fe,barColor:n.oe}}class je extends B{constructor(){super(...arguments),this.zt=null,this.je=[]}J(t){this.zt=t,this.je=[]}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:s}){if(this.zt===null||this.zt.it.length===0||this.zt.tt===null)return;this.je.length||this.He(i);const e=Math.max(1,Math.floor(s)),h=Math.round(this.zt.$e*s)-Math.floor(e/2),r=h+e;for(let l=this.zt.tt.from;ll.qe?l.ui=r.Rs-i-1:r.Rs=l.ui+i+1)}let e=Math.ceil(this.zt.ee*t);for(let h=this.zt.tt.from;h0&&e<4)for(let h=this.zt.tt.from;he&&(r.Ue>r.qe?r.ui-=1:r.Rs+=1)}}}class Ue extends Rt{constructor(){super(...arguments),this.Ns=new je}te(t,i,s){return Object.assign(Object.assign({},this.Js(t,i)),s.Ws(t))}Ks(){const t={it:this.Vs,ee:this.zs.St().ee(),tt:this.Bs,$e:this.Is.Dt().Rt(this.Is.W().base,b(this.Is.Ct()).Ot)};this.Ns.J(t)}}class Ze extends Rt{constructor(){super(...arguments),this.Ns=new Bs}te(t,i,s){return Object.assign(Object.assign({},this.Js(t,i)),s.Ws(t))}Ks(){const t=this.Is.W(),i={it:this.Vs,Nt:t.lineStyle,us:t.lineVisible?t.lineType:void 0,et:t.lineWidth,Ts:t.pointMarkersVisible?t.pointMarkersRadius||t.lineWidth/2+2:void 0,tt:this.Bs,_s:this.zs.St().ee()};this.Ns.J(i)}}const Ye=/[2-9]/g;class ot{constructor(t=50){this.Ye=0,this.Xe=1,this.Ke=1,this.Ze={},this.Ge=new Map,this.Je=t}Qe(){this.Ye=0,this.Ge.clear(),this.Xe=1,this.Ke=1,this.Ze={}}Mi(t,i,s){return this.tr(t,i,s).width}gi(t,i,s){const e=this.tr(t,i,s);return((e.actualBoundingBoxAscent||0)-(e.actualBoundingBoxDescent||0))/2}tr(t,i,s){const e=s||Ye,h=String(i).replace(e,"0");if(this.Ge.has(h))return O(this.Ge.get(h)).ir;if(this.Ye===this.Je){const l=this.Ze[this.Ke];delete this.Ze[this.Ke],this.Ge.delete(l),this.Ke++,this.Ye--}t.save(),t.textBaseline="middle";const r=t.measureText(h);return t.restore(),r.width===0&&i.length||(this.Ge.set(h,{ir:r,nr:this.Xe}),this.Ze[this.Xe]=h,this.Ye++,this.Xe++),r}}class Qe{constructor(t){this.sr=null,this.k=null,this.er="right",this.rr=t}hr(t,i,s){this.sr=t,this.k=i,this.er=s}K(t){this.k!==null&&this.sr!==null&&this.sr.K(t,this.k,this.rr,this.er)}}class Is{constructor(t,i,s){this.lr=t,this.rr=new ot(50),this.ar=i,this.F=s,this.j=-1,this.Wt=new Qe(this.rr)}gt(){const t=this.F._r(this.ar);if(t===null)return null;const i=t.ur(this.ar)?t.cr():this.ar.Dt();if(i===null)return null;const s=t.dr(i);if(s==="overlay")return null;const e=this.F.vr();return e.P!==this.j&&(this.j=e.P,this.rr.Qe()),this.Wt.hr(this.lr.Bi(),e,s),this.Wt}}class Xe extends B{constructor(){super(...arguments),this.zt=null}J(t){this.zt=t}pr(t,i){var s;if(!(!((s=this.zt)===null||s===void 0)&&s.yt))return null;const{st:e,et:h,mr:r}=this.zt;return i>=e-h-7&&i<=e+h+7?{br:this.zt,mr:r}:null}Z({context:t,bitmapSize:i,horizontalPixelRatio:s,verticalPixelRatio:e}){if(this.zt===null||this.zt.yt===!1)return;const h=Math.round(this.zt.st*e);h<0||h>i.height||(t.lineCap="butt",t.strokeStyle=this.zt.O,t.lineWidth=Math.floor(this.zt.et*s),j(t,this.zt.Nt),zs(t,h,0,i.width))}}class gi{constructor(t){this.wr={st:0,O:"rgba(0, 0, 0, 0)",et:1,Nt:0,yt:!1},this.gr=new Xe,this.ft=!0,this.Is=t,this.zs=t.$t(),this.gr.J(this.wr)}bt(){this.ft=!0}gt(){return this.Is.yt()?(this.ft&&(this.Mr(),this.ft=!1),this.gr):null}}class qe extends gi{constructor(t){super(t)}Mr(){this.wr.yt=!1;const t=this.Is.Dt(),i=t.Sr().Sr;if(i!==2&&i!==3)return;const s=this.Is.W();if(!s.baseLineVisible||!this.Is.yt())return;const e=this.Is.Ct();e!==null&&(this.wr.yt=!0,this.wr.st=t.Rt(e.Ot,e.Ot),this.wr.O=s.baseLineColor,this.wr.et=s.baseLineWidth,this.wr.Nt=s.baseLineStyle)}}class Je extends B{constructor(){super(...arguments),this.zt=null}J(t){this.zt=t}We(){return this.zt}Z({context:t,horizontalPixelRatio:i,verticalPixelRatio:s}){const e=this.zt;if(e===null)return;const h=Math.max(1,Math.floor(i)),r=h%2/2,l=Math.round(e.qe.x*i)+r,o=e.qe.y*s;t.fillStyle=e.kr,t.beginPath();const u=Math.max(2,1.5*e.yr)*i;t.arc(l,o,u,0,2*Math.PI,!1),t.fill(),t.fillStyle=e.Cr,t.beginPath(),t.arc(l,o,e.ht*i,0,2*Math.PI,!1),t.fill(),t.lineWidth=h,t.strokeStyle=e.Tr,t.beginPath(),t.arc(l,o,e.ht*i+h/2,0,2*Math.PI,!1),t.stroke()}}const Ke=[{Pr:0,Rr:.25,Dr:4,Or:10,Ar:.25,Vr:0,Br:.4,Ir:.8},{Pr:.25,Rr:.525,Dr:10,Or:14,Ar:0,Vr:0,Br:.8,Ir:0},{Pr:.525,Rr:1,Dr:14,Or:14,Ar:0,Vr:0,Br:0,Ir:0}];function Ai(n,t,i,s){return function(e,h){if(e==="transparent")return e;const r=zt(e),l=r[3];return`rgba(${r[0]}, ${r[1]}, ${r[2]}, ${h*l})`}(n,i+(s-i)*t)}function $i(n,t){const i=n%2600/2600;let s;for(const o of Ke)if(i>=o.Pr&&i<=o.Rr){s=o;break}A(s!==void 0,"Last price animation internal logic error");const e=(i-s.Pr)/(s.Rr-s.Pr);return{Cr:Ai(t,e,s.Ar,s.Vr),Tr:Ai(t,e,s.Br,s.Ir),ht:(h=e,r=s.Dr,l=s.Or,r+(l-r)*h)};var h,r,l}class Ge{constructor(t){this.Wt=new Je,this.ft=!0,this.zr=!0,this.Lr=performance.now(),this.Er=this.Lr-1,this.Nr=t}Fr(){this.Er=this.Lr-1,this.bt()}Wr(){if(this.bt(),this.Nr.W().lastPriceAnimation===2){const t=performance.now(),i=this.Er-t;if(i>0)return void(i<650&&(this.Er+=2600));this.Lr=t,this.Er=t+2600}}bt(){this.ft=!0}jr(){this.zr=!0}yt(){return this.Nr.W().lastPriceAnimation!==0}Hr(){switch(this.Nr.W().lastPriceAnimation){case 0:return!1;case 1:return!0;case 2:return performance.now()<=this.Er}}gt(){return this.ft?(this.Mt(),this.ft=!1,this.zr=!1):this.zr&&(this.$r(),this.zr=!1),this.Wt}Mt(){this.Wt.J(null);const t=this.Nr.$t().St(),i=t.qs(),s=this.Nr.Ct();if(i===null||s===null)return;const e=this.Nr.Ur(!0);if(e.qr||!i.Yr(e.ie))return;const h={x:t.It(e.ie),y:this.Nr.Dt().Rt(e._t,s.Ot)},r=e.O,l=this.Nr.W().lineWidth,o=$i(this.Xr(),r);this.Wt.J({kr:r,yr:l,Cr:o.Cr,Tr:o.Tr,ht:o.ht,qe:h})}$r(){const t=this.Wt.We();if(t!==null){const i=$i(this.Xr(),t.kr);t.Cr=i.Cr,t.Tr=i.Tr,t.ht=i.ht}}Xr(){return this.Hr()?performance.now()-this.Lr:2599}}function st(n,t){return Ns(Math.min(Math.max(n,12),30)*t)}function ut(n,t){switch(n){case"arrowDown":case"arrowUp":return st(t,1);case"circle":return st(t,.8);case"square":return st(t,.7)}}function Vs(n){return function(t){const i=Math.ceil(t);return i%2!=0?i-1:i}(st(n,1))}function Fi(n){return Math.max(st(n,.1),3)}function As(n,t,i,s,e){const h=ut("square",i),r=(h-1)/2,l=n-r,o=t-r;return s>=l&&s<=l+h&&e>=o&&e<=o+h}function Hi(n,t,i,s){const e=(ut("arrowUp",s)-1)/2*i.Kr,h=(Ns(s/2)-1)/2*i.Kr;t.beginPath(),n?(t.moveTo(i.nt-e,i.st),t.lineTo(i.nt,i.st-e),t.lineTo(i.nt+e,i.st),t.lineTo(i.nt+h,i.st),t.lineTo(i.nt+h,i.st+e),t.lineTo(i.nt-h,i.st+e),t.lineTo(i.nt-h,i.st)):(t.moveTo(i.nt-e,i.st),t.lineTo(i.nt,i.st+e),t.lineTo(i.nt+e,i.st),t.lineTo(i.nt+h,i.st),t.lineTo(i.nt+h,i.st-e),t.lineTo(i.nt-h,i.st-e),t.lineTo(i.nt-h,i.st)),t.fill()}function tn(n,t,i,s,e,h){return As(t,i,s,e,h)}class sn extends B{constructor(){super(...arguments),this.zt=null,this.rr=new ot,this.j=-1,this.H="",this.Zr=""}J(t){this.zt=t}hr(t,i){this.j===t&&this.H===i||(this.j=t,this.H=i,this.Zr=K(t,i),this.rr.Qe())}pr(t,i){if(this.zt===null||this.zt.tt===null)return null;for(let s=this.zt.tt.from;s=s&&l<=s+h&&o>=e-u&&o<=e+u}(n.Zt.nt,n.Zt.st,n.Zt.ji,n.Zt.Bt,t,i))||function(s,e,h){if(s.Ys===0)return!1;switch(s.Qr){case"arrowDown":case"arrowUp":return tn(0,s.nt,s.st,s.Ys,e,h);case"circle":return function(r,l,o,u,a){const c=2+ut("circle",o)/2,f=r-u,d=l-a;return Math.sqrt(f*f+d*d)<=c}(s.nt,s.st,s.Ys,e,h);case"square":return As(s.nt,s.st,s.Ys,e,h)}}(n,t,i)}function hn(n,t,i,s,e,h,r,l,o){const u=P(i)?i:i.ge,a=P(i)?i:i.be,c=P(i)?i:i.we,f=P(t.size)?Math.max(t.size,0):1,d=Vs(l.ee())*f,m=d/2;switch(n.Ys=d,t.position){case"inBar":return n.st=r.Rt(u,o),void(n.Zt!==void 0&&(n.Zt.st=n.st+m+h+.6*e));case"aboveBar":return n.st=r.Rt(a,o)-m-s.th,n.Zt!==void 0&&(n.Zt.st=n.st-m-.6*e,s.th+=1.2*e),void(s.th+=d+h);case"belowBar":return n.st=r.Rt(c,o)+m+s.ih,n.Zt!==void 0&&(n.Zt.st=n.st+m+h+.6*e,s.ih+=1.2*e),void(s.ih+=d+h)}t.position}class rn{constructor(t,i){this.ft=!0,this.nh=!0,this.sh=!0,this.eh=null,this.Wt=new sn,this.Nr=t,this.Hi=i,this.zt={it:[],tt:null}}bt(t){this.ft=!0,this.sh=!0,t==="data"&&(this.nh=!0)}gt(t){if(!this.Nr.yt())return null;this.ft&&this.rh();const i=this.Hi.W().layout;return this.Wt.hr(i.fontSize,i.fontFamily),this.Wt.J(this.zt),this.Wt}hh(){if(this.sh){if(this.Nr.lh().length>0){const t=this.Hi.St().ee(),i=Fi(t),s=1.5*Vs(t)+2*i;this.eh={above:s,below:s}}else this.eh=null;this.sh=!1}return this.eh}rh(){const t=this.Nr.Dt(),i=this.Hi.St(),s=this.Nr.lh();this.nh&&(this.zt.it=s.map(a=>({ot:a.time,nt:0,st:0,Ys:0,Qr:a.shape,O:a.color,Gr:a.Gr,mr:a.id,Zt:void 0})),this.nh=!1);const e=this.Hi.W().layout;this.zt.tt=null;const h=i.qs();if(h===null)return;const r=this.Nr.Ct();if(r===null||this.zt.it.length===0)return;let l=NaN;const o=Fi(i.ee()),u={th:o,ih:o};this.zt.tt=Ws(this.zt.it,h,!0);for(let a=this.zt.tt.from;a0&&(f.Zt={Jr:c.text,nt:0,st:0,ji:0,Bt:0});const d=this.Nr.ah(c.time);d!==null&&hn(f,c,d,u,e.fontSize,o,t,i,r.Ot)}this.ft=!1}}class ln extends gi{constructor(t){super(t)}Mr(){const t=this.wr;t.yt=!1;const i=this.Is.W();if(!i.priceLineVisible||!this.Is.yt())return;const s=this.Is.Ur(i.priceLineSource===0);s.qr||(t.yt=!0,t.st=s.Si,t.O=this.Is.oh(s.O),t.et=i.priceLineWidth,t.Nt=i.priceLineStyle)}}class on extends kt{constructor(t){super(),this.jt=t}Ii(t,i,s){t.yt=!1,i.yt=!1;const e=this.jt;if(!e.yt())return;const h=e.W(),r=h.lastValueVisible,l=e._h()!=="",o=h.seriesLastValueMode===0,u=e.Ur(!1);if(u.qr)return;r&&(t.Zt=this.uh(u,r,o),t.yt=t.Zt.length!==0),(l||o)&&(i.Zt=this.dh(u,r,l,o),i.yt=i.Zt.length>0);const a=e.oh(u.O),c=Et(a);s.t=c.t,s.Si=u.Si,i.At=e.$t().Vt(u.Si/e.Dt().Bt()),t.At=a,t.O=c.i,i.O=c.i}dh(t,i,s,e){let h="";const r=this.jt._h();return s&&r.length!==0&&(h+=`${r} `),i&&e&&(h+=this.jt.Dt().fh()?t.ph:t.mh),h.trim()}uh(t,i,s){return i?s?this.jt.Dt().fh()?t.mh:t.ph:t.Zt:""}}function ji(n,t,i,s){const e=Number.isFinite(t),h=Number.isFinite(i);return e&&h?n(t,i):e||h?e?t:i:s}class k{constructor(t,i){this.bh=t,this.wh=i}gh(t){return t!==null&&this.bh===t.bh&&this.wh===t.wh}Mh(){return new k(this.bh,this.wh)}xh(){return this.bh}Sh(){return this.wh}kh(){return this.wh-this.bh}Ei(){return this.wh===this.bh||Number.isNaN(this.wh)||Number.isNaN(this.bh)}Jn(t){return t===null?this:new k(ji(Math.min,this.xh(),t.xh(),-1/0),ji(Math.max,this.Sh(),t.Sh(),1/0))}yh(t){if(!P(t)||this.wh-this.bh===0)return;const i=.5*(this.wh+this.bh);let s=this.wh-i,e=this.bh-i;s*=t,e*=t,this.wh=i+s,this.bh=i+e}Ch(t){P(t)&&(this.wh+=t,this.bh+=t)}Th(){return{minValue:this.bh,maxValue:this.wh}}static Ph(t){return t===null?null:new k(t.minValue,t.maxValue)}}class xt{constructor(t,i){this.Rh=t,this.Dh=i||null}Oh(){return this.Rh}Ah(){return this.Dh}Th(){return this.Rh===null?null:{priceRange:this.Rh.Th(),margins:this.Dh||void 0}}static Ph(t){return t===null?null:new xt(k.Ph(t.priceRange),t.margins)}}class un extends gi{constructor(t,i){super(t),this.Vh=i}Mr(){const t=this.wr;t.yt=!1;const i=this.Vh.W();if(!this.Is.yt()||!i.lineVisible)return;const s=this.Vh.Bh();s!==null&&(t.yt=!0,t.st=s,t.O=i.color,t.et=i.lineWidth,t.Nt=i.lineStyle,t.mr=this.Vh.W().id)}}class an extends kt{constructor(t,i){super(),this.Nr=t,this.Vh=i}Ii(t,i,s){t.yt=!1,i.yt=!1;const e=this.Vh.W(),h=e.axisLabelVisible,r=e.title!=="",l=this.Nr;if(!h||!l.yt())return;const o=this.Vh.Bh();if(o===null)return;r&&(i.Zt=e.title,i.yt=!0),i.At=l.$t().Vt(o/l.Dt().Bt()),t.Zt=this.Ih(e.price),t.yt=!0;const u=Et(e.axisLabelColor||e.color);s.t=u.t;const a=e.axisLabelTextColor||u.i;t.O=a,i.O=a,s.Si=o}Ih(t){const i=this.Nr.Ct();return i===null?"":this.Nr.Dt().Ni(t,i.Ot)}}class cn{constructor(t,i){this.Nr=t,this._n=i,this.zh=new un(t,this),this.lr=new an(t,this),this.Lh=new Is(this.lr,t,t.$t())}Eh(t){R(this._n,t),this.bt(),this.Nr.$t().Nh()}W(){return this._n}Fh(){return this.zh}Wh(){return this.Lh}jh(){return this.lr}bt(){this.zh.bt(),this.lr.bt()}Bh(){const t=this.Nr,i=t.Dt();if(t.$t().St().Ei()||i.Ei())return null;const s=t.Ct();return s===null?null:i.Rt(this._n.price,s.Ot)}}class fn extends mi{constructor(t){super(),this.Hi=t}$t(){return this.Hi}}const dn={Bar:(n,t,i,s)=>{var e;const h=t.upColor,r=t.downColor,l=b(n(i,s)),o=X(l.Ot[0])<=X(l.Ot[3]);return{oe:(e=l.O)!==null&&e!==void 0?e:o?h:r}},Candlestick:(n,t,i,s)=>{var e,h,r;const l=t.upColor,o=t.downColor,u=t.borderUpColor,a=t.borderDownColor,c=t.wickUpColor,f=t.wickDownColor,d=b(n(i,s)),m=X(d.Ot[0])<=X(d.Ot[3]);return{oe:(e=d.O)!==null&&e!==void 0?e:m?l:o,ze:(h=d.At)!==null&&h!==void 0?h:m?u:a,Ie:(r=d.Hh)!==null&&r!==void 0?r:m?c:f}},Custom:(n,t,i,s)=>{var e;return{oe:(e=b(n(i,s)).O)!==null&&e!==void 0?e:t.color}},Area:(n,t,i,s)=>{var e,h,r,l;const o=b(n(i,s));return{oe:(e=o.lt)!==null&&e!==void 0?e:t.lineColor,lt:(h=o.lt)!==null&&h!==void 0?h:t.lineColor,ys:(r=o.ys)!==null&&r!==void 0?r:t.topColor,Cs:(l=o.Cs)!==null&&l!==void 0?l:t.bottomColor}},Baseline:(n,t,i,s)=>{var e,h,r,l,o,u;const a=b(n(i,s));return{oe:a.Ot[3]>=t.baseValue.price?t.topLineColor:t.bottomLineColor,Ce:(e=a.Ce)!==null&&e!==void 0?e:t.topLineColor,Te:(h=a.Te)!==null&&h!==void 0?h:t.bottomLineColor,Me:(r=a.Me)!==null&&r!==void 0?r:t.topFillColor1,xe:(l=a.xe)!==null&&l!==void 0?l:t.topFillColor2,Se:(o=a.Se)!==null&&o!==void 0?o:t.bottomFillColor1,ke:(u=a.ke)!==null&&u!==void 0?u:t.bottomFillColor2}},Line:(n,t,i,s)=>{var e,h;const r=b(n(i,s));return{oe:(e=r.O)!==null&&e!==void 0?e:t.color,lt:(h=r.O)!==null&&h!==void 0?h:t.color}},Histogram:(n,t,i,s)=>{var e;return{oe:(e=b(n(i,s)).O)!==null&&e!==void 0?e:t.color}}};class mn{constructor(t){this.$h=(i,s)=>s!==void 0?s.Ot:this.Nr.Vn().Uh(i),this.Nr=t,this.qh=dn[t.Yh()]}Ws(t,i){return this.qh(this.$h,this.Nr.W(),t,i)}}var Ui;(function(n){n[n.NearestLeft=-1]="NearestLeft",n[n.None=0]="None",n[n.NearestRight=1]="NearestRight"})(Ui||(Ui={}));const V=30;class pn{constructor(){this.Xh=[],this.Kh=new Map,this.Zh=new Map}Gh(){return this.Ys()>0?this.Xh[this.Xh.length-1]:null}Jh(){return this.Ys()>0?this.Qh(0):null}An(){return this.Ys()>0?this.Qh(this.Xh.length-1):null}Ys(){return this.Xh.length}Ei(){return this.Ys()===0}Yr(t){return this.tl(t,0)!==null}Uh(t){return this.il(t)}il(t,i=0){const s=this.tl(t,i);return s===null?null:Object.assign(Object.assign({},this.nl(s)),{ie:this.Qh(s)})}Qs(){return this.Xh}sl(t,i,s){if(this.Ei())return null;let e=null;for(const h of s)e=pt(e,this.el(t,i,h));return e}J(t){this.Zh.clear(),this.Kh.clear(),this.Xh=t}Qh(t){return this.Xh[t].ie}nl(t){return this.Xh[t]}tl(t,i){const s=this.rl(t);if(s===null&&i!==0)switch(i){case-1:return this.hl(t);case 1:return this.ll(t);default:throw new TypeError("Unknown search mode")}return s}hl(t){let i=this.al(t);return i>0&&(i-=1),i!==this.Xh.length&&this.Qh(i)i.iei.ie>s)}_l(t,i,s){let e=null;for(let h=t;he.cl&&(e.cl=r)))}return e}el(t,i,s){if(this.Ei())return null;let e=null;const h=b(this.Jh()),r=b(this.An()),l=Math.max(t,h),o=Math.min(i,r),u=Math.ceil(l/V)*V,a=Math.max(u,Math.floor(o/V)*V);{const f=this.al(l),d=this.ol(Math.min(o,u,i));e=pt(e,this._l(f,d,s))}let c=this.Kh.get(s);c===void 0&&(c=new Map,this.Kh.set(s,c));for(let f=Math.max(u+1,l);fnew Ft(l));return this.gl={vl:h,pl:r},r}Ji(){var t,i,s,e;const h=(s=(i=(t=this.yl).timeAxisViews)===null||i===void 0?void 0:i.call(t))!==null&&s!==void 0?s:[];if(((e=this.Ml)===null||e===void 0?void 0:e.vl)===h)return this.Ml.pl;const r=this.Nr.$t().St(),l=h.map(o=>new gn(o,r));return this.Ml={vl:h,pl:l},l}Tn(){var t,i,s,e;const h=(s=(i=(t=this.yl).priceAxisViews)===null||i===void 0?void 0:i.call(t))!==null&&s!==void 0?s:[];if(((e=this.xl)===null||e===void 0?void 0:e.vl)===h)return this.xl.pl;const r=this.Nr.Dt(),l=h.map(o=>new vn(o,r));return this.xl={vl:h,pl:l},l}Tl(){var t,i,s,e;const h=(s=(i=(t=this.yl).priceAxisPaneViews)===null||i===void 0?void 0:i.call(t))!==null&&s!==void 0?s:[];if(((e=this.Sl)===null||e===void 0?void 0:e.vl)===h)return this.Sl.pl;const r=h.map(l=>new Ft(l));return this.Sl={vl:h,pl:r},r}Pl(){var t,i,s,e;const h=(s=(i=(t=this.yl).timeAxisPaneViews)===null||i===void 0?void 0:i.call(t))!==null&&s!==void 0?s:[];if(((e=this.kl)===null||e===void 0?void 0:e.vl)===h)return this.kl.pl;const r=h.map(l=>new Ft(l));return this.kl={vl:h,pl:r},r}Rl(t,i){var s,e,h;return(h=(e=(s=this.yl).autoscaleInfo)===null||e===void 0?void 0:e.call(s,t,i))!==null&&h!==void 0?h:null}pr(t,i){var s,e,h;return(h=(e=(s=this.yl).hitTest)===null||e===void 0?void 0:e.call(s,t,i))!==null&&h!==void 0?h:null}}function Ht(n,t,i,s){n.forEach(e=>{t(e).forEach(h=>{h.ml()===i&&s.push(h)})})}function jt(n){return n.Cn()}function _n(n){return n.Tl()}function Sn(n){return n.Pl()}class vi extends fn{constructor(t,i,s,e,h){super(t),this.zt=new pn,this.zh=new ln(this),this.Dl=[],this.Ol=new qe(this),this.Al=null,this.Vl=null,this.Bl=[],this.Il=[],this.zl=null,this.Ll=[],this._n=i,this.El=s;const r=new on(this);this.en=[r],this.Lh=new Is(r,this,t),s!=="Area"&&s!=="Line"&&s!=="Baseline"||(this.Al=new Ge(this)),this.Nl(),this.Fl(h)}S(){this.zl!==null&&clearTimeout(this.zl)}oh(t){return this._n.priceLineColor||t}Ur(t){const i={qr:!0},s=this.Dt();if(this.$t().St().Ei()||s.Ei()||this.zt.Ei())return i;const e=this.$t().St().qs(),h=this.Ct();if(e===null||h===null)return i;let r,l;if(t){const c=this.zt.Gh();if(c===null)return i;r=c,l=c.ie}else{const c=this.zt.il(e.ui(),-1);if(c===null||(r=this.zt.Uh(c.ie),r===null))return i;l=c.ie}const o=r.Ot[3],u=this.js().Ws(l,{Ot:r}),a=s.Rt(o,h.Ot);return{qr:!1,_t:o,Zt:s.Ni(o,h.Ot),ph:s.Wl(o),mh:s.jl(o,h.Ot),O:u.oe,Si:a,ie:l}}js(){return this.Vl!==null||(this.Vl=new mn(this)),this.Vl}W(){return this._n}Eh(t){const i=t.priceScaleId;i!==void 0&&i!==this._n.priceScaleId&&this.$t().Hl(this,i),R(this._n,t),t.priceFormat!==void 0&&(this.Nl(),this.$t().$l()),this.$t().Ul(this),this.$t().ql(),this.mn.bt("options")}J(t,i){this.zt.J(t),this.Yl(),this.mn.bt("data"),this.un.bt("data"),this.Al!==null&&(i&&i.Xl?this.Al.Wr():t.length===0&&this.Al.Fr());const s=this.$t()._r(this);this.$t().Kl(s),this.$t().Ul(this),this.$t().ql(),this.$t().Nh()}Zl(t){this.Bl=t,this.Yl();const i=this.$t()._r(this);this.un.bt("data"),this.$t().Kl(i),this.$t().Ul(this),this.$t().ql(),this.$t().Nh()}Gl(){return this.Bl}lh(){return this.Il}Jl(t){const i=new cn(this,t);return this.Dl.push(i),this.$t().Ul(this),i}Ql(t){const i=this.Dl.indexOf(t);i!==-1&&this.Dl.splice(i,1),this.$t().Ul(this)}Yh(){return this.El}Ct(){const t=this.ta();return t===null?null:{Ot:t.Ot[3],ia:t.ot}}ta(){const t=this.$t().St().qs();if(t===null)return null;const i=t.Rs();return this.zt.il(i,1)}Vn(){return this.zt}ah(t){const i=this.zt.Uh(t);return i===null?null:this.El==="Bar"||this.El==="Candlestick"||this.El==="Custom"?{me:i.Ot[0],be:i.Ot[1],we:i.Ot[2],ge:i.Ot[3]}:i.Ot[3]}na(t){const i=[];Ht(this.Ll,jt,"top",i);const s=this.Al;return s!==null&&s.yt()&&(this.zl===null&&s.Hr()&&(this.zl=setTimeout(()=>{this.zl=null,this.$t().sa()},0)),s.jr(),i.push(s)),i}Cn(){const t=[];this.ea()||t.push(this.Ol),t.push(this.mn,this.zh,this.un);const i=this.Dl.map(s=>s.Fh());return t.push(...i),Ht(this.Ll,jt,"normal",t),t}ra(){return this.ha(jt,"bottom")}la(t){return this.ha(_n,t)}aa(t){return this.ha(Sn,t)}oa(t,i){return this.Ll.map(s=>s.pr(t,i)).filter(s=>s!==null)}Gi(t){return[this.Lh,...this.Dl.map(i=>i.Wh())]}Tn(t,i){if(i!==this.qi&&!this.ea())return[];const s=[...this.en];for(const e of this.Dl)s.push(e.jh());return this.Ll.forEach(e=>{s.push(...e.Tn())}),s}Ji(){const t=[];return this.Ll.forEach(i=>{t.push(...i.Ji())}),t}Rl(t,i){if(this._n.autoscaleInfoProvider!==void 0){const s=this._n.autoscaleInfoProvider(()=>{const e=this._a(t,i);return e===null?null:e.Th()});return xt.Ph(s)}return this._a(t,i)}ua(){return this._n.priceFormat.minMove}ca(){return this.da}Rn(){var t;this.mn.bt(),this.un.bt();for(const i of this.en)i.bt();for(const i of this.Dl)i.bt();this.zh.bt(),this.Ol.bt(),(t=this.Al)===null||t===void 0||t.bt(),this.Ll.forEach(i=>i.Rn())}Dt(){return b(super.Dt())}kt(t){if(!((this.El==="Line"||this.El==="Area"||this.El==="Baseline")&&this._n.crosshairMarkerVisible))return null;const i=this.zt.Uh(t);return i===null?null:{_t:i.Ot[3],ht:this.fa(),At:this.va(),Pt:this.pa(),Tt:this.ma(t)}}_h(){return this._n.title}yt(){return this._n.visible}ba(t){this.Ll.push(new wn(t,this))}wa(t){this.Ll=this.Ll.filter(i=>i.Cl()!==t)}ga(){if(this.mn instanceof $t)return t=>this.mn.Ee(t)}Ma(){if(this.mn instanceof $t)return t=>this.mn.Ne(t)}ea(){return!Tt(this.Dt().xa())}_a(t,i){if(!rt(t)||!rt(i)||this.zt.Ei())return null;const s=this.El==="Line"||this.El==="Area"||this.El==="Baseline"||this.El==="Histogram"?[3]:[2,1],e=this.zt.sl(t,i,s);let h=e!==null?new k(e.ul,e.cl):null;if(this.Yh()==="Histogram"){const l=this._n.base,o=new k(l,l);h=h!==null?h.Jn(o):o}let r=this.un.hh();return this.Ll.forEach(l=>{const o=l.Rl(t,i);if(o!=null&&o.priceRange){const d=new k(o.priceRange.minValue,o.priceRange.maxValue);h=h!==null?h.Jn(d):d}var u,a,c,f;o!=null&&o.margins&&(u=r,a=o.margins,r={above:Math.max((c=u==null?void 0:u.above)!==null&&c!==void 0?c:0,a.above),below:Math.max((f=u==null?void 0:u.below)!==null&&f!==void 0?f:0,a.below)})}),new xt(h,r)}fa(){switch(this.El){case"Line":case"Area":case"Baseline":return this._n.crosshairMarkerRadius}return 0}va(){switch(this.El){case"Line":case"Area":case"Baseline":{const t=this._n.crosshairMarkerBorderColor;if(t.length!==0)return t}}return null}pa(){switch(this.El){case"Line":case"Area":case"Baseline":return this._n.crosshairMarkerBorderWidth}return 0}ma(t){switch(this.El){case"Line":case"Area":case"Baseline":{const i=this._n.crosshairMarkerBackgroundColor;if(i.length!==0)return i}}return this.js().Ws(t).oe}Nl(){switch(this._n.priceFormat.type){case"custom":this.da={format:this._n.priceFormat.formatter};break;case"volume":this.da=new Ee(this._n.priceFormat.precision);break;case"percent":this.da=new Os(this._n.priceFormat.precision);break;default:{const t=Math.pow(10,this._n.priceFormat.precision);this.da=new Nt(t,this._n.priceFormat.minMove*t)}}this.qi!==null&&this.qi.Sa()}Yl(){const t=this.$t().St();if(!t.ka()||this.zt.Ei())return void(this.Il=[]);const i=b(this.zt.Jh());this.Il=this.Bl.map((s,e)=>{const h=b(t.ya(s.time,!0)),r=ha instanceof vi).reduce((a,c)=>{if(s.ur(c)||!c.yt())return a;const f=c.Dt(),d=c.Vn();if(f.Ei()||!d.Yr(i))return a;const m=d.Uh(i);if(m===null)return a;const p=X(c.Ct());return a.concat([f.Rt(m.Ot[3],p.Ot)])},[]);if(o.length===0)return e;o.sort((a,c)=>Math.abs(a-l)-Math.abs(c-l));const u=o[0];return e=h.fn(u,r),e}}class Mn extends B{constructor(){super(...arguments),this.zt=null}J(t){this.zt=t}Z({context:t,bitmapSize:i,horizontalPixelRatio:s,verticalPixelRatio:e}){if(this.zt===null)return;const h=Math.max(1,Math.floor(s));t.lineWidth=h,function(r,l){r.save(),r.lineWidth%2&&r.translate(.5,.5),l(),r.restore()}(t,()=>{const r=b(this.zt);if(r.Pa){t.strokeStyle=r.Ra,j(t,r.Da),t.beginPath();for(const l of r.Oa){const o=Math.round(l.Aa*s);t.moveTo(o,-h),t.lineTo(o,i.height+h)}t.stroke()}if(r.Va){t.strokeStyle=r.Ba,j(t,r.Ia),t.beginPath();for(const l of r.za){const o=Math.round(l.Aa*e);t.moveTo(-h,o),t.lineTo(i.width+h,o)}t.stroke()}})}}class zn{constructor(t){this.Wt=new Mn,this.ft=!0,this.Qi=t}bt(){this.ft=!0}gt(){if(this.ft){const t=this.Qi.$t().W().grid,i={Va:t.horzLines.visible,Pa:t.vertLines.visible,Ba:t.horzLines.color,Ra:t.vertLines.color,Ia:t.horzLines.style,Da:t.vertLines.style,za:this.Qi.dn().La(),Oa:(this.Qi.$t().St().La()||[]).map(s=>({Aa:s.coord}))};this.Wt.J(i),this.ft=!1}return this.Wt}}class xn{constructor(t){this.mn=new zn(t)}Fh(){return this.mn}}const Ut={Ea:4,Na:1e-4};function q(n,t){const i=100*(n-t)/t;return t<0?-i:i}function Cn(n,t){const i=q(n.xh(),t),s=q(n.Sh(),t);return new k(i,s)}function et(n,t){const i=100*(n-t)/t+100;return t<0?-i:i}function En(n,t){const i=et(n.xh(),t),s=et(n.Sh(),t);return new k(i,s)}function Ct(n,t){const i=Math.abs(n);if(i<1e-15)return 0;const s=Math.log10(i+t.Na)+t.Ea;return n<0?-s:s}function nt(n,t){const i=Math.abs(n);if(i<1e-15)return 0;const s=Math.pow(10,i-t.Ea)-t.Na;return n<0?-s:s}function it(n,t){if(n===null)return null;const i=Ct(n.xh(),t),s=Ct(n.Sh(),t);return new k(i,s)}function bt(n,t){if(n===null)return null;const i=nt(n.xh(),t),s=nt(n.Sh(),t);return new k(i,s)}function Zt(n){if(n===null)return Ut;const t=Math.abs(n.Sh()-n.xh());if(t>=1||t<1e-15)return Ut;const i=Math.ceil(Math.abs(Math.log10(t))),s=Ut.Ea+i;return{Ea:s,Na:1/Math.pow(10,s)}}class Yt{constructor(t,i){if(this.Fa=t,this.Wa=i,function(s){if(s<0)return!1;for(let e=s;e>1;e/=10)if(e%10!=0)return!1;return!0}(this.Fa))this.ja=[2,2.5,2];else{this.ja=[];for(let s=this.Fa;s!==1;){if(s%2==0)this.ja.push(2),s/=2;else{if(s%5!=0)throw new Error("unexpected base");this.ja.push(2,2.5),s/=5}if(this.ja.length>100)throw new Error("something wrong with base")}}}Ha(t,i,s){const e=this.Fa===0?0:1/this.Fa;let h=Math.pow(10,Math.max(0,Math.ceil(Math.log10(t-i)))),r=0,l=this.Wa[0];for(;;){const c=mt(h,e,1e-14)&&h>e+1e-14,f=mt(h,s*l,1e-14),d=mt(h,1,1e-14);if(!(c&&f&&d))break;h/=l,l=this.Wa[++r%this.Wa.length]}if(h<=e+1e-14&&(h=e),h=Math.max(1,h),this.ja.length>0&&(o=h,u=1,a=1e-14,Math.abs(o-u)e+1e-14;)h/=l,l=this.ja[++r%this.ja.length];var o,u,a;return h}}class Zi{constructor(t,i,s,e){this.$a=[],this.zi=t,this.Fa=i,this.Ua=s,this.qa=e}Ha(t,i){if(t=a?1:-1;let m=null,p=0;for(let g=u-f;g>a;g-=c){const v=this.qa(g,i,!0);m!==null&&Math.abs(v-m)o||(pb(t.Xi())-b(i.Xi()))}var Yi;(function(n){n[n.Normal=0]="Normal",n[n.Logarithmic=1]="Logarithmic",n[n.Percentage=2]="Percentage",n[n.IndexedTo100=3]="IndexedTo100"})(Yi||(Yi={}));const Qi=new Os,Xi=new Nt(100,1);class On{constructor(t,i,s,e){this.Qa=0,this.io=null,this.Rh=null,this.no=null,this.so={eo:!1,ro:null},this.ho=0,this.lo=0,this.ao=new M,this.oo=new M,this._o=[],this.uo=null,this.co=null,this.do=null,this.fo=null,this.da=Xi,this.vo=Zt(null),this.po=t,this._n=i,this.mo=s,this.bo=e,this.wo=new Zi(this,100,this.Mo.bind(this),this.xo.bind(this))}xa(){return this.po}W(){return this._n}Eh(t){if(R(this._n,t),this.Sa(),t.mode!==void 0&&this.So({Sr:t.mode}),t.scaleMargins!==void 0){const i=O(t.scaleMargins.top),s=O(t.scaleMargins.bottom);if(i<0||i>1)throw new Error(`Invalid top margin - expect value between 0 and 1, given=${i}`);if(s<0||s>1)throw new Error(`Invalid bottom margin - expect value between 0 and 1, given=${s}`);if(i+s>1)throw new Error(`Invalid margins - sum of margins must be less than 1, given=${i+s}`);this.ko(),this.co=null}}yo(){return this._n.autoScale}Ja(){return this._n.mode===1}fh(){return this._n.mode===2}Co(){return this._n.mode===3}Sr(){return{Nn:this._n.autoScale,To:this._n.invertScale,Sr:this._n.mode}}So(t){const i=this.Sr();let s=null;t.Nn!==void 0&&(this._n.autoScale=t.Nn),t.Sr!==void 0&&(this._n.mode=t.Sr,t.Sr!==2&&t.Sr!==3||(this._n.autoScale=!0),this.so.eo=!1),i.Sr===1&&t.Sr!==i.Sr&&(function(h,r){if(h===null)return!1;const l=nt(h.xh(),r),o=nt(h.Sh(),r);return isFinite(l)&&isFinite(o)}(this.Rh,this.vo)?(s=bt(this.Rh,this.vo),s!==null&&this.Po(s)):this._n.autoScale=!0),t.Sr===1&&t.Sr!==i.Sr&&(s=it(this.Rh,this.vo),s!==null&&this.Po(s));const e=i.Sr!==this._n.mode;e&&(i.Sr===2||this.fh())&&this.Sa(),e&&(i.Sr===3||this.Co())&&this.Sa(),t.To!==void 0&&i.To!==t.To&&(this._n.invertScale=t.To,this.Ro()),this.oo.m(i,this.Sr())}Do(){return this.oo}P(){return this.mo.fontSize}Bt(){return this.Qa}Oo(t){this.Qa!==t&&(this.Qa=t,this.ko(),this.co=null)}Ao(){if(this.io)return this.io;const t=this.Bt()-this.Vo()-this.Bo();return this.io=t,t}Oh(){return this.Io(),this.Rh}Po(t,i){const s=this.Rh;(i||s===null&&t!==null||s!==null&&!s.gh(t))&&(this.co=null,this.Rh=t)}Ei(){return this.Io(),this.Qa===0||!this.Rh||this.Rh.Ei()}zo(t){return this.To()?t:this.Bt()-1-t}Rt(t,i){return this.fh()?t=q(t,i):this.Co()&&(t=et(t,i)),this.xo(t,i)}Gs(t,i,s){this.Io();const e=this.Bo(),h=b(this.Oh()),r=h.xh(),l=h.Sh(),o=this.Ao()-1,u=this.To(),a=o/(l-r),c=s===void 0?0:s.from,f=s===void 0?t.length:s.to,d=this.Lo();for(let m=c;mt.Rn())}Sa(){this.co=null;const t=this.Jo();let i=100;t!==null&&(i=Math.round(1/t.ua())),this.da=Xi,this.fh()?(this.da=Qi,i=100):this.Co()?(this.da=new Nt(100,1),i=100):t!==null&&(this.da=t.ca()),this.wo=new Zi(this,i,this.Mo.bind(this),this.xo.bind(this)),this.wo.Xa()}Wo(){this.uo=null}Jo(){return this._o[0]||null}Vo(){return this.To()?this._n.scaleMargins.bottom*this.Bt()+this.lo:this._n.scaleMargins.top*this.Bt()+this.ho}Bo(){return this.To()?this._n.scaleMargins.top*this.Bt()+this.ho:this._n.scaleMargins.bottom*this.Bt()+this.lo}Io(){this.so.eo||(this.so.eo=!0,this.i_())}ko(){this.io=null}xo(t,i){if(this.Io(),this.Ei())return 0;t=this.Ja()&&t?Ct(t,this.vo):t;const s=b(this.Oh()),e=this.Bo()+(this.Ao()-1)*(t-s.xh())/s.kh();return this.zo(e)}Mo(t,i){if(this.Io(),this.Ei())return 0;const s=this.zo(t),e=b(this.Oh()),h=e.xh()+e.kh()*((s-this.Bo())/(this.Ao()-1));return this.Ja()?nt(h,this.vo):h}Ro(){this.co=null,this.wo.Xa()}i_(){const t=this.so.ro;if(t===null)return;let i=null;const s=this.Qo();let e=0,h=0;for(const o of s){if(!o.yt())continue;const u=o.Ct();if(u===null)continue;const a=o.Rl(t.Rs(),t.ui());let c=a&&a.Oh();if(c!==null){switch(this._n.mode){case 1:c=it(c,this.vo);break;case 2:c=Cn(c,u.Ot);break;case 3:c=En(c,u.Ot)}if(i=i===null?c:i.Jn(b(c)),a!==null){const f=a.Ah();f!==null&&(e=Math.max(e,f.above),h=Math.max(e,f.below))}}}if(e===this.ho&&h===this.lo||(this.ho=e,this.lo=h,this.co=null,this.ko()),i!==null){if(i.xh()===i.Sh()){const o=this.Jo(),u=5*(o===null||this.fh()||this.Co()?1:o.ua());this.Ja()&&(i=bt(i,this.vo)),i=new k(i.xh()-u,i.Sh()+u),this.Ja()&&(i=it(i,this.vo))}if(this.Ja()){const o=bt(i,this.vo),u=Zt(o);if(r=u,l=this.vo,r.Ea!==l.Ea||r.Na!==l.Na){const a=this.no!==null?bt(this.no,this.vo):null;this.vo=u,i=it(o,u),a!==null&&(this.no=it(a,u))}}this.Po(i)}else this.Rh===null&&(this.Po(new k(-.5,.5)),this.vo=Zt(null));var r,l;this.so.eo=!0}Lo(){return this.fh()?q:this.Co()?et:this.Ja()?t=>Ct(t,this.vo):null}n_(t,i,s){return i===void 0?(s===void 0&&(s=this.ca()),s.format(t)):i(t)}Ih(t,i){return this.n_(t,this.bo.priceFormatter,i)}Go(t,i){return this.n_(t,this.bo.percentageFormatter,i)}}class kn{constructor(t,i){this._o=[],this.s_=new Map,this.Qa=0,this.e_=0,this.r_=1e3,this.uo=null,this.h_=new M,this.wl=t,this.Hi=i,this.l_=new xn(this);const s=i.W();this.a_=this.o_("left",s.leftPriceScale),this.__=this.o_("right",s.rightPriceScale),this.a_.Do().l(this.u_.bind(this,this.a_),this),this.__.Do().l(this.u_.bind(this,this.__),this),this.c_(s)}c_(t){if(t.leftPriceScale&&this.a_.Eh(t.leftPriceScale),t.rightPriceScale&&this.__.Eh(t.rightPriceScale),t.localization&&(this.a_.Sa(),this.__.Sa()),t.overlayPriceScales){const i=Array.from(this.s_.values());for(const s of i){const e=b(s[0].Dt());e.Eh(t.overlayPriceScales),t.localization&&e.Sa()}}}d_(t){switch(t){case"left":return this.a_;case"right":return this.__}return this.s_.has(t)?O(this.s_.get(t))[0].Dt():null}S(){this.$t().f_().p(this),this.a_.Do().p(this),this.__.Do().p(this),this._o.forEach(t=>{t.S&&t.S()}),this.h_.m()}v_(){return this.r_}p_(t){this.r_=t}$t(){return this.Hi}ji(){return this.e_}Bt(){return this.Qa}m_(t){this.e_=t,this.b_()}Oo(t){this.Qa=t,this.a_.Oo(t),this.__.Oo(t),this._o.forEach(i=>{if(this.ur(i)){const s=i.Dt();s!==null&&s.Oo(t)}}),this.b_()}Ta(){return this._o}ur(t){const i=t.Dt();return i===null||this.a_!==i&&this.__!==i}Fo(t,i,s){const e=s!==void 0?s:this.g_().w_+1;this.M_(t,i,e)}jo(t){const i=this._o.indexOf(t);A(i!==-1,"removeDataSource: invalid data source"),this._o.splice(i,1);const s=b(t.Dt()).xa();if(this.s_.has(s)){const h=O(this.s_.get(s)),r=h.indexOf(t);r!==-1&&(h.splice(r,1),h.length===0&&this.s_.delete(s))}const e=t.Dt();e&&e.Ta().indexOf(t)>=0&&e.jo(t),e!==null&&(e.Wo(),this.x_(e)),this.uo=null}dr(t){return t===this.a_?"left":t===this.__?"right":"overlay"}S_(){return this.a_}k_(){return this.__}y_(t,i){t.Uo(i)}C_(t,i){t.qo(i),this.b_()}T_(t){t.Yo()}P_(t,i){t.Xo(i)}R_(t,i){t.Ko(i),this.b_()}D_(t){t.Zo()}b_(){this._o.forEach(t=>{t.Rn()})}dn(){let t=null;return this.Hi.W().rightPriceScale.visible&&this.__.Ta().length!==0?t=this.__:this.Hi.W().leftPriceScale.visible&&this.a_.Ta().length!==0?t=this.a_:this._o.length!==0&&(t=this._o[0].Dt()),t===null&&(t=this.__),t}cr(){let t=null;return this.Hi.W().rightPriceScale.visible?t=this.__:this.Hi.W().leftPriceScale.visible&&(t=this.a_),t}x_(t){t!==null&&t.yo()&&this.O_(t)}A_(t){const i=this.wl.qs();t.So({Nn:!0}),i!==null&&t.t_(i),this.b_()}V_(){this.O_(this.a_),this.O_(this.__)}B_(){this.x_(this.a_),this.x_(this.__),this._o.forEach(t=>{this.ur(t)&&this.x_(t.Dt())}),this.b_(),this.Hi.Nh()}No(){return this.uo===null&&(this.uo=Fs(this._o)),this.uo}I_(){return this.h_}z_(){return this.l_}O_(t){const i=t.Qo();if(i&&i.length>0&&!this.wl.Ei()){const s=this.wl.qs();s!==null&&t.t_(s)}t.Rn()}g_(){const t=this.No();if(t.length===0)return{L_:0,w_:0};let i=0,s=0;for(let e=0;es&&(s=h))}return{L_:i,w_:s}}M_(t,i,s){let e=this.d_(i);if(e===null&&(e=this.o_(i,this.Hi.W().overlayPriceScales)),this._o.push(t),!Tt(i)){const h=this.s_.get(i)||[];h.push(t),this.s_.set(i,h)}e.Fo(t),t.Zi(e),t.Ki(s),this.x_(e),this.uo=null}u_(t,i,s){i.Sr!==s.Sr&&this.O_(t)}o_(t,i){const s=Object.assign({visible:!0,autoScale:!0},W(i)),e=new On(t,s,this.Hi.W().layout,this.Hi.W().localization);return e.Oo(this.Bt()),e}}class Tn{constructor(t,i,s=50){this.Ye=0,this.Xe=1,this.Ke=1,this.Ge=new Map,this.Ze=new Map,this.E_=t,this.N_=i,this.Je=s}F_(t){const i=t.time,s=this.N_.cacheKey(i),e=this.Ge.get(s);if(e!==void 0)return e.W_;if(this.Ye===this.Je){const r=this.Ze.get(this.Ke);this.Ze.delete(this.Ke),this.Ge.delete(O(r)),this.Ke++,this.Ye--}const h=this.E_(t);return this.Ge.set(s,{W_:h,nr:this.Xe}),this.Ze.set(this.Xe,s),this.Ye++,this.Xe++,h}}class ht{constructor(t,i){A(t<=i,"right should be >= left"),this.j_=t,this.H_=i}Rs(){return this.j_}ui(){return this.H_}U_(){return this.H_-this.j_+1}Yr(t){return this.j_<=t&&t<=this.H_}gh(t){return this.j_===t.Rs()&&this.H_===t.ui()}}function qi(n,t){return n===null||t===null?n===t:n.gh(t)}class Nn{constructor(){this.q_=new Map,this.Ge=null,this.Y_=!1}X_(t){this.Y_=t,this.Ge=null}K_(t,i){this.Z_(i),this.Ge=null;for(let s=i;s{t<=s[0].index?i.push(e):s.splice(ct(s,t,h=>h.indexh-e)){if(!this.q_.get(s))continue;const e=i;i=[];const h=e.length;let r=0;const l=O(this.q_.get(s)),o=l.length;let u=1/0,a=-1/0;for(let c=0;c=t&&d-a>=t)i.push(f),a=d;else if(this.Y_)return e}for(;rt.weight?n:t}class Bn{constructor(t,i,s,e){this.e_=0,this.eu=null,this.ru=[],this.fo=null,this.do=null,this.hu=new Nn,this.lu=new Map,this.au=J.su(),this.ou=!0,this._u=new M,this.uu=new M,this.cu=new M,this.du=null,this.fu=null,this.vu=[],this._n=i,this.bo=s,this.pu=i.rightOffset,this.mu=i.barSpacing,this.Hi=t,this.N_=e,this.bu(),this.hu.X_(i.uniformDistribution)}W(){return this._n}wu(t){R(this.bo,t),this.gu(),this.bu()}Eh(t,i){var s;R(this._n,t),this._n.fixLeftEdge&&this.Mu(),this._n.fixRightEdge&&this.xu(),t.barSpacing!==void 0&&this.Hi.Kn(t.barSpacing),t.rightOffset!==void 0&&this.Hi.Zn(t.rightOffset),t.minBarSpacing!==void 0&&this.Hi.Kn((s=t.barSpacing)!==null&&s!==void 0?s:this.mu),this.gu(),this.bu(),this.cu.m()}vn(t){var i,s;return(s=(i=this.ru[t])===null||i===void 0?void 0:i.time)!==null&&s!==void 0?s:null}$i(t){var i;return(i=this.ru[t])!==null&&i!==void 0?i:null}ya(t,i){if(this.ru.length<1)return null;if(this.N_.key(t)>this.N_.key(this.ru[this.ru.length-1].time))return i?this.ru.length-1:null;const s=ct(this.ru,this.N_.key(t),(e,h)=>this.N_.key(e.time)0}qs(){return this.Su(),this.au.iu()}ku(){return this.Su(),this.au.nu()}yu(){const t=this.qs();if(t===null)return null;const i={from:t.Rs(),to:t.ui()};return this.Cu(i)}Cu(t){const i=Math.round(t.from),s=Math.round(t.to),e=b(this.Tu()),h=b(this.Pu());return{from:b(this.$i(Math.max(e,i))),to:b(this.$i(Math.min(h,s)))}}Ru(t){return{from:b(this.ya(t.from,!0)),to:b(this.ya(t.to,!0))}}ji(){return this.e_}m_(t){if(!isFinite(t)||t<=0||this.e_===t)return;const i=this.ku(),s=this.e_;if(this.e_=t,this.ou=!0,this._n.lockVisibleTimeRangeOnResize&&s!==0){const e=this.mu*t/s;this.mu=e}if(this._n.fixLeftEdge&&i!==null&&i.Rs()<=0){const e=s-t;this.pu-=Math.round(e/this.mu)+1,this.ou=!0}this.Du(),this.Ou()}It(t){if(this.Ei()||!rt(t))return 0;const i=this.Au()+this.pu-t;return this.e_-(i+.5)*this.mu-1}Zs(t,i){const s=this.Au(),e=i===void 0?0:i.from,h=i===void 0?t.length:i.to;for(let r=e;ri/2&&!a?p.needAlignCoordinate=!1:p.needAlignCoordinate=c&&m.index<=o||f&&m.index>=u,d++}return this.vu.length=d,this.fu=this.vu,this.vu}Fu(){this.ou=!0,this.Kn(this._n.barSpacing),this.Zn(this._n.rightOffset)}Wu(t){this.ou=!0,this.eu=t,this.Ou(),this.Mu()}ju(t,i){const s=this.Bu(t),e=this.ee(),h=e+i*(e/10);this.Kn(h),this._n.rightBarStaysOnScroll||this.Zn(this.Lu()+(s-this.Bu(t)))}Uo(t){this.fo&&this.Zo(),this.do===null&&this.du===null&&(this.Ei()||(this.do=t,this.Hu()))}qo(t){if(this.du===null)return;const i=ri(this.e_-t,0,this.e_),s=ri(this.e_-b(this.do),0,this.e_);i!==0&&s!==0&&this.Kn(this.du.ee*i/s)}Yo(){this.do!==null&&(this.do=null,this.$u())}Xo(t){this.fo===null&&this.du===null&&(this.Ei()||(this.fo=t,this.Hu()))}Ko(t){if(this.fo===null)return;const i=(this.fo-t)/this.ee();this.pu=b(this.du).Lu+i,this.ou=!0,this.Ou()}Zo(){this.fo!==null&&(this.fo=null,this.$u())}Uu(){this.qu(this._n.rightOffset)}qu(t,i=400){if(!isFinite(t))throw new RangeError("offset is required and must be finite number");if(!isFinite(i)||i<=0)throw new RangeError("animationDuration (optional) must be finite positive number");const s=this.pu,e=performance.now();this.Hi.qn({Yu:h=>(h-e)/i>=1,Xu:h=>{const r=(h-e)/i;return r>=1?t:s+(t-s)*r}})}bt(t,i){this.ou=!0,this.ru=t,this.hu.K_(t,i),this.Ou()}Ku(){return this._u}Zu(){return this.uu}Gu(){return this.cu}Au(){return this.eu||0}Ju(t){const i=t.U_();this.zu(this.e_/i),this.pu=t.ui()-this.Au(),this.Ou(),this.ou=!0,this.Hi.Iu(),this.Hi.Nh()}Qu(){const t=this.Tu(),i=this.Pu();t!==null&&i!==null&&this.Ju(new ht(t,i+this._n.rightOffset))}tc(t){const i=new ht(t.from,t.to);this.Ju(i)}Ui(t){return this.bo.timeFormatter!==void 0?this.bo.timeFormatter(t.originalTime):this.N_.formatHorzItem(t.time)}Eu(){const{handleScroll:t,handleScale:i}=this.Hi.W();return!(t.horzTouchDrag||t.mouseWheel||t.pressedMouseMove||t.vertTouchDrag||i.axisDoubleClickReset.time||i.axisPressedMouseMove.time||i.mouseWheel||i.pinch)}Tu(){return this.ru.length===0?null:0}Pu(){return this.ru.length===0?null:this.ru.length-1}ic(t){return(this.e_-1-t)/this.mu}Bu(t){const i=this.ic(t),s=this.Au()+this.pu-i;return Math.round(1e6*s)/1e6}zu(t){const i=this.mu;this.mu=t,this.Du(),i!==this.mu&&(this.ou=!0,this.nc())}Su(){if(!this.ou)return;if(this.ou=!1,this.Ei())return void this.sc(J.su());const t=this.Au(),i=this.e_/this.mu,s=this.pu+t,e=new ht(s-i+1,s);this.sc(new J(e))}Du(){const t=this.ec();if(this.mui&&(this.mu=i,this.ou=!0)}}ec(){return this._n.fixLeftEdge&&this._n.fixRightEdge&&this.ru.length!==0?this.e_/this.ru.length:this._n.minBarSpacing}Ou(){const t=this.rc();this.pu>t&&(this.pu=t,this.ou=!0);const i=this.hc();i!==null&&this.puthis.lc(s),this.N_),this.lu.set(t.weight,i)),i.F_(t)}lc(t){return this.N_.formatTickmark(t,this.bo)}sc(t){const i=this.au;this.au=t,qi(i.iu(),this.au.iu())||this._u.m(),qi(i.nu(),this.au.nu())||this.uu.m(),this.nc()}nc(){this.fu=null}gu(){this.nc(),this.lu.clear()}bu(){this.N_.updateFormatter(this.bo)}Mu(){if(!this._n.fixLeftEdge)return;const t=this.Tu();if(t===null)return;const i=this.qs();if(i===null)return;const s=i.Rs()-t;if(s<0){const e=this.pu-s-1;this.Zn(e)}this.Du()}xu(){this.Ou(),this.Du()}}class Ln{K(t,i,s){t.useMediaCoordinateSpace(e=>this.Z(e,i,s))}fl(t,i,s){t.useMediaCoordinateSpace(e=>this.ac(e,i,s))}ac(t,i,s){}}class Pn extends Ln{constructor(t){super(),this.oc=new Map,this.zt=t}Z(t){}ac(t){if(!this.zt.yt)return;const{context:i,mediaSize:s}=t;let e=0;for(const r of this.zt._c){if(r.Zt.length===0)continue;i.font=r.R;const l=this.uc(i,r.Zt);l>s.width?r.ju=s.width/l:r.ju=1,e+=r.cc*r.ju}let h=0;switch(this.zt.dc){case"top":h=0;break;case"center":h=Math.max((s.height-e)/2,0);break;case"bottom":h=Math.max(s.height-e,0)}i.fillStyle=this.zt.O;for(const r of this.zt._c){i.save();let l=0;switch(this.zt.fc){case"left":i.textAlign="left",l=r.cc/2;break;case"center":i.textAlign="center",l=s.width/2;break;case"right":i.textAlign="right",l=s.width-1-r.cc/2}i.translate(l,h),i.textBaseline="top",i.font=r.R,i.scale(r.ju,r.ju),i.fillText(r.Zt,0,r.vc),i.restore(),h+=r.cc*r.ju}}uc(t,i){const s=this.mc(t.font);let e=s.get(i);return e===void 0&&(e=t.measureText(i).width,s.set(i,e)),e}mc(t){let i=this.oc.get(t);return i===void 0&&(i=new Map,this.oc.set(t,i)),i}}class Wn{constructor(t){this.ft=!0,this.Ft={yt:!1,O:"",_c:[],dc:"center",fc:"center"},this.Wt=new Pn(this.Ft),this.jt=t}bt(){this.ft=!0}gt(){return this.ft&&(this.Mt(),this.ft=!1),this.Wt}Mt(){const t=this.jt.W(),i=this.Ft;i.yt=t.visible,i.yt&&(i.O=t.color,i.fc=t.horzAlign,i.dc=t.vertAlign,i._c=[{Zt:t.text,R:K(t.fontSize,t.fontFamily,t.fontStyle),cc:1.2*t.fontSize,vc:0,ju:0}])}}class Dn extends mi{constructor(t,i){super(),this._n=i,this.mn=new Wn(this)}Tn(){return[]}Cn(){return[this.mn]}W(){return this._n}Rn(){this.mn.bt()}}var Ji,Ki,Gi,ts,is;(function(n){n[n.OnTouchEnd=0]="OnTouchEnd",n[n.OnNextTap=1]="OnNextTap"})(Ji||(Ji={}));class In{constructor(t,i,s){this.bc=[],this.wc=[],this.e_=0,this.gc=null,this.Mc=new M,this.xc=new M,this.Sc=null,this.kc=t,this._n=i,this.N_=s,this.yc=new pe(this),this.wl=new Bn(this,i.timeScale,this._n.localization,s),this.vt=new Ce(this,i.crosshair),this.Cc=new yn(i.crosshair),this.Tc=new Dn(this,i.watermark),this.Pc(),this.bc[0].p_(2e3),this.Rc=this.Dc(0),this.Oc=this.Dc(1)}$l(){this.Ac(x.ns())}Nh(){this.Ac(x.ts())}sa(){this.Ac(new x(1))}Ul(t){const i=this.Vc(t);this.Ac(i)}Bc(){return this.gc}Ic(t){const i=this.gc;this.gc=t,i!==null&&this.Ul(i.zc),t!==null&&this.Ul(t.zc)}W(){return this._n}Eh(t){R(this._n,t),this.bc.forEach(i=>i.c_(t)),t.timeScale!==void 0&&this.wl.Eh(t.timeScale),t.localization!==void 0&&this.wl.wu(t.localization),(t.leftPriceScale||t.rightPriceScale)&&this.Mc.m(),this.Rc=this.Dc(0),this.Oc=this.Dc(1),this.$l()}Lc(t,i){if(t==="left")return void this.Eh({leftPriceScale:i});if(t==="right")return void this.Eh({rightPriceScale:i});const s=this.Ec(t);s!==null&&(s.Dt.Eh(i),this.Mc.m())}Ec(t){for(const i of this.bc){const s=i.d_(t);if(s!==null)return{Ht:i,Dt:s}}return null}St(){return this.wl}Nc(){return this.bc}Fc(){return this.Tc}Wc(){return this.vt}jc(){return this.xc}Hc(t,i){t.Oo(i),this.Iu()}m_(t){this.e_=t,this.wl.m_(this.e_),this.bc.forEach(i=>i.m_(t)),this.Iu()}Pc(t){const i=new kn(this.wl,this);t!==void 0?this.bc.splice(t,0,i):this.bc.push(i);const s=t===void 0?this.bc.length-1:t,e=x.ns();return e.Ln(s,{En:0,Nn:!0}),this.Ac(e),i}y_(t,i,s){t.y_(i,s)}C_(t,i,s){t.C_(i,s),this.ql(),this.Ac(this.$c(t,2))}T_(t,i){t.T_(i),this.Ac(this.$c(t,2))}P_(t,i,s){i.yo()||t.P_(i,s)}R_(t,i,s){i.yo()||(t.R_(i,s),this.ql(),this.Ac(this.$c(t,2)))}D_(t,i){i.yo()||(t.D_(i),this.Ac(this.$c(t,2)))}A_(t,i){t.A_(i),this.Ac(this.$c(t,2))}Uc(t){this.wl.Uo(t)}qc(t,i){const s=this.St();if(s.Ei()||i===0)return;const e=s.ji();t=Math.max(1,Math.min(t,e)),s.ju(t,i),this.Iu()}Yc(t){this.Xc(0),this.Kc(t),this.Zc()}Gc(t){this.wl.qo(t),this.Iu()}Jc(){this.wl.Yo(),this.Nh()}Xc(t){this.wl.Xo(t)}Kc(t){this.wl.Ko(t),this.Iu()}Zc(){this.wl.Zo(),this.Nh()}wt(){return this.wc}Qc(t,i,s,e,h){this.vt.bn(t,i);let r=NaN,l=this.wl.Vu(t);const o=this.wl.qs();o!==null&&(l=Math.min(Math.max(o.Rs(),l),o.ui()));const u=e.dn(),a=u.Ct();a!==null&&(r=u.fn(i,a)),r=this.Cc.Ca(r,l,e),this.vt.xn(l,r,e),this.sa(),h||this.xc.m(this.vt.xt(),{x:t,y:i},s)}td(t,i,s){const e=s.dn(),h=e.Ct(),r=e.Rt(t,b(h)),l=this.wl.ya(i,!0),o=this.wl.It(b(l));this.Qc(o,r,null,s,!0)}nd(t){this.Wc().kn(),this.sa(),t||this.xc.m(null,null,null)}ql(){const t=this.vt.Ht();if(t!==null){const i=this.vt.gn(),s=this.vt.Mn();this.Qc(i,s,null,t)}this.vt.Rn()}sd(t,i,s){const e=this.wl.vn(0);i!==void 0&&s!==void 0&&this.wl.bt(i,s);const h=this.wl.vn(0),r=this.wl.Au(),l=this.wl.qs();if(l!==null&&e!==null&&h!==null){const o=l.Yr(r),u=this.N_.key(e)>this.N_.key(h),a=t!==null&&t>r&&!u,c=this.wl.W().allowShiftVisibleRangeOnWhitespaceReplacement,f=o&&(s!==void 0||c)&&this.wl.W().shiftVisibleRangeOnNewBar;if(a&&!f){const d=t-r;this.wl.Zn(this.wl.Lu()-d)}}this.wl.Wu(t)}Kl(t){t!==null&&t.B_()}_r(t){const i=this.bc.find(s=>s.No().includes(t));return i===void 0?null:i}Iu(){this.Tc.Rn(),this.bc.forEach(t=>t.B_()),this.ql()}S(){this.bc.forEach(t=>t.S()),this.bc.length=0,this._n.localization.priceFormatter=void 0,this._n.localization.percentageFormatter=void 0,this._n.localization.timeFormatter=void 0}ed(){return this.yc}vr(){return this.yc.W()}f_(){return this.Mc}rd(t,i,s){const e=this.bc[0],h=this.hd(i,t,e,s);return this.wc.push(h),this.wc.length===1?this.$l():this.Nh(),h}ld(t){const i=this._r(t),s=this.wc.indexOf(t);A(s!==-1,"Series not found"),this.wc.splice(s,1),b(i).jo(t),t.S&&t.S()}Hl(t,i){const s=b(this._r(t));s.jo(t);const e=this.Ec(i);if(e===null){const h=t.Xi();s.Fo(t,i,h)}else{const h=e.Ht===s?t.Xi():void 0;e.Ht.Fo(t,i,h)}}Qu(){const t=x.ts();t.jn(),this.Ac(t)}ad(t){const i=x.ts();i.Un(t),this.Ac(i)}Xn(){const t=x.ts();t.Xn(),this.Ac(t)}Kn(t){const i=x.ts();i.Kn(t),this.Ac(i)}Zn(t){const i=x.ts();i.Zn(t),this.Ac(i)}qn(t){const i=x.ts();i.qn(t),this.Ac(i)}Hn(){const t=x.ts();t.Hn(),this.Ac(t)}od(){return this._n.rightPriceScale.visible?"right":"left"}_d(){return this.Oc}q(){return this.Rc}Vt(t){const i=this.Oc,s=this.Rc;if(i===s)return i;if(t=Math.max(0,Math.min(100,Math.round(100*t))),this.Sc===null||this.Sc.ys!==s||this.Sc.Cs!==i)this.Sc={ys:s,Cs:i,ud:new Map};else{const h=this.Sc.ud.get(t);if(h!==void 0)return h}const e=function(h,r,l){const[o,u,a,c]=zt(h),[f,d,m,p]=zt(r),g=[N(o+l*(f-o)),N(u+l*(d-u)),N(a+l*(m-a)),xs(c+l*(p-c))];return`rgba(${g[0]}, ${g[1]}, ${g[2]}, ${g[3]})`}(s,i,t/100);return this.Sc.ud.set(t,e),e}$c(t,i){const s=new x(i);if(t!==null){const e=this.bc.indexOf(t);s.Ln(e,{En:i})}return s}Vc(t,i){return i===void 0&&(i=2),this.$c(this._r(t),i)}Ac(t){this.kc&&this.kc(t),this.bc.forEach(i=>i.z_().Fh().bt())}hd(t,i,s,e){const h=new vi(this,t,i,s,e),r=t.priceScaleId!==void 0?t.priceScaleId:this.od();return s.Fo(h,r),Tt(r)||h.Eh(t),h}Dc(t){const i=this._n.layout;return i.background.type==="gradient"?t===0?i.background.topColor:i.background.bottomColor:i.background.color}}function li(n){return!P(n)&&!at(n)}function Hs(n){return P(n)}(function(n){n[n.Disabled=0]="Disabled",n[n.Continuous=1]="Continuous",n[n.OnDataUpdate=2]="OnDataUpdate"})(Ki||(Ki={})),function(n){n[n.LastBar=0]="LastBar",n[n.LastVisible=1]="LastVisible"}(Gi||(Gi={})),function(n){n.Solid="solid",n.VerticalGradient="gradient"}(ts||(ts={})),function(n){n[n.Year=0]="Year",n[n.Month=1]="Month",n[n.DayOfMonth=2]="DayOfMonth",n[n.Time=3]="Time",n[n.TimeWithSeconds=4]="TimeWithSeconds"}(is||(is={}));const ss=n=>n.getUTCFullYear();function Vn(n,t,i){return t.replace(/yyyy/g,(s=>D(ss(s),4))(n)).replace(/yy/g,(s=>D(ss(s)%100,2))(n)).replace(/MMMM/g,((s,e)=>new Date(s.getUTCFullYear(),s.getUTCMonth(),1).toLocaleString(e,{month:"long"}))(n,i)).replace(/MMM/g,((s,e)=>new Date(s.getUTCFullYear(),s.getUTCMonth(),1).toLocaleString(e,{month:"short"}))(n,i)).replace(/MM/g,(s=>D((e=>e.getUTCMonth()+1)(s),2))(n)).replace(/dd/g,(s=>D((e=>e.getUTCDate())(s),2))(n))}class js{constructor(t="yyyy-MM-dd",i="default"){this.dd=t,this.fd=i}F_(t){return Vn(t,this.dd,this.fd)}}class An{constructor(t){this.vd=t||"%h:%m:%s"}F_(t){return this.vd.replace("%h",D(t.getUTCHours(),2)).replace("%m",D(t.getUTCMinutes(),2)).replace("%s",D(t.getUTCSeconds(),2))}}const $n={pd:"yyyy-MM-dd",md:"%h:%m:%s",bd:" ",wd:"default"};class Fn{constructor(t={}){const i=Object.assign(Object.assign({},$n),t);this.gd=new js(i.pd,i.wd),this.Md=new An(i.md),this.xd=i.bd}F_(t){return`${this.gd.F_(t)}${this.xd}${this.Md.F_(t)}`}}function gt(n){return 60*n*60*1e3}function Qt(n){return 60*n*1e3}const vt=[{Sd:(es=1,1e3*es),kd:10},{Sd:Qt(1),kd:20},{Sd:Qt(5),kd:21},{Sd:Qt(30),kd:22},{Sd:gt(1),kd:30},{Sd:gt(3),kd:31},{Sd:gt(6),kd:32},{Sd:gt(12),kd:33}];var es;function ns(n,t){if(n.getUTCFullYear()!==t.getUTCFullYear())return 70;if(n.getUTCMonth()!==t.getUTCMonth())return 60;if(n.getUTCDate()!==t.getUTCDate())return 50;for(let i=vt.length-1;i>=0;--i)if(Math.floor(t.getTime()/vt[i].Sd)!==Math.floor(n.getTime()/vt[i].Sd))return vt[i].kd;return 0}function Xt(n){let t=n;if(at(n)&&(t=wi(n)),!li(t))throw new Error("time must be of type BusinessDay");const i=new Date(Date.UTC(t.year,t.month-1,t.day,0,0,0,0));return{yd:Math.round(i.getTime()/1e3),Cd:t}}function hs(n){if(!Hs(n))throw new Error("time must be of type isUTCTimestamp");return{yd:n}}function wi(n){const t=new Date(n);if(isNaN(t.getTime()))throw new Error(`Invalid date string=${n}, expected format=yyyy-mm-dd`);return{day:t.getUTCDate(),month:t.getUTCMonth()+1,year:t.getUTCFullYear()}}function rs(n){at(n.time)&&(n.time=wi(n.time))}class ls{options(){return this._n}setOptions(t){this._n=t,this.updateFormatter(t.localization)}preprocessData(t){Array.isArray(t)?function(i){i.forEach(rs)}(t):rs(t)}createConverterToInternalObj(t){return b(function(i){return i.length===0?null:li(i[0].time)||at(i[0].time)?Xt:hs}(t))}key(t){return typeof t=="object"&&"yd"in t?t.yd:this.key(this.convertHorzItemToInternal(t))}cacheKey(t){const i=t;return i.Cd===void 0?new Date(1e3*i.yd).getTime():new Date(Date.UTC(i.Cd.year,i.Cd.month-1,i.Cd.day)).getTime()}convertHorzItemToInternal(t){return Hs(i=t)?hs(i):li(i)?Xt(i):Xt(wi(i));var i}updateFormatter(t){if(!this._n)return;const i=t.dateFormat;this._n.timeScale.timeVisible?this.Td=new Fn({pd:i,md:this._n.timeScale.secondsVisible?"%h:%m:%s":"%h:%m",bd:" ",wd:t.locale}):this.Td=new js(i,t.locale)}formatHorzItem(t){const i=t;return this.Td.F_(new Date(1e3*i.yd))}formatTickmark(t,i){const s=function(h,r,l){switch(h){case 0:case 10:return r?l?4:3:2;case 20:case 21:case 22:case 30:case 31:case 32:case 33:return r?3:2;case 50:return 2;case 60:return 1;case 70:return 0}}(t.weight,this._n.timeScale.timeVisible,this._n.timeScale.secondsVisible),e=this._n.timeScale;if(e.tickMarkFormatter!==void 0){const h=e.tickMarkFormatter(t.originalTime,s,i.locale);if(h!==null)return h}return function(h,r,l){const o={};switch(r){case 0:o.year="numeric";break;case 1:o.month="short";break;case 2:o.day="numeric";break;case 3:o.hour12=!1,o.hour="2-digit",o.minute="2-digit";break;case 4:o.hour12=!1,o.hour="2-digit",o.minute="2-digit",o.second="2-digit"}const u=h.Cd===void 0?new Date(1e3*h.yd):new Date(Date.UTC(h.Cd.year,h.Cd.month-1,h.Cd.day));return new Date(u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate(),u.getUTCHours(),u.getUTCMinutes(),u.getUTCSeconds(),u.getUTCMilliseconds()).toLocaleString(l,o)}(t.time,s,i.locale)}maxTickMarkWeight(t){let i=t.reduce(Rn,t[0]).weight;return i>30&&i<50&&(i=30),i}fillWeightsForPoints(t,i){(function(s,e=0){if(s.length===0)return;let h=e===0?null:s[e-1].time.yd,r=h!==null?new Date(1e3*h):null,l=0;for(let o=e;o1){const o=Math.ceil(l/(s.length-1)),u=new Date(1e3*(s[0].time.yd-o));s[0].timeWeight=ns(new Date(1e3*s[0].time.yd),u)}})(t,i)}static Pd(t){return R({localization:{dateFormat:"dd MMM 'yy"}},t??{})}}const G=typeof window<"u";function os(){return!!G&&window.navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function qt(){return!!G&&/iPhone|iPad|iPod/.test(window.navigator.platform)}function oi(n){return n+n%2}function Jt(n,t){return n.Rd-t.Rd}function Kt(n,t,i){const s=(n.Rd-t.Rd)/(n.ot-t.ot);return Math.sign(s)*Math.min(Math.abs(s),i)}class Hn{constructor(t,i,s,e){this.Dd=null,this.Od=null,this.Ad=null,this.Vd=null,this.Bd=null,this.Id=0,this.zd=0,this.Ld=t,this.Ed=i,this.Nd=s,this.ss=e}Fd(t,i){if(this.Dd!==null){if(this.Dd.ot===i)return void(this.Dd.Rd=t);if(Math.abs(this.Dd.Rd-t)50)return;let s=0;const e=Kt(this.Dd,this.Od,this.Ed),h=Jt(this.Dd,this.Od),r=[e],l=[h];if(s+=h,this.Ad!==null){const u=Kt(this.Od,this.Ad,this.Ed);if(Math.sign(u)===Math.sign(e)){const a=Jt(this.Od,this.Ad);if(r.push(u),l.push(a),s+=a,this.Vd!==null){const c=Kt(this.Ad,this.Vd,this.Ed);if(Math.sign(c)===Math.sign(e)){const f=Jt(this.Ad,this.Vd);r.push(c),l.push(f),s+=f}}}}let o=0;for(let u=0;u({width:Math.max(e.width,h.width),height:Math.max(e.height,h.height)})});return s.resizeCanvasElement(t),s}function Z(n){var t;n.width=1,n.height=1,(t=n.getContext("2d"))===null||t===void 0||t.clearRect(0,0,1,1)}function ui(n,t,i,s){n.fl&&n.fl(t,i,s)}function Mt(n,t,i,s){n.K(t,i,s)}function ai(n,t,i,s){const e=n(i,s);for(const h of e){const r=h.gt();r!==null&&t(r)}}function jn(n){G&&window.chrome!==void 0&&n.addEventListener("mousedown",t=>{if(t.button===1)return t.preventDefault(),!1})}class _i{constructor(t,i,s){this.jd=0,this.Hd=null,this.$d={nt:Number.NEGATIVE_INFINITY,st:Number.POSITIVE_INFINITY},this.Ud=0,this.qd=null,this.Yd={nt:Number.NEGATIVE_INFINITY,st:Number.POSITIVE_INFINITY},this.Xd=null,this.Kd=!1,this.Zd=null,this.Gd=null,this.Jd=!1,this.Qd=!1,this.tf=!1,this.if=null,this.nf=null,this.sf=null,this.ef=null,this.rf=null,this.hf=null,this.lf=null,this.af=0,this._f=!1,this.uf=!1,this.cf=!1,this.df=0,this.ff=null,this.vf=!qt(),this.pf=e=>{this.mf(e)},this.bf=e=>{if(this.wf(e)){const h=this.gf(e);if(++this.Ud,this.qd&&this.Ud>1){const{Mf:r}=this.xf(L(e),this.Yd);r<30&&!this.tf&&this.Sf(h,this.yf.kf),this.Cf()}}else{const h=this.gf(e);if(++this.jd,this.Hd&&this.jd>1){const{Mf:r}=this.xf(L(e),this.$d);r<5&&!this.Qd&&this.Tf(h,this.yf.Pf),this.Rf()}}},this.Df=t,this.yf=i,this._n=s,this.Of()}S(){this.if!==null&&(this.if(),this.if=null),this.nf!==null&&(this.nf(),this.nf=null),this.ef!==null&&(this.ef(),this.ef=null),this.rf!==null&&(this.rf(),this.rf=null),this.hf!==null&&(this.hf(),this.hf=null),this.sf!==null&&(this.sf(),this.sf=null),this.Af(),this.Rf()}Vf(t){this.ef&&this.ef();const i=this.Bf.bind(this);if(this.ef=()=>{this.Df.removeEventListener("mousemove",i)},this.Df.addEventListener("mousemove",i),this.wf(t))return;const s=this.gf(t);this.Tf(s,this.yf.If),this.vf=!0}Rf(){this.Hd!==null&&clearTimeout(this.Hd),this.jd=0,this.Hd=null,this.$d={nt:Number.NEGATIVE_INFINITY,st:Number.POSITIVE_INFINITY}}Cf(){this.qd!==null&&clearTimeout(this.qd),this.Ud=0,this.qd=null,this.Yd={nt:Number.NEGATIVE_INFINITY,st:Number.POSITIVE_INFINITY}}Bf(t){if(this.cf||this.Gd!==null||this.wf(t))return;const i=this.gf(t);this.Tf(i,this.yf.zf),this.vf=!0}Lf(t){const i=Gt(t.changedTouches,b(this.ff));if(i===null||(this.df=wt(t),this.lf!==null)||this.uf)return;this._f=!0;const s=this.xf(L(i),b(this.Gd)),{Ef:e,Nf:h,Mf:r}=s;if(this.Jd||!(r<5)){if(!this.Jd){const l=.5*e,o=h>=l&&!this._n.Ff(),u=l>h&&!this._n.Wf();o||u||(this.uf=!0),this.Jd=!0,this.tf=!0,this.Af(),this.Cf()}if(!this.uf){const l=this.gf(t,i);this.Sf(l,this.yf.jf),Q(t)}}}Hf(t){if(t.button!==0)return;const i=this.xf(L(t),b(this.Zd)),{Mf:s}=i;if(s>=5&&(this.Qd=!0,this.Rf()),this.Qd){const e=this.gf(t);this.Tf(e,this.yf.$f)}}xf(t,i){const s=Math.abs(i.nt-t.nt),e=Math.abs(i.st-t.st);return{Ef:s,Nf:e,Mf:s+e}}Uf(t){let i=Gt(t.changedTouches,b(this.ff));if(i===null&&t.touches.length===0&&(i=t.changedTouches[0]),i===null)return;this.ff=null,this.df=wt(t),this.Af(),this.Gd=null,this.hf&&(this.hf(),this.hf=null);const s=this.gf(t,i);if(this.Sf(s,this.yf.qf),++this.Ud,this.qd&&this.Ud>1){const{Mf:e}=this.xf(L(i),this.Yd);e<30&&!this.tf&&this.Sf(s,this.yf.kf),this.Cf()}else this.tf||(this.Sf(s,this.yf.Yf),this.yf.Yf&&Q(t));this.Ud===0&&Q(t),t.touches.length===0&&this.Kd&&(this.Kd=!1,Q(t))}mf(t){if(t.button!==0)return;const i=this.gf(t);if(this.Zd=null,this.cf=!1,this.rf&&(this.rf(),this.rf=null),os()&&this.Df.ownerDocument.documentElement.removeEventListener("mouseleave",this.pf),!this.wf(t))if(this.Tf(i,this.yf.Xf),++this.jd,this.Hd&&this.jd>1){const{Mf:s}=this.xf(L(t),this.$d);s<5&&!this.Qd&&this.Tf(i,this.yf.Pf),this.Rf()}else this.Qd||this.Tf(i,this.yf.Kf)}Af(){this.Xd!==null&&(clearTimeout(this.Xd),this.Xd=null)}Zf(t){if(this.ff!==null)return;const i=t.changedTouches[0];this.ff=i.identifier,this.df=wt(t);const s=this.Df.ownerDocument.documentElement;this.tf=!1,this.Jd=!1,this.uf=!1,this.Gd=L(i),this.hf&&(this.hf(),this.hf=null);{const h=this.Lf.bind(this),r=this.Uf.bind(this);this.hf=()=>{s.removeEventListener("touchmove",h),s.removeEventListener("touchend",r)},s.addEventListener("touchmove",h,{passive:!1}),s.addEventListener("touchend",r,{passive:!1}),this.Af(),this.Xd=setTimeout(this.Gf.bind(this,t),240)}const e=this.gf(t,i);this.Sf(e,this.yf.Jf),this.qd||(this.Ud=0,this.qd=setTimeout(this.Cf.bind(this),500),this.Yd=L(i))}Qf(t){if(t.button!==0)return;const i=this.Df.ownerDocument.documentElement;os()&&i.addEventListener("mouseleave",this.pf),this.Qd=!1,this.Zd=L(t),this.rf&&(this.rf(),this.rf=null);{const e=this.Hf.bind(this),h=this.mf.bind(this);this.rf=()=>{i.removeEventListener("mousemove",e),i.removeEventListener("mouseup",h)},i.addEventListener("mousemove",e),i.addEventListener("mouseup",h)}if(this.cf=!0,this.wf(t))return;const s=this.gf(t);this.Tf(s,this.yf.tv),this.Hd||(this.jd=0,this.Hd=setTimeout(this.Rf.bind(this),500),this.$d=L(t))}Of(){this.Df.addEventListener("mouseenter",this.Vf.bind(this)),this.Df.addEventListener("touchcancel",this.Af.bind(this));{const t=this.Df.ownerDocument,i=s=>{this.yf.iv&&(s.composed&&this.Df.contains(s.composedPath()[0])||s.target&&this.Df.contains(s.target)||this.yf.iv())};this.nf=()=>{t.removeEventListener("touchstart",i)},this.if=()=>{t.removeEventListener("mousedown",i)},t.addEventListener("mousedown",i),t.addEventListener("touchstart",i,{passive:!0})}qt()&&(this.sf=()=>{this.Df.removeEventListener("dblclick",this.bf)},this.Df.addEventListener("dblclick",this.bf)),this.Df.addEventListener("mouseleave",this.nv.bind(this)),this.Df.addEventListener("touchstart",this.Zf.bind(this),{passive:!0}),jn(this.Df),this.Df.addEventListener("mousedown",this.Qf.bind(this)),this.sv(),this.Df.addEventListener("touchmove",()=>{},{passive:!1})}sv(){this.yf.ev===void 0&&this.yf.rv===void 0&&this.yf.hv===void 0||(this.Df.addEventListener("touchstart",t=>this.lv(t.touches),{passive:!0}),this.Df.addEventListener("touchmove",t=>{if(t.touches.length===2&&this.lf!==null&&this.yf.rv!==void 0){const i=us(t.touches[0],t.touches[1])/this.af;this.yf.rv(this.lf,i),Q(t)}},{passive:!1}),this.Df.addEventListener("touchend",t=>{this.lv(t.touches)}))}lv(t){t.length===1&&(this._f=!1),t.length!==2||this._f||this.Kd?this.av():this.ov(t)}ov(t){const i=this.Df.getBoundingClientRect()||{left:0,top:0};this.lf={nt:(t[0].clientX-i.left+(t[1].clientX-i.left))/2,st:(t[0].clientY-i.top+(t[1].clientY-i.top))/2},this.af=us(t[0],t[1]),this.yf.ev!==void 0&&this.yf.ev(),this.Af()}av(){this.lf!==null&&(this.lf=null,this.yf.hv!==void 0&&this.yf.hv())}nv(t){if(this.ef&&this.ef(),this.wf(t)||!this.vf)return;const i=this.gf(t);this.Tf(i,this.yf._v),this.vf=!qt()}Gf(t){const i=Gt(t.touches,b(this.ff));if(i===null)return;const s=this.gf(t,i);this.Sf(s,this.yf.uv),this.tf=!0,this.Kd=!0}wf(t){return t.sourceCapabilities&&t.sourceCapabilities.firesTouchEvents!==void 0?t.sourceCapabilities.firesTouchEvents:wt(t){t.type!=="touchstart"&&Q(t)}}}}function us(n,t){const i=n.clientX-t.clientX,s=n.clientY-t.clientY;return Math.sqrt(i*i+s*s)}function Q(n){n.cancelable&&n.preventDefault()}function L(n){return{nt:n.pageX,st:n.pageY}}function wt(n){return n.timeStamp||performance.now()}function Gt(n,t){for(let i=0;i{var s,e,h,r;return((e=(s=i.Dt())===null||s===void 0?void 0:s.xa())!==null&&e!==void 0?e:"")!==t?[]:(r=(h=i.la)===null||h===void 0?void 0:h.call(i,n))!==null&&r!==void 0?r:[]}}class as{constructor(t,i,s,e){this.zi=null,this.gv=null,this.Mv=!1,this.xv=new ot(200),this.Zr=null,this.Sv=0,this.kv=!1,this.yv=()=>{this.kv||this.Qi.Cv().$t().Nh()},this.Tv=()=>{this.kv||this.Qi.Cv().$t().Nh()},this.Qi=t,this._n=i,this.mo=i.layout,this.yc=s,this.Pv=e==="left",this.Rv=ti("normal",e),this.Dv=ti("top",e),this.Ov=ti("bottom",e),this.Av=document.createElement("div"),this.Av.style.height="100%",this.Av.style.overflow="hidden",this.Av.style.width="25px",this.Av.style.left="0",this.Av.style.position="relative",this.Vv=U(this.Av,S({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.yv);const h=this.Vv.canvasElement;h.style.position="absolute",h.style.zIndex="1",h.style.left="0",h.style.top="0",this.Bv=U(this.Av,S({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Tv);const r=this.Bv.canvasElement;r.style.position="absolute",r.style.zIndex="2",r.style.left="0",r.style.top="0";const l={tv:this.Iv.bind(this),Jf:this.Iv.bind(this),$f:this.zv.bind(this),jf:this.zv.bind(this),iv:this.Lv.bind(this),Xf:this.Ev.bind(this),qf:this.Ev.bind(this),Pf:this.Nv.bind(this),kf:this.Nv.bind(this),If:this.Fv.bind(this),_v:this.Wv.bind(this)};this.jv=new _i(this.Bv.canvasElement,l,{Ff:()=>!this._n.handleScroll.vertTouchDrag,Wf:()=>!0})}S(){this.jv.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Tv),Z(this.Bv.canvasElement),this.Bv.dispose(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.yv),Z(this.Vv.canvasElement),this.Vv.dispose(),this.zi!==null&&this.zi.$o().p(this),this.zi=null}Hv(){return this.Av}P(){return this.mo.fontSize}$v(){const t=this.yc.W();return this.Zr!==t.R&&(this.xv.Qe(),this.Zr=t.R),t}Uv(){if(this.zi===null)return 0;let t=0;const i=this.$v(),s=b(this.Vv.canvasElement.getContext("2d"));s.save();const e=this.zi.La();s.font=this.qv(),e.length>0&&(t=Math.max(this.xv.Mi(s,e[0].Za),this.xv.Mi(s,e[e.length-1].Za)));const h=this.Yv();for(let o=h.length;o--;){const u=this.xv.Mi(s,h[o].Zt());u>t&&(t=u)}const r=this.zi.Ct();if(r!==null&&this.gv!==null){const o=this.zi.fn(1,r),u=this.zi.fn(this.gv.height-2,r);t=Math.max(t,this.xv.Mi(s,this.zi.Ni(Math.floor(Math.min(o,u))+.11111111111111,r)),this.xv.Mi(s,this.zi.Ni(Math.ceil(Math.max(o,u))-.11111111111111,r)))}s.restore();const l=t||34;return oi(Math.ceil(i.C+i.T+i.B+i.I+5+l))}Xv(t){this.gv!==null&&F(this.gv,t)||(this.gv=t,this.kv=!0,this.Vv.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.kv=!1,this.Av.style.width=`${t.width}px`,this.Av.style.height=`${t.height}px`)}Kv(){return b(this.gv).width}Zi(t){this.zi!==t&&(this.zi!==null&&this.zi.$o().p(this),this.zi=t,t.$o().l(this.ao.bind(this),this))}Dt(){return this.zi}Qe(){const t=this.Qi.Zv();this.Qi.Cv().$t().A_(t,b(this.Dt()))}Gv(t){if(this.gv===null)return;if(t!==1){this.Jv(),this.Vv.applySuggestedBitmapSize();const s=H(this.Vv);s!==null&&(s.useBitmapCoordinateSpace(e=>{this.Qv(e),this.Ae(e)}),this.Qi.tp(s,this.Ov),this.ip(s),this.Qi.tp(s,this.Rv),this.np(s))}this.Bv.applySuggestedBitmapSize();const i=H(this.Bv);i!==null&&(i.useBitmapCoordinateSpace(({context:s,bitmapSize:e})=>{s.clearRect(0,0,e.width,e.height)}),this.sp(i),this.Qi.tp(i,this.Dv))}ep(){return this.Vv.bitmapSize}rp(t,i,s){const e=this.ep();e.width>0&&e.height>0&&t.drawImage(this.Vv.canvasElement,i,s)}bt(){var t;(t=this.zi)===null||t===void 0||t.La()}Iv(t){if(this.zi===null||this.zi.Ei()||!this._n.handleScale.axisPressedMouseMove.price)return;const i=this.Qi.Cv().$t(),s=this.Qi.Zv();this.Mv=!0,i.y_(s,this.zi,t.localY)}zv(t){if(this.zi===null||!this._n.handleScale.axisPressedMouseMove.price)return;const i=this.Qi.Cv().$t(),s=this.Qi.Zv(),e=this.zi;i.C_(s,e,t.localY)}Lv(){if(this.zi===null||!this._n.handleScale.axisPressedMouseMove.price)return;const t=this.Qi.Cv().$t(),i=this.Qi.Zv(),s=this.zi;this.Mv&&(this.Mv=!1,t.T_(i,s))}Ev(t){if(this.zi===null||!this._n.handleScale.axisPressedMouseMove.price)return;const i=this.Qi.Cv().$t(),s=this.Qi.Zv();this.Mv=!1,i.T_(s,this.zi)}Nv(t){this._n.handleScale.axisDoubleClickReset.price&&this.Qe()}Fv(t){this.zi!==null&&(!this.Qi.Cv().$t().W().handleScale.axisPressedMouseMove.price||this.zi.fh()||this.zi.Co()||this.hp(1))}Wv(t){this.hp(0)}Yv(){const t=[],i=this.zi===null?void 0:this.zi;return(s=>{for(let e=0;e{r.fillStyle=s.borderColor;const u=Math.max(1,Math.floor(o)),a=Math.floor(.5*o),c=Math.round(e.T*l);r.beginPath();for(const f of i)r.rect(Math.floor(h*l),Math.round(f.Aa*o)-a,c,u);r.fill()}),t.useMediaCoordinateSpace(({context:r})=>{var l;r.font=this.qv(),r.fillStyle=(l=s.textColor)!==null&&l!==void 0?l:this.mo.textColor,r.textAlign=this.Pv?"right":"left",r.textBaseline="middle";const o=this.Pv?Math.round(h-e.B):Math.round(h+e.T+e.B),u=i.map(a=>this.xv.gi(r,a.Za));for(let a=i.length;a--;){const c=i[a];r.fillText(c.Za,o,c.Aa+u[a])}})}Jv(){if(this.gv===null||this.zi===null)return;let t=this.gv.height/2;const i=[],s=this.zi.No().slice(),e=this.Qi.Zv(),h=this.$v();this.zi===e.cr()&&this.Qi.Zv().No().forEach(o=>{e.ur(o)&&s.push(o)});const r=this.zi.Ta()[0],l=this.zi;s.forEach(o=>{const u=o.Tn(e,l);u.forEach(a=>{a.Oi(null),a.Ai()&&i.push(a)}),r===o&&u.length>0&&(t=u[0].Si())}),i.forEach(o=>o.Oi(o.Si())),this.zi.W().alignLabels&&this.lp(i,h,t)}lp(t,i,s){if(this.gv===null)return;const e=t.filter(r=>r.Si()<=s),h=t.filter(r=>r.Si()>s);e.sort((r,l)=>l.Si()-r.Si()),e.length&&h.length&&h.push(e[0]),h.sort((r,l)=>r.Si()-l.Si());for(const r of t){const l=Math.floor(r.Bt(i)/2),o=r.Si();o>-l&&othis.gv.height-l&&oc-u&&l.Oi(c-u)}for(let r=1;r{h.Vi()&&h.gt(b(this.zi)).K(t,s,this.xv,e)})}sp(t){if(this.gv===null||this.zi===null)return;const i=this.Qi.Cv().$t(),s=[],e=this.Qi.Zv(),h=i.Wc().Tn(e,this.zi);h.length&&s.push(h);const r=this.$v(),l=this.Pv?"right":"left";s.forEach(o=>{o.forEach(u=>{u.gt(b(this.zi)).K(t,r,this.xv,l)})})}hp(t){this.Av.style.cursor=t===1?"ns-resize":"default"}ao(){const t=this.Uv();this.Sv{this.kv||this.gp===null||this.Hi().Nh()},this.Tv=()=>{this.kv||this.gp===null||this.Hi().Nh()},this.Mp=t,this.gp=i,this.gp.I_().l(this.xp.bind(this),this,!0),this.Sp=document.createElement("td"),this.Sp.style.padding="0",this.Sp.style.position="relative";const s=document.createElement("div");s.style.width="100%",s.style.height="100%",s.style.position="relative",s.style.overflow="hidden",this.kp=document.createElement("td"),this.kp.style.padding="0",this.yp=document.createElement("td"),this.yp.style.padding="0",this.Sp.appendChild(s),this.Vv=U(s,S({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.yv);const e=this.Vv.canvasElement;e.style.position="absolute",e.style.zIndex="1",e.style.left="0",e.style.top="0",this.Bv=U(s,S({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Tv);const h=this.Bv.canvasElement;h.style.position="absolute",h.style.zIndex="2",h.style.left="0",h.style.top="0",this.Cp=document.createElement("tr"),this.Cp.appendChild(this.kp),this.Cp.appendChild(this.Sp),this.Cp.appendChild(this.yp),this.Tp(),this.jv=new _i(this.Bv.canvasElement,this,{Ff:()=>this.pp===null&&!this.Mp.W().handleScroll.vertTouchDrag,Wf:()=>this.pp===null&&!this.Mp.W().handleScroll.horzTouchDrag})}S(){this.ap!==null&&this.ap.S(),this.op!==null&&this.op.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Tv),Z(this.Bv.canvasElement),this.Bv.dispose(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.yv),Z(this.Vv.canvasElement),this.Vv.dispose(),this.gp!==null&&this.gp.I_().p(this),this.jv.S()}Zv(){return b(this.gp)}Pp(t){this.gp!==null&&this.gp.I_().p(this),this.gp=t,this.gp!==null&&this.gp.I_().l(Si.prototype.xp.bind(this),this,!0),this.Tp()}Cv(){return this.Mp}Hv(){return this.Cp}Tp(){if(this.gp!==null&&(this.Rp(),this.Hi().wt().length!==0)){if(this.ap!==null){const t=this.gp.S_();this.ap.Zi(b(t))}if(this.op!==null){const t=this.gp.k_();this.op.Zi(b(t))}}}Dp(){this.ap!==null&&this.ap.bt(),this.op!==null&&this.op.bt()}v_(){return this.gp!==null?this.gp.v_():0}p_(t){this.gp&&this.gp.p_(t)}If(t){if(!this.gp)return;this.Op();const i=t.localX,s=t.localY;this.Ap(i,s,t)}tv(t){this.Op(),this.Vp(),this.Ap(t.localX,t.localY,t)}zf(t){var i;if(!this.gp)return;this.Op();const s=t.localX,e=t.localY;this.Ap(s,e,t);const h=this.pr(s,e);this.Mp.Bp((i=h==null?void 0:h.wv)!==null&&i!==void 0?i:null),this.Hi().Ic(h&&{zc:h.zc,mv:h.mv})}Kf(t){this.gp!==null&&(this.Op(),this.Ip(t))}Pf(t){this.gp!==null&&this.zp(this.dp,t)}kf(t){this.Pf(t)}$f(t){this.Op(),this.Lp(t),this.Ap(t.localX,t.localY,t)}Xf(t){this.gp!==null&&(this.Op(),this.vp=!1,this.Ep(t))}Yf(t){this.gp!==null&&this.Ip(t)}uv(t){if(this.vp=!0,this.pp===null){const i={x:t.localX,y:t.localY};this.Np(i,i,t)}}_v(t){this.gp!==null&&(this.Op(),this.gp.$t().Ic(null),this.Fp())}Wp(){return this.cp}jp(){return this.dp}ev(){this.fp=1,this.Hi().Hn()}rv(t,i){if(!this.Mp.W().handleScale.pinch)return;const s=5*(i-this.fp);this.fp=i,this.Hi().qc(t.nt,s)}Jf(t){this.vp=!1,this.mp=this.pp!==null,this.Vp();const i=this.Hi().Wc();this.pp!==null&&i.yt()&&(this.bp={x:i.Yt(),y:i.Xt()},this.pp={x:t.localX,y:t.localY})}jf(t){if(this.gp===null)return;const i=t.localX,s=t.localY;if(this.pp===null)this.Lp(t);else{this.mp=!1;const e=b(this.bp),h=e.x+(i-this.pp.x),r=e.y+(s-this.pp.y);this.Ap(h,r,t)}}qf(t){this.Cv().W().trackingMode.exitMode===0&&(this.mp=!0),this.Hp(),this.Ep(t)}pr(t,i){const s=this.gp;return s===null?null:function(e,h,r){const l=e.No(),o=function(u,a,c){var f,d;let m,p;for(const w of u){const y=(d=(f=w.oa)===null||f===void 0?void 0:f.call(w,a,c))!==null&&d!==void 0?d:[];for(const _ of y)g=_.zOrder,(!(v=m==null?void 0:m.zOrder)||g==="top"&&v!=="top"||g==="normal"&&v==="bottom")&&(m=_,p=w)}var g,v;return m&&p?{bv:m,zc:p}:null}(l,h,r);if((o==null?void 0:o.bv.zOrder)==="top")return _t(o);for(const u of l){if(o&&o.zc===u&&o.bv.zOrder!=="bottom"&&!o.bv.isBackground)return _t(o);const a=Un(u.Cn(e),h,r);if(a!==null)return{zc:u,vv:a.vv,mv:a.mv};if(o&&o.zc===u&&o.bv.zOrder!=="bottom"&&o.bv.isBackground)return _t(o)}return o!=null&&o.bv?_t(o):null}(s,t,i)}$p(t,i){b(i==="left"?this.ap:this.op).Xv(S({width:t,height:this.gv.height}))}Up(){return this.gv}Xv(t){F(this.gv,t)||(this.gv=t,this.kv=!0,this.Vv.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.kv=!1,this.Sp.style.width=t.width+"px",this.Sp.style.height=t.height+"px")}qp(){const t=b(this.gp);t.x_(t.S_()),t.x_(t.k_());for(const i of t.Ta())if(t.ur(i)){const s=i.Dt();s!==null&&t.x_(s),i.Rn()}}ep(){return this.Vv.bitmapSize}rp(t,i,s){const e=this.ep();e.width>0&&e.height>0&&t.drawImage(this.Vv.canvasElement,i,s)}Gv(t){if(t===0||this.gp===null)return;if(t>1&&this.qp(),this.ap!==null&&this.ap.Gv(t),this.op!==null&&this.op.Gv(t),t!==1){this.Vv.applySuggestedBitmapSize();const s=H(this.Vv);s!==null&&(s.useBitmapCoordinateSpace(e=>{this.Qv(e)}),this.gp&&(this.Yp(s,Zn),this.Xp(s),this.Kp(s),this.Yp(s,St),this.Yp(s,Yn)))}this.Bv.applySuggestedBitmapSize();const i=H(this.Bv);i!==null&&(i.useBitmapCoordinateSpace(({context:s,bitmapSize:e})=>{s.clearRect(0,0,e.width,e.height)}),this.Zp(i),this.Yp(i,Qn))}Gp(){return this.ap}Jp(){return this.op}tp(t,i){this.Yp(t,i)}xp(){this.gp!==null&&this.gp.I_().p(this),this.gp=null}Ip(t){this.zp(this.cp,t)}zp(t,i){const s=i.localX,e=i.localY;t.M()&&t.m(this.Hi().St().Vu(s),{x:s,y:e},i)}Qv({context:t,bitmapSize:i}){const{width:s,height:e}=i,h=this.Hi(),r=h.q(),l=h._d();r===l?Ot(t,0,0,s,e,l):Cs(t,0,0,s,e,r,l)}Xp(t){const i=b(this.gp).z_().Fh().gt();i!==null&&i.K(t,!1)}Kp(t){const i=this.Hi().Fc();this.Qp(t,St,ui,i),this.Qp(t,St,Mt,i)}Zp(t){this.Qp(t,St,Mt,this.Hi().Wc())}Yp(t,i){const s=b(this.gp).No();for(const e of s)this.Qp(t,i,ui,e);for(const e of s)this.Qp(t,i,Mt,e)}Qp(t,i,s,e){const h=b(this.gp),r=h.$t().Bc(),l=r!==null&&r.zc===e,o=r!==null&&l&&r.mv!==void 0?r.mv.br:void 0;ai(i,u=>s(u,t,l,o),e,h)}Rp(){if(this.gp===null)return;const t=this.Mp,i=this.gp.S_().W().visible,s=this.gp.k_().W().visible;i||this.ap===null||(this.kp.removeChild(this.ap.Hv()),this.ap.S(),this.ap=null),s||this.op===null||(this.yp.removeChild(this.op.Hv()),this.op.S(),this.op=null);const e=t.$t().ed();i&&this.ap===null&&(this.ap=new as(this,t.W(),e,"left"),this.kp.appendChild(this.ap.Hv())),s&&this.op===null&&(this.op=new as(this,t.W(),e,"right"),this.yp.appendChild(this.op.Hv()))}tm(t){return t.cv&&this.vp||this.pp!==null}im(t){return Math.max(0,Math.min(t,this.gv.width-1))}nm(t){return Math.max(0,Math.min(t,this.gv.height-1))}Ap(t,i,s){this.Hi().Qc(this.im(t),this.nm(i),s,b(this.gp))}Fp(){this.Hi().nd()}Hp(){this.mp&&(this.pp=null,this.Fp())}Np(t,i,s){this.pp=t,this.mp=!1,this.Ap(i.x,i.y,s);const e=this.Hi().Wc();this.bp={x:e.Yt(),y:e.Xt()}}Hi(){return this.Mp.$t()}Ep(t){if(!this.up)return;const i=this.Hi(),s=this.Zv();if(i.D_(s,s.dn()),this._p=null,this.up=!1,i.Zc(),this.wp!==null){const e=performance.now(),h=i.St();this.wp.Pr(h.Lu(),e),this.wp.Yu(e)||i.qn(this.wp)}}Op(){this.pp=null}Vp(){if(this.gp){if(this.Hi().Hn(),document.activeElement!==document.body&&document.activeElement!==document.documentElement)b(document.activeElement).blur();else{const t=document.getSelection();t!==null&&t.removeAllRanges()}!this.gp.dn().Ei()&&this.Hi().St().Ei()}}Lp(t){if(this.gp===null)return;const i=this.Hi(),s=i.St();if(s.Ei())return;const e=this.Mp.W(),h=e.handleScroll,r=e.kineticScroll;if((!h.pressedMouseMove||t.cv)&&(!h.horzTouchDrag&&!h.vertTouchDrag||!t.cv))return;const l=this.gp.dn(),o=performance.now();if(this._p!==null||this.tm(t)||(this._p={x:t.clientX,y:t.clientY,yd:o,sm:t.localX,rm:t.localY}),this._p!==null&&!this.up&&(this._p.x!==t.clientX||this._p.y!==t.clientY)){if(t.cv&&r.touch||!t.cv&&r.mouse){const u=s.ee();this.wp=new Hn(.2/u,7/u,.997,15/u),this.wp.Fd(s.Lu(),this._p.yd)}else this.wp=null;l.Ei()||i.P_(this.gp,l,t.localY),i.Xc(t.localX),this.up=!0}this.up&&(l.Ei()||i.R_(this.gp,l,t.localY),i.Kc(t.localX),this.wp!==null&&this.wp.Fd(s.Lu(),o))}}class cs{constructor(t,i,s,e,h){this.ft=!0,this.gv=S({width:0,height:0}),this.yv=()=>this.Gv(3),this.Pv=t==="left",this.yc=s.ed,this._n=i,this.hm=e,this.lm=h,this.Av=document.createElement("div"),this.Av.style.width="25px",this.Av.style.height="100%",this.Av.style.overflow="hidden",this.Vv=U(this.Av,S({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.yv)}S(){this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.yv),Z(this.Vv.canvasElement),this.Vv.dispose()}Hv(){return this.Av}Up(){return this.gv}Xv(t){F(this.gv,t)||(this.gv=t,this.Vv.resizeCanvasElement(t),this.Av.style.width=`${t.width}px`,this.Av.style.height=`${t.height}px`,this.ft=!0)}Gv(t){if(t<3&&!this.ft||this.gv.width===0||this.gv.height===0)return;this.ft=!1,this.Vv.applySuggestedBitmapSize();const i=H(this.Vv);i!==null&&i.useBitmapCoordinateSpace(s=>{this.Qv(s),this.Ae(s)})}ep(){return this.Vv.bitmapSize}rp(t,i,s){const e=this.ep();e.width>0&&e.height>0&&t.drawImage(this.Vv.canvasElement,i,s)}Ae({context:t,bitmapSize:i,horizontalPixelRatio:s,verticalPixelRatio:e}){if(!this.hm())return;t.fillStyle=this._n.timeScale.borderColor;const h=Math.floor(this.yc.W().C*s),r=Math.floor(this.yc.W().C*e),l=this.Pv?i.width-h:0;t.fillRect(l,0,h,r)}Qv({context:t,bitmapSize:i}){Ot(t,0,0,i.width,i.height,this.lm())}}function yi(n){return t=>{var i,s;return(s=(i=t.aa)===null||i===void 0?void 0:i.call(t,n))!==null&&s!==void 0?s:[]}}const Xn=yi("normal"),qn=yi("top"),Jn=yi("bottom");class Kn{constructor(t,i){this.am=null,this.om=null,this.k=null,this._m=!1,this.gv=S({width:0,height:0}),this.um=new M,this.xv=new ot(5),this.kv=!1,this.yv=()=>{this.kv||this.Mp.$t().Nh()},this.Tv=()=>{this.kv||this.Mp.$t().Nh()},this.Mp=t,this.N_=i,this._n=t.W().layout,this.dm=document.createElement("tr"),this.fm=document.createElement("td"),this.fm.style.padding="0",this.vm=document.createElement("td"),this.vm.style.padding="0",this.Av=document.createElement("td"),this.Av.style.height="25px",this.Av.style.padding="0",this.pm=document.createElement("div"),this.pm.style.width="100%",this.pm.style.height="100%",this.pm.style.position="relative",this.pm.style.overflow="hidden",this.Av.appendChild(this.pm),this.Vv=U(this.pm,S({width:16,height:16})),this.Vv.subscribeSuggestedBitmapSizeChanged(this.yv);const s=this.Vv.canvasElement;s.style.position="absolute",s.style.zIndex="1",s.style.left="0",s.style.top="0",this.Bv=U(this.pm,S({width:16,height:16})),this.Bv.subscribeSuggestedBitmapSizeChanged(this.Tv);const e=this.Bv.canvasElement;e.style.position="absolute",e.style.zIndex="2",e.style.left="0",e.style.top="0",this.dm.appendChild(this.fm),this.dm.appendChild(this.Av),this.dm.appendChild(this.vm),this.bm(),this.Mp.$t().f_().l(this.bm.bind(this),this),this.jv=new _i(this.Bv.canvasElement,this,{Ff:()=>!0,Wf:()=>!this.Mp.W().handleScroll.horzTouchDrag})}S(){this.jv.S(),this.am!==null&&this.am.S(),this.om!==null&&this.om.S(),this.Bv.unsubscribeSuggestedBitmapSizeChanged(this.Tv),Z(this.Bv.canvasElement),this.Bv.dispose(),this.Vv.unsubscribeSuggestedBitmapSizeChanged(this.yv),Z(this.Vv.canvasElement),this.Vv.dispose()}Hv(){return this.dm}wm(){return this.am}gm(){return this.om}tv(t){if(this._m)return;this._m=!0;const i=this.Mp.$t();!i.St().Ei()&&this.Mp.W().handleScale.axisPressedMouseMove.time&&i.Uc(t.localX)}Jf(t){this.tv(t)}iv(){const t=this.Mp.$t();!t.St().Ei()&&this._m&&(this._m=!1,this.Mp.W().handleScale.axisPressedMouseMove.time&&t.Jc())}$f(t){const i=this.Mp.$t();!i.St().Ei()&&this.Mp.W().handleScale.axisPressedMouseMove.time&&i.Gc(t.localX)}jf(t){this.$f(t)}Xf(){this._m=!1;const t=this.Mp.$t();t.St().Ei()&&!this.Mp.W().handleScale.axisPressedMouseMove.time||t.Jc()}qf(){this.Xf()}Pf(){this.Mp.W().handleScale.axisDoubleClickReset.time&&this.Mp.$t().Xn()}kf(){this.Pf()}If(){this.Mp.$t().W().handleScale.axisPressedMouseMove.time&&this.hp(1)}_v(){this.hp(0)}Up(){return this.gv}Mm(){return this.um}xm(t,i,s){F(this.gv,t)||(this.gv=t,this.kv=!0,this.Vv.resizeCanvasElement(t),this.Bv.resizeCanvasElement(t),this.kv=!1,this.Av.style.width=`${t.width}px`,this.Av.style.height=`${t.height}px`,this.um.m(t)),this.am!==null&&this.am.Xv(S({width:i,height:t.height})),this.om!==null&&this.om.Xv(S({width:s,height:t.height}))}Sm(){const t=this.km();return Math.ceil(t.C+t.T+t.P+t.L+t.V+t.ym)}bt(){this.Mp.$t().St().La()}ep(){return this.Vv.bitmapSize}rp(t,i,s){const e=this.ep();e.width>0&&e.height>0&&t.drawImage(this.Vv.canvasElement,i,s)}Gv(t){if(t===0)return;if(t!==1){this.Vv.applySuggestedBitmapSize();const s=H(this.Vv);s!==null&&(s.useBitmapCoordinateSpace(e=>{this.Qv(e),this.Ae(e),this.Cm(s,Jn)}),this.ip(s),this.Cm(s,Xn)),this.am!==null&&this.am.Gv(t),this.om!==null&&this.om.Gv(t)}this.Bv.applySuggestedBitmapSize();const i=H(this.Bv);i!==null&&(i.useBitmapCoordinateSpace(({context:s,bitmapSize:e})=>{s.clearRect(0,0,e.width,e.height)}),this.Tm([...this.Mp.$t().wt(),this.Mp.$t().Wc()],i),this.Cm(i,qn))}Cm(t,i){const s=this.Mp.$t().wt();for(const e of s)ai(i,h=>ui(h,t,!1,void 0),e,void 0);for(const e of s)ai(i,h=>Mt(h,t,!1,void 0),e,void 0)}Qv({context:t,bitmapSize:i}){Ot(t,0,0,i.width,i.height,this.Mp.$t()._d())}Ae({context:t,bitmapSize:i,verticalPixelRatio:s}){if(this.Mp.W().timeScale.borderVisible){t.fillStyle=this.Pm();const e=Math.max(1,Math.floor(this.km().C*s));t.fillRect(0,0,i.width,e)}}ip(t){const i=this.Mp.$t().St(),s=i.La();if(!s||s.length===0)return;const e=this.N_.maxTickMarkWeight(s),h=this.km(),r=i.W();r.borderVisible&&r.ticksVisible&&t.useBitmapCoordinateSpace(({context:l,horizontalPixelRatio:o,verticalPixelRatio:u})=>{l.strokeStyle=this.Pm(),l.fillStyle=this.Pm();const a=Math.max(1,Math.floor(o)),c=Math.floor(.5*o);l.beginPath();const f=Math.round(h.T*u);for(let d=s.length;d--;){const m=Math.round(s[d].coord*o);l.rect(m-c,0,a,f)}l.fill()}),t.useMediaCoordinateSpace(({context:l})=>{const o=h.C+h.T+h.L+h.P/2;l.textAlign="center",l.textBaseline="middle",l.fillStyle=this.$(),l.font=this.qv();for(const u of s)if(u.weight=e){const a=u.needAlignCoordinate?this.Rm(l,u.coord,u.label):u.coord;l.fillText(u.label,a,o)}})}Rm(t,i,s){const e=this.xv.Mi(t,s),h=e/2,r=Math.floor(i-h)+.5;return r<0?i+=Math.abs(0-r):r+e>this.gv.width&&(i-=Math.abs(this.gv.width-(r+e))),i}Tm(t,i){const s=this.km();for(const e of t)for(const h of e.Ji())h.gt().K(i,s)}Pm(){return this.Mp.W().timeScale.borderColor}$(){return this._n.textColor}j(){return this._n.fontSize}qv(){return K(this.j(),this._n.fontFamily)}Dm(){return K(this.j(),this._n.fontFamily,"bold")}km(){this.k===null&&(this.k={C:1,N:NaN,L:NaN,V:NaN,Wi:NaN,T:5,P:NaN,R:"",Fi:new ot,ym:0});const t=this.k,i=this.qv();if(t.R!==i){const s=this.j();t.P=s,t.R=i,t.L=3*s/12,t.V=3*s/12,t.Wi=9*s/12,t.N=0,t.ym=4*s/12,t.Fi.Qe()}return this.k}hp(t){this.Av.style.cursor=t===1?"ew-resize":"default"}bm(){const t=this.Mp.$t(),i=t.W();i.leftPriceScale.visible||this.am===null||(this.fm.removeChild(this.am.Hv()),this.am.S(),this.am=null),i.rightPriceScale.visible||this.om===null||(this.vm.removeChild(this.om.Hv()),this.om.S(),this.om=null);const s={ed:this.Mp.$t().ed()},e=()=>i.leftPriceScale.borderVisible&&t.St().W().borderVisible,h=()=>t._d();i.leftPriceScale.visible&&this.am===null&&(this.am=new cs("left",i,s,e,h),this.fm.appendChild(this.am.Hv())),i.rightPriceScale.visible&&this.om===null&&(this.om=new cs("right",i,s,e,h),this.vm.appendChild(this.om.Hv()))}}const Gn=!!G&&!!navigator.userAgentData&&navigator.userAgentData.brands.some(n=>n.brand.includes("Chromium"))&&!!G&&(!((ii=navigator==null?void 0:navigator.userAgentData)===null||ii===void 0)&&ii.platform?navigator.userAgentData.platform==="Windows":navigator.userAgent.toLowerCase().indexOf("win")>=0);var ii;class th{constructor(t,i,s){var e;this.Om=[],this.Am=0,this.Qa=0,this.e_=0,this.Vm=0,this.Bm=0,this.Im=null,this.zm=!1,this.cp=new M,this.dp=new M,this.xc=new M,this.Lm=null,this.Em=null,this.Nm=t,this._n=i,this.N_=s,this.dm=document.createElement("div"),this.dm.classList.add("tv-lightweight-charts"),this.dm.style.overflow="hidden",this.dm.style.direction="ltr",this.dm.style.width="100%",this.dm.style.height="100%",(e=this.dm).style.userSelect="none",e.style.webkitUserSelect="none",e.style.msUserSelect="none",e.style.MozUserSelect="none",e.style.webkitTapHighlightColor="transparent",this.Fm=document.createElement("table"),this.Fm.setAttribute("cellspacing","0"),this.dm.appendChild(this.Fm),this.Wm=this.jm.bind(this),si(this._n)&&this.Hm(!0),this.Hi=new In(this.kc.bind(this),this._n,s),this.$t().jc().l(this.$m.bind(this),this),this.Um=new Kn(this,this.N_),this.Fm.appendChild(this.Um.Hv());const h=i.autoSize&&this.qm();let r=this._n.width,l=this._n.height;if(h||r===0||l===0){const o=t.getBoundingClientRect();r=r||o.width,l=l||o.height}this.Ym(r,l),this.Xm(),t.appendChild(this.dm),this.Km(),this.Hi.St().Gu().l(this.Hi.$l.bind(this.Hi),this),this.Hi.f_().l(this.Hi.$l.bind(this.Hi),this)}$t(){return this.Hi}W(){return this._n}Zm(){return this.Om}Gm(){return this.Um}S(){this.Hm(!1),this.Am!==0&&window.cancelAnimationFrame(this.Am),this.Hi.jc().p(this),this.Hi.St().Gu().p(this),this.Hi.f_().p(this),this.Hi.S();for(const t of this.Om)this.Fm.removeChild(t.Hv()),t.Wp().p(this),t.jp().p(this),t.S();this.Om=[],b(this.Um).S(),this.dm.parentElement!==null&&this.dm.parentElement.removeChild(this.dm),this.xc.S(),this.cp.S(),this.dp.S(),this.Jm()}Ym(t,i,s=!1){if(this.Qa===i&&this.e_===t)return;const e=function(l){const o=Math.floor(l.width),u=Math.floor(l.height);return S({width:o-o%2,height:u-u%2})}(S({width:t,height:i}));this.Qa=e.height,this.e_=e.width;const h=this.Qa+"px",r=this.e_+"px";b(this.dm).style.height=h,b(this.dm).style.width=r,this.Fm.style.height=h,this.Fm.style.width=r,s?this.Qm(x.ns(),performance.now()):this.Hi.$l()}Gv(t){t===void 0&&(t=x.ns());for(let i=0;i{let u=0;for(let a=0;a{b(l==="left"?this.Um.wm():this.Um.gm()).rp(b(t),o,u)};if(this._n.timeScale.visible){const l=this.Um.ep();if(t!==null){let o=0;this.eb()&&(r("left",o,s),o=b(e.Gp()).ep().width),this.Um.rp(t,o,s),o+=l.width,this.rb()&&r("right",o,s)}s+=l.height}return S({width:i,height:s})}_b(){let t=0,i=0,s=0;for(const m of this.Om)this.eb()&&(i=Math.max(i,b(m.Gp()).Uv(),this._n.leftPriceScale.minimumWidth)),this.rb()&&(s=Math.max(s,b(m.Jp()).Uv(),this._n.rightPriceScale.minimumWidth)),t+=m.v_();i=oi(i),s=oi(s);const e=this.e_,h=this.Qa,r=Math.max(e-i-s,0),l=this._n.timeScale.visible;let o=l?Math.max(this.Um.Sm(),this._n.timeScale.minimumHeight):0;var u;o=(u=o)+u%2;const a=0+o,c=h{h.Dp()}),((s=this.Im)===null||s===void 0?void 0:s.Fn())===3&&(this.Im.Jn(t),this.cb(),this.fb(this.Im),this.vb(this.Im,i),t=this.Im,this.Im=null)),this.Gv(t)}vb(t,i){for(const s of t.Gn())this.Qn(s,i)}fb(t){const i=this.Hi.Nc();for(let s=0;s{if(this.zm=!1,this.Am=0,this.Im!==null){const s=this.Im;this.Im=null,this.Qm(s,i);for(const e of s.Gn())if(e.$n===5&&!e.Ot.Yu(i)){this.$t().qn(e.Ot);break}}}))}cb(){this.Xm()}Xm(){const t=this.Hi.Nc(),i=t.length,s=this.Om.length;for(let e=i;e{const c=a.Vn().il(t);c!==null&&h.set(a,c)});let r;if(t!==null){const a=(e=this.Hi.St().$i(t))===null||e===void 0?void 0:e.originalTime;a!==void 0&&(r=a)}const l=this.$t().Bc(),o=l!==null&&l.zc instanceof vi?l.zc:void 0,u=l!==null&&l.mv!==void 0?l.mv.mr:void 0;return{wb:r,ie:t??void 0,gb:i??void 0,Mb:o,xb:h,Sb:u,kb:s??void 0}}pb(t,i,s){this.cp.m(()=>this.bb(t,i,s))}mb(t,i,s){this.dp.m(()=>this.bb(t,i,s))}$m(t,i,s){this.xc.m(()=>this.bb(t,i,s))}Km(){const t=this._n.timeScale.visible?"":"none";this.Um.Hv().style.display=t}eb(){return this.Om[0].Zv().S_().W().visible}rb(){return this.Om[0].Zv().k_().W().visible}qm(){return"ResizeObserver"in window&&(this.Lm=new ResizeObserver(t=>{const i=t.find(s=>s.target===this.Nm);i&&this.Ym(i.contentRect.width,i.contentRect.height)}),this.Lm.observe(this.Nm,{box:"border-box"}),!0)}Jm(){this.Lm!==null&&this.Lm.disconnect(),this.Lm=null}}function si(n){return!!(n.handleScroll.mouseWheel||n.handleScale.mouseWheel)}function Us(n,t){var i={};for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&t.indexOf(s)<0&&(i[s]=n[s]);if(n!=null&&typeof Object.getOwnPropertySymbols=="function"){var e=0;for(s=Object.getOwnPropertySymbols(n);efunction(l,o){return o?o(l):(u=l).open===void 0&&u.value===void 0;var u}(s,r)?ds({ot:t,ie:i,wb:e},s):ds(n(t,i,s,e,h),s)}function ms(n){return{Candlestick:$(nh),Bar:$(eh),Area:$(ih),Baseline:$(sh),Histogram:$(fs),Line:$(fs),Custom:$(hh)}[n]}function ps(n){return{ie:0,Cb:new Map,ia:n}}function bs(n,t){if(n!==void 0&&n.length!==0)return{Tb:t.key(n[0].ot),Pb:t.key(n[n.length-1].ot)}}function gs(n){let t;return n.forEach(i=>{t===void 0&&(t=i.wb)}),O(t)}class rh{constructor(t){this.Rb=new Map,this.Db=new Map,this.Ob=new Map,this.Ab=[],this.N_=t}S(){this.Rb.clear(),this.Db.clear(),this.Ob.clear(),this.Ab=[]}Vb(t,i){let s=this.Rb.size!==0,e=!1;const h=this.Db.get(t);if(h!==void 0)if(this.Db.size===1)s=!1,e=!0,this.Rb.clear();else for(const o of this.Ab)o.pointData.Cb.delete(t)&&(e=!0);let r=[];if(i.length!==0){const o=i.map(d=>d.time),u=this.N_.createConverterToInternalObj(i),a=ms(t.Yh()),c=t.ga(),f=t.Ma();r=i.map((d,m)=>{const p=u(d.time),g=this.N_.key(p);let v=this.Rb.get(g);v===void 0&&(v=ps(p),this.Rb.set(g,v),e=!0);const w=a(p,v.ie,d,o[m],c,f);return v.Cb.set(t,w),w})}s&&this.Bb(),this.Ib(t,r);let l=-1;if(e){const o=[];this.Rb.forEach(u=>{o.push({timeWeight:0,time:u.ia,pointData:u,originalTime:gs(u.Cb)})}),o.sort((u,a)=>this.N_.key(u.time)-this.N_.key(a.time)),l=this.zb(o)}return this.Lb(t,l,function(o,u,a){const c=bs(o,a),f=bs(u,a);if(c!==void 0&&f!==void 0)return{Xl:c.Pb>=f.Pb&&c.Tb>=f.Tb}}(this.Db.get(t),h,this.N_))}ld(t){return this.Vb(t,[])}Eb(t,i){const s=i;(function(p){p.wb===void 0&&(p.wb=p.time)})(s),this.N_.preprocessData(i);const e=this.N_.createConverterToInternalObj([i])(i.time),h=this.Ob.get(t);if(h!==void 0&&this.N_.key(e)this.N_.key(p.time)this.N_.key(e.ot)?yt(i)&&s.push(i):yt(i)?s[s.length-1]=i:s.splice(-1,1),this.Ob.set(t,i.ot)}Ib(t,i){i.length!==0?(this.Db.set(t,i.filter(yt)),this.Ob.set(t,i[i.length-1].ot)):(this.Db.delete(t),this.Ob.delete(t))}Bb(){for(const t of this.Ab)t.pointData.Cb.size===0&&this.Rb.delete(this.N_.key(t.time))}zb(t){let i=-1;for(let s=0;s{i.length!==0&&(t=Math.max(t,i[i.length-1].ie))}),t}Lb(t,i,s){const e={Wb:new Map,St:{Au:this.Fb()}};if(i!==-1)this.Db.forEach((h,r)=>{e.Wb.set(r,{We:h,jb:r===t?s:void 0})}),this.Db.has(t)||e.Wb.set(t,{We:[],jb:s}),e.St.Hb=this.Ab,e.St.$b=i;else{const h=this.Db.get(t);e.Wb.set(t,{We:h||[],jb:s})}return e}}function ei(n,t){n.ie=t,n.Cb.forEach(i=>{i.ie=t})}function Mi(n){const t={value:n.Ot[3],time:n.wb};return n.yb!==void 0&&(t.customValues=n.yb),t}function vs(n){const t=Mi(n);return n.O!==void 0&&(t.color=n.O),t}function lh(n){const t=Mi(n);return n.lt!==void 0&&(t.lineColor=n.lt),n.ys!==void 0&&(t.topColor=n.ys),n.Cs!==void 0&&(t.bottomColor=n.Cs),t}function oh(n){const t=Mi(n);return n.Ce!==void 0&&(t.topLineColor=n.Ce),n.Te!==void 0&&(t.bottomLineColor=n.Te),n.Me!==void 0&&(t.topFillColor1=n.Me),n.xe!==void 0&&(t.topFillColor2=n.xe),n.Se!==void 0&&(t.bottomFillColor1=n.Se),n.ke!==void 0&&(t.bottomFillColor2=n.ke),t}function Zs(n){const t={open:n.Ot[0],high:n.Ot[1],low:n.Ot[2],close:n.Ot[3],time:n.wb};return n.yb!==void 0&&(t.customValues=n.yb),t}function uh(n){const t=Zs(n);return n.O!==void 0&&(t.color=n.O),t}function ah(n){const t=Zs(n),{O:i,At:s,Hh:e}=n;return i!==void 0&&(t.color=i),s!==void 0&&(t.borderColor=s),e!==void 0&&(t.wickColor=e),t}function ci(n){return{Area:lh,Line:vs,Baseline:oh,Histogram:vs,Bar:uh,Candlestick:ah,Custom:ch}[n]}function ch(n){const t=n.wb;return Object.assign(Object.assign({},n.We),{time:t})}const fh={vertLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},horzLine:{color:"#9598A1",width:1,style:3,visible:!0,labelVisible:!0,labelBackgroundColor:"#131722"},mode:1},dh={vertLines:{color:"#D6DCDE",style:0,visible:!0},horzLines:{color:"#D6DCDE",style:0,visible:!0}},mh={background:{type:"solid",color:"#FFFFFF"},textColor:"#191919",fontSize:12,fontFamily:fi},ni={autoScale:!0,mode:0,invertScale:!1,alignLabels:!0,borderVisible:!0,borderColor:"#2B2B43",entireTextOnly:!1,visible:!1,ticksVisible:!1,scaleMargins:{bottom:.1,top:.2},minimumWidth:0},ph={rightOffset:0,barSpacing:6,minBarSpacing:.5,fixLeftEdge:!1,fixRightEdge:!1,lockVisibleTimeRangeOnResize:!1,rightBarStaysOnScroll:!1,borderVisible:!0,borderColor:"#2B2B43",visible:!0,timeVisible:!1,secondsVisible:!0,shiftVisibleRangeOnNewBar:!0,allowShiftVisibleRangeOnWhitespaceReplacement:!1,ticksVisible:!1,uniformDistribution:!1,minimumHeight:0,allowBoldLabels:!0},bh={color:"rgba(0, 0, 0, 0)",visible:!1,fontSize:48,fontFamily:fi,fontStyle:"",text:"",horzAlign:"center",vertAlign:"center"};function ws(){return{width:0,height:0,autoSize:!1,layout:mh,crosshair:fh,grid:dh,overlayPriceScales:Object.assign({},ni),leftPriceScale:Object.assign(Object.assign({},ni),{visible:!1}),rightPriceScale:Object.assign(Object.assign({},ni),{visible:!0}),timeScale:ph,watermark:bh,localization:{locale:G?navigator.language:"",dateFormat:"dd MMM 'yy"},handleScroll:{mouseWheel:!0,pressedMouseMove:!0,horzTouchDrag:!0,vertTouchDrag:!0},handleScale:{axisPressedMouseMove:{time:!0,price:!0},axisDoubleClickReset:{time:!0,price:!0},mouseWheel:!0,pinch:!0},kineticScroll:{mouse:!1,touch:!0},trackingMode:{exitMode:1}}}class gh{constructor(t,i){this.Ub=t,this.qb=i}applyOptions(t){this.Ub.$t().Lc(this.qb,t)}options(){return this.zi().W()}width(){return Tt(this.qb)?this.Ub.sb(this.qb):0}zi(){return b(this.Ub.$t().Ec(this.qb)).Dt}}function _s(n,t,i){const s=Us(n,["time","originalTime"]),e=Object.assign({time:t},s);return i!==void 0&&(e.originalTime=i),e}const vh={color:"#FF0000",price:0,lineStyle:2,lineWidth:1,lineVisible:!0,axisLabelVisible:!0,title:"",axisLabelColor:"",axisLabelTextColor:""};class wh{constructor(t){this.Vh=t}applyOptions(t){this.Vh.Eh(t)}options(){return this.Vh.W()}Yb(){return this.Vh}}class _h{constructor(t,i,s,e,h){this.Xb=new M,this.Is=t,this.Kb=i,this.Zb=s,this.N_=h,this.Gb=e}S(){this.Xb.S()}priceFormatter(){return this.Is.ca()}priceToCoordinate(t){const i=this.Is.Ct();return i===null?null:this.Is.Dt().Rt(t,i.Ot)}coordinateToPrice(t){const i=this.Is.Ct();return i===null?null:this.Is.Dt().fn(t,i.Ot)}barsInLogicalRange(t){if(t===null)return null;const i=new J(new ht(t.from,t.to)).iu(),s=this.Is.Vn();if(s.Ei())return null;const e=s.il(i.Rs(),1),h=s.il(i.ui(),-1),r=b(s.Jh()),l=b(s.An());if(e!==null&&h!==null&&e.ie>h.ie)return{barsBefore:t.from-r,barsAfter:l-t.to};const o={barsBefore:e===null||e.ie===r?t.from-r:e.ie-r,barsAfter:h===null||h.ie===l?l-t.to:l-h.ie};return e!==null&&h!==null&&(o.from=e.wb,o.to=h.wb),o}setData(t){this.N_,this.Is.Yh(),this.Kb.Jb(this.Is,t),this.Qb("full")}update(t){this.Is.Yh(),this.Kb.tw(this.Is,t),this.Qb("update")}dataByIndex(t,i){const s=this.Is.Vn().il(t,i);return s===null?null:ci(this.seriesType())(s)}data(){const t=ci(this.seriesType());return this.Is.Vn().Qs().map(i=>t(i))}subscribeDataChanged(t){this.Xb.l(t)}unsubscribeDataChanged(t){this.Xb.v(t)}setMarkers(t){this.N_;const i=t.map(s=>_s(s,this.N_.convertHorzItemToInternal(s.time),s.time));this.Is.Zl(i)}markers(){return this.Is.Gl().map(t=>_s(t,t.originalTime,void 0))}applyOptions(t){this.Is.Eh(t)}options(){return W(this.Is.W())}priceScale(){return this.Zb.priceScale(this.Is.Dt().xa())}createPriceLine(t){const i=R(W(vh),t),s=this.Is.Jl(i);return new wh(s)}removePriceLine(t){this.Is.Ql(t.Yb())}seriesType(){return this.Is.Yh()}attachPrimitive(t){this.Is.ba(t),t.attached&&t.attached({chart:this.Gb,series:this,requestUpdate:()=>this.Is.$t().$l()})}detachPrimitive(t){this.Is.wa(t),t.detached&&t.detached()}Qb(t){this.Xb.M()&&this.Xb.m(t)}}class Sh{constructor(t,i,s){this.iw=new M,this.uu=new M,this.um=new M,this.Hi=t,this.wl=t.St(),this.Um=i,this.wl.Ku().l(this.nw.bind(this)),this.wl.Zu().l(this.sw.bind(this)),this.Um.Mm().l(this.ew.bind(this)),this.N_=s}S(){this.wl.Ku().p(this),this.wl.Zu().p(this),this.Um.Mm().p(this),this.iw.S(),this.uu.S(),this.um.S()}scrollPosition(){return this.wl.Lu()}scrollToPosition(t,i){i?this.wl.qu(t,1e3):this.Hi.Zn(t)}scrollToRealTime(){this.wl.Uu()}getVisibleRange(){const t=this.wl.yu();return t===null?null:{from:t.from.originalTime,to:t.to.originalTime}}setVisibleRange(t){const i={from:this.N_.convertHorzItemToInternal(t.from),to:this.N_.convertHorzItemToInternal(t.to)},s=this.wl.Ru(i);this.Hi.ad(s)}getVisibleLogicalRange(){const t=this.wl.ku();return t===null?null:{from:t.Rs(),to:t.ui()}}setVisibleLogicalRange(t){A(t.from<=t.to,"The from index cannot be after the to index."),this.Hi.ad(t)}resetTimeScale(){this.Hi.Xn()}fitContent(){this.Hi.Qu()}logicalToCoordinate(t){const i=this.Hi.St();return i.Ei()?null:i.It(t)}coordinateToLogical(t){return this.wl.Ei()?null:this.wl.Vu(t)}timeToCoordinate(t){const i=this.N_.convertHorzItemToInternal(t),s=this.wl.ya(i,!1);return s===null?null:this.wl.It(s)}coordinateToTime(t){const i=this.Hi.St(),s=i.Vu(t),e=i.$i(s);return e===null?null:e.originalTime}width(){return this.Um.Up().width}height(){return this.Um.Up().height}subscribeVisibleTimeRangeChange(t){this.iw.l(t)}unsubscribeVisibleTimeRangeChange(t){this.iw.v(t)}subscribeVisibleLogicalRangeChange(t){this.uu.l(t)}unsubscribeVisibleLogicalRangeChange(t){this.uu.v(t)}subscribeSizeChange(t){this.um.l(t)}unsubscribeSizeChange(t){this.um.v(t)}applyOptions(t){this.wl.Eh(t)}options(){return Object.assign(Object.assign({},W(this.wl.W())),{barSpacing:this.wl.ee()})}nw(){this.iw.M()&&this.iw.m(this.getVisibleRange())}sw(){this.uu.M()&&this.uu.m(this.getVisibleLogicalRange())}ew(t){this.um.m(t.width,t.height)}}function yh(n){if(n===void 0||n.type==="custom")return;const t=n;t.minMove!==void 0&&t.precision===void 0&&(t.precision=function(i){if(i>=1)return 0;let s=0;for(;s<8;s++){const e=Math.round(i);if(Math.abs(e-i)<1e-8)return s;i*=10}return s}(t.minMove))}function Ss(n){return function(t){if(dt(t.handleScale)){const s=t.handleScale;t.handleScale={axisDoubleClickReset:{time:s,price:s},axisPressedMouseMove:{time:s,price:s},mouseWheel:s,pinch:s}}else if(t.handleScale!==void 0){const{axisPressedMouseMove:s,axisDoubleClickReset:e}=t.handleScale;dt(s)&&(t.handleScale.axisPressedMouseMove={time:s,price:s}),dt(e)&&(t.handleScale.axisDoubleClickReset={time:e,price:e})}const i=t.handleScroll;dt(i)&&(t.handleScroll={horzTouchDrag:i,vertTouchDrag:i,mouseWheel:i,pressedMouseMove:i})}(n),n}class Mh{constructor(t,i,s){this.rw=new Map,this.hw=new Map,this.lw=new M,this.aw=new M,this.ow=new M,this._w=new rh(i);const e=s===void 0?W(ws()):R(W(ws()),Ss(s));this.N_=i,this.Ub=new th(t,e,i),this.Ub.Wp().l(r=>{this.lw.M()&&this.lw.m(this.uw(r()))},this),this.Ub.jp().l(r=>{this.aw.M()&&this.aw.m(this.uw(r()))},this),this.Ub.jc().l(r=>{this.ow.M()&&this.ow.m(this.uw(r()))},this);const h=this.Ub.$t();this.cw=new Sh(h,this.Ub.Gm(),this.N_)}remove(){this.Ub.Wp().p(this),this.Ub.jp().p(this),this.Ub.jc().p(this),this.cw.S(),this.Ub.S(),this.rw.clear(),this.hw.clear(),this.lw.S(),this.aw.S(),this.ow.S(),this._w.S()}resize(t,i,s){this.autoSizeActive()||this.Ub.Ym(t,i,s)}addCustomSeries(t,i){const s=X(t),e=Object.assign(Object.assign({},ys),s.defaultOptions());return this.dw("Custom",e,i,s)}addAreaSeries(t){return this.dw("Area",le,t)}addBaselineSeries(t){return this.dw("Baseline",oe,t)}addBarSeries(t){return this.dw("Bar",he,t)}addCandlestickSeries(t={}){return function(i){i.borderColor!==void 0&&(i.borderUpColor=i.borderColor,i.borderDownColor=i.borderColor),i.wickColor!==void 0&&(i.wickUpColor=i.wickColor,i.wickDownColor=i.wickColor)}(t),this.dw("Candlestick",ne,t)}addHistogramSeries(t){return this.dw("Histogram",ue,t)}addLineSeries(t){return this.dw("Line",re,t)}removeSeries(t){const i=O(this.rw.get(t)),s=this._w.ld(i);this.Ub.$t().ld(i),this.fw(s),this.rw.delete(t),this.hw.delete(i)}Jb(t,i){this.fw(this._w.Vb(t,i))}tw(t,i){this.fw(this._w.Eb(t,i))}subscribeClick(t){this.lw.l(t)}unsubscribeClick(t){this.lw.v(t)}subscribeCrosshairMove(t){this.ow.l(t)}unsubscribeCrosshairMove(t){this.ow.v(t)}subscribeDblClick(t){this.aw.l(t)}unsubscribeDblClick(t){this.aw.v(t)}priceScale(t){return new gh(this.Ub,t)}timeScale(){return this.cw}applyOptions(t){this.Ub.Eh(Ss(t))}options(){return this.Ub.W()}takeScreenshot(){return this.Ub.ib()}autoSizeActive(){return this.Ub.hb()}chartElement(){return this.Ub.lb()}paneSize(){const t=this.Ub.ob();return{height:t.height,width:t.width}}setCrosshairPosition(t,i,s){const e=this.rw.get(s);if(e===void 0)return;const h=this.Ub.$t()._r(e);h!==null&&this.Ub.$t().td(t,i,h)}clearCrosshairPosition(){this.Ub.$t().nd(!0)}dw(t,i,s={},e){yh(s.priceFormat);const h=R(W(Ms),W(i),s),r=this.Ub.$t().rd(t,h,e),l=new _h(r,this,this,this,this.N_);return this.rw.set(l,r),this.hw.set(r,l),l}fw(t){const i=this.Ub.$t();i.sd(t.St.Au,t.St.Hb,t.St.$b),t.Wb.forEach((s,e)=>e.J(s.We,s.jb)),i.Iu()}pw(t){return O(this.hw.get(t))}uw(t){const i=new Map;t.xb.forEach((e,h)=>{const r=h.Yh(),l=ci(r)(e);if(r!=="Custom")A(function(o){return o.open!==void 0||o.value!==void 0}(l));else{const o=h.Ma();A(!o||o(l)===!1)}i.set(this.pw(h),l)});const s=t.Mb===void 0?void 0:this.pw(t.Mb);return{time:t.wb,logical:t.ie,point:t.gb,hoveredSeries:s,hoveredObjectId:t.Sb,seriesData:i,sourceEvent:t.kb}}}function zh(n,t,i){let s;if(at(n)){const h=document.getElementById(n);A(h!==null,`Cannot find element in DOM with id=${n}`),s=h}else s=n;const e=new Mh(s,t,i);return t.setOptions(e.options()),e}function kh(n,t){return zh(n,new ls,ls.Pd(t))}Object.assign(Object.assign({},Ms),ys);const xh={class:"dark:bg-gray-700 bg-white grid grid-cols-1 gap-6 border dark:border-gray-600 rounded py-4 px-6"},Ch={class:"text-sm font-medium text-gray-500 dark:text-gray-400 truncate"},Eh={class:"text-sm font-semibold text-gray-900 dark:text-gray-100"},Th=Qs({__name:"KeyValueTableSimple",props:{data:{}},setup(n){return(t,i)=>(It(),Dt("dl",xh,[(It(!0),Dt(Xs,null,qs(t.data,(s,e)=>(It(),Dt("div",{key:e,class:"flex justify-between items-center"},[Oi("div",Ch,ki(s[0]),1),Oi("div",Eh,ki(s[1]),1)]))),128))]))}}),Nh={width:800,height:380,crosshair:{mode:hi.Normal}},Rh={chart:{layout:{background:{color:"#ffffff"},textColor:"rgba(33, 56, 77, 1)"},grid:{vertLines:{color:"#f1f1f1",visible:!1},horzLines:{color:"#f1f1f1",visible:!1}},priceScale:{borderColor:"rgba(197, 203, 206, 0.6)"},timeScale:{borderColor:"rgba(197, 203, 206, 0.6)",timeVisible:!0,secondsVisible:!1}}},Bh={chart:{layout:{background:{color:"#333333"},textColor:"#D1D5DB"},grid:{vertLines:{color:"#525252",visible:!1},horzLines:{color:"#525252",visible:!1}},priceScale:{borderColor:"#525252"},timeScale:{borderColor:"#525252",timeVisible:!0,secondsVisible:!1}}};export{kh as T,Th as _,Bh as d,Rh as l,Nh as s}; diff --git a/jesse/static/_nuxt/B2Cf9XSq.js b/jesse/static/_nuxt/B2Cf9XSq.js new file mode 100644 index 000000000..9c75dbe3a --- /dev/null +++ b/jesse/static/_nuxt/B2Cf9XSq.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={comments:{blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"[",close:"]"},{open:"{",close:"}"},{open:"(",close:")"},{open:"(*",close:"*)"},{open:"<*",close:"*>"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}]},o={defaultToken:"",tokenPostfix:".m3",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["AND","ANY","ARRAY","AS","BEGIN","BITS","BRANDED","BY","CASE","CONST","DIV","DO","ELSE","ELSIF","END","EVAL","EXCEPT","EXCEPTION","EXIT","EXPORTS","FINALLY","FOR","FROM","GENERIC","IF","IMPORT","IN","INTERFACE","LOCK","LOOP","METHODS","MOD","MODULE","NOT","OBJECT","OF","OR","OVERRIDES","PROCEDURE","RAISE","RAISES","READONLY","RECORD","REF","REPEAT","RETURN","REVEAL","SET","THEN","TO","TRY","TYPE","TYPECASE","UNSAFE","UNTIL","UNTRACED","VALUE","VAR","WHILE","WITH"],reservedConstNames:["ABS","ADR","ADRSIZE","BITSIZE","BYTESIZE","CEILING","DEC","DISPOSE","FALSE","FIRST","FLOAT","FLOOR","INC","ISTYPE","LAST","LOOPHOLE","MAX","MIN","NARROW","NEW","NIL","NUMBER","ORD","ROUND","SUBARRAY","TRUE","TRUNC","TYPECODE","VAL"],reservedTypeNames:["ADDRESS","ANY","BOOLEAN","CARDINAL","CHAR","EXTENDED","INTEGER","LONGCARD","LONGINT","LONGREAL","MUTEX","NULL","REAL","REFANY","ROOT","TEXT"],operators:["+","-","*","/","&","^","."],relations:["=","#","<","<=",">",">=","<:",":"],delimiters:["|","..","=>",",",";",":="],symbols:/[>=<#.,:;+\-*/&^]+/,escapes:/\\(?:[\\fnrt"']|[0-7]{3})/,tokenizer:{root:[[/_\w*/,"invalid"],[/[a-zA-Z][a-zA-Z0-9_]*/,{cases:{"@keywords":{token:"keyword.$0"},"@reservedConstNames":{token:"constant.reserved.$0"},"@reservedTypeNames":{token:"type.reserved.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[0-9]+\.[0-9]+(?:[DdEeXx][\+\-]?[0-9]+)?/,"number.float"],[/[0-9]+(?:\_[0-9a-fA-F]+)?L?/,"number"],[/@symbols/,{cases:{"@operators":"operators","@relations":"operators","@delimiters":"delimiter","@default":"invalid"}}],[/'[^\\']'/,"string.char"],[/(')(@escapes)(')/,["string.char","string.escape","string.char"]],[/'/,"invalid"],[/"([^"\\]|\\.)*$/,"invalid"],[/"/,"string.text","@text"]],text:[[/[^\\"]+/,"string.text"],[/@escapes/,"string.escape"],[/\\./,"invalid"],[/"/,"string.text","@pop"]],comment:[[/\(\*/,"comment","@push"],[/\*\)/,"comment","@pop"],[/./,"comment"]],pragma:[[/<\*/,"keyword.pragma","@push"],[/\*>/,"keyword.pragma","@pop"],[/./,"keyword.pragma"]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/<\*/,"keyword.pragma","@pragma"]]}};export{e as conf,o as language}; diff --git a/jesse/static/_nuxt/B31BOzhO.js b/jesse/static/_nuxt/B31BOzhO.js new file mode 100644 index 000000000..34f47fa6f --- /dev/null +++ b/jesse/static/_nuxt/B31BOzhO.js @@ -0,0 +1,9 @@ +import{m as et}from"./Bgthz7Nd.js";import"./qzODIPNV.js";/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var tt=Object.defineProperty,nt=Object.getOwnPropertyDescriptor,rt=Object.getOwnPropertyNames,it=Object.prototype.hasOwnProperty,at=(e,r,i,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of rt(r))!it.call(e,t)&&t!==i&&tt(e,t,{get:()=>r[t],enumerable:!(n=nt(r,t))||n.enumerable});return e},ot=(e,r,i)=>(at(e,r,"default"),i),d={};ot(d,et);var st=2*60*1e3,ut=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&(this._worker.dispose(),this._worker=null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){if(!this._worker)return;Date.now()-this._lastUsedTime>st&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||(this._worker=d.editor.createWebWorker({moduleId:"vs/language/css/cssWorker",label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._client=this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let r;return this._getClient().then(i=>{r=i}).then(i=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(i=>r)}},T;(function(e){function r(i){return typeof i=="string"}e.is=r})(T||(T={}));var O;(function(e){function r(i){return typeof i=="string"}e.is=r})(O||(O={}));var Y;(function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647;function r(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=r})(Y||(Y={}));var M;(function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647;function r(i){return typeof i=="number"&&e.MIN_VALUE<=i&&i<=e.MAX_VALUE}e.is=r})(M||(M={}));var w;(function(e){function r(n,t){return n===Number.MAX_VALUE&&(n=M.MAX_VALUE),t===Number.MAX_VALUE&&(t=M.MAX_VALUE),{line:n,character:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&o.uinteger(t.line)&&o.uinteger(t.character)}e.is=i})(w||(w={}));var h;(function(e){function r(n,t,a,s){if(o.uinteger(n)&&o.uinteger(t)&&o.uinteger(a)&&o.uinteger(s))return{start:w.create(n,t),end:w.create(a,s)};if(w.is(n)&&w.is(t))return{start:n,end:t};throw new Error(`Range#create called with invalid arguments[${n}, ${t}, ${a}, ${s}]`)}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&w.is(t.start)&&w.is(t.end)}e.is=i})(h||(h={}));var C;(function(e){function r(n,t){return{uri:n,range:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.range)&&(o.string(t.uri)||o.undefined(t.uri))}e.is=i})(C||(C={}));var Z;(function(e){function r(n,t,a,s){return{targetUri:n,targetRange:t,targetSelectionRange:a,originSelectionRange:s}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.targetRange)&&o.string(t.targetUri)&&h.is(t.targetSelectionRange)&&(h.is(t.originSelectionRange)||o.undefined(t.originSelectionRange))}e.is=i})(Z||(Z={}));var S;(function(e){function r(n,t,a,s){return{red:n,green:t,blue:a,alpha:s}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.numberRange(t.red,0,1)&&o.numberRange(t.green,0,1)&&o.numberRange(t.blue,0,1)&&o.numberRange(t.alpha,0,1)}e.is=i})(S||(S={}));var K;(function(e){function r(n,t){return{range:n,color:t}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&h.is(t.range)&&S.is(t.color)}e.is=i})(K||(K={}));var ee;(function(e){function r(n,t,a){return{label:n,textEdit:t,additionalTextEdits:a}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.string(t.label)&&(o.undefined(t.textEdit)||E.is(t))&&(o.undefined(t.additionalTextEdits)||o.typedArray(t.additionalTextEdits,E.is))}e.is=i})(ee||(ee={}));var A;(function(e){e.Comment="comment",e.Imports="imports",e.Region="region"})(A||(A={}));var te;(function(e){function r(n,t,a,s,u,l){const c={startLine:n,endLine:t};return o.defined(a)&&(c.startCharacter=a),o.defined(s)&&(c.endCharacter=s),o.defined(u)&&(c.kind=u),o.defined(l)&&(c.collapsedText=l),c}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.uinteger(t.startLine)&&o.uinteger(t.startLine)&&(o.undefined(t.startCharacter)||o.uinteger(t.startCharacter))&&(o.undefined(t.endCharacter)||o.uinteger(t.endCharacter))&&(o.undefined(t.kind)||o.string(t.kind))}e.is=i})(te||(te={}));var U;(function(e){function r(n,t){return{location:n,message:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&C.is(t.location)&&o.string(t.message)}e.is=i})(U||(U={}));var x;(function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4})(x||(x={}));var ne;(function(e){e.Unnecessary=1,e.Deprecated=2})(ne||(ne={}));var re;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&o.string(n.href)}e.is=r})(re||(re={}));var y;(function(e){function r(n,t,a,s,u,l){let c={range:n,message:t};return o.defined(a)&&(c.severity=a),o.defined(s)&&(c.code=s),o.defined(u)&&(c.source=u),o.defined(l)&&(c.relatedInformation=l),c}e.create=r;function i(n){var t;let a=n;return o.defined(a)&&h.is(a.range)&&o.string(a.message)&&(o.number(a.severity)||o.undefined(a.severity))&&(o.integer(a.code)||o.string(a.code)||o.undefined(a.code))&&(o.undefined(a.codeDescription)||o.string((t=a.codeDescription)===null||t===void 0?void 0:t.href))&&(o.string(a.source)||o.undefined(a.source))&&(o.undefined(a.relatedInformation)||o.typedArray(a.relatedInformation,U.is))}e.is=i})(y||(y={}));var I;(function(e){function r(n,t,...a){let s={title:n,command:t};return o.defined(a)&&a.length>0&&(s.arguments=a),s}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.title)&&o.string(t.command)}e.is=i})(I||(I={}));var E;(function(e){function r(a,s){return{range:a,newText:s}}e.replace=r;function i(a,s){return{range:{start:a,end:a},newText:s}}e.insert=i;function n(a){return{range:a,newText:""}}e.del=n;function t(a){const s=a;return o.objectLiteral(s)&&o.string(s.newText)&&h.is(s.range)}e.is=t})(E||(E={}));var V;(function(e){function r(n,t,a){const s={label:n};return t!==void 0&&(s.needsConfirmation=t),a!==void 0&&(s.description=a),s}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&o.string(t.label)&&(o.boolean(t.needsConfirmation)||t.needsConfirmation===void 0)&&(o.string(t.description)||t.description===void 0)}e.is=i})(V||(V={}));var L;(function(e){function r(i){const n=i;return o.string(n)}e.is=r})(L||(L={}));var ie;(function(e){function r(a,s,u){return{range:a,newText:s,annotationId:u}}e.replace=r;function i(a,s,u){return{range:{start:a,end:a},newText:s,annotationId:u}}e.insert=i;function n(a,s){return{range:a,newText:"",annotationId:s}}e.del=n;function t(a){const s=a;return E.is(s)&&(V.is(s.annotationId)||L.is(s.annotationId))}e.is=t})(ie||(ie={}));var W;(function(e){function r(n,t){return{textDocument:n,edits:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&B.is(t.textDocument)&&Array.isArray(t.edits)}e.is=i})(W||(W={}));var H;(function(e){function r(n,t,a){let s={kind:"create",uri:n};return t!==void 0&&(t.overwrite!==void 0||t.ignoreIfExists!==void 0)&&(s.options=t),a!==void 0&&(s.annotationId=a),s}e.create=r;function i(n){let t=n;return t&&t.kind==="create"&&o.string(t.uri)&&(t.options===void 0||(t.options.overwrite===void 0||o.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||o.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(H||(H={}));var X;(function(e){function r(n,t,a,s){let u={kind:"rename",oldUri:n,newUri:t};return a!==void 0&&(a.overwrite!==void 0||a.ignoreIfExists!==void 0)&&(u.options=a),s!==void 0&&(u.annotationId=s),u}e.create=r;function i(n){let t=n;return t&&t.kind==="rename"&&o.string(t.oldUri)&&o.string(t.newUri)&&(t.options===void 0||(t.options.overwrite===void 0||o.boolean(t.options.overwrite))&&(t.options.ignoreIfExists===void 0||o.boolean(t.options.ignoreIfExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})(X||(X={}));var $;(function(e){function r(n,t,a){let s={kind:"delete",uri:n};return t!==void 0&&(t.recursive!==void 0||t.ignoreIfNotExists!==void 0)&&(s.options=t),a!==void 0&&(s.annotationId=a),s}e.create=r;function i(n){let t=n;return t&&t.kind==="delete"&&o.string(t.uri)&&(t.options===void 0||(t.options.recursive===void 0||o.boolean(t.options.recursive))&&(t.options.ignoreIfNotExists===void 0||o.boolean(t.options.ignoreIfNotExists)))&&(t.annotationId===void 0||L.is(t.annotationId))}e.is=i})($||($={}));var z;(function(e){function r(i){let n=i;return n&&(n.changes!==void 0||n.documentChanges!==void 0)&&(n.documentChanges===void 0||n.documentChanges.every(t=>o.string(t.kind)?H.is(t)||X.is(t)||$.is(t):W.is(t)))}e.is=r})(z||(z={}));var ae;(function(e){function r(n){return{uri:n}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)}e.is=i})(ae||(ae={}));var oe;(function(e){function r(n,t){return{uri:n,version:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&o.integer(t.version)}e.is=i})(oe||(oe={}));var B;(function(e){function r(n,t){return{uri:n,version:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&(t.version===null||o.integer(t.version))}e.is=i})(B||(B={}));var se;(function(e){function r(n,t,a,s){return{uri:n,languageId:t,version:a,text:s}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.string(t.uri)&&o.string(t.languageId)&&o.integer(t.version)&&o.string(t.text)}e.is=i})(se||(se={}));var q;(function(e){e.PlainText="plaintext",e.Markdown="markdown";function r(i){const n=i;return n===e.PlainText||n===e.Markdown}e.is=r})(q||(q={}));var P;(function(e){function r(i){const n=i;return o.objectLiteral(i)&&q.is(n.kind)&&o.string(n.value)}e.is=r})(P||(P={}));var p;(function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25})(p||(p={}));var Q;(function(e){e.PlainText=1,e.Snippet=2})(Q||(Q={}));var ue;(function(e){e.Deprecated=1})(ue||(ue={}));var ce;(function(e){function r(n,t,a){return{newText:n,insert:t,replace:a}}e.create=r;function i(n){const t=n;return t&&o.string(t.newText)&&h.is(t.insert)&&h.is(t.replace)}e.is=i})(ce||(ce={}));var de;(function(e){e.asIs=1,e.adjustIndentation=2})(de||(de={}));var fe;(function(e){function r(i){const n=i;return n&&(o.string(n.detail)||n.detail===void 0)&&(o.string(n.description)||n.description===void 0)}e.is=r})(fe||(fe={}));var le;(function(e){function r(i){return{label:i}}e.create=r})(le||(le={}));var ge;(function(e){function r(i,n){return{items:i||[],isIncomplete:!!n}}e.create=r})(ge||(ge={}));var F;(function(e){function r(n){return n.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}e.fromPlainText=r;function i(n){const t=n;return o.string(t)||o.objectLiteral(t)&&o.string(t.language)&&o.string(t.value)}e.is=i})(F||(F={}));var he;(function(e){function r(i){let n=i;return!!n&&o.objectLiteral(n)&&(P.is(n.contents)||F.is(n.contents)||o.typedArray(n.contents,F.is))&&(i.range===void 0||h.is(i.range))}e.is=r})(he||(he={}));var pe;(function(e){function r(i,n){return n?{label:i,documentation:n}:{label:i}}e.create=r})(pe||(pe={}));var ve;(function(e){function r(i,n,...t){let a={label:i};return o.defined(n)&&(a.documentation=n),o.defined(t)?a.parameters=t:a.parameters=[],a}e.create=r})(ve||(ve={}));var R;(function(e){e.Text=1,e.Read=2,e.Write=3})(R||(R={}));var me;(function(e){function r(i,n){let t={range:i};return o.number(n)&&(t.kind=n),t}e.create=r})(me||(me={}));var v;(function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26})(v||(v={}));var _e;(function(e){e.Deprecated=1})(_e||(_e={}));var be;(function(e){function r(i,n,t,a,s){let u={name:i,kind:n,location:{uri:a,range:t}};return s&&(u.containerName=s),u}e.create=r})(be||(be={}));var we;(function(e){function r(i,n,t,a){return a!==void 0?{name:i,kind:n,location:{uri:t,range:a}}:{name:i,kind:n,location:{uri:t}}}e.create=r})(we||(we={}));var ke;(function(e){function r(n,t,a,s,u,l){let c={name:n,detail:t,kind:a,range:s,selectionRange:u};return l!==void 0&&(c.children=l),c}e.create=r;function i(n){let t=n;return t&&o.string(t.name)&&o.number(t.kind)&&h.is(t.range)&&h.is(t.selectionRange)&&(t.detail===void 0||o.string(t.detail))&&(t.deprecated===void 0||o.boolean(t.deprecated))&&(t.children===void 0||Array.isArray(t.children))&&(t.tags===void 0||Array.isArray(t.tags))}e.is=i})(ke||(ke={}));var xe;(function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"})(xe||(xe={}));var j;(function(e){e.Invoked=1,e.Automatic=2})(j||(j={}));var Ie;(function(e){function r(n,t,a){let s={diagnostics:n};return t!=null&&(s.only=t),a!=null&&(s.triggerKind=a),s}e.create=r;function i(n){let t=n;return o.defined(t)&&o.typedArray(t.diagnostics,y.is)&&(t.only===void 0||o.typedArray(t.only,o.string))&&(t.triggerKind===void 0||t.triggerKind===j.Invoked||t.triggerKind===j.Automatic)}e.is=i})(Ie||(Ie={}));var Ee;(function(e){function r(n,t,a){let s={title:n},u=!0;return typeof t=="string"?(u=!1,s.kind=t):I.is(t)?s.command=t:s.edit=t,u&&a!==void 0&&(s.kind=a),s}e.create=r;function i(n){let t=n;return t&&o.string(t.title)&&(t.diagnostics===void 0||o.typedArray(t.diagnostics,y.is))&&(t.kind===void 0||o.string(t.kind))&&(t.edit!==void 0||t.command!==void 0)&&(t.command===void 0||I.is(t.command))&&(t.isPreferred===void 0||o.boolean(t.isPreferred))&&(t.edit===void 0||z.is(t.edit))}e.is=i})(Ee||(Ee={}));var Le;(function(e){function r(n,t){let a={range:n};return o.defined(t)&&(a.data=t),a}e.create=r;function i(n){let t=n;return o.defined(t)&&h.is(t.range)&&(o.undefined(t.command)||I.is(t.command))}e.is=i})(Le||(Le={}));var Ae;(function(e){function r(n,t){return{tabSize:n,insertSpaces:t}}e.create=r;function i(n){let t=n;return o.defined(t)&&o.uinteger(t.tabSize)&&o.boolean(t.insertSpaces)}e.is=i})(Ae||(Ae={}));var Re;(function(e){function r(n,t,a){return{range:n,target:t,data:a}}e.create=r;function i(n){let t=n;return o.defined(t)&&h.is(t.range)&&(o.undefined(t.target)||o.string(t.target))}e.is=i})(Re||(Re={}));var Pe;(function(e){function r(n,t){return{range:n,parent:t}}e.create=r;function i(n){let t=n;return o.objectLiteral(t)&&h.is(t.range)&&(t.parent===void 0||e.is(t.parent))}e.is=i})(Pe||(Pe={}));var De;(function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"})(De||(De={}));var Me;(function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"})(Me||(Me={}));var Ce;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&(n.resultId===void 0||typeof n.resultId=="string")&&Array.isArray(n.data)&&(n.data.length===0||typeof n.data[0]=="number")}e.is=r})(Ce||(Ce={}));var ye;(function(e){function r(n,t){return{range:n,text:t}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&o.string(t.text)}e.is=i})(ye||(ye={}));var Fe;(function(e){function r(n,t,a){return{range:n,variableName:t,caseSensitiveLookup:a}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&o.boolean(t.caseSensitiveLookup)&&(o.string(t.variableName)||t.variableName===void 0)}e.is=i})(Fe||(Fe={}));var je;(function(e){function r(n,t){return{range:n,expression:t}}e.create=r;function i(n){const t=n;return t!=null&&h.is(t.range)&&(o.string(t.expression)||t.expression===void 0)}e.is=i})(je||(je={}));var Ne;(function(e){function r(n,t){return{frameId:n,stoppedLocation:t}}e.create=r;function i(n){const t=n;return o.defined(t)&&h.is(n.stoppedLocation)}e.is=i})(Ne||(Ne={}));var G;(function(e){e.Type=1,e.Parameter=2;function r(i){return i===1||i===2}e.is=r})(G||(G={}));var J;(function(e){function r(n){return{value:n}}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&(t.tooltip===void 0||o.string(t.tooltip)||P.is(t.tooltip))&&(t.location===void 0||C.is(t.location))&&(t.command===void 0||I.is(t.command))}e.is=i})(J||(J={}));var Oe;(function(e){function r(n,t,a){const s={position:n,label:t};return a!==void 0&&(s.kind=a),s}e.create=r;function i(n){const t=n;return o.objectLiteral(t)&&w.is(t.position)&&(o.string(t.label)||o.typedArray(t.label,J.is))&&(t.kind===void 0||G.is(t.kind))&&t.textEdits===void 0||o.typedArray(t.textEdits,E.is)&&(t.tooltip===void 0||o.string(t.tooltip)||P.is(t.tooltip))&&(t.paddingLeft===void 0||o.boolean(t.paddingLeft))&&(t.paddingRight===void 0||o.boolean(t.paddingRight))}e.is=i})(Oe||(Oe={}));var Se;(function(e){function r(i){return{kind:"snippet",value:i}}e.createSnippet=r})(Se||(Se={}));var Ue;(function(e){function r(i,n,t,a){return{insertText:i,filterText:n,range:t,command:a}}e.create=r})(Ue||(Ue={}));var Ve;(function(e){function r(i){return{items:i}}e.create=r})(Ve||(Ve={}));var We;(function(e){e.Invoked=0,e.Automatic=1})(We||(We={}));var He;(function(e){function r(i,n){return{range:i,text:n}}e.create=r})(He||(He={}));var Xe;(function(e){function r(i,n){return{triggerKind:i,selectedCompletionInfo:n}}e.create=r})(Xe||(Xe={}));var $e;(function(e){function r(i){const n=i;return o.objectLiteral(n)&&O.is(n.uri)&&o.string(n.name)}e.is=r})($e||($e={}));var ze;(function(e){function r(a,s,u,l){return new ct(a,s,u,l)}e.create=r;function i(a){let s=a;return!!(o.defined(s)&&o.string(s.uri)&&(o.undefined(s.languageId)||o.string(s.languageId))&&o.uinteger(s.lineCount)&&o.func(s.getText)&&o.func(s.positionAt)&&o.func(s.offsetAt))}e.is=i;function n(a,s){let u=a.getText(),l=t(s,(g,_)=>{let b=g.range.start.line-_.range.start.line;return b===0?g.range.start.character-_.range.start.character:b}),c=u.length;for(let g=l.length-1;g>=0;g--){let _=l[g],b=a.offsetAt(_.range.start),f=a.offsetAt(_.range.end);if(f<=c)u=u.substring(0,b)+_.newText+u.substring(f,u.length);else throw new Error("Overlapping edit");c=b}return u}e.applyEdits=n;function t(a,s){if(a.length<=1)return a;const u=a.length/2|0,l=a.slice(0,u),c=a.slice(u);t(l,s),t(c,s);let g=0,_=0,b=0;for(;g0&&e.push(r.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let r=this.getLineOffsets(),i=0,n=r.length;if(n===0)return w.create(0,e);for(;ie?n=a:i=a+1}let t=i-1;return w.create(t,e-r[t])}offsetAt(e){let r=this.getLineOffsets();if(e.line>=r.length)return this._content.length;if(e.line<0)return 0;let i=r[e.line],n=e.line+1"u"}e.undefined=n;function t(f){return f===!0||f===!1}e.boolean=t;function a(f){return r.call(f)==="[object String]"}e.string=a;function s(f){return r.call(f)==="[object Number]"}e.number=s;function u(f,N,Ke){return r.call(f)==="[object Number]"&&N<=f&&f<=Ke}e.numberRange=u;function l(f){return r.call(f)==="[object Number]"&&-2147483648<=f&&f<=2147483647}e.integer=l;function c(f){return r.call(f)==="[object Number]"&&0<=f&&f<=2147483647}e.uinteger=c;function g(f){return r.call(f)==="[object Function]"}e.func=g;function _(f){return f!==null&&typeof f=="object"}e.objectLiteral=_;function b(f,N){return Array.isArray(f)&&f.every(N)}e.typedArray=b})(o||(o={}));var dt=class{constructor(e,r,i){this._languageId=e,this._worker=r,this._disposables=[],this._listener=Object.create(null);const n=a=>{let s=a.getLanguageId();if(s!==this._languageId)return;let u;this._listener[a.uri.toString()]=a.onDidChangeContent(()=>{window.clearTimeout(u),u=window.setTimeout(()=>this._doValidate(a.uri,s),500)}),this._doValidate(a.uri,s)},t=a=>{d.editor.setModelMarkers(a,this._languageId,[]);let s=a.uri.toString(),u=this._listener[s];u&&(u.dispose(),delete this._listener[s])};this._disposables.push(d.editor.onDidCreateModel(n)),this._disposables.push(d.editor.onWillDisposeModel(t)),this._disposables.push(d.editor.onDidChangeModelLanguage(a=>{t(a.model),n(a.model)})),this._disposables.push(i(a=>{d.editor.getModels().forEach(s=>{s.getLanguageId()===this._languageId&&(t(s),n(s))})})),this._disposables.push({dispose:()=>{d.editor.getModels().forEach(t);for(let a in this._listener)this._listener[a].dispose()}}),d.editor.getModels().forEach(n)}dispose(){this._disposables.forEach(e=>e&&e.dispose()),this._disposables.length=0}_doValidate(e,r){this._worker(e).then(i=>i.doValidation(e.toString())).then(i=>{const n=i.map(a=>lt(e,a));let t=d.editor.getModel(e);t&&t.getLanguageId()===r&&d.editor.setModelMarkers(t,r,n)}).then(void 0,i=>{console.error(i)})}};function ft(e){switch(e){case x.Error:return d.MarkerSeverity.Error;case x.Warning:return d.MarkerSeverity.Warning;case x.Information:return d.MarkerSeverity.Info;case x.Hint:return d.MarkerSeverity.Hint;default:return d.MarkerSeverity.Info}}function lt(e,r){let i=typeof r.code=="number"?String(r.code):r.code;return{severity:ft(r.severity),startLineNumber:r.range.start.line+1,startColumn:r.range.start.character+1,endLineNumber:r.range.end.line+1,endColumn:r.range.end.character+1,message:r.message,code:i,source:r.source}}var gt=class{constructor(e,r){this._worker=e,this._triggerCharacters=r}get triggerCharacters(){return this._triggerCharacters}provideCompletionItems(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.doComplete(t.toString(),k(r))).then(a=>{if(!a)return;const s=e.getWordUntilPosition(r),u=new d.Range(r.lineNumber,s.startColumn,r.lineNumber,s.endColumn),l=a.items.map(c=>{const g={label:c.label,insertText:c.insertText||c.label,sortText:c.sortText,filterText:c.filterText,documentation:c.documentation,detail:c.detail,command:vt(c.command),range:u,kind:pt(c.kind)};return c.textEdit&&(ht(c.textEdit)?g.range={insert:m(c.textEdit.insert),replace:m(c.textEdit.replace)}:g.range=m(c.textEdit.range),g.insertText=c.textEdit.newText),c.additionalTextEdits&&(g.additionalTextEdits=c.additionalTextEdits.map(D)),c.insertTextFormat===Q.Snippet&&(g.insertTextRules=d.languages.CompletionItemInsertTextRule.InsertAsSnippet),g});return{isIncomplete:a.isIncomplete,suggestions:l}})}};function k(e){if(e)return{character:e.column-1,line:e.lineNumber-1}}function Qe(e){if(e)return{start:{line:e.startLineNumber-1,character:e.startColumn-1},end:{line:e.endLineNumber-1,character:e.endColumn-1}}}function m(e){if(e)return new d.Range(e.start.line+1,e.start.character+1,e.end.line+1,e.end.character+1)}function ht(e){return typeof e.insert<"u"&&typeof e.replace<"u"}function pt(e){const r=d.languages.CompletionItemKind;switch(e){case p.Text:return r.Text;case p.Method:return r.Method;case p.Function:return r.Function;case p.Constructor:return r.Constructor;case p.Field:return r.Field;case p.Variable:return r.Variable;case p.Class:return r.Class;case p.Interface:return r.Interface;case p.Module:return r.Module;case p.Property:return r.Property;case p.Unit:return r.Unit;case p.Value:return r.Value;case p.Enum:return r.Enum;case p.Keyword:return r.Keyword;case p.Snippet:return r.Snippet;case p.Color:return r.Color;case p.File:return r.File;case p.Reference:return r.Reference}return r.Property}function D(e){if(e)return{range:m(e.range),text:e.newText}}function vt(e){return e&&e.command==="editor.action.triggerSuggest"?{id:e.command,title:e.title,arguments:e.arguments}:void 0}var mt=class{constructor(e){this._worker=e}provideHover(e,r,i){let n=e.uri;return this._worker(n).then(t=>t.doHover(n.toString(),k(r))).then(t=>{if(t)return{range:m(t.range),contents:bt(t.contents)}})}};function _t(e){return e&&typeof e=="object"&&typeof e.kind=="string"}function Be(e){return typeof e=="string"?{value:e}:_t(e)?e.kind==="plaintext"?{value:e.value.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}:{value:e.value}:{value:"```"+e.language+` +`+e.value+"\n```\n"}}function bt(e){if(e)return Array.isArray(e)?e.map(Be):[Be(e)]}var wt=class{constructor(e){this._worker=e}provideDocumentHighlights(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.findDocumentHighlights(n.toString(),k(r))).then(t=>{if(t)return t.map(a=>({range:m(a.range),kind:kt(a.kind)}))})}};function kt(e){switch(e){case R.Read:return d.languages.DocumentHighlightKind.Read;case R.Write:return d.languages.DocumentHighlightKind.Write;case R.Text:return d.languages.DocumentHighlightKind.Text}return d.languages.DocumentHighlightKind.Text}var xt=class{constructor(e){this._worker=e}provideDefinition(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.findDefinition(n.toString(),k(r))).then(t=>{if(t)return[Ge(t)]})}};function Ge(e){return{uri:d.Uri.parse(e.uri),range:m(e.range)}}var It=class{constructor(e){this._worker=e}provideReferences(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.findReferences(t.toString(),k(r))).then(a=>{if(a)return a.map(Ge)})}},Et=class{constructor(e){this._worker=e}provideRenameEdits(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.doRename(t.toString(),k(r),i)).then(a=>Lt(a))}};function Lt(e){if(!e||!e.changes)return;let r=[];for(let i in e.changes){const n=d.Uri.parse(i);for(let t of e.changes[i])r.push({resource:n,versionId:void 0,textEdit:{range:m(t.range),text:t.newText}})}return{edits:r}}var At=class{constructor(e){this._worker=e}provideDocumentSymbols(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentSymbols(i.toString())).then(n=>{if(n)return n.map(t=>Rt(t)?Je(t):{name:t.name,detail:"",containerName:t.containerName,kind:Te(t.kind),range:m(t.location.range),selectionRange:m(t.location.range),tags:[]})})}};function Rt(e){return"children"in e}function Je(e){return{name:e.name,detail:e.detail??"",kind:Te(e.kind),range:m(e.range),selectionRange:m(e.selectionRange),tags:e.tags??[],children:(e.children??[]).map(r=>Je(r))}}function Te(e){let r=d.languages.SymbolKind;switch(e){case v.File:return r.File;case v.Module:return r.Module;case v.Namespace:return r.Namespace;case v.Package:return r.Package;case v.Class:return r.Class;case v.Method:return r.Method;case v.Property:return r.Property;case v.Field:return r.Field;case v.Constructor:return r.Constructor;case v.Enum:return r.Enum;case v.Interface:return r.Interface;case v.Function:return r.Function;case v.Variable:return r.Variable;case v.Constant:return r.Constant;case v.String:return r.String;case v.Number:return r.Number;case v.Boolean:return r.Boolean;case v.Array:return r.Array}return r.Function}var Ot=class{constructor(e){this._worker=e}provideLinks(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentLinks(i.toString())).then(n=>{if(n)return{links:n.map(t=>({range:m(t.range),url:t.target}))}})}},Pt=class{constructor(e){this._worker=e}provideDocumentFormattingEdits(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.format(n.toString(),null,Ye(r)).then(a=>{if(!(!a||a.length===0))return a.map(D)}))}},Dt=class{constructor(e){this._worker=e,this.canFormatMultipleRanges=!1}provideDocumentRangeFormattingEdits(e,r,i,n){const t=e.uri;return this._worker(t).then(a=>a.format(t.toString(),Qe(r),Ye(i)).then(s=>{if(!(!s||s.length===0))return s.map(D)}))}};function Ye(e){return{tabSize:e.tabSize,insertSpaces:e.insertSpaces}}var Mt=class{constructor(e){this._worker=e}provideDocumentColors(e,r){const i=e.uri;return this._worker(i).then(n=>n.findDocumentColors(i.toString())).then(n=>{if(n)return n.map(t=>({color:t.color,range:m(t.range)}))})}provideColorPresentations(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getColorPresentations(n.toString(),r.color,Qe(r.range))).then(t=>{if(t)return t.map(a=>{let s={label:a.label};return a.textEdit&&(s.textEdit=D(a.textEdit)),a.additionalTextEdits&&(s.additionalTextEdits=a.additionalTextEdits.map(D)),s})})}},Ct=class{constructor(e){this._worker=e}provideFoldingRanges(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getFoldingRanges(n.toString(),r)).then(t=>{if(t)return t.map(a=>{const s={start:a.startLine+1,end:a.endLine+1};return typeof a.kind<"u"&&(s.kind=yt(a.kind)),s})})}};function yt(e){switch(e){case A.Comment:return d.languages.FoldingRangeKind.Comment;case A.Imports:return d.languages.FoldingRangeKind.Imports;case A.Region:return d.languages.FoldingRangeKind.Region}}var Ft=class{constructor(e){this._worker=e}provideSelectionRanges(e,r,i){const n=e.uri;return this._worker(n).then(t=>t.getSelectionRanges(n.toString(),r.map(k))).then(t=>{if(t)return t.map(a=>{const s=[];for(;a;)s.push({range:m(a.range)}),a=a.parent;return s})})}};function St(e){const r=[],i=[],n=new ut(e);r.push(n);const t=(...s)=>n.getLanguageServiceWorker(...s);function a(){const{languageId:s,modeConfiguration:u}=e;Ze(i),u.completionItems&&i.push(d.languages.registerCompletionItemProvider(s,new gt(t,["/","-",":"]))),u.hovers&&i.push(d.languages.registerHoverProvider(s,new mt(t))),u.documentHighlights&&i.push(d.languages.registerDocumentHighlightProvider(s,new wt(t))),u.definitions&&i.push(d.languages.registerDefinitionProvider(s,new xt(t))),u.references&&i.push(d.languages.registerReferenceProvider(s,new It(t))),u.documentSymbols&&i.push(d.languages.registerDocumentSymbolProvider(s,new At(t))),u.rename&&i.push(d.languages.registerRenameProvider(s,new Et(t))),u.colors&&i.push(d.languages.registerColorProvider(s,new Mt(t))),u.foldingRanges&&i.push(d.languages.registerFoldingRangeProvider(s,new Ct(t))),u.diagnostics&&i.push(new dt(s,t,e.onDidChange)),u.selectionRanges&&i.push(d.languages.registerSelectionRangeProvider(s,new Ft(t))),u.documentFormattingEdits&&i.push(d.languages.registerDocumentFormattingEditProvider(s,new Pt(t))),u.documentRangeFormattingEdits&&i.push(d.languages.registerDocumentRangeFormattingEditProvider(s,new Dt(t)))}return a(),r.push(qe(i)),qe(r)}function qe(e){return{dispose:()=>Ze(e)}}function Ze(e){for(;e.length;)e.pop().dispose()}export{gt as CompletionAdapter,xt as DefinitionAdapter,dt as DiagnosticsAdapter,Mt as DocumentColorAdapter,Pt as DocumentFormattingEditProvider,wt as DocumentHighlightAdapter,Ot as DocumentLinkAdapter,Dt as DocumentRangeFormattingEditProvider,At as DocumentSymbolAdapter,Ct as FoldingRangeAdapter,mt as HoverAdapter,It as ReferenceAdapter,Et as RenameAdapter,Ft as SelectionRangeAdapter,ut as WorkerManager,k as fromPosition,Qe as fromRange,St as setupMode,m as toRange,D as toTextEdit}; diff --git a/jesse/static/_nuxt/B4VqtPa2.js b/jesse/static/_nuxt/B4VqtPa2.js new file mode 100644 index 000000000..54944eb63 --- /dev/null +++ b/jesse/static/_nuxt/B4VqtPa2.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}]},t={defaultToken:"",tokenPostfix:".aes",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["contract","library","entrypoint","function","stateful","state","hash","signature","tuple","list","address","string","bool","int","record","datatype","type","option","oracle","oracle_query","Call","Bits","Bytes","Oracle","String","Crypto","Address","Auth","Chain","None","Some","bits","bytes","event","let","map","private","public","true","false","var","if","else","throw"],operators:["=",">","<","!","~","?","::",":","==","<=",">=","!=","&&","||","++","--","+","-","*","/","&","|","^","%","<<",">>",">>>","+=","-=","*=","/=","&=","|=","^=","%=","<<=",">>=",">>>="],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/,"number.float"],[/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/,"number.float"],[/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/,"number.hex"],[/0[0-7']*[0-7](@integersuffix)/,"number.octal"],[/0[bB][0-1']*[0-1](@integersuffix)/,"number.binary"],[/\d[\d']*\d(@integersuffix)/,"number"],[/\d(@integersuffix)/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],whitespace:[[/[ \t\r\n]+/,""],[/\/\*\*(?!\/)/,"comment.doc","@doccomment"],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]],comment:[[/[^\/*]+/,"comment"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],doccomment:[[/[^\/*]+/,"comment.doc"],[/\*\//,"comment.doc","@pop"],[/[\/*]/,"comment.doc"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]]}};export{e as conf,t as language}; diff --git a/jesse/static/_nuxt/B54YYhIE.js b/jesse/static/_nuxt/B54YYhIE.js new file mode 100644 index 000000000..d225905f3 --- /dev/null +++ b/jesse/static/_nuxt/B54YYhIE.js @@ -0,0 +1 @@ +import{_ as t}from"./53NdJUAN.js";import{g as n,c as s,k as a,o}from"./qzODIPNV.js";const p=["innerHTML"],m=n({__name:"Logs",props:{logs:{}},setup(c){return(e,_)=>{const r=t;return e.logs.length?(o(),s("pre",{key:0,class:"whitespace-pre-line rounded border dark:border-gray-600 bg-gray-50 dark:bg-gray-700 select-text text-base dark:text-gray-300 w-full px-4 sm:px-6 py-2",innerHTML:e.logs},null,8,p)):(o(),a(r,{key:1}))}}});export{m as _}; diff --git a/jesse/static/_nuxt/B5LVxuBt.js b/jesse/static/_nuxt/B5LVxuBt.js new file mode 100644 index 000000000..909a01a72 --- /dev/null +++ b/jesse/static/_nuxt/B5LVxuBt.js @@ -0,0 +1,6 @@ +import{m as i}from"./Bgthz7Nd.js";import"./qzODIPNV.js";/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var l=Object.defineProperty,s=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyNames,c=Object.prototype.hasOwnProperty,p=(t,e,r,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of d(e))!c.call(t,n)&&n!==r&&l(t,n,{get:()=>e[n],enumerable:!(m=s(e,n))||m.enumerable});return t},h=(t,e,r)=>(p(t,e,"default"),r),a={};h(a,i);var o=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"],y={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:["{{!--","--}}"]},brackets:[[""],["<",">"],["{{","}}"],["{","}"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp(`<(?!(?:${o.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:a.languages.IndentAction.IndentOutdent}},{beforeText:new RegExp(`<(?!(?:${o.join("|")}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,"i"),action:{indentAction:a.languages.IndentAction.Indent}}]},k={defaultToken:"",tokenPostfix:"",tokenizer:{root:[[/\{\{!--/,"comment.block.start.handlebars","@commentBlock"],[/\{\{!/,"comment.start.handlebars","@comment"],[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.root"}],[/)/,["delimiter.html","tag.html","delimiter.html"]],[/(<)(script)/,["delimiter.html",{token:"tag.html",next:"@script"}]],[/(<)(style)/,["delimiter.html",{token:"tag.html",next:"@style"}]],[/(<)([:\w]+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/(<\/)(\w+)/,["delimiter.html",{token:"tag.html",next:"@otherTag"}]],[/]+/,"metatag.content.html"],[/>/,"metatag.html","@pop"]],comment:[[/\}\}/,"comment.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentBlock:[[/--\}\}/,"comment.block.end.handlebars","@pop"],[/./,"comment.content.handlebars"]],commentHtml:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.comment"}],[/-->/,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.otherTag"}],[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.script"}],[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterType"}],[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.text/javascript",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.scriptWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.scriptEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],style:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.style"}],[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterType"}],[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleAfterTypeEquals"}],[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.text/css",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInSimpleState.styleWithCustomType.$S2"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/\{\{/,{token:"@rematch",switchTo:"@handlebarsInEmbeddedState.styleEmbedded.$S2",nextEmbedded:"@pop"}],[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}]],handlebarsInSimpleState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3"}],{include:"handlebarsRoot"}],handlebarsInEmbeddedState:[[/\{\{\{?/,"delimiter.handlebars"],[/\}\}\}?/,{token:"delimiter.handlebars",switchTo:"@$S2.$S3",nextEmbedded:"$S3"}],{include:"handlebarsRoot"}],handlebarsRoot:[[/"[^"]*"/,"string.handlebars"],[/[#/][^\s}]+/,"keyword.helper.handlebars"],[/else\b/,"keyword.helper.handlebars"],[/[\s]+/],[/[^}]/,"variable.parameter.handlebars"]]}};export{y as conf,k as language}; diff --git a/jesse/static/_nuxt/B5uW3Zvf.js b/jesse/static/_nuxt/B5uW3Zvf.js new file mode 100644 index 000000000..be0426f5b --- /dev/null +++ b/jesse/static/_nuxt/B5uW3Zvf.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var E={comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["[","]"],["(",")"],["{","}"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]}]},T={defaultToken:"",tokenPostfix:".msdax",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"{",close:"}",token:"delimiter.brackets"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["VAR","RETURN","NOT","EVALUATE","DATATABLE","ORDER","BY","START","AT","DEFINE","MEASURE","ASC","DESC","IN","BOOLEAN","DOUBLE","INTEGER","DATETIME","CURRENCY","STRING"],functions:["CLOSINGBALANCEMONTH","CLOSINGBALANCEQUARTER","CLOSINGBALANCEYEAR","DATEADD","DATESBETWEEN","DATESINPERIOD","DATESMTD","DATESQTD","DATESYTD","ENDOFMONTH","ENDOFQUARTER","ENDOFYEAR","FIRSTDATE","FIRSTNONBLANK","LASTDATE","LASTNONBLANK","NEXTDAY","NEXTMONTH","NEXTQUARTER","NEXTYEAR","OPENINGBALANCEMONTH","OPENINGBALANCEQUARTER","OPENINGBALANCEYEAR","PARALLELPERIOD","PREVIOUSDAY","PREVIOUSMONTH","PREVIOUSQUARTER","PREVIOUSYEAR","SAMEPERIODLASTYEAR","STARTOFMONTH","STARTOFQUARTER","STARTOFYEAR","TOTALMTD","TOTALQTD","TOTALYTD","ADDCOLUMNS","ADDMISSINGITEMS","ALL","ALLEXCEPT","ALLNOBLANKROW","ALLSELECTED","CALCULATE","CALCULATETABLE","CALENDAR","CALENDARAUTO","CROSSFILTER","CROSSJOIN","CURRENTGROUP","DATATABLE","DETAILROWS","DISTINCT","EARLIER","EARLIEST","EXCEPT","FILTER","FILTERS","GENERATE","GENERATEALL","GROUPBY","IGNORE","INTERSECT","ISONORAFTER","KEEPFILTERS","LOOKUPVALUE","NATURALINNERJOIN","NATURALLEFTOUTERJOIN","RELATED","RELATEDTABLE","ROLLUP","ROLLUPADDISSUBTOTAL","ROLLUPGROUP","ROLLUPISSUBTOTAL","ROW","SAMPLE","SELECTCOLUMNS","SUBSTITUTEWITHINDEX","SUMMARIZE","SUMMARIZECOLUMNS","TOPN","TREATAS","UNION","USERELATIONSHIP","VALUES","SUM","SUMX","PATH","PATHCONTAINS","PATHITEM","PATHITEMREVERSE","PATHLENGTH","AVERAGE","AVERAGEA","AVERAGEX","COUNT","COUNTA","COUNTAX","COUNTBLANK","COUNTROWS","COUNTX","DISTINCTCOUNT","DIVIDE","GEOMEAN","GEOMEANX","MAX","MAXA","MAXX","MEDIAN","MEDIANX","MIN","MINA","MINX","PERCENTILE.EXC","PERCENTILE.INC","PERCENTILEX.EXC","PERCENTILEX.INC","PRODUCT","PRODUCTX","RANK.EQ","RANKX","STDEV.P","STDEV.S","STDEVX.P","STDEVX.S","VAR.P","VAR.S","VARX.P","VARX.S","XIRR","XNPV","DATE","DATEDIFF","DATEVALUE","DAY","EDATE","EOMONTH","HOUR","MINUTE","MONTH","NOW","SECOND","TIME","TIMEVALUE","TODAY","WEEKDAY","WEEKNUM","YEAR","YEARFRAC","CONTAINS","CONTAINSROW","CUSTOMDATA","ERROR","HASONEFILTER","HASONEVALUE","ISBLANK","ISCROSSFILTERED","ISEMPTY","ISERROR","ISEVEN","ISFILTERED","ISLOGICAL","ISNONTEXT","ISNUMBER","ISODD","ISSUBTOTAL","ISTEXT","USERNAME","USERPRINCIPALNAME","AND","FALSE","IF","IFERROR","NOT","OR","SWITCH","TRUE","ABS","ACOS","ACOSH","ACOT","ACOTH","ASIN","ASINH","ATAN","ATANH","BETA.DIST","BETA.INV","CEILING","CHISQ.DIST","CHISQ.DIST.RT","CHISQ.INV","CHISQ.INV.RT","COMBIN","COMBINA","CONFIDENCE.NORM","CONFIDENCE.T","COS","COSH","COT","COTH","CURRENCY","DEGREES","EVEN","EXP","EXPON.DIST","FACT","FLOOR","GCD","INT","ISO.CEILING","LCM","LN","LOG","LOG10","MOD","MROUND","ODD","PERMUT","PI","POISSON.DIST","POWER","QUOTIENT","RADIANS","RAND","RANDBETWEEN","ROUND","ROUNDDOWN","ROUNDUP","SIGN","SIN","SINH","SQRT","SQRTPI","TAN","TANH","TRUNC","BLANK","CONCATENATE","CONCATENATEX","EXACT","FIND","FIXED","FORMAT","LEFT","LEN","LOWER","MID","REPLACE","REPT","RIGHT","SEARCH","SUBSTITUTE","TRIM","UNICHAR","UNICODE","UPPER","VALUE"],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},[/[;,.]/,"delimiter"],[/[({})]/,"@brackets"],[/[a-z_][a-zA-Z0-9_]*/,{cases:{"@keywords":"keyword","@functions":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/\/\/+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/N"/,{token:"string",next:"@string"}],[/"/,{token:"string",next:"@string"}]],string:[[/[^"]+/,"string"],[/""/,"string"],[/"/,{token:"string",next:"@pop"}]],complexIdentifiers:[[/\[/,{token:"identifier.quote",next:"@bracketedIdentifier"}],[/'/,{token:"identifier.quote",next:"@quotedIdentifier"}]],bracketedIdentifier:[[/[^\]]+/,"identifier"],[/]]/,"identifier"],[/]/,{token:"identifier.quote",next:"@pop"}]],quotedIdentifier:[[/[^']+/,"identifier"],[/''/,"identifier"],[/'/,{token:"identifier.quote",next:"@pop"}]]}};export{E as conf,T as language}; diff --git a/jesse/static/_nuxt/B7alP455.js b/jesse/static/_nuxt/B7alP455.js new file mode 100644 index 000000000..90fdce496 --- /dev/null +++ b/jesse/static/_nuxt/B7alP455.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"'",close:"'",notIn:["string"]},{open:'"',close:'"',notIn:["string"]},{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"}]},s={defaultToken:"",tokenPostfix:".rq",brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"},{token:"delimiter.angle",open:"<",close:">"}],keywords:["add","as","asc","ask","base","by","clear","construct","copy","create","data","delete","desc","describe","distinct","drop","false","filter","from","graph","group","having","in","insert","limit","load","minus","move","named","not","offset","optional","order","prefix","reduced","select","service","silent","to","true","undef","union","using","values","where","with"],builtinFunctions:["a","abs","avg","bind","bnode","bound","ceil","coalesce","concat","contains","count","datatype","day","encode_for_uri","exists","floor","group_concat","hours","if","iri","isblank","isiri","isliteral","isnumeric","isuri","lang","langmatches","lcase","max","md5","min","minutes","month","now","rand","regex","replace","round","sameterm","sample","seconds","sha1","sha256","sha384","sha512","str","strafter","strbefore","strdt","strends","strlang","strlen","strstarts","struuid","substr","sum","timezone","tz","ucase","uri","uuid","year"],ignoreCase:!0,tokenizer:{root:[[/<[^\s\u00a0>]*>?/,"tag"],{include:"@strings"},[/#.*/,"comment"],[/[{}()\[\]]/,"@brackets"],[/[;,.]/,"delimiter"],[/[_\w\d]+:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])*/,"tag"],[/:(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/,"tag"],[/[$?]?[_\w\d]+/,{cases:{"@keywords":{token:"keyword"},"@builtinFunctions":{token:"predefined.sql"},"@default":"identifier"}}],[/\^\^/,"operator.sql"],[/\^[*+\-<>=&|^\/!?]*/,"operator.sql"],[/[*+\-<>=&|\/!?]/,"operator.sql"],[/@[a-z\d\-]*/,"metatag.html"],[/\s+/,"white"]],strings:[[/'([^'\\]|\\.)*$/,"string.invalid"],[/'$/,"string.sql","@pop"],[/'/,"string.sql","@stringBody"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"$/,"string.sql","@pop"],[/"/,"string.sql","@dblStringBody"]],stringBody:[[/[^\\']+/,"string.sql"],[/\\./,"string.escape"],[/'/,"string.sql","@pop"]],dblStringBody:[[/[^\\"]+/,"string.sql"],[/\\./,"string.escape"],[/"/,"string.sql","@pop"]]}};export{e as conf,s as language}; diff --git a/jesse/static/_nuxt/B8PuEAvC.js b/jesse/static/_nuxt/B8PuEAvC.js new file mode 100644 index 000000000..803935969 --- /dev/null +++ b/jesse/static/_nuxt/B8PuEAvC.js @@ -0,0 +1,6 @@ +import{m as o}from"./Bgthz7Nd.js";import"./qzODIPNV.js";/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var a=Object.defineProperty,l=Object.getOwnPropertyDescriptor,p=Object.getOwnPropertyNames,c=Object.prototype.hasOwnProperty,g=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of p(e))!c.call(t,r)&&r!==n&&a(t,r,{get:()=>e[r],enumerable:!(s=l(e,r))||s.enumerable});return t},d=(t,e,n)=>(g(t,e,"default"),n),i={};d(i,o);var f={comments:{lineComment:"#",blockComment:["'''","'''"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"',notIn:["string"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],onEnterRules:[{beforeText:new RegExp("^\\s*(?:def|class|for|if|elif|else|while|try|with|finally|except|async|match|case).*?:\\s*$"),action:{indentAction:i.languages.IndentAction.Indent}}],folding:{offSide:!0,markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},b={defaultToken:"",tokenPostfix:".python",keywords:["False","None","True","_","and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","exec","finally","for","from","global","if","import","in","is","lambda","match","nonlocal","not","or","pass","print","raise","return","try","type","while","with","yield","int","float","long","complex","hex","abs","all","any","apply","basestring","bin","bool","buffer","bytearray","callable","chr","classmethod","cmp","coerce","compile","complex","delattr","dict","dir","divmod","enumerate","eval","execfile","file","filter","format","frozenset","getattr","globals","hasattr","hash","help","id","input","intern","isinstance","issubclass","iter","len","locals","list","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","reversed","range","raw_input","reduce","reload","repr","reversed","round","self","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","unichr","unicode","vars","xrange","zip","__dict__","__methods__","__members__","__class__","__bases__","__name__","__mro__","__subclasses__","__init__","__import__"],brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"}],tokenizer:{root:[{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},[/[,:;]/,"delimiter"],[/[{}\[\]()]/,"@brackets"],[/@[a-zA-Z_]\w*/,"tag"],[/[a-zA-Z_]\w*/,{cases:{"@keywords":"keyword","@default":"identifier"}}]],whitespace:[[/\s+/,"white"],[/(^#.*$)/,"comment"],[/'''/,"string","@endDocString"],[/"""/,"string","@endDblDocString"]],endDocString:[[/[^']+/,"string"],[/\\'/,"string"],[/'''/,"string","@popall"],[/'/,"string"]],endDblDocString:[[/[^"]+/,"string"],[/\\"/,"string"],[/"""/,"string","@popall"],[/"/,"string"]],numbers:[[/-?0x([abcdef]|[ABCDEF]|\d)+[lL]?/,"number.hex"],[/-?(\d*\.)?\d+([eE][+\-]?\d+)?[jJ]?[lL]?/,"number"]],strings:[[/'$/,"string.escape","@popall"],[/f'{1,3}/,"string.escape","@fStringBody"],[/'/,"string.escape","@stringBody"],[/"$/,"string.escape","@popall"],[/f"{1,3}/,"string.escape","@fDblStringBody"],[/"/,"string.escape","@dblStringBody"]],fStringBody:[[/[^\\'\{\}]+$/,"string","@popall"],[/[^\\'\{\}]+/,"string"],[/\{[^\}':!=]+/,"identifier","@fStringDetail"],[/\\./,"string"],[/'/,"string.escape","@popall"],[/\\$/,"string"]],stringBody:[[/[^\\']+$/,"string","@popall"],[/[^\\']+/,"string"],[/\\./,"string"],[/'/,"string.escape","@popall"],[/\\$/,"string"]],fDblStringBody:[[/[^\\"\{\}]+$/,"string","@popall"],[/[^\\"\{\}]+/,"string"],[/\{[^\}':!=]+/,"identifier","@fStringDetail"],[/\\./,"string"],[/"/,"string.escape","@popall"],[/\\$/,"string"]],dblStringBody:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string"],[/"/,"string.escape","@popall"],[/\\$/,"string"]],fStringDetail:[[/[:][^}]+/,"string"],[/[!][ars]/,"string"],[/=/,"string"],[/\}/,"identifier","@pop"]]}};export{f as conf,b as language}; diff --git a/jesse/static/_nuxt/B8ssZoUh.js b/jesse/static/_nuxt/B8ssZoUh.js new file mode 100644 index 000000000..f766cd673 --- /dev/null +++ b/jesse/static/_nuxt/B8ssZoUh.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var E={comments:{lineComment:"--",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},T={defaultToken:"",tokenPostfix:".sql",ignoreCase:!0,brackets:[{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"}],keywords:["ACCESSIBLE","ADD","ALL","ALTER","ANALYZE","AND","AS","ASC","ASENSITIVE","BEFORE","BETWEEN","BIGINT","BINARY","BLOB","BOTH","BY","CALL","CASCADE","CASE","CHANGE","CHAR","CHARACTER","CHECK","COLLATE","COLUMN","CONDITION","CONSTRAINT","CONTINUE","CONVERT","CREATE","CROSS","CUBE","CUME_DIST","CURRENT_DATE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURSOR","DATABASE","DATABASES","DAY_HOUR","DAY_MICROSECOND","DAY_MINUTE","DAY_SECOND","DEC","DECIMAL","DECLARE","DEFAULT","DELAYED","DELETE","DENSE_RANK","DESC","DESCRIBE","DETERMINISTIC","DISTINCT","DISTINCTROW","DIV","DOUBLE","DROP","DUAL","EACH","ELSE","ELSEIF","EMPTY","ENCLOSED","ESCAPED","EXCEPT","EXISTS","EXIT","EXPLAIN","FALSE","FETCH","FIRST_VALUE","FLOAT","FLOAT4","FLOAT8","FOR","FORCE","FOREIGN","FROM","FULLTEXT","FUNCTION","GENERATED","GET","GRANT","GROUP","GROUPING","GROUPS","HAVING","HIGH_PRIORITY","HOUR_MICROSECOND","HOUR_MINUTE","HOUR_SECOND","IF","IGNORE","IN","INDEX","INFILE","INNER","INOUT","INSENSITIVE","INSERT","INT","INT1","INT2","INT3","INT4","INT8","INTEGER","INTERVAL","INTO","IO_AFTER_GTIDS","IO_BEFORE_GTIDS","IS","ITERATE","JOIN","JSON_TABLE","KEY","KEYS","KILL","LAG","LAST_VALUE","LATERAL","LEAD","LEADING","LEAVE","LEFT","LIKE","LIMIT","LINEAR","LINES","LOAD","LOCALTIME","LOCALTIMESTAMP","LOCK","LONG","LONGBLOB","LONGTEXT","LOOP","LOW_PRIORITY","MASTER_BIND","MASTER_SSL_VERIFY_SERVER_CERT","MATCH","MAXVALUE","MEDIUMBLOB","MEDIUMINT","MEDIUMTEXT","MIDDLEINT","MINUTE_MICROSECOND","MINUTE_SECOND","MOD","MODIFIES","NATURAL","NOT","NO_WRITE_TO_BINLOG","NTH_VALUE","NTILE","NULL","NUMERIC","OF","ON","OPTIMIZE","OPTIMIZER_COSTS","OPTION","OPTIONALLY","OR","ORDER","OUT","OUTER","OUTFILE","OVER","PARTITION","PERCENT_RANK","PRECISION","PRIMARY","PROCEDURE","PURGE","RANGE","RANK","READ","READS","READ_WRITE","REAL","RECURSIVE","REFERENCES","REGEXP","RELEASE","RENAME","REPEAT","REPLACE","REQUIRE","RESIGNAL","RESTRICT","RETURN","REVOKE","RIGHT","RLIKE","ROW","ROWS","ROW_NUMBER","SCHEMA","SCHEMAS","SECOND_MICROSECOND","SELECT","SENSITIVE","SEPARATOR","SET","SHOW","SIGNAL","SMALLINT","SPATIAL","SPECIFIC","SQL","SQLEXCEPTION","SQLSTATE","SQLWARNING","SQL_BIG_RESULT","SQL_CALC_FOUND_ROWS","SQL_SMALL_RESULT","SSL","STARTING","STORED","STRAIGHT_JOIN","SYSTEM","TABLE","TERMINATED","THEN","TINYBLOB","TINYINT","TINYTEXT","TO","TRAILING","TRIGGER","TRUE","UNDO","UNION","UNIQUE","UNLOCK","UNSIGNED","UPDATE","USAGE","USE","USING","UTC_DATE","UTC_TIME","UTC_TIMESTAMP","VALUES","VARBINARY","VARCHAR","VARCHARACTER","VARYING","VIRTUAL","WHEN","WHERE","WHILE","WINDOW","WITH","WRITE","XOR","YEAR_MONTH","ZEROFILL"],operators:["AND","BETWEEN","IN","LIKE","NOT","OR","IS","NULL","INTERSECT","UNION","INNER","JOIN","LEFT","OUTER","RIGHT"],builtinFunctions:["ABS","ACOS","ADDDATE","ADDTIME","AES_DECRYPT","AES_ENCRYPT","ANY_VALUE","Area","AsBinary","AsWKB","ASCII","ASIN","AsText","AsWKT","ASYMMETRIC_DECRYPT","ASYMMETRIC_DERIVE","ASYMMETRIC_ENCRYPT","ASYMMETRIC_SIGN","ASYMMETRIC_VERIFY","ATAN","ATAN2","ATAN","AVG","BENCHMARK","BIN","BIT_AND","BIT_COUNT","BIT_LENGTH","BIT_OR","BIT_XOR","Buffer","CAST","CEIL","CEILING","Centroid","CHAR","CHAR_LENGTH","CHARACTER_LENGTH","CHARSET","COALESCE","COERCIBILITY","COLLATION","COMPRESS","CONCAT","CONCAT_WS","CONNECTION_ID","Contains","CONV","CONVERT","CONVERT_TZ","ConvexHull","COS","COT","COUNT","CRC32","CREATE_ASYMMETRIC_PRIV_KEY","CREATE_ASYMMETRIC_PUB_KEY","CREATE_DH_PARAMETERS","CREATE_DIGEST","Crosses","CUME_DIST","CURDATE","CURRENT_DATE","CURRENT_ROLE","CURRENT_TIME","CURRENT_TIMESTAMP","CURRENT_USER","CURTIME","DATABASE","DATE","DATE_ADD","DATE_FORMAT","DATE_SUB","DATEDIFF","DAY","DAYNAME","DAYOFMONTH","DAYOFWEEK","DAYOFYEAR","DECODE","DEFAULT","DEGREES","DES_DECRYPT","DES_ENCRYPT","DENSE_RANK","Dimension","Disjoint","Distance","ELT","ENCODE","ENCRYPT","EndPoint","Envelope","Equals","EXP","EXPORT_SET","ExteriorRing","EXTRACT","ExtractValue","FIELD","FIND_IN_SET","FIRST_VALUE","FLOOR","FORMAT","FORMAT_BYTES","FORMAT_PICO_TIME","FOUND_ROWS","FROM_BASE64","FROM_DAYS","FROM_UNIXTIME","GEN_RANGE","GEN_RND_EMAIL","GEN_RND_PAN","GEN_RND_SSN","GEN_RND_US_PHONE","GeomCollection","GeomCollFromText","GeometryCollectionFromText","GeomCollFromWKB","GeometryCollectionFromWKB","GeometryCollection","GeometryN","GeometryType","GeomFromText","GeometryFromText","GeomFromWKB","GeometryFromWKB","GET_FORMAT","GET_LOCK","GLength","GREATEST","GROUP_CONCAT","GROUPING","GTID_SUBSET","GTID_SUBTRACT","HEX","HOUR","ICU_VERSION","IF","IFNULL","INET_ATON","INET_NTOA","INET6_ATON","INET6_NTOA","INSERT","INSTR","InteriorRingN","Intersects","INTERVAL","IS_FREE_LOCK","IS_IPV4","IS_IPV4_COMPAT","IS_IPV4_MAPPED","IS_IPV6","IS_USED_LOCK","IS_UUID","IsClosed","IsEmpty","ISNULL","IsSimple","JSON_APPEND","JSON_ARRAY","JSON_ARRAY_APPEND","JSON_ARRAY_INSERT","JSON_ARRAYAGG","JSON_CONTAINS","JSON_CONTAINS_PATH","JSON_DEPTH","JSON_EXTRACT","JSON_INSERT","JSON_KEYS","JSON_LENGTH","JSON_MERGE","JSON_MERGE_PATCH","JSON_MERGE_PRESERVE","JSON_OBJECT","JSON_OBJECTAGG","JSON_OVERLAPS","JSON_PRETTY","JSON_QUOTE","JSON_REMOVE","JSON_REPLACE","JSON_SCHEMA_VALID","JSON_SCHEMA_VALIDATION_REPORT","JSON_SEARCH","JSON_SET","JSON_STORAGE_FREE","JSON_STORAGE_SIZE","JSON_TABLE","JSON_TYPE","JSON_UNQUOTE","JSON_VALID","LAG","LAST_DAY","LAST_INSERT_ID","LAST_VALUE","LCASE","LEAD","LEAST","LEFT","LENGTH","LineFromText","LineStringFromText","LineFromWKB","LineStringFromWKB","LineString","LN","LOAD_FILE","LOCALTIME","LOCALTIMESTAMP","LOCATE","LOG","LOG10","LOG2","LOWER","LPAD","LTRIM","MAKE_SET","MAKEDATE","MAKETIME","MASK_INNER","MASK_OUTER","MASK_PAN","MASK_PAN_RELAXED","MASK_SSN","MASTER_POS_WAIT","MAX","MBRContains","MBRCoveredBy","MBRCovers","MBRDisjoint","MBREqual","MBREquals","MBRIntersects","MBROverlaps","MBRTouches","MBRWithin","MD5","MEMBER OF","MICROSECOND","MID","MIN","MINUTE","MLineFromText","MultiLineStringFromText","MLineFromWKB","MultiLineStringFromWKB","MOD","MONTH","MONTHNAME","MPointFromText","MultiPointFromText","MPointFromWKB","MultiPointFromWKB","MPolyFromText","MultiPolygonFromText","MPolyFromWKB","MultiPolygonFromWKB","MultiLineString","MultiPoint","MultiPolygon","NAME_CONST","NOT IN","NOW","NTH_VALUE","NTILE","NULLIF","NumGeometries","NumInteriorRings","NumPoints","OCT","OCTET_LENGTH","OLD_PASSWORD","ORD","Overlaps","PASSWORD","PERCENT_RANK","PERIOD_ADD","PERIOD_DIFF","PI","Point","PointFromText","PointFromWKB","PointN","PolyFromText","PolygonFromText","PolyFromWKB","PolygonFromWKB","Polygon","POSITION","POW","POWER","PS_CURRENT_THREAD_ID","PS_THREAD_ID","PROCEDURE ANALYSE","QUARTER","QUOTE","RADIANS","RAND","RANDOM_BYTES","RANK","REGEXP_INSTR","REGEXP_LIKE","REGEXP_REPLACE","REGEXP_REPLACE","RELEASE_ALL_LOCKS","RELEASE_LOCK","REPEAT","REPLACE","REVERSE","RIGHT","ROLES_GRAPHML","ROUND","ROW_COUNT","ROW_NUMBER","RPAD","RTRIM","SCHEMA","SEC_TO_TIME","SECOND","SESSION_USER","SHA1","SHA","SHA2","SIGN","SIN","SLEEP","SOUNDEX","SOURCE_POS_WAIT","SPACE","SQRT","SRID","ST_Area","ST_AsBinary","ST_AsWKB","ST_AsGeoJSON","ST_AsText","ST_AsWKT","ST_Buffer","ST_Buffer_Strategy","ST_Centroid","ST_Collect","ST_Contains","ST_ConvexHull","ST_Crosses","ST_Difference","ST_Dimension","ST_Disjoint","ST_Distance","ST_Distance_Sphere","ST_EndPoint","ST_Envelope","ST_Equals","ST_ExteriorRing","ST_FrechetDistance","ST_GeoHash","ST_GeomCollFromText","ST_GeometryCollectionFromText","ST_GeomCollFromTxt","ST_GeomCollFromWKB","ST_GeometryCollectionFromWKB","ST_GeometryN","ST_GeometryType","ST_GeomFromGeoJSON","ST_GeomFromText","ST_GeometryFromText","ST_GeomFromWKB","ST_GeometryFromWKB","ST_HausdorffDistance","ST_InteriorRingN","ST_Intersection","ST_Intersects","ST_IsClosed","ST_IsEmpty","ST_IsSimple","ST_IsValid","ST_LatFromGeoHash","ST_Length","ST_LineFromText","ST_LineStringFromText","ST_LineFromWKB","ST_LineStringFromWKB","ST_LineInterpolatePoint","ST_LineInterpolatePoints","ST_LongFromGeoHash","ST_Longitude","ST_MakeEnvelope","ST_MLineFromText","ST_MultiLineStringFromText","ST_MLineFromWKB","ST_MultiLineStringFromWKB","ST_MPointFromText","ST_MultiPointFromText","ST_MPointFromWKB","ST_MultiPointFromWKB","ST_MPolyFromText","ST_MultiPolygonFromText","ST_MPolyFromWKB","ST_MultiPolygonFromWKB","ST_NumGeometries","ST_NumInteriorRing","ST_NumInteriorRings","ST_NumPoints","ST_Overlaps","ST_PointAtDistance","ST_PointFromGeoHash","ST_PointFromText","ST_PointFromWKB","ST_PointN","ST_PolyFromText","ST_PolygonFromText","ST_PolyFromWKB","ST_PolygonFromWKB","ST_Simplify","ST_SRID","ST_StartPoint","ST_SwapXY","ST_SymDifference","ST_Touches","ST_Transform","ST_Union","ST_Validate","ST_Within","ST_X","ST_Y","StartPoint","STATEMENT_DIGEST","STATEMENT_DIGEST_TEXT","STD","STDDEV","STDDEV_POP","STDDEV_SAMP","STR_TO_DATE","STRCMP","SUBDATE","SUBSTR","SUBSTRING","SUBSTRING_INDEX","SUBTIME","SUM","SYSDATE","SYSTEM_USER","TAN","TIME","TIME_FORMAT","TIME_TO_SEC","TIMEDIFF","TIMESTAMP","TIMESTAMPADD","TIMESTAMPDIFF","TO_BASE64","TO_DAYS","TO_SECONDS","Touches","TRIM","TRUNCATE","UCASE","UNCOMPRESS","UNCOMPRESSED_LENGTH","UNHEX","UNIX_TIMESTAMP","UpdateXML","UPPER","USER","UTC_DATE","UTC_TIME","UTC_TIMESTAMP","UUID","UUID_SHORT","UUID_TO_BIN","VALIDATE_PASSWORD_STRENGTH","VALUES","VAR_POP","VAR_SAMP","VARIANCE","VERSION","WAIT_FOR_EXECUTED_GTID_SET","WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS","WEEK","WEEKDAY","WEEKOFYEAR","WEIGHT_STRING","Within","X","Y","YEAR","YEARWEEK"],builtinVariables:[],tokenizer:{root:[{include:"@comments"},{include:"@whitespace"},{include:"@numbers"},{include:"@strings"},{include:"@complexIdentifiers"},{include:"@scopes"},[/[;,.]/,"delimiter"],[/[()]/,"@brackets"],[/[\w@]+/,{cases:{"@operators":"operator","@builtinVariables":"predefined","@builtinFunctions":"predefined","@keywords":"keyword","@default":"identifier"}}],[/[<>=!%&+\-*/|~^]/,"operator"]],whitespace:[[/\s+/,"white"]],comments:[[/--+.*/,"comment"],[/#+.*/,"comment"],[/\/\*/,{token:"comment.quote",next:"@comment"}]],comment:[[/[^*/]+/,"comment"],[/\*\//,{token:"comment.quote",next:"@pop"}],[/./,"comment"]],numbers:[[/0[xX][0-9a-fA-F]*/,"number"],[/[$][+-]*\d*(\.\d*)?/,"number"],[/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/,"number"]],strings:[[/'/,{token:"string",next:"@string"}],[/"/,{token:"string.double",next:"@stringDouble"}]],string:[[/\\'/,"string"],[/[^']+/,"string"],[/''/,"string"],[/'/,{token:"string",next:"@pop"}]],stringDouble:[[/[^"]+/,"string.double"],[/""/,"string.double"],[/"/,{token:"string.double",next:"@pop"}]],complexIdentifiers:[[/`/,{token:"identifier.quote",next:"@quotedIdentifier"}]],quotedIdentifier:[[/[^`]+/,"identifier"],[/``/,"identifier"],[/`/,{token:"identifier.quote",next:"@pop"}]],scopes:[]}};export{E as conf,T as language}; diff --git a/jesse/static/_nuxt/BFK5Gmgx.js b/jesse/static/_nuxt/BFK5Gmgx.js deleted file mode 100644 index 8781fa440..000000000 --- a/jesse/static/_nuxt/BFK5Gmgx.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as r,o as t,c as o,L as s,a}from"./BLm-LuZL.js";const c={},n={class:"text-center rounded border-2 border-dashed border-gray-300 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 py-4 text-sm"},d=a("span",{class:"text-gray-400"}," Empty ",-1);function _(e,l){return t(),o("div",n,[s(e.$slots,"default",{},()=>[d])])}const g=r(c,[["render",_]]);export{g as _}; diff --git a/jesse/static/_nuxt/BGLI1Hdo.js b/jesse/static/_nuxt/BGLI1Hdo.js new file mode 100644 index 000000000..9881dd99e --- /dev/null +++ b/jesse/static/_nuxt/BGLI1Hdo.js @@ -0,0 +1,6 @@ +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.50.0(c321d0fbecb50ab8a5365fa1965476b0ae63fc87) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/var e={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},o={defaultToken:"",tokenPostfix:".pascaligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["begin","block","case","const","else","end","fail","for","from","function","if","is","nil","of","remove","return","skip","then","type","var","while","with","option","None","transaction"],typeKeywords:["bool","int","list","map","nat","record","string","unit","address","map","mtz","xtz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}};export{e as conf,o as language}; diff --git a/jesse/static/_nuxt/BLm-LuZL.js b/jesse/static/_nuxt/BLm-LuZL.js deleted file mode 100644 index e9bb69e84..000000000 --- a/jesse/static/_nuxt/BLm-LuZL.js +++ /dev/null @@ -1,79 +0,0 @@ -const __vite__fileDeps=["./tugWi8BA.js","./Cri_WUA5.js","./BwlpUYSK.js","./BFK5Gmgx.js","./1sxhQl7t.js","./Sidebar.CrjfLt5S.css","./fSx662--.js","./C8PppCWi.js","./CJ4140l3.js","./6GW7wvnw.js","./CepOyCjx.js","./BxzcziYC.js","./D-JvFtWi.js","./FAD0u1sW.js","./DdRxl-OG.js","./DmKvV_zz.js","./CfpCwG3b.js","./IconCSS.Z2BAHt_z.css","./CofKTKQw.js","./error-404.JekaaCis.css","./D7sWBv9M.js","./error-500.CNP9nqm1.css"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]); -/** -* @vue/shared v3.4.23 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function Od(e,t){const n=new Set(e.split(","));return t?r=>n.has(r.toLowerCase()):r=>n.has(r)}const Et={},Ds=[],nr=()=>{},mE=()=>!1,aa=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Pd=e=>e.startsWith("onUpdate:"),qt=Object.assign,Ld=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},vE=Object.prototype.hasOwnProperty,ut=(e,t)=>vE.call(e,t),$e=Array.isArray,Vs=e=>ni(e)==="[object Map]",cu=e=>ni(e)==="[object Set]",ym=e=>ni(e)==="[object Date]",yE=e=>ni(e)==="[object RegExp]",Fe=e=>typeof e=="function",Rt=e=>typeof e=="string",Jr=e=>typeof e=="symbol",xt=e=>e!==null&&typeof e=="object",Md=e=>(xt(e)||Fe(e))&&Fe(e.then)&&Fe(e.catch),qv=Object.prototype.toString,ni=e=>qv.call(e),bE=e=>ni(e).slice(8,-1),Kv=e=>ni(e)==="[object Object]",Bd=e=>Rt(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ns=Od(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),fu=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},_E=/-(\w)/g,mr=fu(e=>e.replace(_E,(t,n)=>n?n.toUpperCase():"")),wE=/\B([A-Z])/g,ys=fu(e=>e.replace(wE,"-$1").toLowerCase()),du=fu(e=>e.charAt(0).toUpperCase()+e.slice(1)),zc=fu(e=>e?`on${du(e)}`:""),Ar=(e,t)=>!Object.is(e,t),js=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Tf=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Jv=e=>{const t=Rt(e)?Number(e):NaN;return isNaN(t)?e:t};let bm;const Zv=()=>bm||(bm=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ds(e){if($e(e)){const t={};for(let n=0;n{if(n){const r=n.split(kE);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function ae(e){let t="";if(Rt(e))t=e;else if($e(e))for(let n=0;npu(n,t))}const et=e=>Rt(e)?e:e==null?"":$e(e)||xt(e)&&(e.toString===qv||!Fe(e.toString))?JSON.stringify(e,Xv,2):String(e),Xv=(e,t)=>t&&t.__v_isRef?Xv(e,t.value):Vs(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[Wc(r,i)+" =>"]=s,n),{})}:cu(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Wc(n))}:Jr(t)?Wc(t):xt(t)&&!$e(t)&&!Kv(t)?String(t):t,Wc=(e,t="")=>{var n;return Jr(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.4.23 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Nn;class ey{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Nn,!t&&Nn&&(this.index=(Nn.scopes||(Nn.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Nn;try{return Nn=this,t()}finally{Nn=n}}}on(){Nn=this}off(){Nn=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Lo()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Eo,n=as;try{return Eo=!0,as=this,this._runnings++,_m(this),this.fn()}finally{wm(this),this._runnings--,as=n,Eo=t}}stop(){var t;this.active&&(_m(this),wm(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function IE(e){return e.value}function _m(e){e._trackId++,e._depsLength=0}function wm(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},jl=new WeakMap,ls=Symbol(""),If=Symbol("");function In(e,t,n){if(Eo&&as){let r=jl.get(e);r||jl.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=sy(()=>r.delete(n))),ry(as,s)}}function Gr(e,t,n,r,s,i){const l=jl.get(e);if(!l)return;let u=[];if(t==="clear")u=[...l.values()];else if(n==="length"&&$e(e)){const c=Number(r);l.forEach((p,d)=>{(d==="length"||!Jr(d)&&d>=c)&&u.push(p)})}else switch(n!==void 0&&u.push(l.get(n)),t){case"add":$e(e)?Bd(n)&&u.push(l.get("length")):(u.push(l.get(ls)),Vs(e)&&u.push(l.get(If)));break;case"delete":$e(e)||(u.push(l.get(ls)),Vs(e)&&u.push(l.get(If)));break;case"set":Vs(e)&&u.push(l.get(ls));break}Vd();for(const c of u)c&&oy(c,4);Nd()}function RE(e,t){var n;return(n=jl.get(e))==null?void 0:n.get(t)}const OE=Od("__proto__,__v_isRef,__isVue"),iy=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Jr)),xm=PE();function PE(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=ze(this);for(let i=0,l=this.length;i{e[t]=function(...n){Po(),Vd();const r=ze(this)[t].apply(this,n);return Nd(),Lo(),r}}),e}function LE(e){Jr(e)||(e=String(e));const t=ze(this);return In(t,"has",e),t.hasOwnProperty(e)}class ay{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?KE:fy:i?cy:uy).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const l=$e(t);if(!s){if(l&&ut(xm,n))return Reflect.get(xm,n,r);if(n==="hasOwnProperty")return LE}const u=Reflect.get(t,n,r);return(Jr(n)?iy.has(n):OE(n))||(s||In(t,"get",n),i)?u:at(u)?l&&Bd(n)?u:u.value:xt(u)?s?Hd(u):_n(u):u}}class ly extends ay{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const c=Gs(i);if(!Ul(r)&&!Gs(r)&&(i=ze(i),r=ze(r)),!$e(t)&&at(i)&&!at(r))return c?!1:(i.value=r,!0)}const l=$e(t)&&Bd(n)?Number(n)e,hu=e=>Reflect.getPrototypeOf(e);function dl(e,t,n=!1,r=!1){e=e.__v_raw;const s=ze(e),i=ze(t);n||(Ar(t,i)&&In(s,"get",t),In(s,"get",i));const{has:l}=hu(s),u=r?jd:n?qd:Ji;if(l.call(s,t))return u(e.get(t));if(l.call(s,i))return u(e.get(i));e!==s&&e.get(t)}function pl(e,t=!1){const n=this.__v_raw,r=ze(n),s=ze(e);return t||(Ar(e,s)&&In(r,"has",e),In(r,"has",s)),e===s?n.has(e):n.has(e)||n.has(s)}function hl(e,t=!1){return e=e.__v_raw,!t&&In(ze(e),"iterate",ls),Reflect.get(e,"size",e)}function km(e){e=ze(e);const t=ze(this);return hu(t).has.call(t,e)||(t.add(e),Gr(t,"add",e,e)),this}function Sm(e,t){t=ze(t);const n=ze(this),{has:r,get:s}=hu(n);let i=r.call(n,e);i||(e=ze(e),i=r.call(n,e));const l=s.call(n,e);return n.set(e,t),i?Ar(t,l)&&Gr(n,"set",e,t):Gr(n,"add",e,t),this}function Cm(e){const t=ze(this),{has:n,get:r}=hu(t);let s=n.call(t,e);s||(e=ze(e),s=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return s&&Gr(t,"delete",e,void 0),i}function Em(){const e=ze(this),t=e.size!==0,n=e.clear();return t&&Gr(e,"clear",void 0,void 0),n}function gl(e,t){return function(r,s){const i=this,l=i.__v_raw,u=ze(l),c=t?jd:e?qd:Ji;return!e&&In(u,"iterate",ls),l.forEach((p,d)=>r.call(s,c(p),c(d),i))}}function ml(e,t,n){return function(...r){const s=this.__v_raw,i=ze(s),l=Vs(i),u=e==="entries"||e===Symbol.iterator&&l,c=e==="keys"&&l,p=s[e](...r),d=n?jd:t?qd:Ji;return!t&&In(i,"iterate",c?If:ls),{next(){const{value:g,done:h}=p.next();return h?{value:g,done:h}:{value:u?[d(g[0]),d(g[1])]:d(g),done:h}},[Symbol.iterator](){return this}}}}function uo(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function VE(){const e={get(i){return dl(this,i)},get size(){return hl(this)},has:pl,add:km,set:Sm,delete:Cm,clear:Em,forEach:gl(!1,!1)},t={get(i){return dl(this,i,!1,!0)},get size(){return hl(this)},has:pl,add:km,set:Sm,delete:Cm,clear:Em,forEach:gl(!1,!0)},n={get(i){return dl(this,i,!0)},get size(){return hl(this,!0)},has(i){return pl.call(this,i,!0)},add:uo("add"),set:uo("set"),delete:uo("delete"),clear:uo("clear"),forEach:gl(!0,!1)},r={get(i){return dl(this,i,!0,!0)},get size(){return hl(this,!0)},has(i){return pl.call(this,i,!0)},add:uo("add"),set:uo("set"),delete:uo("delete"),clear:uo("clear"),forEach:gl(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=ml(i,!1,!1),n[i]=ml(i,!0,!1),t[i]=ml(i,!1,!0),r[i]=ml(i,!0,!0)}),[e,n,t,r]}const[NE,jE,UE,HE]=VE();function Ud(e,t){const n=t?e?HE:UE:e?jE:NE;return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(ut(n,s)&&s in r?n:r,s,i)}const zE={get:Ud(!1,!1)},WE={get:Ud(!1,!0)},qE={get:Ud(!0,!1)},uy=new WeakMap,cy=new WeakMap,fy=new WeakMap,KE=new WeakMap;function GE(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function JE(e){return e.__v_skip||!Object.isExtensible(e)?0:GE(bE(e))}function _n(e){return Gs(e)?e:zd(e,!1,BE,zE,uy)}function la(e){return zd(e,!1,DE,WE,cy)}function Hd(e){return zd(e,!0,FE,qE,fy)}function zd(e,t,n,r,s){if(!xt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const l=JE(e);if(l===0)return e;const u=new Proxy(e,l===2?r:n);return s.set(e,u),u}function us(e){return Gs(e)?us(e.__v_raw):!!(e&&e.__v_isReactive)}function Gs(e){return!!(e&&e.__v_isReadonly)}function Ul(e){return!!(e&&e.__v_isShallow)}function dy(e){return e?!!e.__v_raw:!1}function ze(e){const t=e&&e.__v_raw;return t?ze(t):e}function Wd(e){return Object.isExtensible(e)&&Gv(e,"__v_skip",!0),e}const Ji=e=>xt(e)?_n(e):e,qd=e=>xt(e)?Hd(e):e;class py{constructor(t,n,r,s){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new Dd(()=>t(this._value),()=>Us(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=ze(this);return(!t._cacheable||t.effect.dirty)&&Ar(t._value,t._value=t.effect.run())&&Us(t,4),Kd(t),t.effect._dirtyLevel>=2&&Us(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function ZE(e,t,n=!1){let r,s;const i=Fe(e);return i?(r=e,s=nr):(r=e.get,s=e.set),new py(r,s,i||!s,n)}function Kd(e){var t;Eo&&as&&(e=ze(e),ry(as,(t=e.dep)!=null?t:e.dep=sy(()=>e.dep=void 0,e instanceof py?e:void 0)))}function Us(e,t=4,n){e=ze(e);const r=e.dep;r&&oy(r,t)}function at(e){return!!(e&&e.__v_isRef===!0)}function te(e){return hy(e,!1)}function Ir(e){return hy(e,!0)}function hy(e,t){return at(e)?e:new YE(e,t)}class YE{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:ze(t),this._value=n?t:Ji(t)}get value(){return Kd(this),this._value}set value(t){const n=this.__v_isShallow||Ul(t)||Gs(t);t=n?t:ze(t),Ar(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Ji(t),Us(this,4))}}function TF(e){Us(e,4)}function R(e){return at(e)?e.value:e}function Tr(e){return Fe(e)?e():R(e)}const QE={get:(e,t,n)=>R(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return at(s)&&!at(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function gy(e){return us(e)?e:new Proxy(e,QE)}class XE{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:r}=t(()=>Kd(this),()=>Us(this));this._get=n,this._set=r}get value(){return this._get()}set value(t){this._set(t)}}function my(e){return new XE(e)}function eT(e){const t=$e(e)?new Array(e.length):{};for(const n in e)t[n]=vy(e,n);return t}class tT{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return RE(ze(this._object),this._key)}}class nT{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Ot(e,t,n){return at(e)?e:Fe(e)?new nT(e):xt(e)&&arguments.length>1?vy(e,t,n):te(e)}function vy(e,t,n){const r=e[t];return at(r)?r:new tT(e,t,n)}/** -* @vue/runtime-core v3.4.23 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function To(e,t,n,r){try{return r?e(...r):e()}catch(s){ri(s,t,n)}}function or(e,t,n,r){if(Fe(e)){const s=To(e,t,n,r);return s&&Md(s)&&s.catch(i=>{ri(i,t,n)}),s}if($e(e)){const s=[];for(let i=0;i>>1,s=cn[r],i=Yi(s);i$r&&cn.splice(t,1)}function Of(e){$e(e)?Hs.push(...e):(!bo||!bo.includes(e,e.allowRecurse?ts+1:ts))&&Hs.push(e),by()}function Tm(e,t,n=Zi?$r+1:0){for(;nYi(n)-Yi(r));if(Hs.length=0,bo){bo.push(...t);return}for(bo=t,ts=0;tse.id==null?1/0:e.id,iT=(e,t)=>{const n=Yi(e)-Yi(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function _y(e){Rf=!1,Zi=!0,cn.sort(iT);try{for($r=0;$rRt(v)?v.trim():v)),g&&(s=n.map(Tf))}let u,c=r[u=zc(t)]||r[u=zc(mr(t))];!c&&i&&(c=r[u=zc(ys(t))]),c&&or(c,e,6,s);const p=r[u+"Once"];if(p){if(!e.emitted)e.emitted={};else if(e.emitted[u])return;e.emitted[u]=!0,or(p,e,6,s)}}function wy(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let l={},u=!1;if(!Fe(e)){const c=p=>{const d=wy(p,t,!0);d&&(u=!0,qt(l,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!u?(xt(e)&&r.set(e,null),null):($e(i)?i.forEach(c=>l[c]=null):qt(l,i),xt(e)&&r.set(e,l),l)}function mu(e,t){return!e||!aa(t)?!1:(t=t.slice(2).replace(/Once$/,""),ut(e,t[0].toLowerCase()+t.slice(1))||ut(e,ys(t))||ut(e,t))}let Wt=null,vu=null;function zl(e){const t=Wt;return Wt=e,vu=e&&e.type.__scopeId||null,t}function lT(e){vu=e}function uT(){vu=null}function ne(e,t=Wt,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&jm(-1);const i=zl(t);let l;try{l=e(...s)}finally{zl(i),r._d&&jm(1)}return l};return r._n=!0,r._c=!0,r._d=!0,r}function qc(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:i,propsOptions:[l],slots:u,attrs:c,emit:p,render:d,renderCache:g,data:h,setupState:v,ctx:_,inheritAttrs:x}=e;let b,E;const C=zl(e);try{if(n.shapeFlag&4){const A=s||r,B=A;b=tr(d.call(B,A,g,i,v,h,_)),E=c}else{const A=t;b=tr(A.length>1?A(i,{attrs:c,slots:u,emit:p}):A(i,null)),E=t.props?c:fT(c)}}catch(A){Ui.length=0,ri(A,e,1),b=P(bn)}let S=b;if(E&&x!==!1){const A=Object.keys(E),{shapeFlag:B}=S;A.length&&B&7&&(l&&A.some(Pd)&&(E=dT(E,l)),S=Rr(S,E))}return n.dirs&&(S=Rr(S),S.dirs=S.dirs?S.dirs.concat(n.dirs):n.dirs),n.transition&&(S.transition=n.transition),b=S,zl(C),b}function cT(e,t=!0){let n;for(let r=0;r{let t;for(const n in e)(n==="class"||n==="style"||aa(n))&&((t||(t={}))[n]=e[n]);return t},dT=(e,t)=>{const n={};for(const r in e)(!Pd(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function pT(e,t,n){const{props:r,children:s,component:i}=e,{props:l,children:u,patchFlag:c}=t,p=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?$m(r,l,p):!!l;if(c&8){const d=t.dynamicProps;for(let g=0;ge.__isSuspense;let Pf=0;const hT={name:"Suspense",__isSuspense:!0,process(e,t,n,r,s,i,l,u,c,p){if(e==null)gT(t,n,r,s,i,l,u,c,p);else{if(i&&i.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}mT(e,t,n,r,s,l,u,c,p)}},hydrate:vT,create:Qd,normalize:yT},Yd=hT;function Qi(e,t){const n=e.props&&e.props[t];Fe(n)&&n()}function gT(e,t,n,r,s,i,l,u,c){const{p,o:{createElement:d}}=c,g=d("div"),h=e.suspense=Qd(e,s,r,t,g,n,i,l,u,c);p(null,h.pendingBranch=e.ssContent,g,null,r,h,i,l),h.deps>0?(Qi(e,"onPending"),Qi(e,"onFallback"),p(null,e.ssFallback,t,n,r,null,i,l),zs(h,e.ssFallback)):h.resolve(!1,!0)}function mT(e,t,n,r,s,i,l,u,{p:c,um:p,o:{createElement:d}}){const g=t.suspense=e.suspense;g.vnode=t,t.el=e.el;const h=t.ssContent,v=t.ssFallback,{activeBranch:_,pendingBranch:x,isInFallback:b,isHydrating:E}=g;if(x)g.pendingBranch=h,pr(h,x)?(c(x,h,g.hiddenContainer,null,s,g,i,l,u),g.deps<=0?g.resolve():b&&(E||(c(_,v,n,r,s,null,i,l,u),zs(g,v)))):(g.pendingId=Pf++,E?(g.isHydrating=!1,g.activeBranch=x):p(x,s,g),g.deps=0,g.effects.length=0,g.hiddenContainer=d("div"),b?(c(null,h,g.hiddenContainer,null,s,g,i,l,u),g.deps<=0?g.resolve():(c(_,v,n,r,s,null,i,l,u),zs(g,v))):_&&pr(h,_)?(c(_,h,n,r,s,g,i,l,u),g.resolve(!0)):(c(null,h,g.hiddenContainer,null,s,g,i,l,u),g.deps<=0&&g.resolve()));else if(_&&pr(h,_))c(_,h,n,r,s,g,i,l,u),zs(g,h);else if(Qi(t,"onPending"),g.pendingBranch=h,h.shapeFlag&512?g.pendingId=h.component.suspenseId:g.pendingId=Pf++,c(null,h,g.hiddenContainer,null,s,g,i,l,u),g.deps<=0)g.resolve();else{const{timeout:C,pendingId:S}=g;C>0?setTimeout(()=>{g.pendingId===S&&g.fallback(v)},C):C===0&&g.fallback(v)}}function Qd(e,t,n,r,s,i,l,u,c,p,d=!1){const{p:g,m:h,um:v,n:_,o:{parentNode:x,remove:b}}=p;let E;const C=bT(e);C&&t!=null&&t.pendingBranch&&(E=t.pendingId,t.deps++);const S=e.props?Jv(e.props.timeout):void 0,A=i,B={vnode:e,parent:t,parentComponent:n,namespace:l,container:r,hiddenContainer:s,deps:0,pendingId:Pf++,timeout:typeof S=="number"?S:-1,activeBranch:null,pendingBranch:null,isInFallback:!d,isHydrating:d,isUnmounted:!1,effects:[],resolve(L=!1,H=!1){const{vnode:j,activeBranch:q,pendingBranch:K,pendingId:Y,effects:z,parentComponent:be,container:ce}=B;let ke=!1;B.isHydrating?B.isHydrating=!1:L||(ke=q&&K.transition&&K.transition.mode==="out-in",ke&&(q.transition.afterLeave=()=>{Y===B.pendingId&&(h(K,ce,i===A?_(q):i,0),Of(z))}),q&&(x(q.el)!==B.hiddenContainer&&(i=_(q)),v(q,be,B,!0)),ke||h(K,ce,i,0)),zs(B,K),B.pendingBranch=null,B.isInFallback=!1;let ie=B.parent,Se=!1;for(;ie;){if(ie.pendingBranch){ie.effects.push(...z),Se=!0;break}ie=ie.parent}!Se&&!ke&&Of(z),B.effects=[],C&&t&&t.pendingBranch&&E===t.pendingId&&(t.deps--,t.deps===0&&!H&&t.resolve()),Qi(j,"onResolve")},fallback(L){if(!B.pendingBranch)return;const{vnode:H,activeBranch:j,parentComponent:q,container:K,namespace:Y}=B;Qi(H,"onFallback");const z=_(j),be=()=>{B.isInFallback&&(g(null,L,K,z,q,null,Y,u,c),zs(B,L))},ce=L.transition&&L.transition.mode==="out-in";ce&&(j.transition.afterLeave=be),B.isInFallback=!0,v(j,q,null,!0),ce||be()},move(L,H,j){B.activeBranch&&h(B.activeBranch,L,H,j),B.container=L},next(){return B.activeBranch&&_(B.activeBranch)},registerDep(L,H){const j=!!B.pendingBranch;j&&B.deps++;const q=L.vnode.el;L.asyncDep.catch(K=>{ri(K,L,0)}).then(K=>{if(L.isUnmounted||B.isUnmounted||B.pendingId!==L.suspenseId)return;L.asyncResolved=!0;const{vnode:Y}=L;Hf(L,K,!1),q&&(Y.el=q);const z=!q&&L.subTree.el;H(L,Y,x(q||L.subTree.el),q?null:_(L.subTree),B,l,c),z&&b(z),Jd(L,Y.el),j&&--B.deps===0&&B.resolve()})},unmount(L,H){B.isUnmounted=!0,B.activeBranch&&v(B.activeBranch,n,L,H),B.pendingBranch&&v(B.pendingBranch,n,L,H)}};return B}function vT(e,t,n,r,s,i,l,u,c){const p=t.suspense=Qd(t,r,n,e.parentNode,document.createElement("div"),null,s,i,l,u,!0),d=c(e,p.pendingBranch=t.ssContent,n,p,i,l);return p.deps===0&&p.resolve(!1,!0),d}function yT(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Im(r?n.default:n),e.ssFallback=r?Im(n.fallback):P(bn)}function Im(e){let t;if(Fe(e)){const n=Zs&&e._c;n&&(e._d=!1,V()),e=e(),n&&(e._d=!0,t=rr,Qy())}return $e(e)&&(e=cT(e)),e=tr(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Cy(e,t){t&&t.pendingBranch?$e(e)?t.effects.push(...e):t.effects.push(e):Of(e)}function zs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let s=t.el;for(;!s&&t.component;)t=t.component.subTree,s=t.el;n.el=s,r&&r.subTree===n&&(r.vnode.el=s,Jd(r,s))}function bT(e){var t;return((t=e.props)==null?void 0:t.suspensible)!=null&&e.props.suspensible!==!1}const _T=Symbol.for("v-scx"),wT=()=>Ke(_T);function Xt(e,t){return ua(e,null,t)}function xT(e,t){return ua(e,null,{flush:"post"})}function kT(e,t){return ua(e,null,{flush:"sync"})}const vl={};function gt(e,t,n){return ua(e,t,n)}function ua(e,t,{immediate:n,deep:r,flush:s,once:i,onTrack:l,onTrigger:u}=Et){if(t&&i){const L=t;t=(...H)=>{L(...H),B()}}const c=Yt,p=L=>r===!0?L:os(L,r===!1?1:void 0);let d,g=!1,h=!1;if(at(e)?(d=()=>e.value,g=Ul(e)):us(e)?(d=()=>p(e),g=!0):$e(e)?(h=!0,g=e.some(L=>us(L)||Ul(L)),d=()=>e.map(L=>{if(at(L))return L.value;if(us(L))return p(L);if(Fe(L))return To(L,c,2)})):Fe(e)?t?d=()=>To(e,c,2):d=()=>(v&&v(),or(e,c,3,[_])):d=nr,t&&r){const L=d;d=()=>os(L())}let v,_=L=>{v=S.onStop=()=>{To(L,c,4),v=S.onStop=void 0}},x;if(pa)if(_=nr,t?n&&or(t,c,3,[d(),h?[]:void 0,_]):d(),s==="sync"){const L=wT();x=L.__watcherHandles||(L.__watcherHandles=[])}else return nr;let b=h?new Array(e.length).fill(vl):vl;const E=()=>{if(!(!S.active||!S.dirty))if(t){const L=S.run();(r||g||(h?L.some((H,j)=>Ar(H,b[j])):Ar(L,b)))&&(v&&v(),or(t,c,3,[L,b===vl?void 0:h&&b[0]===vl?[]:b,_]),b=L)}else S.run()};E.allowRecurse=!!t;let C;s==="sync"?C=E:s==="post"?C=()=>sn(E,c&&c.suspense):(E.pre=!0,c&&(E.id=c.uid),C=()=>gu(E));const S=new Dd(d,nr,C),A=Oo(),B=()=>{S.stop(),A&&Ld(A.effects,S)};return t?n?E():b=S.run():s==="post"?sn(S.run.bind(S),c&&c.suspense):S.run(),x&&x.push(B),B}function ST(e,t,n){const r=this.proxy,s=Rt(e)?e.includes(".")?Ey(r,e):()=>r[e]:e.bind(r,r);let i;Fe(t)?i=t:(i=t.handler,n=t);const l=hs(this),u=ua(s,i.bind(r),n);return l(),u}function Ey(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;s0){if(n>=t)return e;n++}if(r=r||new Set,r.has(e))return e;if(r.add(e),at(e))os(e.value,t,n,r);else if($e(e))for(let s=0;s{os(s,t,n,r)});else if(Kv(e))for(const s in e)os(e[s],t,n,r);return e}function Ty(e,t){if(Wt===null)return e;const n=bu(Wt)||Wt.proxy,r=e.dirs||(e.dirs=[]);for(let s=0;s{e.isMounted=!0}),fa(()=>{e.isUnmounting=!0}),e}const er=[Function,Array],$y={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:er,onEnter:er,onAfterEnter:er,onEnterCancelled:er,onBeforeLeave:er,onLeave:er,onAfterLeave:er,onLeaveCancelled:er,onBeforeAppear:er,onAppear:er,onAfterAppear:er,onAppearCancelled:er},ET={name:"BaseTransition",props:$y,setup(e,{slots:t}){const n=ir(),r=CT();return()=>{const s=t.default&&Iy(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const h of s)if(h.type!==bn){i=h;break}}const l=ze(e),{mode:u}=l;if(r.isLeaving)return Kc(i);const c=Rm(i);if(!c)return Kc(i);const p=Lf(c,l,r,n);Wl(c,p);const d=n.subTree,g=d&&Rm(d);if(g&&g.type!==bn&&!pr(c,g)){const h=Lf(g,l,r,n);if(Wl(g,h),u==="out-in")return r.isLeaving=!0,h.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Kc(i);u==="in-out"&&c.type!==bn&&(h.delayLeave=(v,_,x)=>{const b=Ay(r,g);b[String(g.key)]=g,v[_o]=()=>{_(),v[_o]=void 0,delete p.delayedLeave},p.delayedLeave=x})}return i}}},TT=ET;function Ay(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Lf(e,t,n,r){const{appear:s,mode:i,persisted:l=!1,onBeforeEnter:u,onEnter:c,onAfterEnter:p,onEnterCancelled:d,onBeforeLeave:g,onLeave:h,onAfterLeave:v,onLeaveCancelled:_,onBeforeAppear:x,onAppear:b,onAfterAppear:E,onAppearCancelled:C}=t,S=String(e.key),A=Ay(n,e),B=(j,q)=>{j&&or(j,r,9,q)},L=(j,q)=>{const K=q[1];B(j,q),$e(j)?j.every(Y=>Y.length<=1)&&K():j.length<=1&&K()},H={mode:i,persisted:l,beforeEnter(j){let q=u;if(!n.isMounted)if(s)q=x||u;else return;j[_o]&&j[_o](!0);const K=A[S];K&&pr(e,K)&&K.el[_o]&&K.el[_o](),B(q,[j])},enter(j){let q=c,K=p,Y=d;if(!n.isMounted)if(s)q=b||c,K=E||p,Y=C||d;else return;let z=!1;const be=j[yl]=ce=>{z||(z=!0,ce?B(Y,[j]):B(K,[j]),H.delayedLeave&&H.delayedLeave(),j[yl]=void 0)};q?L(q,[j,be]):be()},leave(j,q){const K=String(e.key);if(j[yl]&&j[yl](!0),n.isUnmounting)return q();B(g,[j]);let Y=!1;const z=j[_o]=be=>{Y||(Y=!0,q(),be?B(_,[j]):B(v,[j]),j[_o]=void 0,A[K]===e&&delete A[K])};A[K]=e,h?L(h,[j,z]):z()},clone(j){return Lf(j,t,n,r)}};return H}function Kc(e){if(ca(e))return e=Rr(e),e.children=null,e}function Rm(e){return ca(e)?e.children?e.children[0]:void 0:e}function Wl(e,t){e.shapeFlag&6&&e.component?Wl(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Iy(e,t=!1,n){let r=[],s=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function ql(e){Fe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,timeout:i,suspensible:l=!0,onError:u}=e;let c=null,p,d=0;const g=()=>(d++,c=null,h()),h=()=>{let v;return c||(v=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),u)return new Promise((x,b)=>{u(_,()=>x(g()),()=>b(_),d+1)});throw _}).then(_=>v!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),p=_,_)))};return we({name:"AsyncComponentWrapper",__asyncLoader:h,get __asyncResolved(){return p},setup(){const v=Yt;if(p)return()=>Gc(p,v);const _=C=>{c=null,ri(C,v,13,!r)};if(l&&v.suspense||pa)return h().then(C=>()=>Gc(C,v)).catch(C=>(_(C),()=>r?P(r,{error:C}):null));const x=te(!1),b=te(),E=te(!!s);return s&&setTimeout(()=>{E.value=!1},s),i!=null&&setTimeout(()=>{if(!x.value&&!b.value){const C=new Error(`Async component timed out after ${i}ms.`);_(C),b.value=C}},i),h().then(()=>{x.value=!0,v.parent&&ca(v.parent.vnode)&&(v.parent.effect.dirty=!0,gu(v.parent.update))}).catch(C=>{_(C),b.value=C}),()=>{if(x.value&&p)return Gc(p,v);if(b.value&&r)return P(r,{error:b.value});if(n&&!E.value)return P(n)}}})}function Gc(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,l=P(e,r,s);return l.ref=n,l.ce=i,delete t.vnode.ce,l}const ca=e=>e.type.__isKeepAlive,$T={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=ir(),r=n.ctx;if(!r.renderer)return()=>{const C=t.default&&t.default();return C&&C.length===1?C[0]:C};const s=new Map,i=new Set;let l=null;const u=n.suspense,{renderer:{p:c,m:p,um:d,o:{createElement:g}}}=r,h=g("div");r.activate=(C,S,A,B,L)=>{const H=C.component;p(C,S,A,0,u),c(H.vnode,C,S,A,H,u,B,C.slotScopeIds,L),sn(()=>{H.isDeactivated=!1,H.a&&js(H.a);const j=C.props&&C.props.onVnodeMounted;j&&Tn(j,H.parent,C)},u)},r.deactivate=C=>{const S=C.component;p(C,h,null,1,u),sn(()=>{S.da&&js(S.da);const A=C.props&&C.props.onVnodeUnmounted;A&&Tn(A,S.parent,C),S.isDeactivated=!0},u)};function v(C){Jc(C),d(C,n,u,!0)}function _(C){s.forEach((S,A)=>{const B=zf(S.type);B&&(!C||!C(B))&&x(A)})}function x(C){const S=s.get(C);!l||!pr(S,l)?v(S):l&&Jc(l),s.delete(C),i.delete(C)}gt(()=>[e.include,e.exclude],([C,S])=>{C&&_(A=>Bi(C,A)),S&&_(A=>!Bi(S,A))},{flush:"post",deep:!0});let b=null;const E=()=>{b!=null&&s.set(b,Zc(n.subTree))};return ct(E),My(E),fa(()=>{s.forEach(C=>{const{subTree:S,suspense:A}=n,B=Zc(S);if(C.type===B.type&&C.key===B.key){Jc(B);const L=B.component.da;L&&sn(L,A);return}v(C)})}),()=>{if(b=null,!t.default)return l=null;const C=t.default(),S=C[0];if(C.length>1)return l=null,C;if(!Ys(S)||!(S.shapeFlag&4)&&!(S.shapeFlag&128))return l=null,S;let A=Zc(S);const B=A.type,L=zf(cs(A)?A.type.__asyncResolved||{}:B),{include:H,exclude:j,max:q}=e;if(H&&(!L||!Bi(H,L))||j&&L&&Bi(j,L))return l=A,S;const K=A.key==null?B:A.key,Y=s.get(K);return A.el&&(A=Rr(A),S.shapeFlag&128&&(S.ssContent=A)),b=K,Y?(A.el=Y.el,A.component=Y.component,A.transition&&Wl(A,A.transition),A.shapeFlag|=512,i.delete(K),i.add(K)):(i.add(K),q&&i.size>parseInt(q,10)&&x(i.values().next().value)),A.shapeFlag|=256,l=A,Sy(S.type)?S:A}}},AT=$T;function Bi(e,t){return $e(e)?e.some(n=>Bi(n,t)):Rt(e)?e.split(",").includes(t):yE(e)?e.test(t):!1}function Ry(e,t){Py(e,"a",t)}function Oy(e,t){Py(e,"da",t)}function Py(e,t,n=Yt){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(yu(t,r,n),n){let s=n.parent;for(;s&&s.parent;)ca(s.parent.vnode)&&IT(r,t,n,s),s=s.parent}}function IT(e,t,n,r){const s=yu(t,e,r,!0);Ht(()=>{Ld(r[t],s)},n)}function Jc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Zc(e){return e.shapeFlag&128?e.ssContent:e}function yu(e,t,n=Yt,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...l)=>{if(n.isUnmounted)return;Po();const u=hs(n),c=or(t,n,e,l);return u(),Lo(),c});return r?s.unshift(i):s.push(i),i}}const Qr=e=>(t,n=Yt)=>(!pa||e==="sp")&&yu(e,(...r)=>t(...r),n),Ly=Qr("bm"),ct=Qr("m"),RT=Qr("bu"),My=Qr("u"),fa=Qr("bum"),Ht=Qr("um"),OT=Qr("sp"),PT=Qr("rtg"),LT=Qr("rtc");function By(e,t=Yt){yu("ec",e,t)}function Rn(e,t,n,r){let s;const i=n&&n[r];if($e(e)||Rt(e)){s=new Array(e.length);for(let l=0,u=e.length;lt(l,u,void 0,i&&i[u]));else{const l=Object.keys(e);s=new Array(l.length);for(let u=0,c=l.length;u{const i=r.fn(...s);return i&&(i.key=r.key),i}:r.fn)}return e}function it(e,t,n={},r,s){if(Wt.isCE||Wt.parent&&cs(Wt.parent)&&Wt.parent.isCE)return t!=="default"&&(n.name=t),P("slot",n,r&&r());let i=e[t];i&&i._c&&(i._d=!1),V();const l=i&&Fy(i(n)),u=Ae(Ye,{key:n.key||l&&l.key||`_${t}`},l||(r?r():[]),l&&e._===1?64:-2);return!s&&u.scopeId&&(u.slotScopeIds=[u.scopeId+"-s"]),i&&i._c&&(i._d=!0),u}function Fy(e){return e.some(t=>Ys(t)?!(t.type===bn||t.type===Ye&&!Fy(t.children)):!0)?e:null}const Mf=e=>e?tb(e)?bu(e)||e.proxy:Mf(e.parent):null,Ni=qt(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Mf(e.parent),$root:e=>Mf(e.root),$emit:e=>e.emit,$options:e=>Xd(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,gu(e.update)}),$nextTick:e=>e.n||(e.n=an.bind(e.proxy)),$watch:e=>ST.bind(e)}),Yc=(e,t)=>e!==Et&&!e.__isScriptSetup&&ut(e,t),BT={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:l,type:u,appContext:c}=e;let p;if(t[0]!=="$"){const v=l[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(Yc(r,t))return l[t]=1,r[t];if(s!==Et&&ut(s,t))return l[t]=2,s[t];if((p=e.propsOptions[0])&&ut(p,t))return l[t]=3,i[t];if(n!==Et&&ut(n,t))return l[t]=4,n[t];Bf&&(l[t]=0)}}const d=Ni[t];let g,h;if(d)return t==="$attrs"&&In(e.attrs,"get",""),d(e);if((g=u.__cssModules)&&(g=g[t]))return g;if(n!==Et&&ut(n,t))return l[t]=4,n[t];if(h=c.config.globalProperties,ut(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return Yc(s,t)?(s[t]=n,!0):r!==Et&&ut(r,t)?(r[t]=n,!0):ut(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},l){let u;return!!n[l]||e!==Et&&ut(e,l)||Yc(t,l)||(u=i[0])&&ut(u,l)||ut(r,l)||ut(Ni,l)||ut(s.config.globalProperties,l)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ut(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function FT(){return DT().attrs}function DT(){const e=ir();return e.setupContext||(e.setupContext=rb(e))}function Kl(e){return $e(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function da(e,t){return!e||!t?e||t:$e(e)&&$e(t)?e.concat(t):qt({},Kl(e),Kl(t))}function VT(e){const t=ir();let n=e();return Uf(),Md(n)&&(n=n.catch(r=>{throw hs(t),r})),[n,()=>hs(t)]}let Bf=!0;function NT(e){const t=Xd(e),n=e.proxy,r=e.ctx;Bf=!1,t.beforeCreate&&Om(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:l,watch:u,provide:c,inject:p,created:d,beforeMount:g,mounted:h,beforeUpdate:v,updated:_,activated:x,deactivated:b,beforeDestroy:E,beforeUnmount:C,destroyed:S,unmounted:A,render:B,renderTracked:L,renderTriggered:H,errorCaptured:j,serverPrefetch:q,expose:K,inheritAttrs:Y,components:z,directives:be,filters:ce}=t;if(p&&jT(p,r,null),l)for(const Se in l){const ve=l[Se];Fe(ve)&&(r[Se]=ve.bind(n))}if(s){const Se=s.call(n,n);xt(Se)&&(e.data=_n(Se))}if(Bf=!0,i)for(const Se in i){const ve=i[Se],Lt=Fe(ve)?ve.bind(n,n):Fe(ve.get)?ve.get.bind(n,n):nr,Gt=!Fe(ve)&&Fe(ve.set)?ve.set.bind(n):nr,Re=F({get:Lt,set:Gt});Object.defineProperty(r,Se,{enumerable:!0,configurable:!0,get:()=>Re.value,set:je=>Re.value=je})}if(u)for(const Se in u)Dy(u[Se],r,n,Se);if(c){const Se=Fe(c)?c.call(n):c;Reflect.ownKeys(Se).forEach(ve=>{bt(ve,Se[ve])})}d&&Om(d,e,"c");function ie(Se,ve){$e(ve)?ve.forEach(Lt=>Se(Lt.bind(n))):ve&&Se(ve.bind(n))}if(ie(Ly,g),ie(ct,h),ie(RT,v),ie(My,_),ie(Ry,x),ie(Oy,b),ie(By,j),ie(LT,L),ie(PT,H),ie(fa,C),ie(Ht,A),ie(OT,q),$e(K))if(K.length){const Se=e.exposed||(e.exposed={});K.forEach(ve=>{Object.defineProperty(Se,ve,{get:()=>n[ve],set:Lt=>n[ve]=Lt})})}else e.exposed||(e.exposed={});B&&e.render===nr&&(e.render=B),Y!=null&&(e.inheritAttrs=Y),z&&(e.components=z),be&&(e.directives=be)}function jT(e,t,n=nr){$e(e)&&(e=Ff(e));for(const r in e){const s=e[r];let i;xt(s)?"default"in s?i=Ke(s.from||r,s.default,!0):i=Ke(s.from||r):i=Ke(s),at(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:l=>i.value=l}):t[r]=i}}function Om(e,t,n){or($e(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Dy(e,t,n,r){const s=r.includes(".")?Ey(n,r):()=>n[r];if(Rt(e)){const i=t[e];Fe(i)&>(s,i)}else if(Fe(e))gt(s,e.bind(n));else if(xt(e))if($e(e))e.forEach(i=>Dy(i,t,n,r));else{const i=Fe(e.handler)?e.handler.bind(n):t[e.handler];Fe(i)&>(s,i,e)}}function Xd(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:l}}=e.appContext,u=i.get(t);let c;return u?c=u:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(p=>Gl(c,p,l,!0)),Gl(c,t,l)),xt(t)&&i.set(t,c),c}function Gl(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&Gl(e,i,n,!0),s&&s.forEach(l=>Gl(e,l,n,!0));for(const l in t)if(!(r&&l==="expose")){const u=UT[l]||n&&n[l];e[l]=u?u(e[l],t[l]):t[l]}return e}const UT={data:Pm,props:Lm,emits:Lm,methods:Fi,computed:Fi,beforeCreate:vn,created:vn,beforeMount:vn,mounted:vn,beforeUpdate:vn,updated:vn,beforeDestroy:vn,beforeUnmount:vn,destroyed:vn,unmounted:vn,activated:vn,deactivated:vn,errorCaptured:vn,serverPrefetch:vn,components:Fi,directives:Fi,watch:zT,provide:Pm,inject:HT};function Pm(e,t){return t?e?function(){return qt(Fe(e)?e.call(this,this):e,Fe(t)?t.call(this,this):t)}:t:e}function HT(e,t){return Fi(Ff(e),Ff(t))}function Ff(e){if($e(e)){const t={};for(let n=0;n1)return n&&Fe(t)?t.call(r&&r.proxy):t}}function ep(){return!!(Yt||Wt||Ws)}const Ny=Object.create(null),Df=()=>Object.create(Ny),jy=e=>Object.getPrototypeOf(e)===Ny;function KT(e,t,n,r=!1){const s={},i=Df();e.propsDefaults=Object.create(null),Uy(e,t,s,i);for(const l in e.propsOptions[0])l in s||(s[l]=void 0);n?e.props=r?s:la(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function GT(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:l}}=e,u=ze(s),[c]=e.propsOptions;let p=!1;if((r||l>0)&&!(l&16)){if(l&8){const d=e.vnode.dynamicProps;for(let g=0;g{c=!0;const[h,v]=Hy(g,t,!0);qt(l,h),v&&u.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return xt(e)&&r.set(e,Ds),Ds;if($e(i))for(let d=0;d-1,v[1]=x<0||_-1||ut(v,"default"))&&u.push(g)}}}const p=[l,u];return xt(e)&&r.set(e,p),p}function Mm(e){return e[0]!=="$"&&!Ns(e)}function Bm(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Fm(e,t){return Bm(e)===Bm(t)}function Dm(e,t){return $e(t)?t.findIndex(n=>Fm(n,e)):Fe(t)&&Fm(t,e)?0:-1}const zy=e=>e[0]==="_"||e==="$stable",tp=e=>$e(e)?e.map(tr):[tr(e)],JT=(e,t,n)=>{if(t._n)return t;const r=ne((...s)=>tp(t(...s)),n);return r._c=!1,r},Wy=(e,t,n)=>{const r=e._ctx;for(const s in e){if(zy(s))continue;const i=e[s];if(Fe(i))t[s]=JT(s,i,r);else if(i!=null){const l=tp(i);t[s]=()=>l}}},qy=(e,t)=>{const n=tp(t);e.slots.default=()=>n},ZT=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=ze(t),Gv(e.slots,"_",n)):Wy(t,e.slots=Df())}else e.slots=Df(),t&&qy(e,t)},YT=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,l=Et;if(r.shapeFlag&32){const u=t._;u?n&&u===1?i=!1:(qt(s,t),!n&&u===1&&delete s._):(i=!t.$stable,Wy(t,s)),l=t}else t&&(qy(e,t),l={default:1});if(i)for(const u in s)!zy(u)&&l[u]==null&&delete s[u]};function Jl(e,t,n,r,s=!1){if($e(e)){e.forEach((h,v)=>Jl(h,t&&($e(t)?t[v]:t),n,r,s));return}if(cs(r)&&!s)return;const i=r.shapeFlag&4?bu(r.component)||r.component.proxy:r.el,l=s?null:i,{i:u,r:c}=e,p=t&&t.r,d=u.refs===Et?u.refs={}:u.refs,g=u.setupState;if(p!=null&&p!==c&&(Rt(p)?(d[p]=null,ut(g,p)&&(g[p]=null)):at(p)&&(p.value=null)),Fe(c))To(c,u,12,[l,d]);else{const h=Rt(c),v=at(c);if(h||v){const _=()=>{if(e.f){const x=h?ut(g,c)?g[c]:d[c]:c.value;s?$e(x)&&Ld(x,i):$e(x)?x.includes(i)||x.push(i):h?(d[c]=[i],ut(g,c)&&(g[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else h?(d[c]=l,ut(g,c)&&(g[c]=l)):v&&(c.value=l,e.k&&(d[e.k]=l))};l?(_.id=-1,sn(_,n)):_()}}}let co=!1;const QT=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",XT=e=>e.namespaceURI.includes("MathML"),bl=e=>{if(QT(e))return"svg";if(XT(e))return"mathml"},_l=e=>e.nodeType===8;function e$(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:l,remove:u,insert:c,createComment:p}}=e,d=(S,A)=>{if(!A.hasChildNodes()){n(null,S,A),Hl(),A._vnode=S;return}co=!1,g(A.firstChild,S,null,null,null),Hl(),A._vnode=S,co&&console.error("Hydration completed but contains mismatches.")},g=(S,A,B,L,H,j=!1)=>{j=j||!!A.dynamicChildren;const q=_l(S)&&S.data==="[",K=()=>x(S,A,B,L,H,q),{type:Y,ref:z,shapeFlag:be,patchFlag:ce}=A;let ke=S.nodeType;A.el=S,ce===-2&&(j=!1,A.dynamicChildren=null);let ie=null;switch(Y){case Js:ke!==3?A.children===""?(c(A.el=s(""),l(S),S),ie=S):ie=K():(S.data!==A.children&&(co=!0,S.data=A.children),ie=i(S));break;case bn:C(S)?(ie=i(S),E(A.el=S.content.firstChild,S,B)):ke!==8||q?ie=K():ie=i(S);break;case qs:if(q&&(S=i(S),ke=S.nodeType),ke===1||ke===3){ie=S;const Se=!A.children.length;for(let ve=0;ve{j=j||!!A.dynamicChildren;const{type:q,props:K,patchFlag:Y,shapeFlag:z,dirs:be,transition:ce}=A,ke=q==="input"||q==="option";if(ke||Y!==-1){be&&Cr(A,null,B,"created");let ie=!1;if(C(S)){ie=Gy(L,ce)&&B&&B.vnode.props&&B.vnode.props.appear;const ve=S.content.firstChild;ie&&ce.beforeEnter(ve),E(ve,S,B),A.el=S=ve}if(z&16&&!(K&&(K.innerHTML||K.textContent))){let ve=v(S.firstChild,A,S,B,L,H,j);for(;ve;){co=!0;const Lt=ve;ve=ve.nextSibling,u(Lt)}}else z&8&&S.textContent!==A.children&&(co=!0,S.textContent=A.children);if(K)if(ke||!j||Y&48)for(const ve in K)(ke&&(ve.endsWith("value")||ve==="indeterminate")||aa(ve)&&!Ns(ve)||ve[0]===".")&&r(S,ve,null,K[ve],void 0,void 0,B);else K.onClick&&r(S,"onClick",null,K.onClick,void 0,void 0,B);let Se;(Se=K&&K.onVnodeBeforeMount)&&Tn(Se,B,A),be&&Cr(A,null,B,"beforeMount"),((Se=K&&K.onVnodeMounted)||be||ie)&&Cy(()=>{Se&&Tn(Se,B,A),ie&&ce.enter(S),be&&Cr(A,null,B,"mounted")},L)}return S.nextSibling},v=(S,A,B,L,H,j,q)=>{q=q||!!A.dynamicChildren;const K=A.children,Y=K.length;for(let z=0;z{const{slotScopeIds:q}=A;q&&(H=H?H.concat(q):q);const K=l(S),Y=v(i(S),A,K,B,L,H,j);return Y&&_l(Y)&&Y.data==="]"?i(A.anchor=Y):(co=!0,c(A.anchor=p("]"),K,Y),Y)},x=(S,A,B,L,H,j)=>{if(co=!0,A.el=null,j){const Y=b(S);for(;;){const z=i(S);if(z&&z!==Y)u(z);else break}}const q=i(S),K=l(S);return u(S),n(null,A,K,q,B,L,bl(K),H),q},b=(S,A="[",B="]")=>{let L=0;for(;S;)if(S=i(S),S&&_l(S)&&(S.data===A&&L++,S.data===B)){if(L===0)return i(S);L--}return S},E=(S,A,B)=>{const L=A.parentNode;L&&L.replaceChild(S,A);let H=B;for(;H;)H.vnode.el===A&&(H.vnode.el=H.subTree.el=S),H=H.parent},C=S=>S.nodeType===1&&S.tagName.toLowerCase()==="template";return[d,g]}const sn=Cy;function t$(e){return Ky(e)}function n$(e){return Ky(e,e$)}function Ky(e,t){const n=Zv();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:l,createText:u,createComment:c,setText:p,setElementText:d,parentNode:g,nextSibling:h,setScopeId:v=nr,insertStaticContent:_}=e,x=(T,O,U,re=null,G=null,fe=null,me=void 0,le=null,ue=!!O.dynamicChildren)=>{if(T===O)return;T&&!pr(T,O)&&(re=ee(T),je(T,G,fe,!0),T=null),O.patchFlag===-2&&(ue=!1,O.dynamicChildren=null);const{type:se,ref:_e,shapeFlag:Oe}=O;switch(se){case Js:b(T,O,U,re);break;case bn:E(T,O,U,re);break;case qs:T==null&&C(O,U,re,me);break;case Ye:z(T,O,U,re,G,fe,me,le,ue);break;default:Oe&1?B(T,O,U,re,G,fe,me,le,ue):Oe&6?be(T,O,U,re,G,fe,me,le,ue):(Oe&64||Oe&128)&&se.process(T,O,U,re,G,fe,me,le,ue,Ce)}_e!=null&&G&&Jl(_e,T&&T.ref,fe,O||T,!O)},b=(T,O,U,re)=>{if(T==null)r(O.el=u(O.children),U,re);else{const G=O.el=T.el;O.children!==T.children&&p(G,O.children)}},E=(T,O,U,re)=>{T==null?r(O.el=c(O.children||""),U,re):O.el=T.el},C=(T,O,U,re)=>{[T.el,T.anchor]=_(T.children,O,U,re,T.el,T.anchor)},S=({el:T,anchor:O},U,re)=>{let G;for(;T&&T!==O;)G=h(T),r(T,U,re),T=G;r(O,U,re)},A=({el:T,anchor:O})=>{let U;for(;T&&T!==O;)U=h(T),s(T),T=U;s(O)},B=(T,O,U,re,G,fe,me,le,ue)=>{O.type==="svg"?me="svg":O.type==="math"&&(me="mathml"),T==null?L(O,U,re,G,fe,me,le,ue):q(T,O,G,fe,me,le,ue)},L=(T,O,U,re,G,fe,me,le)=>{let ue,se;const{props:_e,shapeFlag:Oe,transition:Ee,dirs:De}=T;if(ue=T.el=l(T.type,fe,_e&&_e.is,_e),Oe&8?d(ue,T.children):Oe&16&&j(T.children,ue,null,re,G,Qc(T,fe),me,le),De&&Cr(T,null,re,"created"),H(ue,T,T.scopeId,me,re),_e){for(const ot in _e)ot!=="value"&&!Ns(ot)&&i(ue,ot,null,_e[ot],fe,T.children,re,G,St);"value"in _e&&i(ue,"value",null,_e.value,fe),(se=_e.onVnodeBeforeMount)&&Tn(se,re,T)}De&&Cr(T,null,re,"beforeMount");const He=Gy(G,Ee);He&&Ee.beforeEnter(ue),r(ue,O,U),((se=_e&&_e.onVnodeMounted)||He||De)&&sn(()=>{se&&Tn(se,re,T),He&&Ee.enter(ue),De&&Cr(T,null,re,"mounted")},G)},H=(T,O,U,re,G)=>{if(U&&v(T,U),re)for(let fe=0;fe{for(let se=ue;se{const le=O.el=T.el;let{patchFlag:ue,dynamicChildren:se,dirs:_e}=O;ue|=T.patchFlag&16;const Oe=T.props||Et,Ee=O.props||Et;let De;if(U&&qo(U,!1),(De=Ee.onVnodeBeforeUpdate)&&Tn(De,U,O,T),_e&&Cr(O,T,U,"beforeUpdate"),U&&qo(U,!0),se?K(T.dynamicChildren,se,le,U,re,Qc(O,G),fe):me||ve(T,O,le,null,U,re,Qc(O,G),fe,!1),ue>0){if(ue&16)Y(le,O,Oe,Ee,U,re,G);else if(ue&2&&Oe.class!==Ee.class&&i(le,"class",null,Ee.class,G),ue&4&&i(le,"style",Oe.style,Ee.style,G),ue&8){const He=O.dynamicProps;for(let ot=0;ot{De&&Tn(De,U,O,T),_e&&Cr(O,T,U,"updated")},re)},K=(T,O,U,re,G,fe,me)=>{for(let le=0;le{if(U!==re){if(U!==Et)for(const le in U)!Ns(le)&&!(le in re)&&i(T,le,U[le],null,me,O.children,G,fe,St);for(const le in re){if(Ns(le))continue;const ue=re[le],se=U[le];ue!==se&&le!=="value"&&i(T,le,se,ue,me,O.children,G,fe,St)}"value"in re&&i(T,"value",U.value,re.value,me)}},z=(T,O,U,re,G,fe,me,le,ue)=>{const se=O.el=T?T.el:u(""),_e=O.anchor=T?T.anchor:u("");let{patchFlag:Oe,dynamicChildren:Ee,slotScopeIds:De}=O;De&&(le=le?le.concat(De):De),T==null?(r(se,U,re),r(_e,U,re),j(O.children||[],U,_e,G,fe,me,le,ue)):Oe>0&&Oe&64&&Ee&&T.dynamicChildren?(K(T.dynamicChildren,Ee,U,G,fe,me,le),(O.key!=null||G&&O===G.subTree)&&np(T,O,!0)):ve(T,O,U,_e,G,fe,me,le,ue)},be=(T,O,U,re,G,fe,me,le,ue)=>{O.slotScopeIds=le,T==null?O.shapeFlag&512?G.ctx.activate(O,U,re,me,ue):ce(O,U,re,G,fe,me,ue):ke(T,O,ue)},ce=(T,O,U,re,G,fe,me)=>{const le=T.component=f$(T,re,G);if(ca(T)&&(le.ctx.renderer=Ce),d$(le),le.asyncDep){if(G&&G.registerDep(le,ie),!T.el){const ue=le.subTree=P(bn);E(null,ue,O,U)}}else ie(le,T,O,U,G,fe,me)},ke=(T,O,U)=>{const re=O.component=T.component;if(pT(T,O,U))if(re.asyncDep&&!re.asyncResolved){Se(re,O,U);return}else re.next=O,sT(re.update),re.effect.dirty=!0,re.update();else O.el=T.el,re.vnode=O},ie=(T,O,U,re,G,fe,me)=>{const le=()=>{if(T.isMounted){let{next:_e,bu:Oe,u:Ee,parent:De,vnode:He}=T;{const yr=Jy(T);if(yr){_e&&(_e.el=He.el,Se(T,_e,me)),yr.asyncDep.then(()=>{T.isUnmounted||le()});return}}let ot=_e,_t;qo(T,!1),_e?(_e.el=He.el,Se(T,_e,me)):_e=He,Oe&&js(Oe),(_t=_e.props&&_e.props.onVnodeBeforeUpdate)&&Tn(_t,De,_e,He),qo(T,!0);const Mt=qc(T),dn=T.subTree;T.subTree=Mt,x(dn,Mt,g(dn.el),ee(dn),T,G,fe),_e.el=Mt.el,ot===null&&Jd(T,Mt.el),Ee&&sn(Ee,G),(_t=_e.props&&_e.props.onVnodeUpdated)&&sn(()=>Tn(_t,De,_e,He),G)}else{let _e;const{el:Oe,props:Ee}=O,{bm:De,m:He,parent:ot}=T,_t=cs(O);if(qo(T,!1),De&&js(De),!_t&&(_e=Ee&&Ee.onVnodeBeforeMount)&&Tn(_e,ot,O),qo(T,!0),Oe&&mt){const Mt=()=>{T.subTree=qc(T),mt(Oe,T.subTree,T,G,null)};_t?O.type.__asyncLoader().then(()=>!T.isUnmounted&&Mt()):Mt()}else{const Mt=T.subTree=qc(T);x(null,Mt,U,re,T,G,fe),O.el=Mt.el}if(He&&sn(He,G),!_t&&(_e=Ee&&Ee.onVnodeMounted)){const Mt=O;sn(()=>Tn(_e,ot,Mt),G)}(O.shapeFlag&256||ot&&cs(ot.vnode)&&ot.vnode.shapeFlag&256)&&T.a&&sn(T.a,G),T.isMounted=!0,O=U=re=null}},ue=T.effect=new Dd(le,nr,()=>gu(se),T.scope),se=T.update=()=>{ue.dirty&&ue.run()};se.id=T.uid,qo(T,!0),se()},Se=(T,O,U)=>{O.component=T;const re=T.vnode.props;T.vnode=O,T.next=null,GT(T,O.props,re,U),YT(T,O.children,U),Po(),Tm(T),Lo()},ve=(T,O,U,re,G,fe,me,le,ue=!1)=>{const se=T&&T.children,_e=T?T.shapeFlag:0,Oe=O.children,{patchFlag:Ee,shapeFlag:De}=O;if(Ee>0){if(Ee&128){Gt(se,Oe,U,re,G,fe,me,le,ue);return}else if(Ee&256){Lt(se,Oe,U,re,G,fe,me,le,ue);return}}De&8?(_e&16&&St(se,G,fe),Oe!==se&&d(U,Oe)):_e&16?De&16?Gt(se,Oe,U,re,G,fe,me,le,ue):St(se,G,fe,!0):(_e&8&&d(U,""),De&16&&j(Oe,U,re,G,fe,me,le,ue))},Lt=(T,O,U,re,G,fe,me,le,ue)=>{T=T||Ds,O=O||Ds;const se=T.length,_e=O.length,Oe=Math.min(se,_e);let Ee;for(Ee=0;Ee_e?St(T,G,fe,!0,!1,Oe):j(O,U,re,G,fe,me,le,ue,Oe)},Gt=(T,O,U,re,G,fe,me,le,ue)=>{let se=0;const _e=O.length;let Oe=T.length-1,Ee=_e-1;for(;se<=Oe&&se<=Ee;){const De=T[se],He=O[se]=ue?wo(O[se]):tr(O[se]);if(pr(De,He))x(De,He,U,null,G,fe,me,le,ue);else break;se++}for(;se<=Oe&&se<=Ee;){const De=T[Oe],He=O[Ee]=ue?wo(O[Ee]):tr(O[Ee]);if(pr(De,He))x(De,He,U,null,G,fe,me,le,ue);else break;Oe--,Ee--}if(se>Oe){if(se<=Ee){const De=Ee+1,He=De<_e?O[De].el:re;for(;se<=Ee;)x(null,O[se]=ue?wo(O[se]):tr(O[se]),U,He,G,fe,me,le,ue),se++}}else if(se>Ee)for(;se<=Oe;)je(T[se],G,fe,!0),se++;else{const De=se,He=se,ot=new Map;for(se=He;se<=Ee;se++){const en=O[se]=ue?wo(O[se]):tr(O[se]);en.key!=null&&ot.set(en.key,se)}let _t,Mt=0;const dn=Ee-He+1;let yr=!1,bs=0;const Or=new Array(dn);for(se=0;se=dn){je(en,G,fe,!0);continue}let xn;if(en.key!=null)xn=ot.get(en.key);else for(_t=He;_t<=Ee;_t++)if(Or[_t-He]===0&&pr(en,O[_t])){xn=_t;break}xn===void 0?je(en,G,fe,!0):(Or[xn-He]=se+1,xn>=bs?bs=xn:yr=!0,x(en,O[xn],U,null,G,fe,me,le,ue),Mt++)}const _s=yr?r$(Or):Ds;for(_t=_s.length-1,se=dn-1;se>=0;se--){const en=He+se,xn=O[en],ka=en+1<_e?O[en+1].el:re;Or[se]===0?x(null,xn,U,ka,G,fe,me,le,ue):yr&&(_t<0||se!==_s[_t]?Re(xn,U,ka,2):_t--)}}},Re=(T,O,U,re,G=null)=>{const{el:fe,type:me,transition:le,children:ue,shapeFlag:se}=T;if(se&6){Re(T.component.subTree,O,U,re);return}if(se&128){T.suspense.move(O,U,re);return}if(se&64){me.move(T,O,U,Ce);return}if(me===Ye){r(fe,O,U);for(let Oe=0;Oele.enter(fe),G);else{const{leave:Oe,delayLeave:Ee,afterLeave:De}=le,He=()=>r(fe,O,U),ot=()=>{Oe(fe,()=>{He(),De&&De()})};Ee?Ee(fe,He,ot):ot()}else r(fe,O,U)},je=(T,O,U,re=!1,G=!1)=>{const{type:fe,props:me,ref:le,children:ue,dynamicChildren:se,shapeFlag:_e,patchFlag:Oe,dirs:Ee}=T;if(le!=null&&Jl(le,null,U,T,!0),_e&256){O.ctx.deactivate(T);return}const De=_e&1&&Ee,He=!cs(T);let ot;if(He&&(ot=me&&me.onVnodeBeforeUnmount)&&Tn(ot,O,T),_e&6)fn(T.component,U,re);else{if(_e&128){T.suspense.unmount(U,re);return}De&&Cr(T,null,O,"beforeUnmount"),_e&64?T.type.remove(T,O,U,G,Ce,re):se&&(fe!==Ye||Oe>0&&Oe&64)?St(se,O,U,!1,!0):(fe===Ye&&Oe&384||!G&&_e&16)&&St(ue,O,U),re&&Ft(T)}(He&&(ot=me&&me.onVnodeUnmounted)||De)&&sn(()=>{ot&&Tn(ot,O,T),De&&Cr(T,null,O,"unmounted")},U)},Ft=T=>{const{type:O,el:U,anchor:re,transition:G}=T;if(O===Ye){Dt(U,re);return}if(O===qs){A(T);return}const fe=()=>{s(U),G&&!G.persisted&&G.afterLeave&&G.afterLeave()};if(T.shapeFlag&1&&G&&!G.persisted){const{leave:me,delayLeave:le}=G,ue=()=>me(U,fe);le?le(T.el,fe,ue):ue()}else fe()},Dt=(T,O)=>{let U;for(;T!==O;)U=h(T),s(T),T=U;s(O)},fn=(T,O,U)=>{const{bum:re,scope:G,update:fe,subTree:me,um:le}=T;re&&js(re),G.stop(),fe&&(fe.active=!1,je(me,T,O,U)),le&&sn(le,O),sn(()=>{T.isUnmounted=!0},O),O&&O.pendingBranch&&!O.isUnmounted&&T.asyncDep&&!T.asyncResolved&&T.suspenseId===O.pendingId&&(O.deps--,O.deps===0&&O.resolve())},St=(T,O,U,re=!1,G=!1,fe=0)=>{for(let me=fe;meT.shapeFlag&6?ee(T.component.subTree):T.shapeFlag&128?T.suspense.next():h(T.anchor||T.el);let ye=!1;const pe=(T,O,U)=>{T==null?O._vnode&&je(O._vnode,null,null,!0):x(O._vnode||null,T,O,null,null,null,U),ye||(ye=!0,Tm(),Hl(),ye=!1),O._vnode=T},Ce={p:x,um:je,m:Re,r:Ft,mt:ce,mc:j,pc:ve,pbc:K,n:ee,o:e};let rt,mt;return t&&([rt,mt]=t(Ce)),{render:pe,hydrate:rt,createApp:qT(pe,rt)}}function Qc({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function qo({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Gy(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function np(e,t,n=!1){const r=e.children,s=t.children;if($e(r)&&$e(s))for(let i=0;i>1,e[n[u]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,l=n[i-1];i-- >0;)n[i]=l,l=t[l];return n}function Jy(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Jy(t)}const o$=e=>e.__isTeleport,ji=e=>e&&(e.disabled||e.disabled===""),Vm=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Nm=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Nf=(e,t)=>{const n=e&&e.to;return Rt(n)?t?t(n):null:n},s$={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,i,l,u,c,p){const{mc:d,pc:g,pbc:h,o:{insert:v,querySelector:_,createText:x,createComment:b}}=p,E=ji(t.props);let{shapeFlag:C,children:S,dynamicChildren:A}=t;if(e==null){const B=t.el=x(""),L=t.anchor=x("");v(B,n,r),v(L,n,r);const H=t.target=Nf(t.props,_),j=t.targetAnchor=x("");H&&(v(j,H),l==="svg"||Vm(H)?l="svg":(l==="mathml"||Nm(H))&&(l="mathml"));const q=(K,Y)=>{C&16&&d(S,K,Y,s,i,l,u,c)};E?q(n,L):H&&q(H,j)}else{t.el=e.el;const B=t.anchor=e.anchor,L=t.target=e.target,H=t.targetAnchor=e.targetAnchor,j=ji(e.props),q=j?n:L,K=j?B:H;if(l==="svg"||Vm(L)?l="svg":(l==="mathml"||Nm(L))&&(l="mathml"),A?(h(e.dynamicChildren,A,q,s,i,l,u),np(e,t,!0)):c||g(e,t,q,K,s,i,l,u,!1),E)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):wl(t,n,B,p,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const Y=t.target=Nf(t.props,_);Y&&wl(t,Y,null,p,0)}else j&&wl(t,L,H,p,1)}Yy(t)},remove(e,t,n,r,{um:s,o:{remove:i}},l){const{shapeFlag:u,children:c,anchor:p,targetAnchor:d,target:g,props:h}=e;if(g&&i(d),l&&i(p),u&16){const v=l||!ji(h);for(let _=0;_0?rr||Ds:null,Qy(),Zs>0&&rr&&rr.push(e),e}function Z(e,t,n,r,s,i){return Xy(I(e,t,n,r,s,i,!0))}function Ae(e,t,n,r,s){return Xy(P(e,t,n,r,s,!0))}function Ys(e){return e?e.__v_isVNode===!0:!1}function pr(e,t){return e.type===t.type&&e.key===t.key}const eb=({key:e})=>e??null,Ol=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Rt(e)||at(e)||Fe(e)?{i:Wt,r:e,k:t,f:!!n}:e:null);function I(e,t=null,n=null,r=0,s=null,i=e===Ye?0:1,l=!1,u=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&eb(t),ref:t&&Ol(t),scopeId:vu,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:Wt};return u?(rp(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=Rt(n)?8:16),Zs>0&&!l&&rr&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&rr.push(c),c}const P=a$;function a$(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===xy)&&(e=bn),Ys(e)){const u=Rr(e,t,!0);return n&&rp(u,n),Zs>0&&!i&&rr&&(u.shapeFlag&6?rr[rr.indexOf(e)]=u:rr.push(u)),u.patchFlag|=-2,u}if(g$(e)&&(e=e.__vccOpts),t){t=Qs(t);let{class:u,style:c}=t;u&&!Rt(u)&&(t.class=ae(u)),xt(c)&&(dy(c)&&!$e(c)&&(c=qt({},c)),t.style=ds(c))}const l=Rt(e)?1:Sy(e)?128:o$(e)?64:xt(e)?4:Fe(e)?2:0;return I(e,t,n,r,s,l,i,!0)}function Qs(e){return e?dy(e)||jy(e)?qt({},e):e:null}function Rr(e,t,n=!1){const{props:r,ref:s,patchFlag:i,children:l}=e,u=t?lt(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&eb(u),ref:t&&t.ref?n&&s?$e(s)?s.concat(Ol(t)):[s,Ol(t)]:Ol(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ye?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Rr(e.ssContent),ssFallback:e.ssFallback&&Rr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function de(e=" ",t=0){return P(Js,null,e,t)}function l$(e,t){const n=P(qs,null,e);return n.staticCount=t,n}function Ie(e="",t=!1){return t?(V(),Ae(bn,null,e)):P(bn,null,e)}function tr(e){return e==null||typeof e=="boolean"?P(bn):$e(e)?P(Ye,null,e.slice()):typeof e=="object"?wo(e):P(Js,null,String(e))}function wo(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Rr(e)}function rp(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if($e(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),rp(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!jy(t)?t._ctx=Wt:s===3&&Wt&&(Wt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Fe(t)?(t={default:t,_ctx:Wt},n=32):(t=String(t),r&64?(n=16,t=[de(t)]):n=8);e.children=t,e.shapeFlag|=n}function lt(...e){const t={};for(let n=0;nYt||Wt;let Zl,jf;{const e=Zv(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(l=>l(i)):s[0](i)}};Zl=t("__VUE_INSTANCE_SETTERS__",n=>Yt=n),jf=t("__VUE_SSR_SETTERS__",n=>pa=n)}const hs=e=>{const t=Yt;return Zl(e),e.scope.on(),()=>{e.scope.off(),Zl(t)}},Uf=()=>{Yt&&Yt.scope.off(),Zl(null)};function tb(e){return e.vnode.shapeFlag&4}let pa=!1;function d$(e,t=!1){t&&jf(t);const{props:n,children:r}=e.vnode,s=tb(e);KT(e,n,s,t),ZT(e,r);const i=s?p$(e,t):void 0;return t&&jf(!1),i}function p$(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,BT);const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?rb(e):null,i=hs(e);Po();const l=To(r,e,0,[e.props,s]);if(Lo(),i(),Md(l)){if(l.then(Uf,Uf),t)return l.then(u=>{Hf(e,u,t)}).catch(u=>{ri(u,e,0)});e.asyncDep=l}else Hf(e,l,t)}else nb(e,t)}function Hf(e,t,n){Fe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:xt(t)&&(e.setupState=gy(t)),nb(e,n)}let Um;function nb(e,t,n){const r=e.type;if(!e.render){if(!t&&Um&&!r.render){const s=r.template||Xd(e).template;if(s){const{isCustomElement:i,compilerOptions:l}=e.appContext.config,{delimiters:u,compilerOptions:c}=r,p=qt(qt({isCustomElement:i,delimiters:u},l),c);r.render=Um(s,p)}}e.render=r.render||nr}{const s=hs(e);Po();try{NT(e)}finally{Lo(),s()}}}const h$={get(e,t){return In(e,"get",""),e[t]}};function rb(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,h$),slots:e.slots,emit:e.emit,expose:t}}function bu(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(gy(Wd(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ni)return Ni[n](e)},has(t,n){return n in t||n in Ni}}))}function zf(e,t=!0){return Fe(e)?e.displayName||e.name:e.name||t&&e.__name}function g$(e){return Fe(e)&&"__vccOpts"in e}const F=(e,t)=>ZE(e,t,pa);function Mo(e,t,n=Et){const r=ir(),s=mr(t),i=ys(t),l=my((c,p)=>{let d;return kT(()=>{const g=e[t];Ar(d,g)&&(d=g,p())}),{get(){return c(),n.get?n.get(d):d},set(g){const h=r.vnode.props;!(h&&(t in h||s in h||i in h)&&(`onUpdate:${t}`in h||`onUpdate:${s}`in h||`onUpdate:${i}`in h))&&Ar(g,d)&&(d=g,p()),r.emit(`update:${t}`,n.set?n.set(g):g)}}}),u=t==="modelValue"?"modelModifiers":`${t}Modifiers`;return l[Symbol.iterator]=()=>{let c=0;return{next(){return c<2?{value:c++?e[u]||{}:l,done:!1}:{done:!0}}}},l}function Xe(e,t,n){const r=arguments.length;return r===2?xt(t)&&!$e(t)?Ys(t)?P(e,null,[t]):P(e,t):P(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Ys(n)&&(n=[n]),P(e,t,n))}const ob="3.4.23";/** -* @vue/runtime-dom v3.4.23 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const m$="http://www.w3.org/2000/svg",v$="http://www.w3.org/1998/Math/MathML",xo=typeof document<"u"?document:null,Hm=xo&&xo.createElement("template"),y$={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?xo.createElementNS(m$,e):t==="mathml"?xo.createElementNS(v$,e):xo.createElement(e,n?{is:n}:void 0);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>xo.createTextNode(e),createComment:e=>xo.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>xo.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const l=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Hm.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const u=Hm.content;if(r==="svg"||r==="mathml"){const c=u.firstChild;for(;c.firstChild;)u.appendChild(c.firstChild);u.removeChild(c)}t.insertBefore(u,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},fo="transition",Ci="animation",Xi=Symbol("_vtc"),oi=(e,{slots:t})=>Xe(TT,b$(e),t);oi.displayName="Transition";const sb={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};oi.props=qt({},$y,sb);const Ko=(e,t=[])=>{$e(e)?e.forEach(n=>n(...t)):e&&e(...t)},zm=e=>e?$e(e)?e.some(t=>t.length>1):e.length>1:!1;function b$(e){const t={};for(const z in e)z in sb||(t[z]=e[z]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:l=`${n}-enter-active`,enterToClass:u=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:p=l,appearToClass:d=u,leaveFromClass:g=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,_=_$(s),x=_&&_[0],b=_&&_[1],{onBeforeEnter:E,onEnter:C,onEnterCancelled:S,onLeave:A,onLeaveCancelled:B,onBeforeAppear:L=E,onAppear:H=C,onAppearCancelled:j=S}=t,q=(z,be,ce)=>{Go(z,be?d:u),Go(z,be?p:l),ce&&ce()},K=(z,be)=>{z._isLeaving=!1,Go(z,g),Go(z,v),Go(z,h),be&&be()},Y=z=>(be,ce)=>{const ke=z?H:C,ie=()=>q(be,z,ce);Ko(ke,[be,ie]),Wm(()=>{Go(be,z?c:i),po(be,z?d:u),zm(ke)||qm(be,r,x,ie)})};return qt(t,{onBeforeEnter(z){Ko(E,[z]),po(z,i),po(z,l)},onBeforeAppear(z){Ko(L,[z]),po(z,c),po(z,p)},onEnter:Y(!1),onAppear:Y(!0),onLeave(z,be){z._isLeaving=!0;const ce=()=>K(z,be);po(z,g),k$(),po(z,h),Wm(()=>{z._isLeaving&&(Go(z,g),po(z,v),zm(A)||qm(z,r,b,ce))}),Ko(A,[z,ce])},onEnterCancelled(z){q(z,!1),Ko(S,[z])},onAppearCancelled(z){q(z,!0),Ko(j,[z])},onLeaveCancelled(z){K(z),Ko(B,[z])}})}function _$(e){if(e==null)return null;if(xt(e))return[Xc(e.enter),Xc(e.leave)];{const t=Xc(e);return[t,t]}}function Xc(e){return Jv(e)}function po(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Xi]||(e[Xi]=new Set)).add(t)}function Go(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Xi];n&&(n.delete(t),n.size||(e[Xi]=void 0))}function Wm(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let w$=0;function qm(e,t,n,r){const s=e._endId=++w$,i=()=>{s===e._endId&&r()};if(n)return setTimeout(i,n);const{type:l,timeout:u,propCount:c}=x$(e,t);if(!l)return r();const p=l+"end";let d=0;const g=()=>{e.removeEventListener(p,h),i()},h=v=>{v.target===e&&++d>=c&&g()};setTimeout(()=>{d(n[_]||"").split(", "),s=r(`${fo}Delay`),i=r(`${fo}Duration`),l=Km(s,i),u=r(`${Ci}Delay`),c=r(`${Ci}Duration`),p=Km(u,c);let d=null,g=0,h=0;t===fo?l>0&&(d=fo,g=l,h=i.length):t===Ci?p>0&&(d=Ci,g=p,h=c.length):(g=Math.max(l,p),d=g>0?l>p?fo:Ci:null,h=d?d===fo?i.length:c.length:0);const v=d===fo&&/\b(transform|all)(,|$)/.test(r(`${fo}Property`).toString());return{type:d,timeout:g,propCount:h,hasTransform:v}}function Km(e,t){for(;e.lengthGm(n)+Gm(e[r])))}function Gm(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function k$(){return document.body.offsetHeight}function S$(e,t,n){const r=e[Xi];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Yl=Symbol("_vod"),ib=Symbol("_vsh"),$F={beforeMount(e,{value:t},{transition:n}){e[Yl]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Ei(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Ei(e,!0),r.enter(e)):r.leave(e,()=>{Ei(e,!1)}):Ei(e,t))},beforeUnmount(e,{value:t}){Ei(e,t)}};function Ei(e,t){e.style.display=t?e[Yl]:"none",e[ib]=!t}const ab=Symbol("");function AF(e){const t=ir();if(!t)return;const n=t.ut=(s=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(i=>qf(i,s))},r=()=>{const s=e(t.proxy);Wf(t.subTree,s),n(s)};ct(()=>{xT(r);const s=new MutationObserver(r);s.observe(t.subTree.el.parentNode,{childList:!0}),Ht(()=>s.disconnect())})}function Wf(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Wf(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)qf(e.el,t);else if(e.type===Ye)e.children.forEach(n=>Wf(n,t));else if(e.type===qs){let{el:n,anchor:r}=e;for(;n&&(qf(n,t),n!==r);)n=n.nextSibling}}function qf(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const s in t)n.setProperty(`--${s}`,t[s]),r+=`--${s}: ${t[s]};`;n[ab]=r}}const C$=/(^|;)\s*display\s*:/;function E$(e,t,n){const r=e.style,s=Rt(n);let i=!1;if(n&&!s){if(t)if(Rt(t))for(const l of t.split(";")){const u=l.slice(0,l.indexOf(":")).trim();n[u]==null&&Pl(r,u,"")}else for(const l in t)n[l]==null&&Pl(r,l,"");for(const l in n)l==="display"&&(i=!0),Pl(r,l,n[l])}else if(s){if(t!==n){const l=r[ab];l&&(n+=";"+l),r.cssText=n,i=C$.test(n)}}else t&&e.removeAttribute("style");Yl in e&&(e[Yl]=i?r.display:"",e[ib]&&(r.display="none"))}const Jm=/\s*!important$/;function Pl(e,t,n){if($e(n))n.forEach(r=>Pl(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=T$(e,t);Jm.test(n)?e.setProperty(ys(r),n.replace(Jm,""),"important"):e[r]=n}}const Zm=["Webkit","Moz","ms"],ef={};function T$(e,t){const n=ef[t];if(n)return n;let r=mr(t);if(r!=="filter"&&r in e)return ef[t]=r;r=du(r);for(let s=0;stf||(P$.then(()=>tf=0),tf=Date.now());function M$(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;or(B$(r,n.value),t,5,[r])};return n.value=e,n.attached=L$(),n}function B$(e,t){if($e(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const e0=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,F$=(e,t,n,r,s,i,l,u,c)=>{const p=s==="svg";t==="class"?S$(e,r,p):t==="style"?E$(e,n,r):aa(t)?Pd(t)||R$(e,t,n,r,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):D$(e,t,r,p))?A$(e,t,r,i,l,u,c):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),$$(e,t,r,p))};function D$(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&e0(t)&&Fe(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return e0(t)&&Rt(n)?!1:t in e}const Ql=e=>{const t=e.props["onUpdate:modelValue"]||!1;return $e(t)?n=>js(t,n):t};function V$(e){e.target.composing=!0}function t0(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ks=Symbol("_assign"),N$={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[Ks]=Ql(s);const i=r||s.props&&s.props.type==="number";ns(e,t?"change":"input",l=>{if(l.target.composing)return;let u=e.value;n&&(u=u.trim()),i&&(u=Tf(u)),e[Ks](u)}),n&&ns(e,"change",()=>{e.value=e.value.trim()}),t||(ns(e,"compositionstart",V$),ns(e,"compositionend",t0),ns(e,"change",t0))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:s}},i){if(e[Ks]=Ql(i),e.composing)return;const l=(s||e.type==="number")&&!/^0\d/.test(e.value)?Tf(e.value):e.value,u=t??"";l!==u&&(document.activeElement===e&&e.type!=="range"&&(n||r&&e.value.trim()===u)||(e.value=u))}},j$={deep:!0,created(e,t,n){e[Ks]=Ql(n),ns(e,"change",()=>{const r=e._modelValue,s=U$(e),i=e.checked,l=e[Ks];if($e(r)){const u=Qv(r,s),c=u!==-1;if(i&&!c)l(r.concat(s));else if(!i&&c){const p=[...r];p.splice(u,1),l(p)}}else if(cu(r)){const u=new Set(r);i?u.add(s):u.delete(s),l(u)}else l(lb(e,i))})},mounted:n0,beforeUpdate(e,t,n){e[Ks]=Ql(n),n0(e,t,n)}};function n0(e,{value:t,oldValue:n},r){e._modelValue=t,$e(t)?e.checked=Qv(t,r.props.value)>-1:cu(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=pu(t,lb(e,!0)))}function U$(e){return"_value"in e?e._value:e.value}function lb(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const H$=["ctrl","shift","alt","meta"],z$={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>H$.some(n=>e[`${n}Key`]&&!t.includes(n))},Ll=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...i)=>{for(let l=0;l{const t=W$().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=fb(r);if(!s)return;const i=t._component;!Fe(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.innerHTML="";const l=n(s,!1,cb(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),l},t},G$=(...e)=>{const t=q$().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=fb(r);if(s)return n(s,!0,cb(s))},t};function cb(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function fb(e){return Rt(e)?document.querySelector(e):e}const J$=/"(?:_|\\u0{2}5[Ff]){2}(?:p|\\u0{2}70)(?:r|\\u0{2}72)(?:o|\\u0{2}6[Ff])(?:t|\\u0{2}74)(?:o|\\u0{2}6[Ff])(?:_|\\u0{2}5[Ff]){2}"\s*:/,Z$=/"(?:c|\\u0063)(?:o|\\u006[Ff])(?:n|\\u006[Ee])(?:s|\\u0073)(?:t|\\u0074)(?:r|\\u0072)(?:u|\\u0075)(?:c|\\u0063)(?:t|\\u0074)(?:o|\\u006[Ff])(?:r|\\u0072)"\s*:/,Y$=/^\s*["[{]|^\s*-?\d{1,16}(\.\d{1,17})?([Ee][+-]?\d+)?\s*$/;function Q$(e,t){if(e==="__proto__"||e==="constructor"&&t&&typeof t=="object"&&"prototype"in t){X$(e);return}return t}function X$(e){console.warn(`[destr] Dropping "${e}" key to prevent prototype pollution.`)}function ea(e,t={}){if(typeof e!="string")return e;const n=e.trim();if(e[0]==='"'&&e.endsWith('"')&&!e.includes("\\"))return n.slice(1,-1);if(n.length<=9){const r=n.toLowerCase();if(r==="true")return!0;if(r==="false")return!1;if(r==="undefined")return;if(r==="null")return null;if(r==="nan")return Number.NaN;if(r==="infinity")return Number.POSITIVE_INFINITY;if(r==="-infinity")return Number.NEGATIVE_INFINITY}if(!Y$.test(e)){if(t.strict)throw new SyntaxError("[destr] Invalid JSON");return e}try{if(J$.test(e)||Z$.test(e)){if(t.strict)throw new Error("[destr] Possible prototype pollution");return JSON.parse(e,Q$)}return JSON.parse(e)}catch(r){if(t.strict)throw r;return e}}const eA=/#/g,tA=/&/g,nA=/\//g,rA=/=/g,op=/\+/g,oA=/%5e/gi,sA=/%60/gi,iA=/%7c/gi,aA=/%20/gi;function lA(e){return encodeURI(""+e).replace(iA,"|")}function Kf(e){return lA(typeof e=="string"?e:JSON.stringify(e)).replace(op,"%2B").replace(aA,"+").replace(eA,"%23").replace(tA,"%26").replace(sA,"`").replace(oA,"^").replace(nA,"%2F")}function nf(e){return Kf(e).replace(rA,"%3D")}function Xl(e=""){try{return decodeURIComponent(""+e)}catch{return""+e}}function uA(e){return Xl(e.replace(op," "))}function cA(e){return Xl(e.replace(op," "))}function db(e=""){const t={};e[0]==="?"&&(e=e.slice(1));for(const n of e.split("&")){const r=n.match(/([^=]+)=?(.*)/)||[];if(r.length<2)continue;const s=uA(r[1]);if(s==="__proto__"||s==="constructor")continue;const i=cA(r[2]||"");t[s]===void 0?t[s]=i:Array.isArray(t[s])?t[s].push(i):t[s]=[t[s],i]}return t}function fA(e,t){return(typeof t=="number"||typeof t=="boolean")&&(t=String(t)),t?Array.isArray(t)?t.map(n=>`${nf(e)}=${Kf(n)}`).join("&"):`${nf(e)}=${Kf(t)}`:nf(e)}function dA(e){return Object.keys(e).filter(t=>e[t]!==void 0).map(t=>fA(t,e[t])).filter(Boolean).join("&")}const pA=/^[\s\w\0+.-]{2,}:([/\\]{1,2})/,hA=/^[\s\w\0+.-]{2,}:([/\\]{2})?/,gA=/^([/\\]\s*){2,}[^/\\]/,mA=/^[\s\0]*(blob|data|javascript|vbscript):$/i,vA=/\/$|\/\?|\/#/,yA=/^\.?\//;function Bo(e,t={}){return typeof t=="boolean"&&(t={acceptRelative:t}),t.strict?pA.test(e):hA.test(e)||(t.acceptRelative?gA.test(e):!1)}function bA(e){return!!e&&mA.test(e)}function Gf(e="",t){return t?vA.test(e):e.endsWith("/")}function sp(e="",t){if(!t)return(Gf(e)?e.slice(0,-1):e)||"/";if(!Gf(e,!0))return e||"/";let n=e,r="";const s=e.indexOf("#");s>=0&&(n=e.slice(0,s),r=e.slice(s));const[i,...l]=n.split("?");return((i.endsWith("/")?i.slice(0,-1):i)||"/")+(l.length>0?`?${l.join("?")}`:"")+r}function eu(e="",t){if(!t)return e.endsWith("/")?e:e+"/";if(Gf(e,!0))return e||"/";let n=e,r="";const s=e.indexOf("#");if(s>=0&&(n=e.slice(0,s),r=e.slice(s),!n))return r;const[i,...l]=n.split("?");return i+"/"+(l.length>0?`?${l.join("?")}`:"")+r}function _A(e=""){return e.startsWith("/")}function o0(e=""){return _A(e)?e:"/"+e}function wA(e,t){if(hb(t)||Bo(e))return e;const n=sp(t);return e.startsWith(n)?e:_u(n,e)}function s0(e,t){if(hb(t))return e;const n=sp(t);if(!e.startsWith(n))return e;const r=e.slice(n.length);return r[0]==="/"?r:"/"+r}function pb(e,t){const n=ha(e),r={...db(n.search),...t};return n.search=dA(r),SA(n)}function hb(e){return!e||e==="/"}function xA(e){return e&&e!=="/"}function _u(e,...t){let n=e||"";for(const r of t.filter(s=>xA(s)))if(n){const s=r.replace(yA,"");n=eu(n)+s}else n=r;return n}function gb(...e){var l,u,c,p;const t=/\/(?!\/)/,n=e.filter(Boolean),r=[];let s=0;for(const d of n)if(!(!d||d==="/")){for(const[g,h]of d.split(t).entries())if(!(!h||h===".")){if(h===".."){if(r.length===1&&Bo(r[0]))continue;r.pop(),s--;continue}if(g===1&&((l=r[r.length-1])!=null&&l.endsWith(":/"))){r[r.length-1]+="/"+h;continue}r.push(h),s++}}let i=r.join("/");return s>=0?(u=n[0])!=null&&u.startsWith("/")&&!i.startsWith("/")?i="/"+i:(c=n[0])!=null&&c.startsWith("./")&&!i.startsWith("./")&&(i="./"+i):i="../".repeat(-1*s)+i,(p=n[n.length-1])!=null&&p.endsWith("/")&&!i.endsWith("/")&&(i+="/"),i}function kA(e,t,n={}){return n.trailingSlash||(e=eu(e),t=eu(t)),n.leadingSlash||(e=o0(e),t=o0(t)),n.encoding||(e=Xl(e),t=Xl(t)),e===t}const mb=Symbol.for("ufo:protocolRelative");function ha(e="",t){const n=e.match(/^[\s\0]*(blob:|data:|javascript:|vbscript:)(.*)/i);if(n){const[,g,h=""]=n;return{protocol:g.toLowerCase(),pathname:h,href:g+h,auth:"",host:"",search:"",hash:""}}if(!Bo(e,{acceptRelative:!0}))return t?ha(t+e):i0(e);const[,r="",s,i=""]=e.replace(/\\/g,"/").match(/^[\s\0]*([\w+.-]{2,}:)?\/\/([^/@]+@)?(.*)/)||[],[,l="",u=""]=i.match(/([^#/?]*)(.*)?/)||[],{pathname:c,search:p,hash:d}=i0(u.replace(/\/(?=[A-Za-z]:)/,""));return{protocol:r.toLowerCase(),auth:s?s.slice(0,Math.max(0,s.length-1)):"",host:l,pathname:c,search:p,hash:d,[mb]:!r}}function i0(e=""){const[t="",n="",r=""]=(e.match(/([^#?]*)(\?[^#]*)?(#.*)?/)||[]).splice(1);return{pathname:t,search:n,hash:r}}function SA(e){const t=e.pathname||"",n=e.search?(e.search.startsWith("?")?"":"?")+e.search:"",r=e.hash||"",s=e.auth?e.auth+"@":"",i=e.host||"";return(e.protocol||e[mb]?(e.protocol||"")+"//":"")+s+i+t+n+r}class CA extends Error{constructor(t,n){super(t,n),this.name="FetchError",n!=null&&n.cause&&!this.cause&&(this.cause=n.cause)}}function EA(e){var c,p,d,g,h;const t=((c=e.error)==null?void 0:c.message)||((p=e.error)==null?void 0:p.toString())||"",n=((d=e.request)==null?void 0:d.method)||((g=e.options)==null?void 0:g.method)||"GET",r=((h=e.request)==null?void 0:h.url)||String(e.request)||"/",s=`[${n}] ${JSON.stringify(r)}`,i=e.response?`${e.response.status} ${e.response.statusText}`:"",l=`${s}: ${i}${t?` ${t}`:""}`,u=new CA(l,e.error?{cause:e.error}:void 0);for(const v of["request","options","response"])Object.defineProperty(u,v,{get(){return e[v]}});for(const[v,_]of[["data","_data"],["status","status"],["statusCode","status"],["statusText","statusText"],["statusMessage","statusText"]])Object.defineProperty(u,v,{get(){return e.response&&e.response[_]}});return u}const TA=new Set(Object.freeze(["PATCH","POST","PUT","DELETE"]));function a0(e="GET"){return TA.has(e.toUpperCase())}function $A(e){if(e===void 0)return!1;const t=typeof e;return t==="string"||t==="number"||t==="boolean"||t===null?!0:t!=="object"?!1:Array.isArray(e)?!0:e.buffer?!1:e.constructor&&e.constructor.name==="Object"||typeof e.toJSON=="function"}const AA=new Set(["image/svg","application/xml","application/xhtml","application/html"]),IA=/^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;function RA(e=""){if(!e)return"json";const t=e.split(";").shift()||"";return IA.test(t)?"json":AA.has(t)||t.startsWith("text/")?"text":"blob"}function OA(e,t,n=globalThis.Headers){const r={...t,...e};if(t!=null&&t.params&&(e!=null&&e.params)&&(r.params={...t==null?void 0:t.params,...e==null?void 0:e.params}),t!=null&&t.query&&(e!=null&&e.query)&&(r.query={...t==null?void 0:t.query,...e==null?void 0:e.query}),t!=null&&t.headers&&(e!=null&&e.headers)){r.headers=new n((t==null?void 0:t.headers)||{});for(const[s,i]of new n((e==null?void 0:e.headers)||{}))r.headers.set(s,i)}return r}const PA=new Set([408,409,425,429,500,502,503,504]),LA=new Set([101,204,205,304]);function vb(e={}){const{fetch:t=globalThis.fetch,Headers:n=globalThis.Headers,AbortController:r=globalThis.AbortController}=e;async function s(u){const c=u.error&&u.error.name==="AbortError"&&!u.options.timeout||!1;if(u.options.retry!==!1&&!c){let d;typeof u.options.retry=="number"?d=u.options.retry:d=a0(u.options.method)?0:1;const g=u.response&&u.response.status||500;if(d>0&&(Array.isArray(u.options.retryStatusCodes)?u.options.retryStatusCodes.includes(g):PA.has(g))){const h=u.options.retryDelay||0;return h>0&&await new Promise(v=>setTimeout(v,h)),i(u.request,{...u.options,retry:d-1})}}const p=EA(u);throw Error.captureStackTrace&&Error.captureStackTrace(p,i),p}const i=async function(c,p={}){var v;const d={request:c,options:OA(p,e.defaults,n),response:void 0,error:void 0};d.options.method=(v=d.options.method)==null?void 0:v.toUpperCase(),d.options.onRequest&&await d.options.onRequest(d),typeof d.request=="string"&&(d.options.baseURL&&(d.request=wA(d.request,d.options.baseURL)),(d.options.query||d.options.params)&&(d.request=pb(d.request,{...d.options.params,...d.options.query}))),d.options.body&&a0(d.options.method)&&($A(d.options.body)?(d.options.body=typeof d.options.body=="string"?d.options.body:JSON.stringify(d.options.body),d.options.headers=new n(d.options.headers||{}),d.options.headers.has("content-type")||d.options.headers.set("content-type","application/json"),d.options.headers.has("accept")||d.options.headers.set("accept","application/json")):("pipeTo"in d.options.body&&typeof d.options.body.pipeTo=="function"||typeof d.options.body.pipe=="function")&&("duplex"in d.options||(d.options.duplex="half")));let g;if(!d.options.signal&&d.options.timeout){const _=new r;g=setTimeout(()=>_.abort(),d.options.timeout),d.options.signal=_.signal}try{d.response=await t(d.request,d.options)}catch(_){return d.error=_,d.options.onRequestError&&await d.options.onRequestError(d),await s(d)}finally{g&&clearTimeout(g)}if(d.response.body&&!LA.has(d.response.status)&&d.options.method!=="HEAD"){const _=(d.options.parseResponse?"json":d.options.responseType)||RA(d.response.headers.get("content-type")||"");switch(_){case"json":{const x=await d.response.text(),b=d.options.parseResponse||ea;d.response._data=b(x);break}case"stream":{d.response._data=d.response.body;break}default:d.response._data=await d.response[_]()}}return d.options.onResponse&&await d.options.onResponse(d),!d.options.ignoreResponseError&&d.response.status>=400&&d.response.status<600?(d.options.onResponseError&&await d.options.onResponseError(d),await s(d)):d.response},l=async function(c,p){return(await i(c,p))._data};return l.raw=i,l.native=(...u)=>t(...u),l.create=(u={})=>vb({...e,defaults:{...e.defaults,...u}}),l}const ip=function(){if(typeof globalThis<"u")return globalThis;if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")}(),MA=ip.fetch||(()=>Promise.reject(new Error("[ofetch] global.fetch is not supported!"))),BA=ip.Headers,FA=ip.AbortController,DA=vb({fetch:MA,Headers:BA,AbortController:FA}),VA=DA,NA=()=>{var e;return((e=window==null?void 0:window.__NUXT__)==null?void 0:e.config)||{}},tu=NA().app,jA=()=>tu.baseURL,UA=()=>tu.buildAssetsDir,HA=(...e)=>gb(yb(),UA(),...e),yb=(...e)=>{const t=tu.cdnURL||tu.baseURL;return e.length?gb(t,...e):t};globalThis.__buildAssetsURL=HA,globalThis.__publicAssetsURL=yb;globalThis.$fetch||(globalThis.$fetch=VA.create({baseURL:jA()}));function Jf(e,t={},n){for(const r in e){const s=e[r],i=n?`${n}:${r}`:r;typeof s=="object"&&s!==null?Jf(s,t,i):typeof s=="function"&&(t[i]=s)}return t}const zA={run:e=>e()},WA=()=>zA,bb=typeof console.createTask<"u"?console.createTask:WA;function qA(e,t){const n=t.shift(),r=bb(n);return e.reduce((s,i)=>s.then(()=>r.run(()=>i(...t))),Promise.resolve())}function KA(e,t){const n=t.shift(),r=bb(n);return Promise.all(e.map(s=>r.run(()=>s(...t))))}function rf(e,t){for(const n of[...e])n(t)}class GA{constructor(){this._hooks={},this._before=void 0,this._after=void 0,this._deprecatedMessages=void 0,this._deprecatedHooks={},this.hook=this.hook.bind(this),this.callHook=this.callHook.bind(this),this.callHookWith=this.callHookWith.bind(this)}hook(t,n,r={}){if(!t||typeof n!="function")return()=>{};const s=t;let i;for(;this._deprecatedHooks[t];)i=this._deprecatedHooks[t],t=i.to;if(i&&!r.allowDeprecated){let l=i.message;l||(l=`${s} hook has been deprecated`+(i.to?`, please use ${i.to}`:"")),this._deprecatedMessages||(this._deprecatedMessages=new Set),this._deprecatedMessages.has(l)||(console.warn(l),this._deprecatedMessages.add(l))}if(!n.name)try{Object.defineProperty(n,"name",{get:()=>"_"+t.replace(/\W+/g,"_")+"_hook_cb",configurable:!0})}catch{}return this._hooks[t]=this._hooks[t]||[],this._hooks[t].push(n),()=>{n&&(this.removeHook(t,n),n=void 0)}}hookOnce(t,n){let r,s=(...i)=>(typeof r=="function"&&r(),r=void 0,s=void 0,n(...i));return r=this.hook(t,s),r}removeHook(t,n){if(this._hooks[t]){const r=this._hooks[t].indexOf(n);r!==-1&&this._hooks[t].splice(r,1),this._hooks[t].length===0&&delete this._hooks[t]}}deprecateHook(t,n){this._deprecatedHooks[t]=typeof n=="string"?{to:n}:n;const r=this._hooks[t]||[];delete this._hooks[t];for(const s of r)this.hook(t,s)}deprecateHooks(t){Object.assign(this._deprecatedHooks,t);for(const n in t)this.deprecateHook(n,t[n])}addHooks(t){const n=Jf(t),r=Object.keys(n).map(s=>this.hook(s,n[s]));return()=>{for(const s of r.splice(0,r.length))s()}}removeHooks(t){const n=Jf(t);for(const r in n)this.removeHook(r,n[r])}removeAllHooks(){for(const t in this._hooks)delete this._hooks[t]}callHook(t,...n){return n.unshift(t),this.callHookWith(qA,t,...n)}callHookParallel(t,...n){return n.unshift(t),this.callHookWith(KA,t,...n)}callHookWith(t,n,...r){const s=this._before||this._after?{name:n,args:r,context:{}}:void 0;this._before&&rf(this._before,s);const i=t(n in this._hooks?[...this._hooks[n]]:[],r);return i instanceof Promise?i.finally(()=>{this._after&&s&&rf(this._after,s)}):(this._after&&s&&rf(this._after,s),i)}beforeEach(t){return this._before=this._before||[],this._before.push(t),()=>{if(this._before!==void 0){const n=this._before.indexOf(t);n!==-1&&this._before.splice(n,1)}}}afterEach(t){return this._after=this._after||[],this._after.push(t),()=>{if(this._after!==void 0){const n=this._after.indexOf(t);n!==-1&&this._after.splice(n,1)}}}}function _b(){return new GA}function JA(e={}){let t,n=!1;const r=l=>{if(t&&t!==l)throw new Error("Context conflict")};let s;if(e.asyncContext){const l=e.AsyncLocalStorage||globalThis.AsyncLocalStorage;l?s=new l:console.warn("[unctx] `AsyncLocalStorage` is not provided.")}const i=()=>{if(s&&t===void 0){const l=s.getStore();if(l!==void 0)return l}return t};return{use:()=>{const l=i();if(l===void 0)throw new Error("Context is not available");return l},tryUse:()=>i(),set:(l,u)=>{u||r(l),t=l,n=!0},unset:()=>{t=void 0,n=!1},call:(l,u)=>{r(l),t=l;try{return s?s.run(l,u):u()}finally{n||(t=void 0)}},async callAsync(l,u){t=l;const c=()=>{t=l},p=()=>t===l?c:void 0;Zf.add(p);try{const d=s?s.run(l,u):u();return n||(t=void 0),await d}finally{Zf.delete(p)}}}}function ZA(e={}){const t={};return{get(n,r={}){return t[n]||(t[n]=JA({...e,...r})),t[n],t[n]}}}const nu=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof global<"u"?global:typeof window<"u"?window:{},l0="__unctx__",YA=nu[l0]||(nu[l0]=ZA()),QA=(e,t={})=>YA.get(e,t),u0="__unctx_async_handlers__",Zf=nu[u0]||(nu[u0]=new Set);function ru(e){const t=[];for(const s of Zf){const i=s();i&&t.push(i)}const n=()=>{for(const s of t)s()};let r=e();return r&&typeof r=="object"&&"catch"in r&&(r=r.catch(s=>{throw n(),s})),[r,n]}const wb=QA("nuxt-app",{asyncContext:!1}),XA="__nuxt_plugin";function eI(e){let t=0;const n={_scope:Fd(),provide:void 0,globalName:"nuxt",versions:{get nuxt(){return"3.11.2"},get vue(){return n.vueApp.version}},payload:_n({data:{},state:{},once:new Set,_errors:{},...window.__NUXT__??{}}),static:{data:{}},runWithContext:s=>n._scope.run(()=>rI(n,s)),isHydrating:!0,deferHydration(){if(!n.isHydrating)return()=>{};t++;let s=!1;return()=>{if(!s&&(s=!0,t--,t===0))return n.isHydrating=!1,n.callHook("app:suspense:resolve")}},_asyncDataPromises:{},_asyncData:{},_payloadRevivers:{},...e};n.hooks=_b(),n.hook=n.hooks.hook,n.callHook=n.hooks.callHook,n.provide=(s,i)=>{const l="$"+s;xl(n,l,i),xl(n.vueApp.config.globalProperties,l,i)},xl(n.vueApp,"$nuxt",n),xl(n.vueApp.config.globalProperties,"$nuxt",n);{window.addEventListener("nuxt.preloadError",i=>{n.callHook("app:chunkError",{error:i.payload})}),window.useNuxtApp=window.useNuxtApp||nt;const s=n.hook("app:error",(...i)=>{console.error("[nuxt] error caught during app initialization",...i)});n.hook("app:mounted",s)}const r=n.payload.config;return n.provide("config",r),n}async function tI(e,t){if(t.hooks&&e.hooks.addHooks(t.hooks),typeof t=="function"){const{provide:n}=await e.runWithContext(()=>t(e))||{};if(n&&typeof n=="object")for(const r in n)e.provide(r,n[r])}}async function nI(e,t){const n=[],r=[],s=[],i=[];let l=0;async function u(c){var d;const p=((d=c.dependsOn)==null?void 0:d.filter(g=>t.some(h=>h._name===g)&&!n.includes(g)))??[];if(p.length>0)r.push([new Set(p),c]);else{const g=tI(e,c).then(async()=>{c._name&&(n.push(c._name),await Promise.all(r.map(async([h,v])=>{h.has(c._name)&&(h.delete(c._name),h.size===0&&(l++,await u(v)))})))});c.parallel?s.push(g.catch(h=>i.push(h))):await g}}for(const c of t)await u(c);if(await Promise.all(s),l)for(let c=0;c{}),e,{[XA]:!0,_name:t})}function rI(e,t,n){const r=()=>n?t(...n):t();return wb.set(e),e.vueApp.runWithContext(r)}function oI(){var t;let e;return ep()&&(e=(t=ir())==null?void 0:t.appContext.app.$nuxt),e=e||wb.tryUse(),e||null}function nt(){const e=oI();if(!e)throw new Error("[nuxt] instance unavailable");return e}function Yr(e){return nt().$config}function xl(e,t,n){Object.defineProperty(e,t,{get:()=>n})}const kl=/^[\u0009\u0020-\u007E\u0080-\u00FF]+$/;function sI(e,t){if(typeof e!="string")throw new TypeError("argument str must be a string");const n={},s=(t||{}).decode||lI;let i=0;for(;i{t+=s};return{toString(){return t},getContext(){return n},dispatch(s){return e.replacer&&(s=e.replacer(s)),this[s===null?"null":typeof s](s)},object(s){if(s&&typeof s.toJSON=="function")return this.object(s.toJSON());const i=Object.prototype.toString.call(s);let l="";const u=i.length;u<10?l="unknown:["+i+"]":l=i.slice(8,u-1),l=l.toLowerCase();let c=null;if((c=n.get(s))===void 0)n.set(s,n.size);else return this.dispatch("[CIRCULAR:"+c+"]");if(typeof Buffer<"u"&&Buffer.isBuffer&&Buffer.isBuffer(s))return r("buffer:"),r(s.toString("utf8"));if(l!=="object"&&l!=="function"&&l!=="asyncfunction")this[l]?this[l](s):e.ignoreUnknown||this.unkown(s,l);else{let p=Object.keys(s);e.unorderedObjects&&(p=p.sort());let d=[];e.respectType!==!1&&!d0(s)&&(d=cI),e.excludeKeys&&(p=p.filter(h=>!e.excludeKeys(h)),d=d.filter(h=>!e.excludeKeys(h))),r("object:"+(p.length+d.length)+":");const g=h=>{this.dispatch(h),r(":"),e.excludeValues||this.dispatch(s[h]),r(",")};for(const h of p)g(h);for(const h of d)g(h)}},array(s,i){if(i=i===void 0?e.unorderedArrays!==!1:i,r("array:"+s.length+":"),!i||s.length<=1){for(const c of s)this.dispatch(c);return}const l=new Map,u=s.map(c=>{const p=xb(e);p.dispatch(c);for(const[d,g]of p.getContext())l.set(d,g);return p.toString()});return n=l,u.sort(),this.array(u,!1)},date(s){return r("date:"+s.toJSON())},symbol(s){return r("symbol:"+s.toString())},unkown(s,i){if(r(i),!!s&&(r(":"),s&&typeof s.entries=="function"))return this.array(Array.from(s.entries()),!0)},error(s){return r("error:"+s.toString())},boolean(s){return r("bool:"+s)},string(s){r("string:"+s.length+":"),r(s)},function(s){r("fn:"),d0(s)?this.dispatch("[native]"):this.dispatch(s.toString()),e.respectFunctionNames!==!1&&this.dispatch("function-name:"+String(s.name)),e.respectFunctionProperties&&this.object(s)},number(s){return r("number:"+s)},xml(s){return r("xml:"+s.toString())},null(){return r("Null")},undefined(){return r("Undefined")},regexp(s){return r("regex:"+s.toString())},uint8array(s){return r("uint8array:"),this.dispatch(Array.prototype.slice.call(s))},uint8clampedarray(s){return r("uint8clampedarray:"),this.dispatch(Array.prototype.slice.call(s))},int8array(s){return r("int8array:"),this.dispatch(Array.prototype.slice.call(s))},uint16array(s){return r("uint16array:"),this.dispatch(Array.prototype.slice.call(s))},int16array(s){return r("int16array:"),this.dispatch(Array.prototype.slice.call(s))},uint32array(s){return r("uint32array:"),this.dispatch(Array.prototype.slice.call(s))},int32array(s){return r("int32array:"),this.dispatch(Array.prototype.slice.call(s))},float32array(s){return r("float32array:"),this.dispatch(Array.prototype.slice.call(s))},float64array(s){return r("float64array:"),this.dispatch(Array.prototype.slice.call(s))},arraybuffer(s){return r("arraybuffer:"),this.dispatch(new Uint8Array(s))},url(s){return r("url:"+s.toString())},map(s){r("map:");const i=[...s];return this.array(i,e.unorderedSets!==!1)},set(s){r("set:");const i=[...s];return this.array(i,e.unorderedSets!==!1)},file(s){return r("file:"),this.dispatch([s.name,s.size,s.type,s.lastModfied])},blob(){if(e.ignoreUnknown)return r("[blob]");throw new Error(`Hashing Blob objects is currently not supported -Use "options.replacer" or "options.ignoreUnknown" -`)},domwindow(){return r("domwindow")},bigint(s){return r("bigint:"+s.toString())},process(){return r("process")},timer(){return r("timer")},pipe(){return r("pipe")},tcp(){return r("tcp")},udp(){return r("udp")},tty(){return r("tty")},statwatcher(){return r("statwatcher")},securecontext(){return r("securecontext")},connection(){return r("connection")},zlib(){return r("zlib")},context(){return r("context")},nodescript(){return r("nodescript")},httpparser(){return r("httpparser")},dataview(){return r("dataview")},signal(){return r("signal")},fsevent(){return r("fsevent")},tlswrap(){return r("tlswrap")}}}const kb="[native code] }",fI=kb.length;function d0(e){return typeof e!="function"?!1:Function.prototype.toString.call(e).slice(-fI)===kb}class $o{constructor(t,n){t=this.words=t||[],this.sigBytes=n===void 0?t.length*4:n}toString(t){return(t||dI).stringify(this)}concat(t){if(this.clamp(),this.sigBytes%4)for(let n=0;n>>2]>>>24-n%4*8&255;this.words[this.sigBytes+n>>>2]|=r<<24-(this.sigBytes+n)%4*8}else for(let n=0;n>>2]=t.words[n>>>2];return this.sigBytes+=t.sigBytes,this}clamp(){this.words[this.sigBytes>>>2]&=4294967295<<32-this.sigBytes%4*8,this.words.length=Math.ceil(this.sigBytes/4)}clone(){return new $o([...this.words])}}const dI={stringify(e){const t=[];for(let n=0;n>>2]>>>24-n%4*8&255;t.push((r>>>4).toString(16),(r&15).toString(16))}return t.join("")}},pI={stringify(e){const t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",n=[];for(let r=0;r>>2]>>>24-r%4*8&255,i=e.words[r+1>>>2]>>>24-(r+1)%4*8&255,l=e.words[r+2>>>2]>>>24-(r+2)%4*8&255,u=s<<16|i<<8|l;for(let c=0;c<4&&r*8+c*6>>6*(3-c)&63))}return n.join("")}},hI={parse(e){const t=e.length,n=[];for(let r=0;r>>2]|=(e.charCodeAt(r)&255)<<24-r%4*8;return new $o(n,t)}},gI={parse(e){return hI.parse(unescape(encodeURIComponent(e)))}};class mI{constructor(){this._data=new $o,this._nDataBytes=0,this._minBufferSize=0,this.blockSize=512/32}reset(){this._data=new $o,this._nDataBytes=0}_append(t){typeof t=="string"&&(t=gI.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes}_doProcessBlock(t,n){}_process(t){let n,r=this._data.sigBytes/(this.blockSize*4);t?r=Math.ceil(r):r=Math.max((r|0)-this._minBufferSize,0);const s=r*this.blockSize,i=Math.min(s*4,this._data.sigBytes);if(s){for(let l=0;l>>7)^(S<<14|S>>>18)^S>>>3,B=Jo[h-2],L=(B<<15|B>>>17)^(B<<13|B>>>19)^B>>>10;Jo[h]=A+Jo[h-7]+L+Jo[h-16]}const v=c&p^~c&d,_=s&i^s&l^i&l,x=(s<<30|s>>>2)^(s<<19|s>>>13)^(s<<10|s>>>22),b=(c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25),E=g+b+v+yI[h]+Jo[h],C=x+_;g=d,d=p,p=c,c=u+E|0,u=l,l=i,i=s,s=E+C|0}r[0]=r[0]+s|0,r[1]=r[1]+i|0,r[2]=r[2]+l|0,r[3]=r[3]+u|0,r[4]=r[4]+c|0,r[5]=r[5]+p|0,r[6]=r[6]+d|0,r[7]=r[7]+g|0}finalize(t){super.finalize(t);const n=this._nDataBytes*8,r=this._data.sigBytes*8;return this._data.words[r>>>5]|=128<<24-r%32,this._data.words[(r+64>>>9<<4)+14]=Math.floor(n/4294967296),this._data.words[(r+64>>>9<<4)+15]=n,this._data.sigBytes=this._data.words.length*4,this._process(),this._hash}}function _I(e){return new bI().finalize(e).toString(pI)}function wI(e,t={}){const n=typeof e=="string"?e:Yf(e,t);return _I(n).slice(0,10)}function Sb(e,t,n={}){return e===t||Yf(e,n)===Yf(t,n)}function of(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t!==null&&t!==Object.prototype&&Object.getPrototypeOf(t)!==null||Symbol.iterator in e?!1:Symbol.toStringTag in e?Object.prototype.toString.call(e)==="[object Module]":!0}function Qf(e,t,n=".",r){if(!of(t))return Qf(e,{},n,r);const s=Object.assign({},t);for(const i in e){if(i==="__proto__"||i==="constructor")continue;const l=e[i];l!=null&&(r&&r(s,i,l,n)||(Array.isArray(l)&&Array.isArray(s[i])?s[i]=[...l,...s[i]]:of(l)&&of(s[i])?s[i]=Qf(l,s[i],(n?`${n}.`:"")+i.toString(),r):s[i]=l))}return s}function ap(e){return(...t)=>t.reduce((n,r)=>Qf(n,r,"",e),{})}const wu=ap(),xI=ap((e,t,n)=>{if(e[t]!==void 0&&typeof n=="function")return e[t]=n(e[t]),!0});function kI(e,t){try{return t in e}catch{return!1}}var SI=Object.defineProperty,CI=(e,t,n)=>t in e?SI(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Xo=(e,t,n)=>(CI(e,typeof t!="symbol"?t+"":t,n),n);class Xf extends Error{constructor(t,n={}){super(t,n),Xo(this,"statusCode",500),Xo(this,"fatal",!1),Xo(this,"unhandled",!1),Xo(this,"statusMessage"),Xo(this,"data"),Xo(this,"cause"),n.cause&&!this.cause&&(this.cause=n.cause)}toJSON(){const t={message:this.message,statusCode:td(this.statusCode,500)};return this.statusMessage&&(t.statusMessage=Cb(this.statusMessage)),this.data!==void 0&&(t.data=this.data),t}}Xo(Xf,"__h3_error__",!0);function ed(e){if(typeof e=="string")return new Xf(e);if(EI(e))return e;const t=new Xf(e.message??e.statusMessage??"",{cause:e.cause||e});if(kI(e,"stack"))try{Object.defineProperty(t,"stack",{get(){return e.stack}})}catch{try{t.stack=e.stack}catch{}}if(e.data&&(t.data=e.data),e.statusCode?t.statusCode=td(e.statusCode,t.statusCode):e.status&&(t.statusCode=td(e.status,t.statusCode)),e.statusMessage?t.statusMessage=e.statusMessage:e.statusText&&(t.statusMessage=e.statusText),t.statusMessage){const n=t.statusMessage;Cb(t.statusMessage)!==n&&console.warn("[h3] Please prefer using `message` for longer error messages instead of `statusMessage`. In the future, `statusMessage` will be sanitized by default.")}return e.fatal!==void 0&&(t.fatal=e.fatal),e.unhandled!==void 0&&(t.unhandled=e.unhandled),t}function EI(e){var t;return((t=e==null?void 0:e.constructor)==null?void 0:t.__h3_error__)===!0}const TI=/[^\u0009\u0020-\u007E]/g;function Cb(e=""){return e.replace(TI,"")}function td(e,t=200){return!e||(typeof e=="string"&&(e=Number.parseInt(e,10)),e<100||e>999)?t:e}const Eb=Symbol("layout-meta"),$n=Symbol("route"),Wn=()=>{var e;return(e=nt())==null?void 0:e.$router},xu=()=>ep()?Ke($n,nt()._route):nt()._route;const $I=()=>{try{if(nt()._processingMiddleware)return!0}catch{return!1}return!1},Ao=(e,t)=>{e||(e="/");const n=typeof e=="string"?e:pb(e.path||"/",e.query||{})+(e.hash||"");if(t!=null&&t.open){const{target:u="_blank",windowFeatures:c={}}=t.open,p=Object.entries(c).filter(([d,g])=>g!==void 0).map(([d,g])=>`${d.toLowerCase()}=${g}`).join(", ");return open(n,u,p),Promise.resolve()}const r=(t==null?void 0:t.external)||Bo(n,{acceptRelative:!0});if(r){if(!(t!=null&&t.external))throw new Error("Navigating to an external URL is not allowed by default. Use `navigateTo(url, { external: true })`.");const u=ha(n).protocol;if(u&&bA(u))throw new Error(`Cannot navigate to a URL with '${u}' protocol.`)}const s=$I();if(!r&&s)return e;const i=Wn(),l=nt();return r?(l._scope.stop(),t!=null&&t.replace?location.replace(n):location.href=n,s?l.isHydrating?new Promise(()=>{}):!1:Promise.resolve()):t!=null&&t.replace?i.replace(e):i.push(e)},Tb="__nuxt_error",ku=()=>Ot(nt().payload,"error"),Fs=e=>{const t=ga(e);try{const n=nt(),r=ku();n.hooks.callHook("app:error",t),r.value=r.value||t}catch{throw t}return t},AI=async(e={})=>{const t=nt(),n=ku();t.callHook("app:error:cleared",e),e.redirect&&await Wn().replace(e.redirect),n.value=null},II=e=>!!e&&typeof e=="object"&&Tb in e,ga=e=>{const t=ed(e);return Object.defineProperty(t,Tb,{value:!0,configurable:!1,writable:!1}),t},RI="modulepreload",OI=function(e,t){return e[0]==="."?new URL(e,t).href:e},h0={},PI=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){const i=document.getElementsByTagName("link"),l=document.querySelector("meta[property=csp-nonce]"),u=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));s=Promise.all(n.map(c=>{if(c=OI(c,r),c in h0)return;h0[c]=!0;const p=c.endsWith(".css"),d=p?'[rel="stylesheet"]':"";if(!!r)for(let v=i.length-1;v>=0;v--){const _=i[v];if(_.href===c&&(!p||_.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${c}"]${d}`))return;const h=document.createElement("link");if(h.rel=p?"stylesheet":RI,p||(h.as="script",h.crossOrigin=""),h.href=c,u&&h.setAttribute("nonce",u),document.head.appendChild(h),p)return new Promise((v,_)=>{h.addEventListener("load",v),h.addEventListener("error",()=>_(new Error(`Unable to preload CSS for ${c}`)))})}))}return s.then(()=>t()).catch(i=>{const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=i,window.dispatchEvent(l),!l.defaultPrevented)throw i})},yn=(...e)=>PI(...e).catch(t=>{const n=new Event("nuxt.preloadError");throw n.payload=t,window.dispatchEvent(n),t}),LI=-1,MI=-2,BI=-3,FI=-4,DI=-5,VI=-6;function NI(e,t){return jI(JSON.parse(e),t)}function jI(e,t){if(typeof e=="number")return s(e,!0);if(!Array.isArray(e)||e.length===0)throw new Error("Invalid input");const n=e,r=Array(n.length);function s(i,l=!1){if(i===LI)return;if(i===BI)return NaN;if(i===FI)return 1/0;if(i===DI)return-1/0;if(i===VI)return-0;if(l)throw new Error("Invalid input");if(i in r)return r[i];const u=n[i];if(!u||typeof u!="object")r[i]=u;else if(Array.isArray(u))if(typeof u[0]=="string"){const c=u[0],p=t==null?void 0:t[c];if(p)return r[i]=p(s(u[1]));switch(c){case"Date":r[i]=new Date(u[1]);break;case"Set":const d=new Set;r[i]=d;for(let v=1;v>>9)+65536).toString(16).substring(1,8).toLowerCase()}function g0(e){return e._h||lp(e._d?e._d:`${e.tag}:${e.textContent||e.innerHTML||""}:${Object.entries(e.props).map(([t,n])=>`${t}:${String(n)}`).join(",")}`)}function Ab(e,t){const{props:n,tag:r}=e;if(WI.includes(r))return r;if(r==="link"&&n.rel==="canonical")return"canonical";if(n.charset)return"charset";const s=["id"];r==="meta"&&s.push("name","property","http-equiv");for(const i of s)if(typeof n[i]<"u"){const l=String(n[i]);return t&&!t(l)?!1:`${r}:${i}:${l}`}return!1}function m0(e,t){return e==null?t||null:typeof e=="function"?e(t):e}function Ib(e,t){const n=[],r=t.resolveKeyData||(i=>i.key),s=t.resolveValueData||(i=>i.value);for(const[i,l]of Object.entries(e))n.push(...(Array.isArray(l)?l:[l]).map(u=>{const c={key:i,value:u},p=s(c);return typeof p=="object"?Ib(p,t):Array.isArray(p)?p:{[typeof t.key=="function"?t.key(c):t.key]:r(c),[typeof t.value=="function"?t.value(c):t.value]:p}}).flat());return n}function Rb(e,t){return Object.entries(e).map(([n,r])=>{if(typeof r=="object"&&(r=Rb(r,t)),t.resolve){const s=t.resolve({key:n,value:r});if(typeof s<"u")return s}return typeof r=="number"&&(r=r.toString()),typeof r=="string"&&t.wrapValue&&(r=r.replace(new RegExp(t.wrapValue,"g"),`\\${t.wrapValue}`),r=`${t.wrapValue}${r}${t.wrapValue}`),`${n}${t.keyValueSeparator||""}${r}`}).join(t.entrySeparator||"")}const mn=e=>({keyValue:e,metaKey:"property"}),sf=e=>({keyValue:e}),up={appleItunesApp:{unpack:{entrySeparator:", ",resolve({key:e,value:t}){return`${Kr(e)}=${t}`}}},articleExpirationTime:mn("article:expiration_time"),articleModifiedTime:mn("article:modified_time"),articlePublishedTime:mn("article:published_time"),bookReleaseDate:mn("book:release_date"),charset:{metaKey:"charset"},contentSecurityPolicy:{unpack:{entrySeparator:"; ",resolve({key:e,value:t}){return`${Kr(e)} ${t}`}},metaKey:"http-equiv"},contentType:{metaKey:"http-equiv"},defaultStyle:{metaKey:"http-equiv"},fbAppId:mn("fb:app_id"),msapplicationConfig:sf("msapplication-Config"),msapplicationTileColor:sf("msapplication-TileColor"),msapplicationTileImage:sf("msapplication-TileImage"),ogAudioSecureUrl:mn("og:audio:secure_url"),ogAudioUrl:mn("og:audio"),ogImageSecureUrl:mn("og:image:secure_url"),ogImageUrl:mn("og:image"),ogSiteName:mn("og:site_name"),ogVideoSecureUrl:mn("og:video:secure_url"),ogVideoUrl:mn("og:video"),profileFirstName:mn("profile:first_name"),profileLastName:mn("profile:last_name"),profileUsername:mn("profile:username"),refresh:{metaKey:"http-equiv",unpack:{entrySeparator:";",resolve({key:e,value:t}){if(e==="seconds")return`${t}`}}},robots:{unpack:{entrySeparator:", ",resolve({key:e,value:t}){return typeof t=="boolean"?`${Kr(e)}`:`${Kr(e)}:${t}`}}},xUaCompatible:{metaKey:"http-equiv"}},Ob=["og","book","article","profile"];function Pb(e){var n;const t=Kr(e).split(":")[0];return Ob.includes(t)?"property":((n=up[e])==null?void 0:n.metaKey)||"name"}function KI(e){var t;return((t=up[e])==null?void 0:t.keyValue)||Kr(e)}function Kr(e){const t=e.replace(/([A-Z])/g,"-$1").toLowerCase(),n=t.split("-")[0];return Ob.includes(n)||n==="twitter"?e.replace(/([A-Z])/g,":$1").toLowerCase():t}function nd(e){if(Array.isArray(e))return e.map(n=>nd(n));if(typeof e!="object"||Array.isArray(e))return e;const t={};for(const[n,r]of Object.entries(e))t[Kr(n)]=nd(r);return t}function GI(e,t){const n=up[t];return t==="refresh"?`${e.seconds};url=${e.url}`:Rb(nd(e),{keyValueSeparator:"=",entrySeparator:", ",resolve({value:r,key:s}){if(r===null)return"";if(typeof r=="boolean")return`${s}`},...n==null?void 0:n.unpack})}const Lb=["og:image","og:video","og:audio","twitter:image"];function Mb(e){const t={};return Object.entries(e).forEach(([n,r])=>{String(r)!=="false"&&n&&(t[n]=r)}),t}function v0(e,t){const n=Mb(t),r=Kr(e),s=Pb(r);if(Lb.includes(r)){const i={};return Object.entries(n).forEach(([l,u])=>{i[`${e}${l==="url"?"":`${l.charAt(0).toUpperCase()}${l.slice(1)}`}`]=u}),Bb(i).sort((l,u)=>{var c,p;return(((c=l[s])==null?void 0:c.length)||0)-(((p=u[s])==null?void 0:p.length)||0)})}return[{[s]:r,...n}]}function Bb(e){const t=[],n={};Object.entries(e).forEach(([s,i])=>{if(!Array.isArray(i)){if(typeof i=="object"&&i){if(Lb.includes(Kr(s))){t.push(...v0(s,i));return}n[s]=Mb(i)}else n[s]=i;return}i.forEach(l=>{t.push(...typeof l=="string"?Bb({[s]:l}):v0(s,l))})});const r=Ib(n,{key({key:s}){return Pb(s)},value({key:s}){return s==="charset"?"charset":"content"},resolveKeyData({key:s}){return KI(s)},resolveValueData({value:s,key:i}){return s===null?"_null":typeof s=="object"?GI(s,i):typeof s=="number"?s.toString():s}});return[...t,...r].map(s=>(s.content==="_null"&&(s.content=null),s))}async function JI(e,t,n){const r={tag:e,props:await Fb(typeof t=="object"&&typeof t!="function"&&!(t instanceof Promise)?{...t}:{[["script","noscript","style"].includes(e)?"innerHTML":"textContent"]:t},["templateParams","titleTemplate"].includes(e))};return $b.forEach(s=>{const i=typeof r.props[s]<"u"?r.props[s]:n[s];typeof i<"u"&&((!["innerHTML","textContent","children"].includes(s)||HI.includes(r.tag))&&(r[s==="children"?"innerHTML":s]=i),delete r.props[s])}),r.props.body&&(r.tagPosition="bodyClose",delete r.props.body),r.tag==="script"&&typeof r.innerHTML=="object"&&(r.innerHTML=JSON.stringify(r.innerHTML),r.props.type=r.props.type||"application/json"),Array.isArray(r.props.content)?r.props.content.map(s=>({...r,props:{...r.props,content:s}})):r}function ZI(e,t){var r;const n=e==="class"?" ":";";return typeof t=="object"&&!Array.isArray(t)&&(t=Object.entries(t).filter(([,s])=>s).map(([s,i])=>e==="style"?`${s}:${i}`:s)),(r=Array.isArray(t)?t.join(n):t)==null?void 0:r.split(n).filter(s=>s.trim()).filter(Boolean).join(n)}async function Fb(e,t){for(const n of Object.keys(e)){if(["class","style"].includes(n)){e[n]=ZI(n,e[n]);continue}if(e[n]instanceof Promise&&(e[n]=await e[n]),!t&&!$b.includes(n)){const r=String(e[n]),s=n.startsWith("data-");r==="true"||r===""?e[n]=s?"true":!0:e[n]||(s&&r==="false"?e[n]="false":delete e[n])}}return e}const YI=10;async function QI(e){const t=[];return Object.entries(e.resolvedInput).filter(([n,r])=>typeof r<"u"&&zI.includes(n)).forEach(([n,r])=>{const s=UI(r);t.push(...s.map(i=>JI(n,i,e)).flat())}),(await Promise.all(t)).flat().filter(Boolean).map((n,r)=>(n._e=e._i,e.mode&&(n._m=e.mode),n._p=(e._i<c&&c[p]||void 0,t):u=t[l],typeof u<"u"?(u||"").replace(/"/g,'\\"'):!1}let s=e;try{s=decodeURI(e)}catch{}return(s.match(/%(\w+\.+\w+)|%(\w+)/g)||[]).sort().reverse().forEach(l=>{const u=r(l.slice(1));typeof u=="string"&&(e=e.replace(new RegExp(`\\${l}(\\W|$)`,"g"),(c,p)=>`${u}${p}`).trim())}),e.includes(ho)&&(e.endsWith(ho)&&(e=e.slice(0,-ho.length).trim()),e.startsWith(ho)&&(e=e.slice(ho.length).trim()),e=e.replace(new RegExp(`\\${ho}\\s*\\${ho}`,"g"),ho),e=Bl(e,{separator:n},n)),e}async function Db(e,t={}){var d;const n=t.document||e.resolvedOptions.document;if(!n||!e.dirty)return;const r={shouldRender:!0,tags:[]};if(await e.hooks.callHook("dom:beforeRender",r),!r.shouldRender)return;const s=(await e.resolveTags()).map(g=>({tag:g,id:Ml.includes(g.tag)?g0(g):g.tag,shouldRender:!0}));let i=e._dom;if(!i){i={elMap:{htmlAttrs:n.documentElement,bodyAttrs:n.body}};for(const g of["body","head"]){const h=(d=n[g])==null?void 0:d.children,v=[];for(const _ of[...h].filter(x=>Ml.includes(x.tagName.toLowerCase()))){const x={tag:_.tagName.toLowerCase(),props:await Fb(_.getAttributeNames().reduce((C,S)=>({...C,[S]:_.getAttribute(S)}),{})),innerHTML:_.innerHTML};let b=1,E=Ab(x);for(;E&&v.find(C=>C._d===E);)E=`${E}:${b++}`;x._d=E||void 0,v.push(x),i.elMap[_.getAttribute("data-hid")||g0(x)]=_}}}i.pendingSideEffects={...i.sideEffects||{}},i.sideEffects={};function l(g,h,v){const _=`${g}:${h}`;i.sideEffects[_]=v,delete i.pendingSideEffects[_]}function u({id:g,$el:h,tag:v}){const _=v.tag.endsWith("Attrs");i.elMap[g]=h,_||(["textContent","innerHTML"].forEach(x=>{v[x]&&v[x]!==h[x]&&(h[x]=v[x])}),l(g,"el",()=>{var x;(x=i.elMap[g])==null||x.remove(),delete i.elMap[g]}));for(const[x,b]of Object.entries(v._eventHandlers||{}))h.getAttribute(`data-${x}`)!==""&&((v.tag==="bodyAttrs"?n.defaultView:h).addEventListener(x.replace("on",""),b.bind(h)),h.setAttribute(`data-${x}`,""));Object.entries(v.props).forEach(([x,b])=>{const E=`attr:${x}`;if(x==="class")for(const C of(b||"").split(" ").filter(Boolean))_&&l(g,`${E}:${C}`,()=>h.classList.remove(C)),!h.classList.contains(C)&&h.classList.add(C);else if(x==="style")for(const C of(b||"").split(";").filter(Boolean)){const[S,...A]=C.split(":").map(B=>B.trim());l(g,`${E}:${C}:${S}`,()=>{h.style.removeProperty(S)}),h.style.setProperty(S,A.join(":"))}else h.getAttribute(x)!==b&&h.setAttribute(x,b===!0?"":String(b)),_&&l(g,E,()=>h.removeAttribute(x))})}const c=[],p={bodyClose:void 0,bodyOpen:void 0,head:void 0};for(const g of s){const{tag:h,shouldRender:v,id:_}=g;if(v){if(h.tag==="title"){n.title=h.textContent;continue}g.$el=g.$el||i.elMap[_],g.$el?u(g):Ml.includes(h.tag)&&c.push(g)}}for(const g of c){const h=g.tag.tagPosition||"head";g.$el=n.createElement(g.tag.tag),u(g),p[h]=p[h]||n.createDocumentFragment(),p[h].appendChild(g.$el)}for(const g of s)await e.hooks.callHook("dom:renderTag",g,n,l);p.head&&n.head.appendChild(p.head),p.bodyOpen&&n.body.insertBefore(p.bodyOpen,n.body.firstChild),p.bodyClose&&n.body.appendChild(p.bodyClose),Object.values(i.pendingSideEffects).forEach(g=>g()),e._dom=i,e.dirty=!1,await e.hooks.callHook("dom:rendered",{renders:s})}async function e3(e,t={}){const n=t.delayFn||(r=>setTimeout(r,10));return e._domUpdatePromise=e._domUpdatePromise||new Promise(r=>n(async()=>{await Db(e,t),delete e._domUpdatePromise,r()}))}function t3(e){return t=>{var r,s;const n=((s=(r=t.resolvedOptions.document)==null?void 0:r.head.querySelector('script[id="unhead:payload"]'))==null?void 0:s.innerHTML)||!1;return n&&t.push(JSON.parse(n)),{mode:"client",hooks:{"entries:updated":function(i){e3(i,e)}}}}}const n3=["templateParams","htmlAttrs","bodyAttrs"],r3={hooks:{"tag:normalise":function({tag:e}){["hid","vmid","key"].forEach(r=>{e.props[r]&&(e.key=e.props[r],delete e.props[r])});const n=Ab(e)||(e.key?`${e.tag}:${e.key}`:!1);n&&(e._d=n)},"tags:resolve":function(e){const t={};e.tags.forEach(r=>{const s=(r.key?`${r.tag}:${r.key}`:r._d)||r._p,i=t[s];if(i){let u=r==null?void 0:r.tagDuplicateStrategy;if(!u&&n3.includes(r.tag)&&(u="merge"),u==="merge"){const c=i.props;["class","style"].forEach(p=>{c[p]&&(r.props[p]?(p==="style"&&!c[p].endsWith(";")&&(c[p]+=";"),r.props[p]=`${c[p]} ${r.props[p]}`):r.props[p]=c[p])}),t[s].props={...c,...r.props};return}else if(r._e===i._e){i._duped=i._duped||[],r._d=`${i._d}:${i._duped.length+1}`,i._duped.push(r);return}else if(ou(r)>ou(i))return}const l=Object.keys(r.props).length+(r.innerHTML?1:0)+(r.textContent?1:0);if(Ml.includes(r.tag)&&l===0){delete t[s];return}t[s]=r});const n=[];Object.values(t).forEach(r=>{const s=r._duped;delete r._duped,n.push(r),s&&n.push(...s)}),e.tags=n,e.tags=e.tags.filter(r=>!(r.tag==="meta"&&(r.props.name||r.props.property)&&!r.props.content))}}},o3={mode:"server",hooks:{"tags:resolve":function(e){const t={};e.tags.filter(n=>["titleTemplate","templateParams","title"].includes(n.tag)&&n._m==="server").forEach(n=>{t[n.tag]=n.tag.startsWith("title")?n.textContent:n.props}),Object.keys(t).length&&e.tags.push({tag:"script",innerHTML:JSON.stringify(t),props:{id:"unhead:payload",type:"application/json"}})}}},s3=["script","link","bodyAttrs"],i3=e=>({hooks:{"tags:resolve":function(t){for(const n of t.tags.filter(r=>s3.includes(r.tag)))Object.entries(n.props).forEach(([r,s])=>{r.startsWith("on")&&typeof s=="function"&&(e.ssr&&_0.includes(r)?n.props[r]=`this.dataset.${r}fired = true`:delete n.props[r],n._eventHandlers=n._eventHandlers||{},n._eventHandlers[r]=s)}),e.ssr&&n._eventHandlers&&(n.props.src||n.props.href)&&(n.key=n.key||lp(n.props.src||n.props.href))},"dom:renderTag":function({$el:t,tag:n}){var r,s;for(const i of Object.keys((t==null?void 0:t.dataset)||{}).filter(l=>_0.some(u=>`${u}fired`===l))){const l=i.replace("fired","");(s=(r=n._eventHandlers)==null?void 0:r[l])==null||s.call(t,new Event(l.replace("on","")))}}}}),a3=["link","style","script","noscript"],l3={hooks:{"tag:normalise":({tag:e})=>{e.key&&a3.includes(e.tag)&&(e.props["data-hid"]=e._h=lp(e.key))}}},u3={hooks:{"tags:resolve":e=>{const t=n=>{var r;return(r=e.tags.find(s=>s._d===n))==null?void 0:r._p};for(const{prefix:n,offset:r}of XI)for(const s of e.tags.filter(i=>typeof i.tagPriority=="string"&&i.tagPriority.startsWith(n))){const i=t(s.tagPriority.replace(n,""));typeof i<"u"&&(s._p=i+r)}e.tags.sort((n,r)=>n._p-r._p).sort((n,r)=>ou(n)-ou(r))}}},c3={meta:"content",link:"href",htmlAttrs:"lang"},f3=e=>({hooks:{"tags:resolve":t=>{var u;const{tags:n}=t,r=(u=n.find(c=>c.tag==="title"))==null?void 0:u.textContent,s=n.findIndex(c=>c.tag==="templateParams"),i=s!==-1?n[s].props:{},l=i.separator||"|";delete i.separator,i.pageTitle=Bl(i.pageTitle||r||"",i,l);for(const c of n.filter(p=>p.processTemplateParams!==!1)){const p=c3[c.tag];p&&typeof c.props[p]=="string"?c.props[p]=Bl(c.props[p],i,l):(c.processTemplateParams===!0||["titleTemplate","title"].includes(c.tag))&&["innerHTML","textContent"].forEach(d=>{typeof c[d]=="string"&&(c[d]=Bl(c[d],i,l))})}e._templateParams=i,e._separator=l,t.tags=n.filter(c=>c.tag!=="templateParams")}}}),d3={hooks:{"tags:resolve":e=>{const{tags:t}=e;let n=t.findIndex(s=>s.tag==="titleTemplate");const r=t.findIndex(s=>s.tag==="title");if(r!==-1&&n!==-1){const s=m0(t[n].textContent,t[r].textContent);s!==null?t[r].textContent=s||t[r].textContent:delete t[r]}else if(n!==-1){const s=m0(t[n].textContent);s!==null&&(t[n].textContent=s,t[n].tag="title",n=-1)}n!==-1&&delete t[n],e.tags=t.filter(Boolean)}}},p3={hooks:{"tags:afterResolve":function(e){for(const t of e.tags)typeof t.innerHTML=="string"&&(t.innerHTML&&["application/ld+json","application/json"].includes(t.props.type)?t.innerHTML=t.innerHTML.replace(/{u.dirty=!0,t.callHook("entries:updated",u)};let s=0,i=[];const l=[],u={plugins:l,dirty:!1,resolvedOptions:e,hooks:t,headEntries(){return i},use(c){const p=typeof c=="function"?c(u):c;(!p.key||!l.some(d=>d.key===p.key))&&(l.push(p),w0(p.mode,n)&&t.addHooks(p.hooks||{}))},push(c,p){p==null||delete p.head;const d={_i:s++,input:c,...p};return w0(d.mode,n)&&(i.push(d),r()),{dispose(){i=i.filter(g=>g._i!==d._i),t.callHook("entries:updated",u),r()},patch(g){i=i.map(h=>(h._i===d._i&&(h.input=d.input=g),h)),r()}}},async resolveTags(){const c={tags:[],entries:[...i]};await t.callHook("entries:resolve",c);for(const p of c.entries){const d=p.resolvedInput||p.input;if(p.resolvedInput=await(p.transform?p.transform(d):d),p.resolvedInput)for(const g of await QI(p)){const h={tag:g,entry:p,resolvedOptions:u.resolvedOptions};await t.callHook("tag:normalise",h),c.tags.push(h.tag)}}return await t.callHook("tags:beforeResolve",c),await t.callHook("tags:resolve",c),await t.callHook("tags:afterResolve",c),c.tags},ssr:n};return[r3,o3,i3,l3,u3,f3,d3,p3,...(e==null?void 0:e.plugins)||[]].forEach(c=>u.use(c)),u.hooks.callHook("init",u),u}function m3(){return Vb}const v3=ob.startsWith("3");function y3(e){return typeof e=="function"?e():R(e)}function su(e,t=""){if(e instanceof Promise)return e;const n=y3(e);return!e||!n?n:Array.isArray(n)?n.map(r=>su(r,t)):typeof n=="object"?Object.fromEntries(Object.entries(n).map(([r,s])=>r==="titleTemplate"||r.startsWith("on")?[r,R(s)]:[r,su(s,r)])):n}const b3={hooks:{"entries:resolve":function(e){for(const t of e.entries)t.resolvedInput=su(t.input)}}},Nb="usehead";function _3(e){return{install(n){v3&&(n.config.globalProperties.$unhead=e,n.config.globalProperties.$head=e,n.provide(Nb,e))}}.install}function w3(e={}){e.domDelayFn=e.domDelayFn||(n=>an(()=>setTimeout(()=>n(),0)));const t=h3(e);return t.use(b3),t.install=_3(t),t}const rd=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},od="__unhead_injection_handler__";function x3(e){rd[od]=e}function k3(){if(od in rd)return rd[od]();const e=Ke(Nb);return e||m3()}function S3(e,t={}){const n=t.head||k3();if(n)return n.ssr?n.push(e,t):C3(n,e,t)}function C3(e,t,n={}){const r=te(!1),s=te({});Xt(()=>{s.value=r.value?{}:su(t)});const i=e.push(s.value,n);return gt(s,u=>{i.patch(u)}),ir()&&(fa(()=>{i.dispose()}),Oy(()=>{r.value=!0}),Ry(()=>{r.value=!1})),i}function Sr(e){if(typeof e!="object")return e;var t,n,r=Object.prototype.toString.call(e);if(r==="[object Object]"){if(e.constructor!==Object&&typeof e.constructor=="function"){n=new e.constructor;for(t in e)e.hasOwnProperty(t)&&n[t]!==e[t]&&(n[t]=Sr(e[t]))}else{n={};for(t in e)t==="__proto__"?Object.defineProperty(n,t,{value:Sr(e[t]),configurable:!0,enumerable:!0,writable:!0}):n[t]=Sr(e[t])}return n}if(r==="[object Array]"){for(t=e.length,n=Array(t);t--;)n[t]=Sr(e[t]);return n}return r==="[object Set]"?(n=new Set,e.forEach(function(s){n.add(Sr(s))}),n):r==="[object Map]"?(n=new Map,e.forEach(function(s,i){n.set(Sr(i),Sr(s))}),n):r==="[object Date]"?new Date(+e):r==="[object RegExp]"?(n=new RegExp(e.source,e.flags),n.lastIndex=e.lastIndex,n):r==="[object DataView]"?new e.constructor(Sr(e.buffer)):r==="[object ArrayBuffer]"?e.slice(0):r.slice(-6)==="Array]"?new e.constructor(e):e}const E3={ui:{primary:"indigo",gray:"stone"}},T3={nuxt:{},ui:{primary:"green",gray:"cool",colors:["red","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink","rose","primary","backdrop","body"],strategy:"merge"}},Ge=xI(E3,T3);function ma(){const e=nt();return e._appConfig||(e._appConfig=_n(Ge)),e._appConfig}const $3=!1,sd=!1,A3=!1,I3={componentName:"NuxtLink"},R3={deep:!0},O3={},P3="#__nuxt";function x0(e,t={}){const n=M3(e,t),r=nt(),s=r._payloadCache=r._payloadCache||{};return n in s||(s[n]=B3(e).then(i=>i?jb(n).then(l=>l||(delete s[n],null)):(s[n]=null,null))),s[n]}const L3="_payload.json";function M3(e,t={}){var s;const n=new URL(e,"http://localhost");if(n.host!=="localhost"||Bo(n.pathname,{acceptRelative:!0}))throw new Error("Payload URL must not include hostname: "+e);const r=t.hash||(t.fresh?Date.now():(s=ma().nuxt)==null?void 0:s.buildId);return _u(Yr().app.baseURL,n.pathname,L3+(r?`?${r}`:""))}async function jb(e){const t=fetch(e).then(n=>n.text().then(Ub));try{return await t}catch(n){console.warn("[nuxt] Cannot load payload ",e,n)}return null}async function B3(e=xu().path){return!!nt().payload.prerenderedAt}let Sl=null;async function F3(){if(Sl)return Sl;const e=document.getElementById("__NUXT_DATA__");if(!e)return{};const t=await Ub(e.textContent||""),n=e.dataset.src?await jb(e.dataset.src):void 0;return Sl={...t,...n,...window.__NUXT__},Sl}async function Ub(e){return await NI(e,nt()._payloadRevivers)}function D3(e,t){nt()._payloadRevivers[e]=t}const k0={NuxtError:e=>ga(e),EmptyShallowRef:e=>Ir(e==="_"?void 0:e==="0n"?BigInt(0):ea(e)),EmptyRef:e=>te(e==="_"?void 0:e==="0n"?BigInt(0):ea(e)),ShallowRef:e=>Ir(e),ShallowReactive:e=>la(e),Ref:e=>te(e),Reactive:e=>_n(e)},V3=zn({name:"nuxt:revive-payload:client",order:-30,async setup(e){let t,n;for(const r in k0)D3(r,k0[r]);Object.assign(e.payload,([t,n]=ru(()=>e.runWithContext(F3)),t=await t,n(),t)),window.__NUXT__=e.payload}}),N3=[],j3=zn({name:"nuxt:head",enforce:"pre",setup(e){const t=w3({plugins:N3});x3(()=>nt().vueApp._context.provides.usehead),e.vueApp.use(t);{let n=!0;const r=async()=>{n=!1,await Db(t)};t.hooks.hook("dom:beforeRender",s=>{s.shouldRender=!n}),e.hooks.hook("page:start",()=>{n=!0}),e.hooks.hook("page:finish",()=>{e.isHydrating||r()}),e.hooks.hook("app:error",r),e.hooks.hook("app:suspense:resolve",r)}}});/*! - * vue-router v4.3.2 - * (c) 2024 Eduardo San Martin Morote - * @license MIT - */const Bs=typeof document<"u";function U3(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const yt=Object.assign;function af(e,t){const n={};for(const r in t){const s=t[r];n[r]=vr(s)?s.map(e):e(s)}return n}const zi=()=>{},vr=Array.isArray,Hb=/#/g,H3=/&/g,z3=/\//g,W3=/=/g,q3=/\?/g,zb=/\+/g,K3=/%5B/g,G3=/%5D/g,Wb=/%5E/g,J3=/%60/g,qb=/%7B/g,Z3=/%7C/g,Kb=/%7D/g,Y3=/%20/g;function cp(e){return encodeURI(""+e).replace(Z3,"|").replace(K3,"[").replace(G3,"]")}function Q3(e){return cp(e).replace(qb,"{").replace(Kb,"}").replace(Wb,"^")}function id(e){return cp(e).replace(zb,"%2B").replace(Y3,"+").replace(Hb,"%23").replace(H3,"%26").replace(J3,"`").replace(qb,"{").replace(Kb,"}").replace(Wb,"^")}function X3(e){return id(e).replace(W3,"%3D")}function e4(e){return cp(e).replace(Hb,"%23").replace(q3,"%3F")}function t4(e){return e==null?"":e4(e).replace(z3,"%2F")}function ta(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const n4=/\/$/,r4=e=>e.replace(n4,"");function lf(e,t,n="/"){let r,s={},i="",l="";const u=t.indexOf("#");let c=t.indexOf("?");return u=0&&(c=-1),c>-1&&(r=t.slice(0,c),i=t.slice(c+1,u>-1?u:t.length),s=e(i)),u>-1&&(r=r||t.slice(0,u),l=t.slice(u,t.length)),r=a4(r??t,n),{fullPath:r+(i&&"?")+i+l,path:r,query:s,hash:ta(l)}}function o4(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function S0(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function s4(e,t,n){const r=t.matched.length-1,s=n.matched.length-1;return r>-1&&r===s&&Xs(t.matched[r],n.matched[s])&&Gb(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Xs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Gb(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!i4(e[n],t[n]))return!1;return!0}function i4(e,t){return vr(e)?C0(e,t):vr(t)?C0(t,e):e===t}function C0(e,t){return vr(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function a4(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),s=r[r.length-1];(s===".."||s===".")&&r.push("");let i=n.length-1,l,u;for(l=0;l1&&i--;else break;return n.slice(0,i).join("/")+"/"+r.slice(l).join("/")}var na;(function(e){e.pop="pop",e.push="push"})(na||(na={}));var Wi;(function(e){e.back="back",e.forward="forward",e.unknown=""})(Wi||(Wi={}));function l4(e){if(!e)if(Bs){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),r4(e)}const u4=/^[^#]+#/;function c4(e,t){return e.replace(u4,"#")+t}function f4(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Su=()=>({left:window.scrollX,top:window.scrollY});function d4(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),s=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!s)return;t=f4(s,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function E0(e,t){return(history.state?history.state.position-t:-1)+e}const ad=new Map;function p4(e,t){ad.set(e,t)}function h4(e){const t=ad.get(e);return ad.delete(e),t}let g4=()=>location.protocol+"//"+location.host;function Jb(e,t){const{pathname:n,search:r,hash:s}=t,i=e.indexOf("#");if(i>-1){let u=s.includes(e.slice(i))?e.slice(i).length:1,c=s.slice(u);return c[0]!=="/"&&(c="/"+c),S0(c,"")}return S0(n,e)+r+s}function m4(e,t,n,r){let s=[],i=[],l=null;const u=({state:h})=>{const v=Jb(e,location),_=n.value,x=t.value;let b=0;if(h){if(n.value=v,t.value=h,l&&l===_){l=null;return}b=x?h.position-x.position:0}else r(v);s.forEach(E=>{E(n.value,_,{delta:b,type:na.pop,direction:b?b>0?Wi.forward:Wi.back:Wi.unknown})})};function c(){l=n.value}function p(h){s.push(h);const v=()=>{const _=s.indexOf(h);_>-1&&s.splice(_,1)};return i.push(v),v}function d(){const{history:h}=window;h.state&&h.replaceState(yt({},h.state,{scroll:Su()}),"")}function g(){for(const h of i)h();i=[],window.removeEventListener("popstate",u),window.removeEventListener("beforeunload",d)}return window.addEventListener("popstate",u),window.addEventListener("beforeunload",d,{passive:!0}),{pauseListeners:c,listen:p,destroy:g}}function T0(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?Su():null}}function v4(e){const{history:t,location:n}=window,r={value:Jb(e,n)},s={value:t.state};s.value||i(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(c,p,d){const g=e.indexOf("#"),h=g>-1?(n.host&&document.querySelector("base")?e:e.slice(g))+c:g4()+e+c;try{t[d?"replaceState":"pushState"](p,"",h),s.value=p}catch(v){console.error(v),n[d?"replace":"assign"](h)}}function l(c,p){const d=yt({},t.state,T0(s.value.back,c,s.value.forward,!0),p,{position:s.value.position});i(c,d,!0),r.value=c}function u(c,p){const d=yt({},s.value,t.state,{forward:c,scroll:Su()});i(d.current,d,!0);const g=yt({},T0(r.value,c,null),{position:d.position+1},p);i(c,g,!1),r.value=c}return{location:r,state:s,push:u,replace:l}}function Zb(e){e=l4(e);const t=v4(e),n=m4(e,t.state,t.location,t.replace);function r(i,l=!0){l||n.pauseListeners(),history.go(i)}const s=yt({location:"",base:e,go:r,createHref:c4.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}function y4(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),Zb(e)}function b4(e){return typeof e=="string"||e&&typeof e=="object"}function Yb(e){return typeof e=="string"||typeof e=="symbol"}const dr={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0},Qb=Symbol("");var $0;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})($0||($0={}));function ei(e,t){return yt(new Error,{type:e,[Qb]:!0},t)}function Ur(e,t){return e instanceof Error&&Qb in e&&(t==null||!!(e.type&t))}const A0="[^/]+?",_4={sensitive:!1,strict:!1,start:!0,end:!0},w4=/[.+*?^${}()[\]/\\]/g;function x4(e,t){const n=yt({},_4,t),r=[];let s=n.start?"^":"";const i=[];for(const p of e){const d=p.length?[]:[90];n.strict&&!p.length&&(s+="/");for(let g=0;gt.length?t.length===1&&t[0]===80?1:-1:0}function S4(e,t){let n=0;const r=e.score,s=t.score;for(;n0&&t[t.length-1]<0}const C4={type:0,value:""},E4=/[a-zA-Z0-9_]/;function T4(e){if(!e)return[[]];if(e==="/")return[[C4]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${n})/"${p}": ${v}`)}let n=0,r=n;const s=[];let i;function l(){i&&s.push(i),i=[]}let u=0,c,p="",d="";function g(){p&&(n===0?i.push({type:0,value:p}):n===1||n===2||n===3?(i.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${p}) must be alone in its segment. eg: '/:ids+.`),i.push({type:1,value:p,regexp:d,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),p="")}function h(){p+=c}for(;u{l(C)}:zi}function l(d){if(Yb(d)){const g=r.get(d);g&&(r.delete(d),n.splice(n.indexOf(g),1),g.children.forEach(l),g.alias.forEach(l))}else{const g=n.indexOf(d);g>-1&&(n.splice(g,1),d.record.name&&r.delete(d.record.name),d.children.forEach(l),d.alias.forEach(l))}}function u(){return n}function c(d){let g=0;for(;g=0&&(d.record.path!==n[g].record.path||!Xb(d,n[g]));)g++;n.splice(g,0,d),d.record.name&&!O0(d)&&r.set(d.record.name,d)}function p(d,g){let h,v={},_,x;if("name"in d&&d.name){if(h=r.get(d.name),!h)throw ei(1,{location:d});x=h.record.name,v=yt(R0(g.params,h.keys.filter(C=>!C.optional).concat(h.parent?h.parent.keys.filter(C=>C.optional):[]).map(C=>C.name)),d.params&&R0(d.params,h.keys.map(C=>C.name))),_=h.stringify(v)}else if(d.path!=null)_=d.path,h=n.find(C=>C.re.test(_)),h&&(v=h.parse(_),x=h.record.name);else{if(h=g.name?r.get(g.name):n.find(C=>C.re.test(g.path)),!h)throw ei(1,{location:d,currentLocation:g});x=h.record.name,v=yt({},g.params,d.params),_=h.stringify(v)}const b=[];let E=h;for(;E;)b.unshift(E.record),E=E.parent;return{name:x,path:_,params:v,matched:b,meta:O4(b)}}return e.forEach(d=>i(d)),{addRoute:i,resolve:p,removeRoute:l,getRoutes:u,getRecordMatcher:s}}function R0(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function I4(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:R4(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function R4(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function O0(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function O4(e){return e.reduce((t,n)=>yt(t,n.meta),{})}function P0(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Xb(e,t){return t.children.some(n=>n===e||Xb(e,n))}function P4(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;si&&id(i)):[r&&id(r)]).forEach(i=>{i!==void 0&&(t+=(t.length?"&":"")+n,i!=null&&(t+="="+i))})}return t}function L4(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=vr(r)?r.map(s=>s==null?null:""+s):r==null?r:""+r)}return t}const M4=Symbol(""),M0=Symbol(""),fp=Symbol(""),dp=Symbol(""),ld=Symbol("");function Ti(){let e=[];function t(r){return e.push(r),()=>{const s=e.indexOf(r);s>-1&&e.splice(s,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function ko(e,t,n,r,s,i=l=>l()){const l=r&&(r.enterCallbacks[s]=r.enterCallbacks[s]||[]);return()=>new Promise((u,c)=>{const p=h=>{h===!1?c(ei(4,{from:n,to:t})):h instanceof Error?c(h):b4(h)?c(ei(2,{from:t,to:h})):(l&&r.enterCallbacks[s]===l&&typeof h=="function"&&l.push(h),u())},d=i(()=>e.call(r&&r.instances[s],t,n,p));let g=Promise.resolve(d);e.length<3&&(g=g.then(p)),g.catch(h=>c(h))})}function uf(e,t,n,r,s=i=>i()){const i=[];for(const l of e)for(const u in l.components){let c=l.components[u];if(!(t!=="beforeRouteEnter"&&!l.instances[u]))if(B4(c)){const d=(c.__vccOpts||c)[t];d&&i.push(ko(d,n,r,l,u,s))}else{let p=c();i.push(()=>p.then(d=>{if(!d)return Promise.reject(new Error(`Couldn't resolve component "${u}" at "${l.path}"`));const g=U3(d)?d.default:d;l.components[u]=g;const v=(g.__vccOpts||g)[t];return v&&ko(v,n,r,l,u,s)()}))}}return i}function B4(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function B0(e){const t=Ke(fp),n=Ke(dp),r=F(()=>{const c=R(e.to);return t.resolve(c)}),s=F(()=>{const{matched:c}=r.value,{length:p}=c,d=c[p-1],g=n.matched;if(!d||!g.length)return-1;const h=g.findIndex(Xs.bind(null,d));if(h>-1)return h;const v=F0(c[p-2]);return p>1&&F0(d)===v&&g[g.length-1].path!==v?g.findIndex(Xs.bind(null,c[p-2])):h}),i=F(()=>s.value>-1&&N4(n.params,r.value.params)),l=F(()=>s.value>-1&&s.value===n.matched.length-1&&Gb(n.params,r.value.params));function u(c={}){return V4(c)?t[R(e.replace)?"replace":"push"](R(e.to)).catch(zi):Promise.resolve()}return{route:r,href:F(()=>r.value.href),isActive:i,isExactActive:l,navigate:u}}const F4=we({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:B0,setup(e,{slots:t}){const n=_n(B0(e)),{options:r}=Ke(fp),s=F(()=>({[D0(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[D0(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&t.default(n);return e.custom?i:Xe("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},i)}}}),D4=F4;function V4(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function N4(e,t){for(const n in t){const r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!vr(s)||s.length!==r.length||r.some((i,l)=>i!==s[l]))return!1}return!0}function F0(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const D0=(e,t,n)=>e??t??n,j4=we({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Ke(ld),s=F(()=>e.route||r.value),i=Ke(M0,0),l=F(()=>{let p=R(i);const{matched:d}=s.value;let g;for(;(g=d[p])&&!g.components;)p++;return p}),u=F(()=>s.value.matched[l.value]);bt(M0,F(()=>l.value+1)),bt(M4,u),bt(ld,s);const c=te();return gt(()=>[c.value,u.value,e.name],([p,d,g],[h,v,_])=>{d&&(d.instances[g]=p,v&&v!==d&&p&&p===h&&(d.leaveGuards.size||(d.leaveGuards=v.leaveGuards),d.updateGuards.size||(d.updateGuards=v.updateGuards))),p&&d&&(!v||!Xs(d,v)||!h)&&(d.enterCallbacks[g]||[]).forEach(x=>x(p))},{flush:"post"}),()=>{const p=s.value,d=e.name,g=u.value,h=g&&g.components[d];if(!h)return V0(n.default,{Component:h,route:p});const v=g.props[d],_=v?v===!0?p.params:typeof v=="function"?v(p):v:null,b=Xe(h,yt({},_,t,{onVnodeUnmounted:E=>{E.component.isUnmounted&&(g.instances[d]=null)},ref:c}));return V0(n.default,{Component:b,route:p})||b}}});function V0(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const e1=j4;function U4(e){const t=A4(e.routes,e),n=e.parseQuery||P4,r=e.stringifyQuery||L0,s=e.history,i=Ti(),l=Ti(),u=Ti(),c=Ir(dr);let p=dr;Bs&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const d=af.bind(null,ee=>""+ee),g=af.bind(null,t4),h=af.bind(null,ta);function v(ee,ye){let pe,Ce;return Yb(ee)?(pe=t.getRecordMatcher(ee),Ce=ye):Ce=ee,t.addRoute(Ce,pe)}function _(ee){const ye=t.getRecordMatcher(ee);ye&&t.removeRoute(ye)}function x(){return t.getRoutes().map(ee=>ee.record)}function b(ee){return!!t.getRecordMatcher(ee)}function E(ee,ye){if(ye=yt({},ye||c.value),typeof ee=="string"){const O=lf(n,ee,ye.path),U=t.resolve({path:O.path},ye),re=s.createHref(O.fullPath);return yt(O,U,{params:h(U.params),hash:ta(O.hash),redirectedFrom:void 0,href:re})}let pe;if(ee.path!=null)pe=yt({},ee,{path:lf(n,ee.path,ye.path).path});else{const O=yt({},ee.params);for(const U in O)O[U]==null&&delete O[U];pe=yt({},ee,{params:g(O)}),ye.params=g(ye.params)}const Ce=t.resolve(pe,ye),rt=ee.hash||"";Ce.params=d(h(Ce.params));const mt=o4(r,yt({},ee,{hash:Q3(rt),path:Ce.path})),T=s.createHref(mt);return yt({fullPath:mt,hash:rt,query:r===L0?L4(ee.query):ee.query||{}},Ce,{redirectedFrom:void 0,href:T})}function C(ee){return typeof ee=="string"?lf(n,ee,c.value.path):yt({},ee)}function S(ee,ye){if(p!==ee)return ei(8,{from:ye,to:ee})}function A(ee){return H(ee)}function B(ee){return A(yt(C(ee),{replace:!0}))}function L(ee){const ye=ee.matched[ee.matched.length-1];if(ye&&ye.redirect){const{redirect:pe}=ye;let Ce=typeof pe=="function"?pe(ee):pe;return typeof Ce=="string"&&(Ce=Ce.includes("?")||Ce.includes("#")?Ce=C(Ce):{path:Ce},Ce.params={}),yt({query:ee.query,hash:ee.hash,params:Ce.path!=null?{}:ee.params},Ce)}}function H(ee,ye){const pe=p=E(ee),Ce=c.value,rt=ee.state,mt=ee.force,T=ee.replace===!0,O=L(pe);if(O)return H(yt(C(O),{state:typeof O=="object"?yt({},rt,O.state):rt,force:mt,replace:T}),ye||pe);const U=pe;U.redirectedFrom=ye;let re;return!mt&&s4(r,Ce,pe)&&(re=ei(16,{to:U,from:Ce}),Re(Ce,Ce,!0,!1)),(re?Promise.resolve(re):K(U,Ce)).catch(G=>Ur(G)?Ur(G,2)?G:Gt(G):ve(G,U,Ce)).then(G=>{if(G){if(Ur(G,2))return H(yt({replace:T},C(G.to),{state:typeof G.to=="object"?yt({},rt,G.to.state):rt,force:mt}),ye||U)}else G=z(U,Ce,!0,T,rt);return Y(U,Ce,G),G})}function j(ee,ye){const pe=S(ee,ye);return pe?Promise.reject(pe):Promise.resolve()}function q(ee){const ye=Dt.values().next().value;return ye&&typeof ye.runWithContext=="function"?ye.runWithContext(ee):ee()}function K(ee,ye){let pe;const[Ce,rt,mt]=H4(ee,ye);pe=uf(Ce.reverse(),"beforeRouteLeave",ee,ye);for(const O of Ce)O.leaveGuards.forEach(U=>{pe.push(ko(U,ee,ye))});const T=j.bind(null,ee,ye);return pe.push(T),St(pe).then(()=>{pe=[];for(const O of i.list())pe.push(ko(O,ee,ye));return pe.push(T),St(pe)}).then(()=>{pe=uf(rt,"beforeRouteUpdate",ee,ye);for(const O of rt)O.updateGuards.forEach(U=>{pe.push(ko(U,ee,ye))});return pe.push(T),St(pe)}).then(()=>{pe=[];for(const O of mt)if(O.beforeEnter)if(vr(O.beforeEnter))for(const U of O.beforeEnter)pe.push(ko(U,ee,ye));else pe.push(ko(O.beforeEnter,ee,ye));return pe.push(T),St(pe)}).then(()=>(ee.matched.forEach(O=>O.enterCallbacks={}),pe=uf(mt,"beforeRouteEnter",ee,ye,q),pe.push(T),St(pe))).then(()=>{pe=[];for(const O of l.list())pe.push(ko(O,ee,ye));return pe.push(T),St(pe)}).catch(O=>Ur(O,8)?O:Promise.reject(O))}function Y(ee,ye,pe){u.list().forEach(Ce=>q(()=>Ce(ee,ye,pe)))}function z(ee,ye,pe,Ce,rt){const mt=S(ee,ye);if(mt)return mt;const T=ye===dr,O=Bs?history.state:{};pe&&(Ce||T?s.replace(ee.fullPath,yt({scroll:T&&O&&O.scroll},rt)):s.push(ee.fullPath,rt)),c.value=ee,Re(ee,ye,pe,T),Gt()}let be;function ce(){be||(be=s.listen((ee,ye,pe)=>{if(!fn.listening)return;const Ce=E(ee),rt=L(Ce);if(rt){H(yt(rt,{replace:!0}),Ce).catch(zi);return}p=Ce;const mt=c.value;Bs&&p4(E0(mt.fullPath,pe.delta),Su()),K(Ce,mt).catch(T=>Ur(T,12)?T:Ur(T,2)?(H(T.to,Ce).then(O=>{Ur(O,20)&&!pe.delta&&pe.type===na.pop&&s.go(-1,!1)}).catch(zi),Promise.reject()):(pe.delta&&s.go(-pe.delta,!1),ve(T,Ce,mt))).then(T=>{T=T||z(Ce,mt,!1),T&&(pe.delta&&!Ur(T,8)?s.go(-pe.delta,!1):pe.type===na.pop&&Ur(T,20)&&s.go(-1,!1)),Y(Ce,mt,T)}).catch(zi)}))}let ke=Ti(),ie=Ti(),Se;function ve(ee,ye,pe){Gt(ee);const Ce=ie.list();return Ce.length?Ce.forEach(rt=>rt(ee,ye,pe)):console.error(ee),Promise.reject(ee)}function Lt(){return Se&&c.value!==dr?Promise.resolve():new Promise((ee,ye)=>{ke.add([ee,ye])})}function Gt(ee){return Se||(Se=!ee,ce(),ke.list().forEach(([ye,pe])=>ee?pe(ee):ye()),ke.reset()),ee}function Re(ee,ye,pe,Ce){const{scrollBehavior:rt}=e;if(!Bs||!rt)return Promise.resolve();const mt=!pe&&h4(E0(ee.fullPath,0))||(Ce||!pe)&&history.state&&history.state.scroll||null;return an().then(()=>rt(ee,ye,mt)).then(T=>T&&d4(T)).catch(T=>ve(T,ee,ye))}const je=ee=>s.go(ee);let Ft;const Dt=new Set,fn={currentRoute:c,listening:!0,addRoute:v,removeRoute:_,hasRoute:b,getRoutes:x,resolve:E,options:e,push:A,replace:B,go:je,back:()=>je(-1),forward:()=>je(1),beforeEach:i.add,beforeResolve:l.add,afterEach:u.add,onError:ie.add,isReady:Lt,install(ee){const ye=this;ee.component("RouterLink",D4),ee.component("RouterView",e1),ee.config.globalProperties.$router=ye,Object.defineProperty(ee.config.globalProperties,"$route",{enumerable:!0,get:()=>R(c)}),Bs&&!Ft&&c.value===dr&&(Ft=!0,A(s.location).catch(rt=>{}));const pe={};for(const rt in dr)Object.defineProperty(pe,rt,{get:()=>c.value[rt],enumerable:!0});ee.provide(fp,ye),ee.provide(dp,la(pe)),ee.provide(ld,c);const Ce=ee.unmount;Dt.add(ee),ee.unmount=function(){Dt.delete(ee),Dt.size<1&&(p=dr,be&&be(),be=null,c.value=dr,Ft=!1,Se=!1),Ce()}}};function St(ee){return ee.reduce((ye,pe)=>ye.then(()=>q(pe)),Promise.resolve())}return fn}function H4(e,t){const n=[],r=[],s=[],i=Math.max(t.matched.length,e.matched.length);for(let l=0;lXs(p,u))?r.push(u):n.push(u));const c=e.matched[l];c&&(t.matched.find(p=>Xs(p,c))||s.push(c))}return[n,r,s]}function z4(){return Ke(dp)}const W4=(e,t)=>t.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""}),ud=(e,t)=>{const n=e.route.matched.find(s=>{var i;return((i=s.components)==null?void 0:i.default)===e.Component.type}),r=t??(n==null?void 0:n.meta.key)??(n&&W4(e.route,n));return typeof r=="function"?r(e.route):r},q4=(e,t)=>({default:()=>e?Xe(AT,e===!0?{}:e,t):t});function pp(e){return Array.isArray(e)?e:[e]}const cf=null,ff=null,df=null,pf=null,hf=null,gf=null,mf=null,vf=null,yf=null,bf=null,N0=[{name:"backtest-id",path:"/backtest/:id()",meta:{},alias:[],redirect:cf==null?void 0:cf.redirect,component:()=>yn(()=>import("./tugWi8BA.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url).then(e=>e.default||e)},{name:"backtest",path:"/backtest",meta:{},alias:[],redirect:ff==null?void 0:ff.redirect,component:()=>yn(()=>import("./BYD3ggkR.js"),[],import.meta.url).then(e=>e.default||e)},{name:"candles-id",path:"/candles/:id()",meta:{},alias:[],redirect:df==null?void 0:df.redirect,component:()=>yn(()=>import("./6GW7wvnw.js"),__vite__mapDeps([9,1,4,5,6,8]),import.meta.url).then(e=>e.default||e)},{name:"candles",path:"/candles",meta:{},alias:[],redirect:pf==null?void 0:pf.redirect,component:()=>yn(()=>import("./C9Hyr1fD.js"),[],import.meta.url).then(e=>e.default||e)},{name:"exchange-api-keys",path:"/exchange-api-keys",meta:{},alias:[],redirect:hf==null?void 0:hf.redirect,component:()=>yn(()=>import("./CepOyCjx.js"),__vite__mapDeps([10,6,3,8,11]),import.meta.url).then(e=>e.default||e)},{name:"index",path:"/",meta:{},alias:[],redirect:gf==null?void 0:gf.redirect,component:()=>yn(()=>import("./D-JvFtWi.js"),__vite__mapDeps([12,8]),import.meta.url).then(e=>e.default||e)},{name:"live-id",path:"/live/:id()",meta:{},alias:[],redirect:mf==null?void 0:mf.redirect,component:()=>yn(()=>import("./FAD0u1sW.js"),__vite__mapDeps([13,1,2,3,4,5,6,7,8]),import.meta.url).then(e=>e.default||e)},{name:"live",path:"/live",meta:{},alias:[],redirect:vf==null?void 0:vf.redirect,component:()=>yn(()=>import("./Cuvv8N1X.js"),[],import.meta.url).then(e=>e.default||e)},{name:"notification-api-keys",path:"/notification-api-keys",meta:{},alias:[],redirect:yf==null?void 0:yf.redirect,component:()=>yn(()=>import("./DdRxl-OG.js"),__vite__mapDeps([14,6,3,8,11]),import.meta.url).then(e=>e.default||e)},{name:"optimization",path:"/optimization",meta:{},alias:[],redirect:bf==null?void 0:bf.redirect,component:()=>yn(()=>import("./DmKvV_zz.js"),__vite__mapDeps([15,2,3,4,5,6,8]),import.meta.url).then(e=>e.default||e)}],t1=(e,t,n)=>(t=t===!0?{}:t,{default:()=>{var r;return t?Xe(e,t,n):(r=n.default)==null?void 0:r.call(n)}});function j0(e){const t=(e==null?void 0:e.meta.key)??e.path.replace(/(:\w+)\([^)]+\)/g,"$1").replace(/(:\w+)[?+*]/g,"$1").replace(/:\w+/g,n=>{var r;return((r=e.params[n.slice(1)])==null?void 0:r.toString())||""});return typeof t=="function"?t(e):t}function K4(e,t){return e===t||t===dr?!1:j0(e)!==j0(t)?!0:!e.matched.every((r,s)=>{var i,l;return r.components&&r.components.default===((l=(i=t.matched[s])==null?void 0:i.components)==null?void 0:l.default)})}const G4={scrollBehavior(e,t,n){var p;const r=nt(),s=((p=Wn().options)==null?void 0:p.scrollBehaviorType)??"auto";let i=n||void 0;const l=typeof e.meta.scrollToTop=="function"?e.meta.scrollToTop(e,t):e.meta.scrollToTop;if(!i&&t&&e&&l!==!1&&K4(e,t)&&(i={left:0,top:0}),e.path===t.path)return t.hash&&!e.hash?{left:0,top:0}:e.hash?{el:e.hash,top:U0(e.hash),behavior:s}:!1;const u=d=>!!(d.meta.pageTransition??sd),c=u(t)&&u(e)?"page:transition:finish":"page:finish";return new Promise(d=>{r.hooks.hookOnce(c,async()=>{await new Promise(g=>setTimeout(g,0)),e.hash&&(i={el:e.hash,top:U0(e.hash),behavior:s}),d(i)})})}};function U0(e){try{const t=document.querySelector(e);if(t)return parseFloat(getComputedStyle(t).scrollMarginTop)}catch{}return 0}const J4={hashMode:!0,scrollBehaviorType:"auto"},Vn={...J4,...G4},Z4=async e=>{var c;let t,n;if(!((c=e.meta)!=null&&c.validate))return;const r=nt(),s=Wn();if(([t,n]=ru(()=>Promise.resolve(e.meta.validate(e))),t=await t,n(),t)===!0)return;const l=ga({statusCode:404,statusMessage:`Page Not Found: ${e.fullPath}`,data:{path:e.fullPath}}),u=s.beforeResolve(p=>{if(u(),p===e){const d=s.afterEach(async()=>{d(),await r.runWithContext(()=>Fs(l)),window.history.pushState({},"",e.fullPath)});return!1}})},Y4=[Z4],qi={};function Q4(e,t,n){const{pathname:r,search:s,hash:i}=t,l=e.indexOf("#");if(l>-1){const p=i.includes(e.slice(l))?e.slice(l).length:1;let d=i.slice(p);return d[0]!=="/"&&(d="/"+d),s0(d,"")}const u=s0(r,e),c=!n||kA(u,n,{trailingSlash:!0})?u:n;return c+(c.includes("?")?"":s)+i}const X4=zn({name:"nuxt:router",enforce:"pre",async setup(e){var b,E;let t,n,r=Yr().app.baseURL;Vn.hashMode&&!r.includes("#")&&(r+="#");const s=((b=Vn.history)==null?void 0:b.call(Vn,r))??(Vn.hashMode?y4(r):Zb(r)),i=((E=Vn.routes)==null?void 0:E.call(Vn,N0))??N0;let l;const u=U4({...Vn,scrollBehavior:(C,S,A)=>{if(S===dr){l=A;return}if(Vn.scrollBehavior){if(u.options.scrollBehavior=Vn.scrollBehavior,"scrollRestoration"in window.history){const B=u.beforeEach(()=>{B(),window.history.scrollRestoration="manual"})}return Vn.scrollBehavior(C,dr,l||A)}},history:s,routes:i});"scrollRestoration"in window.history&&(window.history.scrollRestoration="auto"),e.vueApp.use(u);const c=Ir(u.currentRoute.value);u.afterEach((C,S)=>{c.value=S}),Object.defineProperty(e.vueApp.config.globalProperties,"previousRoute",{get:()=>c.value});const p=Q4(r,window.location,e.payload.path),d=Ir(u.currentRoute.value),g=()=>{d.value=u.currentRoute.value};e.hook("page:finish",g),u.afterEach((C,S)=>{var A,B,L,H;((B=(A=C.matched[0])==null?void 0:A.components)==null?void 0:B.default)===((H=(L=S.matched[0])==null?void 0:L.components)==null?void 0:H.default)&&g()});const h={};for(const C in d.value)Object.defineProperty(h,C,{get:()=>d.value[C]});e._route=la(h),e._middleware=e._middleware||{global:[],named:{}};try{[t,n]=ru(()=>u.isReady()),await t,n()}catch(C){[t,n]=ru(()=>e.runWithContext(()=>Fs(C))),await t,n()}const v=p!==u.currentRoute.value.fullPath?u.resolve(p):u.currentRoute.value;g();const _=e.payload.state._layout;u.beforeEach(async(C,S)=>{var A;await e.callHook("page:loading:start"),C.meta=_n(C.meta),e.isHydrating&&_&&!Gs(C.meta.layout)&&(C.meta.layout=_),e._processingMiddleware=!0;{const B=new Set([...Y4,...e._middleware.global]);for(const L of C.matched){const H=L.meta.middleware;if(H)for(const j of pp(H))B.add(j)}for(const L of B){const H=typeof L=="string"?e._middleware.named[L]||await((A=qi[L])==null?void 0:A.call(qi).then(q=>q.default||q)):L;if(!H)throw new Error(`Unknown route middleware: '${L}'.`);const j=await e.runWithContext(()=>H(C,S));if(!e.payload.serverRendered&&e.isHydrating&&(j===!1||j instanceof Error)){const q=j||ed({statusCode:404,statusMessage:`Page Not Found: ${p}`});return await e.runWithContext(()=>Fs(q)),!1}if(j!==!0&&(j||j===!1))return j}}}),u.onError(async()=>{delete e._processingMiddleware,await e.callHook("page:loading:end")});const x=ku();return u.afterEach(async(C,S,A)=>{delete e._processingMiddleware,!e.isHydrating&&x.value&&await e.runWithContext(AI),A&&await e.callHook("page:loading:end"),C.matched.length===0&&await e.runWithContext(()=>Fs(ed({statusCode:404,fatal:!1,statusMessage:`Page not found: ${C.fullPath}`,data:{path:C.fullPath}})))}),e.hooks.hookOnce("app:created",async()=>{try{"name"in v&&(v.name=void 0),await u.replace({...v,force:!0}),u.options.scrollBehavior=Vn.scrollBehavior}catch(C){await e.runWithContext(()=>Fs(C))}}),{provide:{router:u}}}}),cd=globalThis.requestIdleCallback||(e=>{const t=Date.now(),n={didTimeout:!1,timeRemaining:()=>Math.max(0,50-(Date.now()-t))};return setTimeout(()=>{e(n)},1)}),eR=globalThis.cancelIdleCallback||(e=>{clearTimeout(e)}),n1=e=>{const t=nt();t.isHydrating?t.hooks.hookOnce("app:suspense:resolve",()=>{cd(e)}):cd(e)},tR=zn({name:"nuxt:payload",setup(e){Wn().beforeResolve(async(t,n)=>{if(t.path===n.path)return;const r=await x0(t.path);r&&Object.assign(e.static.data,r.data)}),n1(()=>{e.hooks.hook("link:prefetch",async t=>{ha(t).protocol||await x0(t)})})}}),nR=!1;/*! - * pinia v2.1.7 - * (c) 2023 Eduardo San Martin Morote - * @license MIT - */let r1;const va=e=>r1=e,o1=Symbol();function fd(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var Ki;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(Ki||(Ki={}));function rR(){const e=Fd(!0),t=e.run(()=>te({}));let n=[],r=[];const s=Wd({install(i){va(s),s._a=i,i.provide(o1,s),i.config.globalProperties.$pinia=s,r.forEach(l=>n.push(l)),r=[]},use(i){return!this._a&&!nR?r.push(i):n.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return s}const s1=()=>{};function H0(e,t,n,r=s1){e.push(t);const s=()=>{const i=e.indexOf(t);i>-1&&(e.splice(i,1),r())};return!n&&Oo()&&ps(s),s}function Ms(e,...t){e.slice().forEach(n=>{n(...t)})}const oR=e=>e();function dd(e,t){e instanceof Map&&t instanceof Map&&t.forEach((n,r)=>e.set(r,n)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],s=e[n];fd(s)&&fd(r)&&e.hasOwnProperty(n)&&!at(r)&&!us(r)?e[n]=dd(s,r):e[n]=r}return e}const sR=Symbol();function iR(e){return!fd(e)||!e.hasOwnProperty(sR)}const{assign:yo}=Object;function aR(e){return!!(at(e)&&e.effect)}function lR(e,t,n,r){const{state:s,actions:i,getters:l}=t,u=n.state.value[e];let c;function p(){u||(n.state.value[e]=s?s():{});const d=eT(n.state.value[e]);return yo(d,i,Object.keys(l||{}).reduce((g,h)=>(g[h]=Wd(F(()=>{va(n);const v=n._s.get(e);return l[h].call(v,v)})),g),{}))}return c=i1(e,p,t,n,r,!0),c}function i1(e,t,n={},r,s,i){let l;const u=yo({actions:{}},n),c={deep:!0};let p,d,g=[],h=[],v;const _=r.state.value[e];!i&&!_&&(r.state.value[e]={}),te({});let x;function b(j){let q;p=d=!1,typeof j=="function"?(j(r.state.value[e]),q={type:Ki.patchFunction,storeId:e,events:v}):(dd(r.state.value[e],j),q={type:Ki.patchObject,payload:j,storeId:e,events:v});const K=x=Symbol();an().then(()=>{x===K&&(p=!0)}),d=!0,Ms(g,q,r.state.value[e])}const E=i?function(){const{state:q}=n,K=q?q():{};this.$patch(Y=>{yo(Y,K)})}:s1;function C(){l.stop(),g=[],h=[],r._s.delete(e)}function S(j,q){return function(){va(r);const K=Array.from(arguments),Y=[],z=[];function be(ie){Y.push(ie)}function ce(ie){z.push(ie)}Ms(h,{args:K,name:j,store:B,after:be,onError:ce});let ke;try{ke=q.apply(this&&this.$id===e?this:B,K)}catch(ie){throw Ms(z,ie),ie}return ke instanceof Promise?ke.then(ie=>(Ms(Y,ie),ie)).catch(ie=>(Ms(z,ie),Promise.reject(ie))):(Ms(Y,ke),ke)}}const A={_p:r,$id:e,$onAction:H0.bind(null,h),$patch:b,$reset:E,$subscribe(j,q={}){const K=H0(g,j,q.detached,()=>Y()),Y=l.run(()=>gt(()=>r.state.value[e],z=>{(q.flush==="sync"?d:p)&&j({storeId:e,type:Ki.direct,events:v},z)},yo({},c,q)));return K},$dispose:C},B=_n(A);r._s.set(e,B);const H=(r._a&&r._a.runWithContext||oR)(()=>r._e.run(()=>(l=Fd()).run(t)));for(const j in H){const q=H[j];if(at(q)&&!aR(q)||us(q))i||(_&&iR(q)&&(at(q)?q.value=_[j]:dd(q,_[j])),r.state.value[e][j]=q);else if(typeof q=="function"){const K=S(j,q);H[j]=K,u.actions[j]=q}}return yo(B,H),yo(ze(B),H),Object.defineProperty(B,"$state",{get:()=>r.state.value[e],set:j=>{b(q=>{yo(q,j)})}}),r._p.forEach(j=>{yo(B,l.run(()=>j({store:B,app:r._a,pinia:r,options:u})))}),_&&i&&n.hydrate&&n.hydrate(B.$state,_),p=!0,d=!0,B}function si(e,t,n){let r,s;const i=typeof t=="function";typeof e=="string"?(r=e,s=i?n:t):(s=e,r=e.id);function l(u,c){const p=ep();return u=u||(p?Ke(o1,null):null),u&&va(u),u=r1,u._s.has(r)||(i?i1(r,t,s,u):lR(r,s,u)),u._s.get(r)}return l.$id=r,l}const uR=e=>e==="defer"||e===!1;function cR(...e){var _;const t=typeof e[e.length-1]=="string"?e.pop():void 0;typeof e[0]!="string"&&e.unshift(t);let[n,r,s={}]=e;if(typeof n!="string")throw new TypeError("[nuxt] [asyncData] key must be a string.");if(typeof r!="function")throw new TypeError("[nuxt] [asyncData] handler must be a function.");const i=nt(),l=r,u=()=>null,c=()=>i.isHydrating?i.payload.data[n]:i.static.data[n];s.server=s.server??!0,s.default=s.default??u,s.getCachedData=s.getCachedData??c,s.lazy=s.lazy??!1,s.immediate=s.immediate??!0,s.deep=s.deep??R3.deep,s.dedupe=s.dedupe??"cancel";const p=()=>s.getCachedData(n,i)!=null;if(!i._asyncData[n]||!s.immediate){(_=i.payload._errors)[n]??(_[n]=null);const x=s.deep?te:Ir;i._asyncData[n]={data:x(s.getCachedData(n,i)??s.default()),pending:te(!p()),error:Ot(i.payload._errors,n),status:te("idle")}}const d={...i._asyncData[n]};d.refresh=d.execute=(x={})=>{if(i._asyncDataPromises[n]){if(uR(x.dedupe??s.dedupe))return i._asyncDataPromises[n];i._asyncDataPromises[n].cancelled=!0}if((x._initial||i.isHydrating&&x._initial!==!1)&&p())return Promise.resolve(s.getCachedData(n,i));d.pending.value=!0,d.status.value="pending";const b=new Promise((E,C)=>{try{E(l(i))}catch(S){C(S)}}).then(async E=>{if(b.cancelled)return i._asyncDataPromises[n];let C=E;s.transform&&(C=await s.transform(E)),s.pick&&(C=dR(C,s.pick)),i.payload.data[n]=C,d.data.value=C,d.error.value=null,d.status.value="success"}).catch(E=>{if(b.cancelled)return i._asyncDataPromises[n];d.error.value=ga(E),d.data.value=R(s.default()),d.status.value="error"}).finally(()=>{b.cancelled||(d.pending.value=!1,delete i._asyncDataPromises[n])});return i._asyncDataPromises[n]=b,i._asyncDataPromises[n]},d.clear=()=>fR(i,n);const g=()=>d.refresh({_initial:!0}),h=s.server!==!1&&i.payload.serverRendered;{const x=ir();if(x&&!x._nuxtOnBeforeMountCbs){x._nuxtOnBeforeMountCbs=[];const C=x._nuxtOnBeforeMountCbs;Ly(()=>{C.forEach(S=>{S()}),C.splice(0,C.length)}),Ht(()=>C.splice(0,C.length))}h&&i.isHydrating&&(d.error.value||p())?(d.pending.value=!1,d.status.value=d.error.value?"error":"success"):x&&(i.payload.serverRendered&&i.isHydrating||s.lazy)&&s.immediate?x._nuxtOnBeforeMountCbs.push(g):s.immediate&&g();const b=Oo();if(s.watch){const C=gt(s.watch,()=>d.refresh());b&&ps(C)}const E=i.hook("app:data:refresh",async C=>{(!C||C.includes(n))&&await d.refresh()});b&&ps(E)}const v=Promise.resolve(i._asyncDataPromises[n]).then(()=>d);return Object.assign(v,d),v}function fR(e,t){t in e.payload.data&&(e.payload.data[t]=void 0),t in e.payload._errors&&(e.payload._errors[t]=null),e._asyncData[t]&&(e._asyncData[t].data.value=void 0,e._asyncData[t].error.value=null,e._asyncData[t].pending.value=!1,e._asyncData[t].status.value="idle"),t in e._asyncDataPromises&&(e._asyncDataPromises[t].cancelled=!0,e._asyncDataPromises[t]=void 0)}function dR(e,t){const n={};for(const r of t)n[r]=e[r];return n}const pR="$s";function ya(...e){const t=typeof e[e.length-1]=="string"?e.pop():void 0;typeof e[0]!="string"&&e.unshift(t);const[n,r]=e;if(!n||typeof n!="string")throw new TypeError("[nuxt] [useState] key must be a string: "+n);if(r!==void 0&&typeof r!="function")throw new Error("[nuxt] [useState] init must be a function: "+r);const s=pR+n,i=nt(),l=Ot(i.payload.state,s);if(l.value===void 0&&r){const u=r();if(at(u))return i.payload.state[s]=u,u;l.value=u}return l}function a1(e,t,n){const[r={},s]=typeof t=="string"?[{},t]:[t,n],i=F(()=>Tr(e)),l=r.key||wI([s,typeof i.value=="string"?i.value:"",...hR(r)]);if(!l||typeof l!="string")throw new TypeError("[nuxt] [useFetch] key must be a string: "+l);if(!e)throw new Error("[nuxt] [useFetch] request is missing.");const u=l===s?"$f"+l:l;if(!r.baseURL&&typeof i.value=="string"&&i.value[0]==="/"&&i.value[1]==="/")throw new Error('[nuxt] [useFetch] the request URL must not start with "//".');const{server:c,lazy:p,default:d,transform:g,pick:h,watch:v,immediate:_,getCachedData:x,deep:b,dedupe:E,...C}=r,S=_n({...O3,...C,cache:typeof r.cache=="boolean"?void 0:r.cache}),A={server:c,lazy:p,default:d,transform:g,pick:h,immediate:_,getCachedData:x,deep:b,dedupe:E,watch:v===!1?[]:[S,i,...v||[]]};let B;return cR(u,()=>{var q;(q=B==null?void 0:B.abort)==null||q.call(B),B=typeof AbortController<"u"?new AbortController:{};const H=Tr(r.timeout);return H&&setTimeout(()=>B.abort(),H),(r.$fetch||globalThis.$fetch)(i.value,{signal:B.signal,...S})},A)}function hR(e){var n;const t=[((n=Tr(e.method))==null?void 0:n.toUpperCase())||"GET",Tr(e.baseURL)];for(const r of[e.params||e.query]){const s=Tr(r);if(!s)continue;const i={};for(const[l,u]of Object.entries(s))i[Tr(l)]=Tr(u);t.push(i)}return t}const gR={path:"/",watch:!0,decode:e=>ea(decodeURIComponent(e)),encode:e=>encodeURIComponent(typeof e=="string"?e:JSON.stringify(e))},mR=void 0;function z0(e,t){var c;const n={...gR,...t},r=W0(n)||{};let s;n.maxAge!==void 0?s=n.maxAge*1e3:n.expires&&(s=n.expires.getTime()-Date.now());const i=s!==void 0&&s<=0,l=Sr(i?void 0:r[e]??((c=n.default)==null?void 0:c.call(n))),u=s&&!i?bR(l,s,n.watch&&n.watch!=="shallow"):te(l);{let p=null;try{!mR&&typeof BroadcastChannel<"u"&&(p=new BroadcastChannel(`nuxt:cookies:${e}`))}catch{}const d=()=>{n.readonly||Sb(u.value,r[e])||(yR(e,u.value,n),r[e]=Sr(u.value),p==null||p.postMessage({value:n.encode(u.value)}))},g=v=>{var x;const _=v.refresh?(x=W0(n))==null?void 0:x[e]:n.decode(v.value);h=!0,r[e]=u.value=_,an(()=>{h=!1})};let h=!1;Oo()&&ps(()=>{h=!0,d(),p==null||p.close()}),p&&(p.onmessage=({data:v})=>g(v)),n.watch?gt(u,()=>{h||d()},{deep:n.watch!=="shallow"}):d()}return u}function W0(e={}){return sI(document.cookie,e)}function vR(e,t,n={}){return t==null?c0(e,t,{...n,maxAge:-1}):c0(e,t,n)}function yR(e,t,n={}){document.cookie=vR(e,t,n)}const q0=2147483647;function bR(e,t,n){let r,s,i=0;const l=n?te(e):{value:e};return Oo()&&ps(()=>{s==null||s(),clearTimeout(r)}),my((u,c)=>{n&&(s=gt(l,c));function p(){clearTimeout(r);const d=t-i,g=d{if(i+=g,i4)return Promise.all(s).then(()=>l1(e,t));t._routePreloaded.add(n);const i=r.map(l=>{var u;return(u=l.components)==null?void 0:u.default}).filter(l=>typeof l=="function");for(const l of i){const u=Promise.resolve(l()).catch(()=>{}).finally(()=>s.splice(s.indexOf(u)));s.push(u)}await Promise.all(s)}function _R(e={}){const t=e.path||window.location.pathname;let n={};try{n=ea(sessionStorage.getItem("nuxt:reload")||"{}")}catch{}if(e.force||(n==null?void 0:n.path)!==t||(n==null?void 0:n.expires){r.value=!0}),bt(u1,!0),s=>{var c;if(r.value)return(c=t.default)==null?void 0:c.call(t);const i=t.fallback||t.placeholder;if(i)return i();const l=s.fallback||s.placeholder||"",u=s.fallbackTag||s.placeholderTag||"span";return Z(u,n,l)}}}),xR="data-n-ids",kR="-";function ii(e){var s,i,l,u,c,p;if(typeof e!="string")throw new TypeError("[nuxt] [useId] key must be a string.");e=`n${e.slice(1)}`;const t=nt(),n=ir();if(!n)throw new TypeError("[nuxt] `useId` must be called within a component setup function.");t._id||(t._id=0),n._nuxtIdIndex||(n._nuxtIdIndex={}),(s=n._nuxtIdIndex)[e]||(s[e]=0);const r=e+kR+n._nuxtIdIndex[e]++;if(t.payload.serverRendered&&t.isHydrating&&!Ke(u1,!1)){const d=((i=n.vnode.el)==null?void 0:i.nodeType)===8&&((u=(l=n.vnode.el)==null?void 0:l.nextElementSibling)!=null&&u.getAttribute)?(c=n.vnode.el)==null?void 0:c.nextElementSibling:n.vnode.el,g=JSON.parse(((p=d==null?void 0:d.getAttribute)==null?void 0:p.call(d,xR))||"{}");if(g[r])return g[r]}return e+"_"+t._id++}const SR=(...e)=>e.find(t=>t!==void 0);function CR(e){const t=e.componentName||"NuxtLink";function n(r,s){if(!r||e.trailingSlash!=="append"&&e.trailingSlash!=="remove")return r;if(typeof r=="string")return K0(r,e.trailingSlash);const i="path"in r&&r.path!==void 0?r.path:s(r).path;return{...r,name:void 0,path:K0(i,e.trailingSlash)}}return we({name:t,props:{to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1},custom:{type:Boolean,default:void 0,required:!1}},setup(r,{slots:s}){const i=Wn(),l=Yr(),u=F(()=>{const _=r.to||r.href||"";return n(_,i.resolve)}),c=F(()=>typeof u.value=="string"&&Bo(u.value,{acceptRelative:!0})),p=F(()=>r.target&&r.target!=="_self"),d=F(()=>r.external||p.value?!0:typeof u.value=="object"?!1:u.value===""||c.value),g=te(!1),h=te(null),v=_=>{var x;h.value=r.custom?(x=_==null?void 0:_.$el)==null?void 0:x.nextElementSibling:_==null?void 0:_.$el};if(r.prefetch!==!1&&r.noPrefetch!==!0&&r.target!=="_blank"&&!TR()){const x=nt();let b,E=null;ct(()=>{const C=ER();n1(()=>{b=cd(()=>{var S;(S=h==null?void 0:h.value)!=null&&S.tagName&&(E=C.observe(h.value,async()=>{E==null||E(),E=null;const A=typeof u.value=="string"?u.value:i.resolve(u.value).fullPath;await Promise.all([x.hooks.callHook("link:prefetch",A).catch(()=>{}),!d.value&&l1(u.value,i).catch(()=>{})]),g.value=!0}))})})}),fa(()=>{b&&eR(b),E==null||E(),E=null})}return()=>{var E,C;if(!d.value){const S={ref:v,to:u.value,activeClass:r.activeClass||e.activeClass,exactActiveClass:r.exactActiveClass||e.exactActiveClass,replace:r.replace,ariaCurrentValue:r.ariaCurrentValue,custom:r.custom};return r.custom||(g.value&&(S.class=r.prefetchedClass||e.prefetchedClass),S.rel=r.rel||void 0),Xe(hr("RouterLink"),S,s.default)}const _=typeof u.value=="object"?((E=i.resolve(u.value))==null?void 0:E.href)??null:u.value&&!r.external&&!c.value?n(_u(l.app.baseURL,u.value),i.resolve):u.value||null,x=r.target||null,b=SR(r.noRel?"":r.rel,e.externalRelAttribute,c.value||p.value?"noopener noreferrer":"")||null;if(r.custom){if(!s.default)return null;const S=()=>Ao(_,{replace:r.replace,external:r.external});return s.default({href:_,navigate:S,get route(){if(!_)return;const A=ha(_);return{path:A.pathname,fullPath:A.pathname,get query(){return db(A.search)},hash:A.hash,params:{},name:void 0,matched:[],redirectedFrom:void 0,meta:{},href:_}},rel:b,target:x,isExternal:d.value,isActive:!1,isExactActive:!1})}return Xe("a",{ref:h,href:_,rel:b,target:x},(C=s.default)==null?void 0:C.call(s))}}})}const pd=CR(I3);function K0(e,t){const n=t==="append"?eu:sp;return Bo(e)&&!e.startsWith("http")?e:n(e,!0)}function ER(){const e=nt();if(e._observer)return e._observer;let t=null;const n=new Map,r=(i,l)=>(t||(t=new IntersectionObserver(u=>{for(const c of u){const p=n.get(c.target);(c.isIntersecting||c.intersectionRatio>0)&&p&&p()}})),n.set(i,l),t.observe(i),()=>{n.delete(i),t.unobserve(i),n.size===0&&(t.disconnect(),t=null)});return e._observer={observe:r}}function TR(){const e=navigator.connection;return!!(e&&(e.saveData||/2g/.test(e.effectiveType)))}const $R=zn(e=>{const t=rR();return e.vueApp.use(t),va(t),e.payload&&e.payload.pinia&&(t.state.value=e.payload.pinia),{provide:{pinia:t}}}),AR=ql(()=>yn(()=>Promise.resolve().then(()=>P6),void 0,import.meta.url).then(e=>e.default||e.default||e)),IR=ql(()=>yn(()=>import("./CfpCwG3b.js"),__vite__mapDeps([16,17]),import.meta.url).then(e=>e.default||e.default||e)),RR=[["Icon",AR],["IconCSS",IR]],OR=zn({name:"nuxt:global-components",setup(e){for(const[t,n]of RR)e.vueApp.component(t,n),e.vueApp.component("Lazy"+t,n)}}),So={default:()=>yn(()=>import("./DChWJ3W5.js"),[],import.meta.url).then(e=>e.default||e)},PR=zn({name:"nuxt:prefetch",setup(e){const t=Wn();e.hooks.hook("app:mounted",()=>{t.beforeEach(async n=>{var s;const r=(s=n==null?void 0:n.meta)==null?void 0:s.layout;r&&typeof So[r]=="function"&&await So[r]()})}),e.hooks.hook("link:prefetch",n=>{if(Bo(n))return;const r=t.resolve(n);if(!r)return;const s=r.meta.layout;let i=pp(r.meta.middleware);i=i.filter(l=>typeof l=="string");for(const l of i)typeof qi[l]=="function"&&qi[l]();s&&typeof So[s]=="function"&&So[s]()})}});function hd(e){return Oo()?(ps(e),!0):!1}function gs(e){return typeof e=="function"?e():R(e)}const gd=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const G0=()=>+Date.now(),ra=()=>{};function c1(e,t){function n(...r){return new Promise((s,i)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(i)})}return n}function LR(e,t={}){let n,r,s=ra;const i=u=>{clearTimeout(u),s(),s=ra};return u=>{const c=gs(e),p=gs(t.maxWait);return n&&i(n),c<=0||p!==void 0&&p<=0?(r&&(i(r),r=null),Promise.resolve(u())):new Promise((d,g)=>{s=t.rejectOnCancel?g:d,p&&!r&&(r=setTimeout(()=>{n&&i(n),r=null,d(u())},p)),n=setTimeout(()=>{r&&i(r),r=null,d(u())},c)})}}function MR(...e){let t=0,n,r=!0,s=ra,i,l,u,c,p;!at(e[0])&&typeof e[0]=="object"?{delay:l,trailing:u=!0,leading:c=!0,rejectOnCancel:p=!1}=e[0]:[l,u=!0,c=!0,p=!1]=e;const d=()=>{n&&(clearTimeout(n),n=void 0,s(),s=ra)};return h=>{const v=gs(l),_=Date.now()-t,x=()=>i=h();return d(),v<=0?(t=Date.now(),x()):(_>v&&(c||!r)?(t=Date.now(),x()):u&&(i=new Promise((b,E)=>{s=p?E:b,n=setTimeout(()=>{t=Date.now(),r=!0,b(x()),d()},Math.max(0,v-_))})),!c&&!n&&(n=setTimeout(()=>r=!0,v)),r=!1,i)}}function BR(e,t=200,n={}){return c1(LR(t,n),e)}function FR(e,t=200,n=!1,r=!0,s=!1){return c1(MR(t,n,r,s),e)}function f1(e,t=1e3,n={}){const{immediate:r=!0,immediateCallback:s=!1}=n;let i=null;const l=te(!1);function u(){i&&(clearInterval(i),i=null)}function c(){l.value=!1,u()}function p(){const d=gs(t);d<=0||(l.value=!0,s&&e(),u(),i=setInterval(e,d))}if(r&&gd&&p(),at(t)||typeof t=="function"){const d=gt(t,()=>{l.value&&gd&&p()});hd(d)}return hd(c),{isActive:l,pause:c,resume:p}}function IF(e,t,n){let r;at(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:i=void 0,shallow:l=!0,onError:u=ra}=r,c=te(!s),p=l?Ir(t):te(t);let d=0;return Xt(async g=>{if(!c.value)return;d++;const h=d;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const _=await e(x=>{g(()=>{i&&(i.value=!1),v||x()})});h===d&&(p.value=_)}catch(_){u(_)}finally{i&&h===d&&(i.value=!1),v=!0}}),s?F(()=>(c.value=!0,p.value)):p}function RF(e){var t;const n=gs(e);return(t=n==null?void 0:n.$el)!=null?t:n}const DR=gd?window:void 0;function d1(e,t={}){const{immediate:n=!0,fpsLimit:r=void 0,window:s=DR}=t,i=te(!1),l=r?1e3/r:null;let u=0,c=null;function p(h){if(!i.value||!s)return;u||(u=h);const v=h-u;if(l&&vs(u);return(c=t==null?void 0:t.cleanups)==null||c.push(d),d}function r(u){function c(...p){s(c),u(...p)}return n(c)}function s(u){const c=$i.get(e);c&&(c.delete(u),c.size||i())}function i(){$i.delete(e)}function l(u,c){var p;(p=$i.get(e))==null||p.forEach(d=>d(u,c))}return{on:n,once:r,off:s,emit:l,reset:i}}function NR(e={}){const{controls:t=!1,interval:n="requestAnimationFrame"}=e,r=te(new Date),s=()=>r.value=new Date,i=n==="requestAnimationFrame"?d1(s,{immediate:!0}):f1(s,n,{immediate:!0});return t?{now:r,...i}:r}const jR=[{max:6e4,value:1e3,name:"second"},{max:276e4,value:6e4,name:"minute"},{max:72e6,value:36e5,name:"hour"},{max:5184e5,value:864e5,name:"day"},{max:24192e5,value:6048e5,name:"week"},{max:28512e6,value:2592e6,name:"month"},{max:Number.POSITIVE_INFINITY,value:31536e6,name:"year"}],UR={justNow:"just now",past:e=>e.match(/\d/)?`${e} ago`:e,future:e=>e.match(/\d/)?`in ${e}`:e,month:(e,t)=>e===1?t?"last month":"next month":`${e} month${e>1?"s":""}`,year:(e,t)=>e===1?t?"last year":"next year":`${e} year${e>1?"s":""}`,day:(e,t)=>e===1?t?"yesterday":"tomorrow":`${e} day${e>1?"s":""}`,week:(e,t)=>e===1?t?"last week":"next week":`${e} week${e>1?"s":""}`,hour:e=>`${e} hour${e>1?"s":""}`,minute:e=>`${e} minute${e>1?"s":""}`,second:e=>`${e} second${e>1?"s":""}`,invalid:""};function HR(e){return e.toISOString().slice(0,10)}function OF(e,t={}){const{controls:n=!1,updateInterval:r=3e4}=t,{now:s,...i}=NR({interval:r,controls:!0}),l=F(()=>zR(new Date(gs(e)),t,gs(s)));return n?{timeAgo:l,...i}:l}function zR(e,t={},n=Date.now()){var r;const{max:s,messages:i=UR,fullDateFormatter:l=HR,units:u=jR,showSecond:c=!1,rounding:p="round"}=t,d=typeof p=="number"?b=>+b.toFixed(p):Math[p],g=+n-+e,h=Math.abs(g);function v(b,E){return d(Math.abs(b)/E.value)}function _(b,E){const C=v(b,E),S=b>0,A=x(E.name,C,S);return x(S?"past":"future",A,S)}function x(b,E,C){const S=i[b];return typeof S=="function"?S(E,C):S.replace("{0}",E.toString())}if(h<6e4&&!c)return i.justNow;if(typeof s=="number"&&h>s)return l(new Date(e));if(typeof s=="string"){const b=(r=u.find(E=>E.name===s))==null?void 0:r.max;if(b&&h>b)return l(new Date(e))}for(const[b,E]of u.entries()){if(v(g,E)<=0&&u[b-1])return _(g,u[b-1]);if(hl.value=G0()+n,c=i?()=>{u(),i(l.value)}:u,p=s==="requestAnimationFrame"?d1(c,{immediate:r}):f1(c,s,{immediate:r});return t?{timestamp:l,...p}:l}const qR=Symbol("nuxt-ui.slideover"),KR=zn(e=>{const t=Ir({component:"div",props:{}});e.vueApp.provide(qR,t)}),GR=Symbol("nuxt-ui.modal"),JR=zn(e=>{const t=Ir({component:"div",props:{}});e.vueApp.provide(GR,t)}),hp="-";function ZR(e){const t=QR(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;function s(l){const u=l.split(hp);return u[0]===""&&u.length!==1&&u.shift(),p1(u,t)||YR(l)}function i(l,u){const c=n[l]||[];return u&&r[l]?[...c,...r[l]]:c}return{getClassGroupId:s,getConflictingClassGroupIds:i}}function p1(e,t){var l;if(e.length===0)return t.classGroupId;const n=e[0],r=t.nextPart.get(n),s=r?p1(e.slice(1),r):void 0;if(s)return s;if(t.validators.length===0)return;const i=e.join(hp);return(l=t.validators.find(({validator:u})=>u(i)))==null?void 0:l.classGroupId}const J0=/^\[(.+)\]$/;function YR(e){if(J0.test(e)){const t=J0.exec(e)[1],n=t==null?void 0:t.substring(0,t.indexOf(":"));if(n)return"arbitrary.."+n}}function QR(e){const{theme:t,prefix:n}=e,r={nextPart:new Map,validators:[]};return eO(Object.entries(e.classGroups),n).forEach(([i,l])=>{md(l,r,i,t)}),r}function md(e,t,n,r){e.forEach(s=>{if(typeof s=="string"){const i=s===""?t:Z0(t,s);i.classGroupId=n;return}if(typeof s=="function"){if(XR(s)){md(s(r),t,n,r);return}t.validators.push({validator:s,classGroupId:n});return}Object.entries(s).forEach(([i,l])=>{md(l,Z0(t,i),n,r)})})}function Z0(e,t){let n=e;return t.split(hp).forEach(r=>{n.nextPart.has(r)||n.nextPart.set(r,{nextPart:new Map,validators:[]}),n=n.nextPart.get(r)}),n}function XR(e){return e.isThemeGetter}function eO(e,t){return t?e.map(([n,r])=>{const s=r.map(i=>typeof i=="string"?t+i:typeof i=="object"?Object.fromEntries(Object.entries(i).map(([l,u])=>[t+l,u])):i);return[n,s]}):e}function tO(e){if(e<1)return{get:()=>{},set:()=>{}};let t=0,n=new Map,r=new Map;function s(i,l){n.set(i,l),t++,t>e&&(t=0,r=n,n=new Map)}return{get(i){let l=n.get(i);if(l!==void 0)return l;if((l=r.get(i))!==void 0)return s(i,l),l},set(i,l){n.has(i)?n.set(i,l):s(i,l)}}}const h1="!";function nO(e){const t=e.separator,n=t.length===1,r=t[0],s=t.length;return function(l){const u=[];let c=0,p=0,d;for(let x=0;xp?d-p:void 0;return{modifiers:u,hasImportantModifier:h,baseClassName:v,maybePostfixModifierPosition:_}}}function rO(e){if(e.length<=1)return e;const t=[];let n=[];return e.forEach(r=>{r[0]==="["?(t.push(...n.sort(),r),n=[]):n.push(r)}),t.push(...n.sort()),t}function oO(e){return{cache:tO(e.cacheSize),splitModifiers:nO(e),...ZR(e)}}const sO=/\s+/;function iO(e,t){const{splitModifiers:n,getClassGroupId:r,getConflictingClassGroupIds:s}=t,i=new Set;return e.trim().split(sO).map(l=>{const{modifiers:u,hasImportantModifier:c,baseClassName:p,maybePostfixModifierPosition:d}=n(l);let g=r(d?p.substring(0,d):p),h=!!d;if(!g){if(!d)return{isTailwindClass:!1,originalClassName:l};if(g=r(p),!g)return{isTailwindClass:!1,originalClassName:l};h=!1}const v=rO(u).join(":");return{isTailwindClass:!0,modifierId:c?v+h1:v,classGroupId:g,originalClassName:l,hasPostfixModifier:h}}).reverse().filter(l=>{if(!l.isTailwindClass)return!0;const{modifierId:u,classGroupId:c,hasPostfixModifier:p}=l,d=u+c;return i.has(d)?!1:(i.add(d),s(c,p).forEach(g=>i.add(u+g)),!0)}).reverse().map(l=>l.originalClassName).join(" ")}function pt(){let e=0,t,n,r="";for(;eg(d),e());return n=oO(p),r=n.cache.get,s=n.cache.set,i=u,u(c)}function u(c){const p=r(c);if(p)return p;const d=iO(c,n);return s(c,d),d}return function(){return i(pt.apply(null,arguments))}}function $t(e){const t=n=>n[e]||[];return t.isThemeGetter=!0,t}const m1=/^\[(?:([a-z-]+):)?(.+)\]$/i,aO=/^\d+\/\d+$/,lO=new Set(["px","full","screen"]),uO=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,cO=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,fO=/^(rgba?|hsla?|hwb|(ok)?(lab|lch))\(.+\)$/,dO=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,pO=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/;function Hr(e){return ss(e)||lO.has(e)||aO.test(e)}function go(e){return ai(e,"length",wO)}function ss(e){return!!e&&!Number.isNaN(Number(e))}function Cl(e){return ai(e,"number",ss)}function Ai(e){return!!e&&Number.isInteger(Number(e))}function hO(e){return e.endsWith("%")&&ss(e.slice(0,-1))}function qe(e){return m1.test(e)}function mo(e){return uO.test(e)}const gO=new Set(["length","size","percentage"]);function mO(e){return ai(e,gO,v1)}function vO(e){return ai(e,"position",v1)}const yO=new Set(["image","url"]);function bO(e){return ai(e,yO,kO)}function _O(e){return ai(e,"",xO)}function Ii(){return!0}function ai(e,t,n){const r=m1.exec(e);return r?r[1]?typeof t=="string"?r[1]===t:t.has(r[1]):n(r[2]):!1}function wO(e){return cO.test(e)&&!fO.test(e)}function v1(){return!1}function xO(e){return dO.test(e)}function kO(e){return pO.test(e)}function yd(){const e=$t("colors"),t=$t("spacing"),n=$t("blur"),r=$t("brightness"),s=$t("borderColor"),i=$t("borderRadius"),l=$t("borderSpacing"),u=$t("borderWidth"),c=$t("contrast"),p=$t("grayscale"),d=$t("hueRotate"),g=$t("invert"),h=$t("gap"),v=$t("gradientColorStops"),_=$t("gradientColorStopPositions"),x=$t("inset"),b=$t("margin"),E=$t("opacity"),C=$t("padding"),S=$t("saturate"),A=$t("scale"),B=$t("sepia"),L=$t("skew"),H=$t("space"),j=$t("translate"),q=()=>["auto","contain","none"],K=()=>["auto","hidden","clip","visible","scroll"],Y=()=>["auto",qe,t],z=()=>[qe,t],be=()=>["",Hr,go],ce=()=>["auto",ss,qe],ke=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],ie=()=>["solid","dashed","dotted","double","none"],Se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],ve=()=>["start","end","center","between","around","evenly","stretch"],Lt=()=>["","0",qe],Gt=()=>["auto","avoid","all","avoid-page","page","left","right","column"],Re=()=>[ss,Cl],je=()=>[ss,qe];return{cacheSize:500,separator:":",theme:{colors:[Ii],spacing:[Hr,go],blur:["none","",mo,qe],brightness:Re(),borderColor:[e],borderRadius:["none","","full",mo,qe],borderSpacing:z(),borderWidth:be(),contrast:Re(),grayscale:Lt(),hueRotate:je(),invert:Lt(),gap:z(),gradientColorStops:[e],gradientColorStopPositions:[hO,go],inset:Y(),margin:Y(),opacity:Re(),padding:z(),saturate:Re(),scale:Re(),sepia:Lt(),skew:je(),space:z(),translate:z()},classGroups:{aspect:[{aspect:["auto","square","video",qe]}],container:["container"],columns:[{columns:[mo]}],"break-after":[{"break-after":Gt()}],"break-before":[{"break-before":Gt()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ke(),qe]}],overflow:[{overflow:K()}],"overflow-x":[{"overflow-x":K()}],"overflow-y":[{"overflow-y":K()}],overscroll:[{overscroll:q()}],"overscroll-x":[{"overscroll-x":q()}],"overscroll-y":[{"overscroll-y":q()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[x]}],"inset-x":[{"inset-x":[x]}],"inset-y":[{"inset-y":[x]}],start:[{start:[x]}],end:[{end:[x]}],top:[{top:[x]}],right:[{right:[x]}],bottom:[{bottom:[x]}],left:[{left:[x]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",Ai,qe]}],basis:[{basis:Y()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",qe]}],grow:[{grow:Lt()}],shrink:[{shrink:Lt()}],order:[{order:["first","last","none",Ai,qe]}],"grid-cols":[{"grid-cols":[Ii]}],"col-start-end":[{col:["auto",{span:["full",Ai,qe]},qe]}],"col-start":[{"col-start":ce()}],"col-end":[{"col-end":ce()}],"grid-rows":[{"grid-rows":[Ii]}],"row-start-end":[{row:["auto",{span:[Ai,qe]},qe]}],"row-start":[{"row-start":ce()}],"row-end":[{"row-end":ce()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",qe]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",qe]}],gap:[{gap:[h]}],"gap-x":[{"gap-x":[h]}],"gap-y":[{"gap-y":[h]}],"justify-content":[{justify:["normal",...ve()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...ve(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...ve(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[C]}],px:[{px:[C]}],py:[{py:[C]}],ps:[{ps:[C]}],pe:[{pe:[C]}],pt:[{pt:[C]}],pr:[{pr:[C]}],pb:[{pb:[C]}],pl:[{pl:[C]}],m:[{m:[b]}],mx:[{mx:[b]}],my:[{my:[b]}],ms:[{ms:[b]}],me:[{me:[b]}],mt:[{mt:[b]}],mr:[{mr:[b]}],mb:[{mb:[b]}],ml:[{ml:[b]}],"space-x":[{"space-x":[H]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[H]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",qe,t]}],"min-w":[{"min-w":[qe,t,"min","max","fit"]}],"max-w":[{"max-w":[qe,t,"none","full","min","max","fit","prose",{screen:[mo]},mo]}],h:[{h:[qe,t,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[qe,t,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[qe,t,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[qe,t,"auto","min","max","fit"]}],"font-size":[{text:["base",mo,go]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Cl]}],"font-family":[{font:[Ii]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractons"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",qe]}],"line-clamp":[{"line-clamp":["none",ss,Cl]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Hr,qe]}],"list-image":[{"list-image":["none",qe]}],"list-style-type":[{list:["none","disc","decimal",qe]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[e]}],"placeholder-opacity":[{"placeholder-opacity":[E]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[e]}],"text-opacity":[{"text-opacity":[E]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...ie(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Hr,go]}],"underline-offset":[{"underline-offset":["auto",Hr,qe]}],"text-decoration-color":[{decoration:[e]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:z()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",qe]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",qe]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[E]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ke(),vO]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",mO]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},bO]}],"bg-color":[{bg:[e]}],"gradient-from-pos":[{from:[_]}],"gradient-via-pos":[{via:[_]}],"gradient-to-pos":[{to:[_]}],"gradient-from":[{from:[v]}],"gradient-via":[{via:[v]}],"gradient-to":[{to:[v]}],rounded:[{rounded:[i]}],"rounded-s":[{"rounded-s":[i]}],"rounded-e":[{"rounded-e":[i]}],"rounded-t":[{"rounded-t":[i]}],"rounded-r":[{"rounded-r":[i]}],"rounded-b":[{"rounded-b":[i]}],"rounded-l":[{"rounded-l":[i]}],"rounded-ss":[{"rounded-ss":[i]}],"rounded-se":[{"rounded-se":[i]}],"rounded-ee":[{"rounded-ee":[i]}],"rounded-es":[{"rounded-es":[i]}],"rounded-tl":[{"rounded-tl":[i]}],"rounded-tr":[{"rounded-tr":[i]}],"rounded-br":[{"rounded-br":[i]}],"rounded-bl":[{"rounded-bl":[i]}],"border-w":[{border:[u]}],"border-w-x":[{"border-x":[u]}],"border-w-y":[{"border-y":[u]}],"border-w-s":[{"border-s":[u]}],"border-w-e":[{"border-e":[u]}],"border-w-t":[{"border-t":[u]}],"border-w-r":[{"border-r":[u]}],"border-w-b":[{"border-b":[u]}],"border-w-l":[{"border-l":[u]}],"border-opacity":[{"border-opacity":[E]}],"border-style":[{border:[...ie(),"hidden"]}],"divide-x":[{"divide-x":[u]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[u]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[E]}],"divide-style":[{divide:ie()}],"border-color":[{border:[s]}],"border-color-x":[{"border-x":[s]}],"border-color-y":[{"border-y":[s]}],"border-color-t":[{"border-t":[s]}],"border-color-r":[{"border-r":[s]}],"border-color-b":[{"border-b":[s]}],"border-color-l":[{"border-l":[s]}],"divide-color":[{divide:[s]}],"outline-style":[{outline:["",...ie()]}],"outline-offset":[{"outline-offset":[Hr,qe]}],"outline-w":[{outline:[Hr,go]}],"outline-color":[{outline:[e]}],"ring-w":[{ring:be()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[e]}],"ring-opacity":[{"ring-opacity":[E]}],"ring-offset-w":[{"ring-offset":[Hr,go]}],"ring-offset-color":[{"ring-offset":[e]}],shadow:[{shadow:["","inner","none",mo,_O]}],"shadow-color":[{shadow:[Ii]}],opacity:[{opacity:[E]}],"mix-blend":[{"mix-blend":[...Se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":Se()}],filter:[{filter:["","none"]}],blur:[{blur:[n]}],brightness:[{brightness:[r]}],contrast:[{contrast:[c]}],"drop-shadow":[{"drop-shadow":["","none",mo,qe]}],grayscale:[{grayscale:[p]}],"hue-rotate":[{"hue-rotate":[d]}],invert:[{invert:[g]}],saturate:[{saturate:[S]}],sepia:[{sepia:[B]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[n]}],"backdrop-brightness":[{"backdrop-brightness":[r]}],"backdrop-contrast":[{"backdrop-contrast":[c]}],"backdrop-grayscale":[{"backdrop-grayscale":[p]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[d]}],"backdrop-invert":[{"backdrop-invert":[g]}],"backdrop-opacity":[{"backdrop-opacity":[E]}],"backdrop-saturate":[{"backdrop-saturate":[S]}],"backdrop-sepia":[{"backdrop-sepia":[B]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[l]}],"border-spacing-x":[{"border-spacing-x":[l]}],"border-spacing-y":[{"border-spacing-y":[l]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",qe]}],duration:[{duration:je()}],ease:[{ease:["linear","in","out","in-out",qe]}],delay:[{delay:je()}],animate:[{animate:["none","spin","ping","pulse","bounce",qe]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[A]}],"scale-x":[{"scale-x":[A]}],"scale-y":[{"scale-y":[A]}],rotate:[{rotate:[Ai,qe]}],"translate-x":[{"translate-x":[j]}],"translate-y":[{"translate-y":[j]}],"skew-x":[{"skew-x":[L]}],"skew-y":[{"skew-y":[L]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",qe]}],accent:[{accent:["auto",e]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",qe]}],"caret-color":[{caret:[e]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":z()}],"scroll-mx":[{"scroll-mx":z()}],"scroll-my":[{"scroll-my":z()}],"scroll-ms":[{"scroll-ms":z()}],"scroll-me":[{"scroll-me":z()}],"scroll-mt":[{"scroll-mt":z()}],"scroll-mr":[{"scroll-mr":z()}],"scroll-mb":[{"scroll-mb":z()}],"scroll-ml":[{"scroll-ml":z()}],"scroll-p":[{"scroll-p":z()}],"scroll-px":[{"scroll-px":z()}],"scroll-py":[{"scroll-py":z()}],"scroll-ps":[{"scroll-ps":z()}],"scroll-pe":[{"scroll-pe":z()}],"scroll-pt":[{"scroll-pt":z()}],"scroll-pr":[{"scroll-pr":z()}],"scroll-pb":[{"scroll-pb":z()}],"scroll-pl":[{"scroll-pl":z()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",qe]}],fill:[{fill:[e,"none"]}],"stroke-w":[{stroke:[Hr,go,Cl]}],stroke:[{stroke:[e,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}}function SO(e,{cacheSize:t,prefix:n,separator:r,extend:s={},override:i={}}){Fl(e,"cacheSize",t),Fl(e,"prefix",n),Fl(e,"separator",r);for(const l in i)CO(e[l],i[l]);for(const l in s)EO(e[l],s[l]);return e}function Fl(e,t,n){n!==void 0&&(e[t]=n)}function CO(e,t){if(t)for(const n in t)Fl(e,n,t[n])}function EO(e,t){if(t)for(const n in t){const r=t[n];r!==void 0&&(e[n]=(e[n]||[]).concat(r))}}function TO(e,...t){return typeof e=="function"?vd(yd,e,...t):vd(()=>SO(yd(),e),...t)}const Un=vd(yd);function $O(e,t){const n={...e};for(const r of t)delete n[r];return n}function Di(e,t,n){typeof t=="string"&&(t=t.split(".").map(s=>{const i=Number(s);return isNaN(i)?s:i}));let r=e;for(const s of t){if(r==null)return n;r=r[s]}return r!==void 0?r:n}const gp={to:{type:[String,Object],default:void 0,required:!1},href:{type:[String,Object],default:void 0,required:!1},target:{type:String,default:void 0,required:!1},rel:{type:String,default:void 0,required:!1},noRel:{type:Boolean,default:void 0,required:!1},prefetch:{type:Boolean,default:void 0,required:!1},noPrefetch:{type:Boolean,default:void 0,required:!1},activeClass:{type:String,default:void 0,required:!1},exactActiveClass:{type:String,default:void 0,required:!1},prefetchedClass:{type:String,default:void 0,required:!1},replace:{type:Boolean,default:void 0,required:!1},ariaCurrentValue:{type:String,default:void 0,required:!1},external:{type:Boolean,default:void 0,required:!1}},AO=e=>Object.keys(gp).reduce((n,r)=>(e[r]!==void 0&&(n[r]=e[r]),n),{}),IO=TO({extend:{classGroups:{icons:[e=>/^i-/.test(e)]}}}),RO=ap((e,t,n,r)=>{if(r==="default"||r.startsWith("default.")||r==="popper"||r.startsWith("popper.")||r.endsWith("avatar")&&t==="size"||r.endsWith("chip")&&t==="size"||r.endsWith("badge")&&t==="size"||t==="color"||t==="variant")return!1;if(typeof e[t]=="string"&&typeof n=="string"&&e[t]&&n)return e[t]=IO(e[t],n),!0});function wn(e,...t){return e==="override"?wu({},...t):RO({},...t)}function Y0(e){const t=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(t,function(r,s,i,l){return s+s+i+i+l+l});const n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return n?`${parseInt(n[1],16)} ${parseInt(n[2],16)} ${parseInt(n[3],16)}`:null}function y1(e){const t=parseFloat(e);return isNaN(t)?e:t}const OO="inherit",PO="currentColor",LO="transparent",MO="#000",BO="#fff",FO={50:"#f8fafc",100:"#f1f5f9",200:"#e2e8f0",300:"#cbd5e1",400:"#94a3b8",500:"#64748b",600:"#475569",700:"#334155",800:"#1e293b",900:"#0f172a",950:"#020617"},DO={50:"rgb(var(--color-gray-50) / )",100:"rgb(var(--color-gray-100) / )",200:"rgb(var(--color-gray-200) / )",300:"rgb(var(--color-gray-300) / )",400:"rgb(var(--color-gray-400) / )",500:"rgb(var(--color-gray-500) / )",600:"rgb(var(--color-gray-600) / )",700:"rgb(var(--color-gray-700) / )",800:"rgb(var(--color-gray-800) / )",900:"rgb(var(--color-gray-900) / )",950:"rgb(var(--color-gray-950) / )"},VO={50:"#fafafa",100:"#f4f4f5",200:"#e4e4e7",300:"#d4d4d8",400:"#a1a1aa",500:"#71717a",600:"#52525b",700:"#3f3f46",800:"#27272a",900:"#18181b",950:"#09090b"},NO={50:"#fafafa",100:"#f5f5f5",200:"#e5e5e5",300:"#d4d4d4",400:"#a3a3a3",500:"#737373",600:"#525252",700:"#404040",800:"#262626",900:"#171717",950:"#0a0a0a"},jO={50:"#fafaf9",100:"#f5f5f4",200:"#e7e5e4",300:"#d6d3d1",400:"#a8a29e",500:"#78716c",600:"#57534e",700:"#44403c",800:"#292524",900:"#1c1917",950:"#0c0a09"},UO={50:"#fef2f2",100:"#fee2e2",200:"#fecaca",300:"#fca5a5",400:"#f87171",500:"#ef4444",600:"#dc2626",700:"#b91c1c",800:"#991b1b",900:"#7f1d1d",950:"#450a0a"},HO={50:"#fff7ed",100:"#ffedd5",200:"#fed7aa",300:"#fdba74",400:"#fb923c",500:"#f97316",600:"#ea580c",700:"#c2410c",800:"#9a3412",900:"#7c2d12",950:"#431407"},zO={50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},WO={50:"#fffbeb",100:"#fef3c7",200:"#fde68a",300:"#fcd34d",400:"#fbbf24",500:"#f59e0b",600:"#d97706",700:"#b45309",800:"#92400e",900:"#78350f",950:"#451a03"},qO={50:"#f7fee7",100:"#ecfccb",200:"#d9f99d",300:"#bef264",400:"#a3e635",500:"#84cc16",600:"#65a30d",700:"#4d7c0f",800:"#3f6212",900:"#365314",950:"#1a2e05"},KO={50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},GO={50:"#ecfdf5",100:"#d1fae5",200:"#a7f3d0",300:"#6ee7b7",400:"#34d399",500:"#10b981",600:"#059669",700:"#047857",800:"#065f46",900:"#064e3b",950:"#022c22"},JO={50:"#f0fdfa",100:"#ccfbf1",200:"#99f6e4",300:"#5eead4",400:"#2dd4bf",500:"#14b8a6",600:"#0d9488",700:"#0f766e",800:"#115e59",900:"#134e4a",950:"#042f2e"},ZO={50:"#ecfeff",100:"#cffafe",200:"#a5f3fc",300:"#67e8f9",400:"#22d3ee",500:"#06b6d4",600:"#0891b2",700:"#0e7490",800:"#155e75",900:"#164e63",950:"#083344"},YO={50:"#f0f9ff",100:"#e0f2fe",200:"#bae6fd",300:"#7dd3fc",400:"#38bdf8",500:"#0ea5e9",600:"#0284c7",700:"#0369a1",800:"#075985",900:"#0c4a6e",950:"#082f49"},QO={50:"#eff6ff",100:"#dbeafe",200:"#bfdbfe",300:"#93c5fd",400:"#60a5fa",500:"#3b82f6",600:"#2563eb",700:"#1d4ed8",800:"#1e40af",900:"#1e3a8a",950:"#172554"},XO={50:"#eef2ff",100:"#e0e7ff",200:"#c7d2fe",300:"#a5b4fc",400:"#818cf8",500:"#6366f1",600:"#4f46e5",700:"#4338ca",800:"#3730a3",900:"#312e81",950:"#1e1b4b"},eP={50:"#f5f3ff",100:"#ede9fe",200:"#ddd6fe",300:"#c4b5fd",400:"#a78bfa",500:"#8b5cf6",600:"#7c3aed",700:"#6d28d9",800:"#5b21b6",900:"#4c1d95",950:"#2e1065"},tP={50:"#faf5ff",100:"#f3e8ff",200:"#e9d5ff",300:"#d8b4fe",400:"#c084fc",500:"#a855f7",600:"#9333ea",700:"#7e22ce",800:"#6b21a8",900:"#581c87",950:"#3b0764"},nP={50:"#fdf4ff",100:"#fae8ff",200:"#f5d0fe",300:"#f0abfc",400:"#e879f9",500:"#d946ef",600:"#c026d3",700:"#a21caf",800:"#86198f",900:"#701a75",950:"#4a044e"},rP={50:"#fdf2f8",100:"#fce7f3",200:"#fbcfe8",300:"#f9a8d4",400:"#f472b6",500:"#ec4899",600:"#db2777",700:"#be185d",800:"#9d174d",900:"#831843",950:"#500724"},oP={50:"#fff1f2",100:"#ffe4e6",200:"#fecdd3",300:"#fda4af",400:"#fb7185",500:"#f43f5e",600:"#e11d48",700:"#be123c",800:"#9f1239",900:"#881337",950:"#4c0519"},sP={50:"rgb(var(--color-primary-50) / )",100:"rgb(var(--color-primary-100) / )",200:"rgb(var(--color-primary-200) / )",300:"rgb(var(--color-primary-300) / )",400:"rgb(var(--color-primary-400) / )",500:"rgb(var(--color-primary-500) / )",600:"rgb(var(--color-primary-600) / )",700:"rgb(var(--color-primary-700) / )",800:"rgb(var(--color-primary-800) / )",900:"rgb(var(--color-primary-900) / )",950:"rgb(var(--color-primary-950) / )",DEFAULT:"rgb(var(--color-primary-DEFAULT) / )"},iP={DEFAULT:"#ffffff",dark:"#333333"},aP={DEFAULT:"#333333",dark:"#f6f7ee"},El={inherit:OO,current:PO,transparent:LO,black:MO,white:BO,slate:FO,gray:DO,zinc:VO,neutral:NO,stone:jO,red:UO,orange:HO,amber:zO,yellow:WO,lime:qO,green:KO,emerald:GO,teal:JO,cyan:ZO,sky:YO,blue:QO,indigo:XO,violet:eP,purple:tP,fuchsia:nP,pink:rP,rose:oP,primary:sP,backdrop:iP,body:aP,"cool-gray":void 0},lP=zn(()=>{const e=ma(),t=nt(),n=F(()=>{const s=El[e.ui.primary],i=El[e.ui.gray];return s||console.warn(`[@nuxt/ui] Primary color '${e.ui.primary}' not found in Tailwind config`),i||console.warn(`[@nuxt/ui] Gray color '${e.ui.gray}' not found in Tailwind config`),`:root { -${Object.entries(s||El.green).map(([l,u])=>`--color-primary-${l}: ${Y0(u)};`).join(` -`)} ---color-primary-DEFAULT: var(--color-primary-500); - -${Object.entries(i||El.cool).map(([l,u])=>`--color-gray-${l}: ${Y0(u)};`).join(` -`)} -} - -.dark { - --color-primary-DEFAULT: var(--color-primary-400); -} -`}),r={style:[{innerHTML:()=>n.value,tagPriority:-2,id:"nuxt-ui-colors"}]};if(t.isHydrating&&!t.payload.serverRendered){const s=document.createElement("style");s.innerHTML=n.value,s.setAttribute("data-nuxt-ui-colors",""),document.head.appendChild(s),r.script=[{innerHTML:"document.head.removeChild(document.querySelector('[data-nuxt-ui-colors]'))"}]}S3(r)}),uP="__NUXT_COLOR_MODE__",cP="nuxt-color-mode",zr=window[uP]||{},fP=zn(e=>{const t=ya("color-mode",()=>_n({preference:zr.preference,value:zr.value,unknown:!1,forced:!1})).value;Wn().afterEach(s=>{const i=s.meta.colorMode;i&&i!=="system"?(t.value=i,t.forced=!0):(i==="system"&&console.warn("You cannot force the colorMode to system at the page level."),t.forced=!1,t.value=t.preference==="system"?zr.getColorScheme():t.preference)});let n;function r(){n||!window.matchMedia||(n=window.matchMedia("(prefers-color-scheme: dark)"),n.addEventListener("change",()=>{!t.forced&&t.preference==="system"&&(t.value=zr.getColorScheme())}))}gt(()=>t.preference,s=>{var i;t.forced||(s==="system"?(t.value=zr.getColorScheme(),r()):t.value=s,(i=window.localStorage)==null||i.setItem(cP,s))},{immediate:!0}),gt(()=>t.value,(s,i)=>{zr.removeColorScheme(i),zr.addColorScheme(s)}),t.preference==="system"&&r(),e.hook("app:mounted",()=>{t.unknown&&(t.preference=zr.preference,t.value=zr.value,t.unknown=!1)}),e.provide("colorMode",t)}),dP=zn({name:"nuxt:chunk-reload",setup(e){const t=Wn(),n=Yr(),r=new Set;t.beforeEach(()=>{r.clear()}),e.hook("app:chunkError",({error:i})=>{r.add(i)});function s(i){const u="href"in i&&i.href[0]==="#"?n.app.baseURL+i.href:_u(n.app.baseURL,i.fullPath);_R({path:u,persistState:!0})}e.hook("app:manifest:update",()=>{t.beforeResolve(s)}),t.onError((i,l)=>{r.has(i)&&s(l)})}});function Q0(e){return{getItem:t=>z0(t,{...e,encode:encodeURIComponent,decode:decodeURIComponent}).value,setItem:(t,n)=>{z0(t,{...e,encode:encodeURIComponent,decode:decodeURIComponent}).value=n}}}function pP(){return{getItem:e=>nt().ssrContext?null:localStorage.getItem(e),setItem:(e,t)=>{nt().ssrContext||localStorage.setItem(e,t)}}}function hP(){return{getItem:e=>nt().ssrContext?null:sessionStorage.getItem(e),setItem:(e,t)=>{nt().ssrContext||sessionStorage.setItem(e,t)}}}const ms={localStorage:pP(),sessionStorage:hP(),cookies:Q0(),cookiesWithOptions:Q0};function gP(e){return typeof e=="object"&&e!==null}function X0(e,t){return e=gP(e)?e:Object.create(null),new Proxy(e,{get(n,r,s){return r==="key"?Reflect.get(n,r,s):Reflect.get(n,r,s)||Reflect.get(t,r,s)}})}function mP(e,t){return t.reduce((n,r)=>n==null?void 0:n[r],e)}function vP(e,t,n){return t.slice(0,-1).reduce((r,s)=>/^(__proto__)$/.test(s)?{}:r[s]=r[s]||{},e)[t[t.length-1]]=n,e}function yP(e,t){return t.reduce((n,r)=>{const s=r.split(".");return vP(n,s,mP(e,s))},{})}function bP(e,t){return n=>{var r;try{const{storage:s=localStorage,beforeRestore:i=void 0,afterRestore:l=void 0,serializer:u={serialize:JSON.stringify,deserialize:JSON.parse},key:c=t.$id,paths:p=null,debug:d=!1}=n;return{storage:s,beforeRestore:i,afterRestore:l,serializer:u,key:((r=e.key)!=null?r:g=>g)(typeof c=="string"?c:c(t.$id)),paths:p,debug:d}}catch(s){return n.debug&&console.error("[pinia-plugin-persistedstate]",s),null}}}function ev(e,{storage:t,serializer:n,key:r,debug:s}){try{const i=t==null?void 0:t.getItem(r);i&&e.$patch(n==null?void 0:n.deserialize(i))}catch(i){s&&console.error("[pinia-plugin-persistedstate]",i)}}function tv(e,{storage:t,serializer:n,key:r,paths:s,debug:i}){try{const l=Array.isArray(s)?yP(e,s):e;t.setItem(r,n.serialize(l))}catch(l){i&&console.error("[pinia-plugin-persistedstate]",l)}}function _P(e={}){return t=>{const{auto:n=!1}=e,{options:{persist:r=n},store:s,pinia:i}=t;if(!r)return;if(!(s.$id in i.state.value)){const u=i._s.get(s.$id.replace("__hot:",""));u&&Promise.resolve().then(()=>u.$persist());return}const l=(Array.isArray(r)?r.map(u=>X0(u,e)):[X0(r,e)]).map(bP(e,s)).filter(Boolean);s.$persist=()=>{l.forEach(u=>{tv(s.$state,u)})},s.$hydrate=({runHooks:u=!0}={})=>{l.forEach(c=>{const{beforeRestore:p,afterRestore:d}=c;u&&(p==null||p(t)),ev(s,c),u&&(d==null||d(t))})},l.forEach(u=>{const{beforeRestore:c,afterRestore:p}=u;c==null||c(t),ev(s,u),p==null||p(t),s.$subscribe((d,g)=>{tv(g,u)},{detached:!0})})}}const wP=zn(e=>{const{cookieOptions:t,debug:n,storage:r}=Yr().public.persistedState;e.$pinia.use(_P({storage:r==="cookies"?ms.cookiesWithOptions(t):ms[r],debug:n}))}),xP=[V3,j3,X4,tR,$R,OR,PR,KR,JR,lP,fP,dP,wP];function kP(e,t){const n=t/e*100;return 2/Math.PI*100*Math.atan(n/50)}function SP(e={}){const{duration:t=2e3,throttle:n=200,hideDelay:r=500,resetDelay:s=400}=e,i=e.estimatedProgress||kP,l=nt(),u=te(0),c=te(!1);let p=!1,d,g,h,v;const _=()=>x(0);function x(L=0){if(!l.isHydrating){if(L>=100)return E();S(),u.value=L<0?0:L,n?g=setTimeout(()=>{c.value=!0,A()},n):(c.value=!0,A())}}function b(){h=setTimeout(()=>{c.value=!1,v=setTimeout(()=>{u.value=0},s)},r)}function E(L={}){u.value=100,p=!0,S(),C(),L.force?(u.value=0,c.value=!1):b()}function C(){clearTimeout(h),clearTimeout(v)}function S(){clearTimeout(g),cancelAnimationFrame(d)}function A(){p=!1;let L;function H(j){if(p)return;L??(L=j);const q=j-L;u.value=Math.max(0,Math.min(100,i(t,q))),d=requestAnimationFrame(H)}d=requestAnimationFrame(H)}let B=()=>{};{const L=l.hook("page:loading:start",()=>{_()}),H=l.hook("page:loading:end",()=>{E()}),j=l.hook("vue:error",()=>E());B=()=>{j(),L(),H(),S()}}return{_cleanup:B,progress:F(()=>u.value),isLoading:F(()=>c.value),start:_,set:x,finish:E,clear:S}}function CP(e={}){const t=nt(),n=t._loadingIndicator=t._loadingIndicator||SP(e);return Oo()&&(t._loadingIndicatorDeps=t._loadingIndicatorDeps||0,t._loadingIndicatorDeps++,ps(()=>{t._loadingIndicatorDeps--,t._loadingIndicatorDeps===0&&(n._cleanup(),delete t._loadingIndicator)})),n}const EP=we({name:"NuxtLoadingIndicator",props:{throttle:{type:Number,default:200},duration:{type:Number,default:2e3},height:{type:Number,default:3},color:{type:[String,Boolean],default:"repeating-linear-gradient(to right,#00dc82 0%,#34cdfe 50%,#0047e1 100%)"},estimatedProgress:{type:Function,required:!1}},setup(e,{slots:t,expose:n}){const{progress:r,isLoading:s,start:i,finish:l,clear:u}=CP({duration:e.duration,throttle:e.throttle,estimatedProgress:e.estimatedProgress});return n({progress:r,isLoading:s,start:i,finish:l,clear:u}),()=>Xe("div",{class:"nuxt-loading-indicator",style:{position:"fixed",top:0,right:0,left:0,pointerEvents:"none",width:"auto",height:`${e.height}px`,opacity:s.value?1:0,background:e.color||void 0,backgroundSize:`${100/r.value*100}% auto`,transform:`scaleX(${r.value}%)`,transformOrigin:"left",transition:"transform 0.1s, height 0.4s, opacity 0.4s",zIndex:999999}},t)}});function TP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"})])}function nv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 9V5.25A2.25 2.25 0 0 0 13.5 3h-6a2.25 2.25 0 0 0-2.25 2.25v13.5A2.25 2.25 0 0 0 7.5 21h6a2.25 2.25 0 0 0 2.25-2.25V15M12 9l-3 3m0 0 3 3m-3-3h12.75"})])}function $P(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"})])}function rv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M14.857 17.082a23.848 23.848 0 0 0 5.454-1.31A8.967 8.967 0 0 1 18 9.75V9A6 6 0 0 0 6 9v.75a8.967 8.967 0 0 1-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 0 1-5.714 0m5.714 0a3 3 0 1 1-5.714 0M3.124 7.5A8.969 8.969 0 0 1 5.292 3m13.416 0a8.969 8.969 0 0 1 2.168 4.5"})])}function b1(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 15.75V18m-7.5-6.75h.008v.008H8.25v-.008Zm0 2.25h.008v.008H8.25V13.5Zm0 2.25h.008v.008H8.25v-.008Zm0 2.25h.008v.008H8.25V18Zm2.498-6.75h.007v.008h-.007v-.008Zm0 2.25h.007v.008h-.007V13.5Zm0 2.25h.007v.008h-.007v-.008Zm0 2.25h.007v.008h-.007V18Zm2.504-6.75h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V13.5Zm0 2.25h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V18Zm2.498-6.75h.008v.008h-.008v-.008Zm0 2.25h.008v.008h-.008V13.5ZM8.25 6h7.5v2.25h-7.5V6ZM12 2.25c-1.892 0-3.758.11-5.593.322C5.307 2.7 4.5 3.65 4.5 4.757V19.5a2.25 2.25 0 0 0 2.25 2.25h10.5a2.25 2.25 0 0 0 2.25-2.25V4.757c0-1.108-.806-2.057-1.907-2.185A48.507 48.507 0 0 0 12 2.25Z"})])}function ov(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M2.25 12.76c0 1.6 1.123 2.994 2.707 3.227 1.087.16 2.185.283 3.293.369V21l4.076-4.076a1.526 1.526 0 0 1 1.037-.443 48.282 48.282 0 0 0 5.68-.494c1.584-.233 2.707-1.626 2.707-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0 0 12 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018Z"})])}function AP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m4.5 12.75 6 6 9-13.5"})])}function sv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M20.25 6.375c0 2.278-3.694 4.125-8.25 4.125S3.75 8.653 3.75 6.375m16.5 0c0-2.278-3.694-4.125-8.25-4.125S3.75 4.097 3.75 6.375m16.5 0v11.25c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125V6.375m16.5 0v3.75m-16.5-3.75v3.75m16.5 0v3.75C20.25 16.153 16.556 18 12 18s-8.25-1.847-8.25-4.125v-3.75m16.5 0c0 2.278-3.694 4.125-8.25 4.125s-8.25-1.847-8.25-4.125"})])}function iv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M4.5 12a7.5 7.5 0 0 0 15 0m-15 0a7.5 7.5 0 1 1 15 0m-15 0H3m16.5 0H21m-1.5 0H12m-8.457 3.077 1.41-.513m14.095-5.13 1.41-.513M5.106 17.785l1.15-.964m11.49-9.642 1.149-.964M7.501 19.795l.75-1.3m7.5-12.99.75-1.3m-6.063 16.658.26-1.477m2.605-14.772.26-1.477m0 17.726-.26-1.477M10.698 4.614l-.26-1.477M16.5 19.794l-.75-1.299M7.5 4.205 12 12m6.894 5.785-1.149-.964M6.256 7.178l-1.15-.964m15.352 8.864-1.41-.513M4.954 9.435l-1.41-.514M12.002 12l-3.75 6.495"})])}function _1(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M8.25 3v1.5M4.5 8.25H3m18 0h-1.5M4.5 12H3m18 0h-1.5m-15 3.75H3m18 0h-1.5M8.25 19.5V21M12 3v1.5m0 15V21m3.75-18v1.5m0 15V21m-9-1.5h10.5a2.25 2.25 0 0 0 2.25-2.25V6.75a2.25 2.25 0 0 0-2.25-2.25H6.75A2.25 2.25 0 0 0 4.5 6.75v10.5a2.25 2.25 0 0 0 2.25 2.25Zm.75-12h9v9h-9v-9Z"})])}function w1(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 6v12m-3-2.818.879.659c1.171.879 3.07.879 4.242 0 1.172-.879 1.172-2.303 0-3.182C13.536 12.219 12.768 12 12 12c-.725 0-1.45-.22-2.003-.659-1.106-.879-1.106-2.303 0-3.182s2.9-.879 4.006 0l.415.33M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"})])}function av(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"})])}function lv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z"})])}function IP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 6.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 12.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5ZM12 18.75a.75.75 0 1 1 0-1.5.75.75 0 0 1 0 1.5Z"})])}function RP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126ZM12 15.75h.007v.008H12v-.008Z"})])}function OP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m2.25 12 8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25"})])}function uv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15 9h3.75M15 12h3.75M15 15h3.75M4.5 19.5h15a2.25 2.25 0 0 0 2.25-2.25V6.75A2.25 2.25 0 0 0 19.5 4.5h-15a2.25 2.25 0 0 0-2.25 2.25v10.5A2.25 2.25 0 0 0 4.5 19.5Zm6-10.125a1.875 1.875 0 1 1-3.75 0 1.875 1.875 0 0 1 3.75 0Zm1.294 6.336a6.721 6.721 0 0 1-3.17.789 6.721 6.721 0 0 1-3.168-.789 3.376 3.376 0 0 1 6.338 0Z"})])}function x1(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"m11.25 11.25.041-.02a.75.75 0 0 1 1.063.852l-.708 2.836a.75.75 0 0 0 1.063.853l.041-.021M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9-3.75h.008v.008H12V8.25Z"})])}function cv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 5.25a3 3 0 0 1 3 3m3 0a6 6 0 0 1-7.029 5.912c-.563-.097-1.159.026-1.563.43L10.5 17.25H8.25v2.25H6v2.25H2.25v-2.818c0-.597.237-1.17.659-1.591l6.499-6.499c.404-.404.527-1 .43-1.563A6 6 0 1 1 21.75 8.25Z"})])}function PP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z"})])}function LP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M18.364 18.364A9 9 0 0 0 5.636 5.636m12.728 12.728A9 9 0 0 1 5.636 5.636m12.728 12.728L5.636 5.636"})])}function fv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z"})])}function MP(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z"})])}function dv(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.75 6a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0ZM4.501 20.118a7.5 7.5 0 0 1 14.998 0A17.933 17.933 0 0 1 12 21.75c-2.676 0-5.216-.584-7.499-1.632Z"})])}function mp(e,t){return V(),Z("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24","stroke-width":"1.5",stroke:"currentColor","aria-hidden":"true","data-slot":"icon"},[I("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18 18 6M6 6l12 12"})])}async function pv(e,t=!1){let n=Yr().public.apiBaseUrl;if(!n)throw new Error("apiBaseUrl is not defined");n==="/"&&(n="");let r=n+e;e.startsWith("https://")&&(r=e);const s=t?{Authorization:`${wt().authToken}`}:void 0,{data:i,error:l}=await a1(`${r}`,{headers:s,server:!1,lazy:!0},"$UqgiltlUfE");return{data:i,error:l}}async function jt(e,t,n=!1){let r=Yr().public.apiBaseUrl;if(!r)throw new Error("apiBaseUrl is not defined");r==="/"&&(r="");let s=r+e;e.startsWith("https://")&&(s=e);const i=n?{Authorization:`${wt().authToken}`,"Content-Type":"application/json"}:{"Content-Type":"application/json"},{data:l,error:u}=await a1(`${s}`,{method:"POST",body:JSON.stringify(t),headers:i,server:!1,lazy:!0},"$HgqqyPIEgZ");return{data:l,error:u}}function k1(){const e=ya("notifications",()=>[]);function t(r){const s={id:new Date().getTime().toString(),...r};return e.value.findIndex(l=>l.id===s.id)===-1&&e.value.push(s),s}function n(r){e.value=e.value.filter(s=>s.id!==r)}return{add:t,remove:n}}function Ve(e,t){if(typeof window>"u")return;const n=k1(),r=e.charAt(0).toUpperCase()+e.slice(1),s=e==="error"?"red":"green",i=e==="error"?"i-heroicons i-heroicons-x-circle":"i-heroicons i-heroicons-check-circle";n.add({title:r,description:t,color:s,icon:i})}function es(e){e.response?e.response.data&&e.response.data.message&&Ve("error",e.response.data.message):e.value?e.value.data&&e.value.data.message?Ve("error",e.value.data.message):e.value.data&&e.value.data.error&&Ve("error",e.value.data.error):e.message?Ve("error",e.message):Ve("error","An error occurred")}var Ri=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function BP(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var iu={exports:{}};/** - * @license - * Lodash - * Copyright OpenJS Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */iu.exports;(function(e,t){(function(){var n,r="4.17.21",s=200,i="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",l="Expected a function",u="Invalid `variable` option passed into `_.template`",c="__lodash_hash_undefined__",p=500,d="__lodash_placeholder__",g=1,h=2,v=4,_=1,x=2,b=1,E=2,C=4,S=8,A=16,B=32,L=64,H=128,j=256,q=512,K=30,Y="...",z=800,be=16,ce=1,ke=2,ie=3,Se=1/0,ve=9007199254740991,Lt=17976931348623157e292,Gt=NaN,Re=4294967295,je=Re-1,Ft=Re>>>1,Dt=[["ary",H],["bind",b],["bindKey",E],["curry",S],["curryRight",A],["flip",q],["partial",B],["partialRight",L],["rearg",j]],fn="[object Arguments]",St="[object Array]",ee="[object AsyncFunction]",ye="[object Boolean]",pe="[object Date]",Ce="[object DOMException]",rt="[object Error]",mt="[object Function]",T="[object GeneratorFunction]",O="[object Map]",U="[object Number]",re="[object Null]",G="[object Object]",fe="[object Promise]",me="[object Proxy]",le="[object RegExp]",ue="[object Set]",se="[object String]",_e="[object Symbol]",Oe="[object Undefined]",Ee="[object WeakMap]",De="[object WeakSet]",He="[object ArrayBuffer]",ot="[object DataView]",_t="[object Float32Array]",Mt="[object Float64Array]",dn="[object Int8Array]",yr="[object Int16Array]",bs="[object Int32Array]",Or="[object Uint8Array]",_s="[object Uint8ClampedArray]",en="[object Uint16Array]",xn="[object Uint32Array]",ka=/\b__p \+= '';/g,D_=/\b(__p \+=) '' \+/g,V_=/(__e\(.*?\)|\b__t\)) \+\n'';/g,Hp=/&(?:amp|lt|gt|quot|#39);/g,zp=/[&<>"']/g,N_=RegExp(Hp.source),j_=RegExp(zp.source),U_=/<%-([\s\S]+?)%>/g,H_=/<%([\s\S]+?)%>/g,Wp=/<%=([\s\S]+?)%>/g,z_=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,W_=/^\w*$/,q_=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Ou=/[\\^$.*+?()[\]{}|]/g,K_=RegExp(Ou.source),Pu=/^\s+/,G_=/\s/,J_=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Z_=/\{\n\/\* \[wrapped with (.+)\] \*/,Y_=/,? & /,Q_=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,X_=/[()=,{}\[\]\/\s]/,ew=/\\(\\)?/g,tw=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,qp=/\w*$/,nw=/^[-+]0x[0-9a-f]+$/i,rw=/^0b[01]+$/i,ow=/^\[object .+?Constructor\]$/,sw=/^0o[0-7]+$/i,iw=/^(?:0|[1-9]\d*)$/,aw=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Sa=/($^)/,lw=/['\n\r\u2028\u2029\\]/g,Ca="\\ud800-\\udfff",uw="\\u0300-\\u036f",cw="\\ufe20-\\ufe2f",fw="\\u20d0-\\u20ff",Kp=uw+cw+fw,Gp="\\u2700-\\u27bf",Jp="a-z\\xdf-\\xf6\\xf8-\\xff",dw="\\xac\\xb1\\xd7\\xf7",pw="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",hw="\\u2000-\\u206f",gw=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Zp="A-Z\\xc0-\\xd6\\xd8-\\xde",Yp="\\ufe0e\\ufe0f",Qp=dw+pw+hw+gw,Lu="['’]",mw="["+Ca+"]",Xp="["+Qp+"]",Ea="["+Kp+"]",eh="\\d+",vw="["+Gp+"]",th="["+Jp+"]",nh="[^"+Ca+Qp+eh+Gp+Jp+Zp+"]",Mu="\\ud83c[\\udffb-\\udfff]",yw="(?:"+Ea+"|"+Mu+")",rh="[^"+Ca+"]",Bu="(?:\\ud83c[\\udde6-\\uddff]){2}",Fu="[\\ud800-\\udbff][\\udc00-\\udfff]",ws="["+Zp+"]",oh="\\u200d",sh="(?:"+th+"|"+nh+")",bw="(?:"+ws+"|"+nh+")",ih="(?:"+Lu+"(?:d|ll|m|re|s|t|ve))?",ah="(?:"+Lu+"(?:D|LL|M|RE|S|T|VE))?",lh=yw+"?",uh="["+Yp+"]?",_w="(?:"+oh+"(?:"+[rh,Bu,Fu].join("|")+")"+uh+lh+")*",ww="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",xw="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",ch=uh+lh+_w,kw="(?:"+[vw,Bu,Fu].join("|")+")"+ch,Sw="(?:"+[rh+Ea+"?",Ea,Bu,Fu,mw].join("|")+")",Cw=RegExp(Lu,"g"),Ew=RegExp(Ea,"g"),Du=RegExp(Mu+"(?="+Mu+")|"+Sw+ch,"g"),Tw=RegExp([ws+"?"+th+"+"+ih+"(?="+[Xp,ws,"$"].join("|")+")",bw+"+"+ah+"(?="+[Xp,ws+sh,"$"].join("|")+")",ws+"?"+sh+"+"+ih,ws+"+"+ah,xw,ww,eh,kw].join("|"),"g"),$w=RegExp("["+oh+Ca+Kp+Yp+"]"),Aw=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Iw=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],Rw=-1,Tt={};Tt[_t]=Tt[Mt]=Tt[dn]=Tt[yr]=Tt[bs]=Tt[Or]=Tt[_s]=Tt[en]=Tt[xn]=!0,Tt[fn]=Tt[St]=Tt[He]=Tt[ye]=Tt[ot]=Tt[pe]=Tt[rt]=Tt[mt]=Tt[O]=Tt[U]=Tt[G]=Tt[le]=Tt[ue]=Tt[se]=Tt[Ee]=!1;var Ct={};Ct[fn]=Ct[St]=Ct[He]=Ct[ot]=Ct[ye]=Ct[pe]=Ct[_t]=Ct[Mt]=Ct[dn]=Ct[yr]=Ct[bs]=Ct[O]=Ct[U]=Ct[G]=Ct[le]=Ct[ue]=Ct[se]=Ct[_e]=Ct[Or]=Ct[_s]=Ct[en]=Ct[xn]=!0,Ct[rt]=Ct[mt]=Ct[Ee]=!1;var Ow={À:"A",Á:"A",Â:"A",Ã:"A",Ä:"A",Å:"A",à:"a",á:"a",â:"a",ã:"a",ä:"a",å:"a",Ç:"C",ç:"c",Ð:"D",ð:"d",È:"E",É:"E",Ê:"E",Ë:"E",è:"e",é:"e",ê:"e",ë:"e",Ì:"I",Í:"I",Î:"I",Ï:"I",ì:"i",í:"i",î:"i",ï:"i",Ñ:"N",ñ:"n",Ò:"O",Ó:"O",Ô:"O",Õ:"O",Ö:"O",Ø:"O",ò:"o",ó:"o",ô:"o",õ:"o",ö:"o",ø:"o",Ù:"U",Ú:"U",Û:"U",Ü:"U",ù:"u",ú:"u",û:"u",ü:"u",Ý:"Y",ý:"y",ÿ:"y",Æ:"Ae",æ:"ae",Þ:"Th",þ:"th",ß:"ss",Ā:"A",Ă:"A",Ą:"A",ā:"a",ă:"a",ą:"a",Ć:"C",Ĉ:"C",Ċ:"C",Č:"C",ć:"c",ĉ:"c",ċ:"c",č:"c",Ď:"D",Đ:"D",ď:"d",đ:"d",Ē:"E",Ĕ:"E",Ė:"E",Ę:"E",Ě:"E",ē:"e",ĕ:"e",ė:"e",ę:"e",ě:"e",Ĝ:"G",Ğ:"G",Ġ:"G",Ģ:"G",ĝ:"g",ğ:"g",ġ:"g",ģ:"g",Ĥ:"H",Ħ:"H",ĥ:"h",ħ:"h",Ĩ:"I",Ī:"I",Ĭ:"I",Į:"I",İ:"I",ĩ:"i",ī:"i",ĭ:"i",į:"i",ı:"i",Ĵ:"J",ĵ:"j",Ķ:"K",ķ:"k",ĸ:"k",Ĺ:"L",Ļ:"L",Ľ:"L",Ŀ:"L",Ł:"L",ĺ:"l",ļ:"l",ľ:"l",ŀ:"l",ł:"l",Ń:"N",Ņ:"N",Ň:"N",Ŋ:"N",ń:"n",ņ:"n",ň:"n",ŋ:"n",Ō:"O",Ŏ:"O",Ő:"O",ō:"o",ŏ:"o",ő:"o",Ŕ:"R",Ŗ:"R",Ř:"R",ŕ:"r",ŗ:"r",ř:"r",Ś:"S",Ŝ:"S",Ş:"S",Š:"S",ś:"s",ŝ:"s",ş:"s",š:"s",Ţ:"T",Ť:"T",Ŧ:"T",ţ:"t",ť:"t",ŧ:"t",Ũ:"U",Ū:"U",Ŭ:"U",Ů:"U",Ű:"U",Ų:"U",ũ:"u",ū:"u",ŭ:"u",ů:"u",ű:"u",ų:"u",Ŵ:"W",ŵ:"w",Ŷ:"Y",ŷ:"y",Ÿ:"Y",Ź:"Z",Ż:"Z",Ž:"Z",ź:"z",ż:"z",ž:"z",IJ:"IJ",ij:"ij",Œ:"Oe",œ:"oe",ʼn:"'n",ſ:"s"},Pw={"&":"&","<":"<",">":">",'"':""","'":"'"},Lw={"&":"&","<":"<",">":">",""":'"',"'":"'"},Mw={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Bw=parseFloat,Fw=parseInt,fh=typeof Ri=="object"&&Ri&&Ri.Object===Object&&Ri,Dw=typeof self=="object"&&self&&self.Object===Object&&self,tn=fh||Dw||Function("return this")(),Vu=t&&!t.nodeType&&t,Fo=Vu&&!0&&e&&!e.nodeType&&e,dh=Fo&&Fo.exports===Vu,Nu=dh&&fh.process,qn=function(){try{var D=Fo&&Fo.require&&Fo.require("util").types;return D||Nu&&Nu.binding&&Nu.binding("util")}catch{}}(),ph=qn&&qn.isArrayBuffer,hh=qn&&qn.isDate,gh=qn&&qn.isMap,mh=qn&&qn.isRegExp,vh=qn&&qn.isSet,yh=qn&&qn.isTypedArray;function Pn(D,J,W){switch(W.length){case 0:return D.call(J);case 1:return D.call(J,W[0]);case 2:return D.call(J,W[0],W[1]);case 3:return D.call(J,W[0],W[1],W[2])}return D.apply(J,W)}function Vw(D,J,W,xe){for(var Ne=-1,ft=D==null?0:D.length;++Ne-1}function ju(D,J,W){for(var xe=-1,Ne=D==null?0:D.length;++xe-1;);return W}function Eh(D,J){for(var W=D.length;W--&&xs(J,D[W],0)>-1;);return W}function Gw(D,J){for(var W=D.length,xe=0;W--;)D[W]===J&&++xe;return xe}var Jw=Wu(Ow),Zw=Wu(Pw);function Yw(D){return"\\"+Mw[D]}function Qw(D,J){return D==null?n:D[J]}function ks(D){return $w.test(D)}function Xw(D){return Aw.test(D)}function ex(D){for(var J,W=[];!(J=D.next()).done;)W.push(J.value);return W}function Ju(D){var J=-1,W=Array(D.size);return D.forEach(function(xe,Ne){W[++J]=[Ne,xe]}),W}function Th(D,J){return function(W){return D(J(W))}}function no(D,J){for(var W=-1,xe=D.length,Ne=0,ft=[];++W-1}function jx(o,a){var f=this.__data__,m=za(f,o);return m<0?(++this.size,f.push([o,a])):f[m][1]=a,this}Pr.prototype.clear=Fx,Pr.prototype.delete=Dx,Pr.prototype.get=Vx,Pr.prototype.has=Nx,Pr.prototype.set=jx;function Lr(o){var a=-1,f=o==null?0:o.length;for(this.clear();++a=a?o:a)),o}function Zn(o,a,f,m,y,k){var $,M=a&g,N=a&h,Q=a&v;if(f&&($=y?f(o,m,y,k):f(o)),$!==n)return $;if(!Pt(o))return o;var X=Ue(o);if(X){if($=W2(o),!M)return kn(o,$)}else{var oe=un(o),ge=oe==mt||oe==T;if(lo(o))return ug(o,M);if(oe==G||oe==fn||ge&&!y){if($=N||ge?{}:$g(o),!M)return N?L2(o,r2($,o)):P2(o,Vh($,o))}else{if(!Ct[oe])return y?o:{};$=q2(o,oe,M)}}k||(k=new ur);var Te=k.get(o);if(Te)return Te;k.set(o,$),rm(o)?o.forEach(function(Me){$.add(Zn(Me,a,f,Me,o,k))}):tm(o)&&o.forEach(function(Me,Qe){$.set(Qe,Zn(Me,a,f,Qe,o,k))});var Le=Q?N?wc:_c:N?Cn:Qt,Je=X?n:Le(o);return Kn(Je||o,function(Me,Qe){Je&&(Qe=Me,Me=o[Qe]),mi($,Qe,Zn(Me,a,f,Qe,o,k))}),$}function o2(o){var a=Qt(o);return function(f){return Nh(f,o,a)}}function Nh(o,a,f){var m=f.length;if(o==null)return!m;for(o=kt(o);m--;){var y=f[m],k=a[y],$=o[y];if($===n&&!(y in o)||!k($))return!1}return!0}function jh(o,a,f){if(typeof o!="function")throw new Gn(l);return ki(function(){o.apply(n,f)},a)}function vi(o,a,f,m){var y=-1,k=Ta,$=!0,M=o.length,N=[],Q=a.length;if(!M)return N;f&&(a=At(a,Ln(f))),m?(k=ju,$=!1):a.length>=s&&(k=ci,$=!1,a=new No(a));e:for(;++yy?0:y+f),m=m===n||m>y?y:We(m),m<0&&(m+=y),m=f>m?0:sm(m);f0&&f(M)?a>1?nn(M,a-1,f,m,y):to(y,M):m||(y[y.length]=M)}return y}var nc=gg(),zh=gg(!0);function br(o,a){return o&&nc(o,a,Qt)}function rc(o,a){return o&&zh(o,a,Qt)}function qa(o,a){return eo(a,function(f){return Vr(o[f])})}function Uo(o,a){a=io(a,o);for(var f=0,m=a.length;o!=null&&fa}function a2(o,a){return o!=null&&vt.call(o,a)}function l2(o,a){return o!=null&&a in kt(o)}function u2(o,a,f){return o>=ln(a,f)&&o=120&&X.length>=120)?new No($&&X):n}X=o[0];var oe=-1,ge=M[0];e:for(;++oe-1;)M!==o&&Fa.call(M,N,1),Fa.call(o,N,1);return o}function tg(o,a){for(var f=o?a.length:0,m=f-1;f--;){var y=a[f];if(f==m||y!==k){var k=y;Dr(y)?Fa.call(o,y,1):pc(o,y)}}return o}function cc(o,a){return o+Na(Mh()*(a-o+1))}function x2(o,a,f,m){for(var y=-1,k=Zt(Va((a-o)/(f||1)),0),$=W(k);k--;)$[m?k:++y]=o,o+=f;return $}function fc(o,a){var f="";if(!o||a<1||a>ve)return f;do a%2&&(f+=o),a=Na(a/2),a&&(o+=o);while(a);return f}function Ze(o,a){return $c(Rg(o,a,En),o+"")}function k2(o){return Dh(Ls(o))}function S2(o,a){var f=Ls(o);return rl(f,jo(a,0,f.length))}function _i(o,a,f,m){if(!Pt(o))return o;a=io(a,o);for(var y=-1,k=a.length,$=k-1,M=o;M!=null&&++yy?0:y+a),f=f>y?y:f,f<0&&(f+=y),y=a>f?0:f-a>>>0,a>>>=0;for(var k=W(y);++m>>1,$=o[k];$!==null&&!Bn($)&&(f?$<=a:$=s){var Q=a?null:D2(o);if(Q)return Aa(Q);$=!1,y=ci,N=new No}else N=a?[]:M;e:for(;++m=m?o:Yn(o,a,f)}var lg=gx||function(o){return tn.clearTimeout(o)};function ug(o,a){if(a)return o.slice();var f=o.length,m=Ih?Ih(f):new o.constructor(f);return o.copy(m),m}function vc(o){var a=new o.constructor(o.byteLength);return new Ma(a).set(new Ma(o)),a}function A2(o,a){var f=a?vc(o.buffer):o.buffer;return new o.constructor(f,o.byteOffset,o.byteLength)}function I2(o){var a=new o.constructor(o.source,qp.exec(o));return a.lastIndex=o.lastIndex,a}function R2(o){return gi?kt(gi.call(o)):{}}function cg(o,a){var f=a?vc(o.buffer):o.buffer;return new o.constructor(f,o.byteOffset,o.length)}function fg(o,a){if(o!==a){var f=o!==n,m=o===null,y=o===o,k=Bn(o),$=a!==n,M=a===null,N=a===a,Q=Bn(a);if(!M&&!Q&&!k&&o>a||k&&$&&N&&!M&&!Q||m&&$&&N||!f&&N||!y)return 1;if(!m&&!k&&!Q&&o=M)return N;var Q=f[m];return N*(Q=="desc"?-1:1)}}return o.index-a.index}function dg(o,a,f,m){for(var y=-1,k=o.length,$=f.length,M=-1,N=a.length,Q=Zt(k-$,0),X=W(N+Q),oe=!m;++M1?f[y-1]:n,$=y>2?f[2]:n;for(k=o.length>3&&typeof k=="function"?(y--,k):n,$&&hn(f[0],f[1],$)&&(k=y<3?n:k,y=1),a=kt(a);++m-1?y[k?a[$]:$]:n}}function yg(o){return Fr(function(a){var f=a.length,m=f,y=Jn.prototype.thru;for(o&&a.reverse();m--;){var k=a[m];if(typeof k!="function")throw new Gn(l);if(y&&!$&&tl(k)=="wrapper")var $=new Jn([],!0)}for(m=$?m:f;++m1&&st.reverse(),X&&NM))return!1;var Q=k.get(o),X=k.get(a);if(Q&&X)return Q==a&&X==o;var oe=-1,ge=!0,Te=f&x?new No:n;for(k.set(o,a),k.set(a,o);++oe1?"& ":"")+a[m],a=a.join(f>2?", ":" "),o.replace(J_,`{ -/* [wrapped with `+a+`] */ -`)}function G2(o){return Ue(o)||Wo(o)||!!(Ph&&o&&o[Ph])}function Dr(o,a){var f=typeof o;return a=a??ve,!!a&&(f=="number"||f!="symbol"&&iw.test(o))&&o>-1&&o%1==0&&o0){if(++a>=z)return arguments[0]}else a=0;return o.apply(n,arguments)}}function rl(o,a){var f=-1,m=o.length,y=m-1;for(a=a===n?m:a;++f1?o[a-1]:n;return f=typeof f=="function"?(o.pop(),f):n,Hg(o,f)});function zg(o){var a=w(o);return a.__chain__=!0,a}function sS(o,a){return a(o),o}function ol(o,a){return a(o)}var iS=Fr(function(o){var a=o.length,f=a?o[0]:0,m=this.__wrapped__,y=function(k){return tc(k,o)};return a>1||this.__actions__.length||!(m instanceof tt)||!Dr(f)?this.thru(y):(m=m.slice(f,+f+(a?1:0)),m.__actions__.push({func:ol,args:[y],thisArg:n}),new Jn(m,this.__chain__).thru(function(k){return a&&!k.length&&k.push(n),k}))});function aS(){return zg(this)}function lS(){return new Jn(this.value(),this.__chain__)}function uS(){this.__values__===n&&(this.__values__=om(this.value()));var o=this.__index__>=this.__values__.length,a=o?n:this.__values__[this.__index__++];return{done:o,value:a}}function cS(){return this}function fS(o){for(var a,f=this;f instanceof Ha;){var m=Fg(f);m.__index__=0,m.__values__=n,a?y.__wrapped__=m:a=m;var y=m;f=f.__wrapped__}return y.__wrapped__=o,a}function dS(){var o=this.__wrapped__;if(o instanceof tt){var a=o;return this.__actions__.length&&(a=new tt(this)),a=a.reverse(),a.__actions__.push({func:ol,args:[Ac],thisArg:n}),new Jn(a,this.__chain__)}return this.thru(Ac)}function pS(){return ig(this.__wrapped__,this.__actions__)}var hS=Za(function(o,a,f){vt.call(o,f)?++o[f]:Mr(o,f,1)});function gS(o,a,f){var m=Ue(o)?bh:s2;return f&&hn(o,a,f)&&(a=n),m(o,Pe(a,3))}function mS(o,a){var f=Ue(o)?eo:Hh;return f(o,Pe(a,3))}var vS=vg(Dg),yS=vg(Vg);function bS(o,a){return nn(sl(o,a),1)}function _S(o,a){return nn(sl(o,a),Se)}function wS(o,a,f){return f=f===n?1:We(f),nn(sl(o,a),f)}function Wg(o,a){var f=Ue(o)?Kn:oo;return f(o,Pe(a,3))}function qg(o,a){var f=Ue(o)?Nw:Uh;return f(o,Pe(a,3))}var xS=Za(function(o,a,f){vt.call(o,f)?o[f].push(a):Mr(o,f,[a])});function kS(o,a,f,m){o=Sn(o)?o:Ls(o),f=f&&!m?We(f):0;var y=o.length;return f<0&&(f=Zt(y+f,0)),cl(o)?f<=y&&o.indexOf(a,f)>-1:!!y&&xs(o,a,f)>-1}var SS=Ze(function(o,a,f){var m=-1,y=typeof a=="function",k=Sn(o)?W(o.length):[];return oo(o,function($){k[++m]=y?Pn(a,$,f):yi($,a,f)}),k}),CS=Za(function(o,a,f){Mr(o,f,a)});function sl(o,a){var f=Ue(o)?At:Jh;return f(o,Pe(a,3))}function ES(o,a,f,m){return o==null?[]:(Ue(a)||(a=a==null?[]:[a]),f=m?n:f,Ue(f)||(f=f==null?[]:[f]),Xh(o,a,f))}var TS=Za(function(o,a,f){o[f?0:1].push(a)},function(){return[[],[]]});function $S(o,a,f){var m=Ue(o)?Uu:kh,y=arguments.length<3;return m(o,Pe(a,4),f,y,oo)}function AS(o,a,f){var m=Ue(o)?jw:kh,y=arguments.length<3;return m(o,Pe(a,4),f,y,Uh)}function IS(o,a){var f=Ue(o)?eo:Hh;return f(o,ll(Pe(a,3)))}function RS(o){var a=Ue(o)?Dh:k2;return a(o)}function OS(o,a,f){(f?hn(o,a,f):a===n)?a=1:a=We(a);var m=Ue(o)?e2:S2;return m(o,a)}function PS(o){var a=Ue(o)?t2:E2;return a(o)}function LS(o){if(o==null)return 0;if(Sn(o))return cl(o)?Ss(o):o.length;var a=un(o);return a==O||a==ue?o.size:ac(o).length}function MS(o,a,f){var m=Ue(o)?Hu:T2;return f&&hn(o,a,f)&&(a=n),m(o,Pe(a,3))}var BS=Ze(function(o,a){if(o==null)return[];var f=a.length;return f>1&&hn(o,a[0],a[1])?a=[]:f>2&&hn(a[0],a[1],a[2])&&(a=[a[0]]),Xh(o,nn(a,1),[])}),il=mx||function(){return tn.Date.now()};function FS(o,a){if(typeof a!="function")throw new Gn(l);return o=We(o),function(){if(--o<1)return a.apply(this,arguments)}}function Kg(o,a,f){return a=f?n:a,a=o&&a==null?o.length:a,Br(o,H,n,n,n,n,a)}function Gg(o,a){var f;if(typeof a!="function")throw new Gn(l);return o=We(o),function(){return--o>0&&(f=a.apply(this,arguments)),o<=1&&(a=n),f}}var Rc=Ze(function(o,a,f){var m=b;if(f.length){var y=no(f,Os(Rc));m|=B}return Br(o,m,a,f,y)}),Jg=Ze(function(o,a,f){var m=b|E;if(f.length){var y=no(f,Os(Jg));m|=B}return Br(a,m,o,f,y)});function Zg(o,a,f){a=f?n:a;var m=Br(o,S,n,n,n,n,n,a);return m.placeholder=Zg.placeholder,m}function Yg(o,a,f){a=f?n:a;var m=Br(o,A,n,n,n,n,n,a);return m.placeholder=Yg.placeholder,m}function Qg(o,a,f){var m,y,k,$,M,N,Q=0,X=!1,oe=!1,ge=!0;if(typeof o!="function")throw new Gn(l);a=Xn(a)||0,Pt(f)&&(X=!!f.leading,oe="maxWait"in f,k=oe?Zt(Xn(f.maxWait)||0,a):k,ge="trailing"in f?!!f.trailing:ge);function Te(Nt){var fr=m,jr=y;return m=y=n,Q=Nt,$=o.apply(jr,fr),$}function Le(Nt){return Q=Nt,M=ki(Qe,a),X?Te(Nt):$}function Je(Nt){var fr=Nt-N,jr=Nt-Q,vm=a-fr;return oe?ln(vm,k-jr):vm}function Me(Nt){var fr=Nt-N,jr=Nt-Q;return N===n||fr>=a||fr<0||oe&&jr>=k}function Qe(){var Nt=il();if(Me(Nt))return st(Nt);M=ki(Qe,Je(Nt))}function st(Nt){return M=n,ge&&m?Te(Nt):(m=y=n,$)}function Fn(){M!==n&&lg(M),Q=0,m=N=y=M=n}function gn(){return M===n?$:st(il())}function Dn(){var Nt=il(),fr=Me(Nt);if(m=arguments,y=this,N=Nt,fr){if(M===n)return Le(N);if(oe)return lg(M),M=ki(Qe,a),Te(N)}return M===n&&(M=ki(Qe,a)),$}return Dn.cancel=Fn,Dn.flush=gn,Dn}var DS=Ze(function(o,a){return jh(o,1,a)}),VS=Ze(function(o,a,f){return jh(o,Xn(a)||0,f)});function NS(o){return Br(o,q)}function al(o,a){if(typeof o!="function"||a!=null&&typeof a!="function")throw new Gn(l);var f=function(){var m=arguments,y=a?a.apply(this,m):m[0],k=f.cache;if(k.has(y))return k.get(y);var $=o.apply(this,m);return f.cache=k.set(y,$)||k,$};return f.cache=new(al.Cache||Lr),f}al.Cache=Lr;function ll(o){if(typeof o!="function")throw new Gn(l);return function(){var a=arguments;switch(a.length){case 0:return!o.call(this);case 1:return!o.call(this,a[0]);case 2:return!o.call(this,a[0],a[1]);case 3:return!o.call(this,a[0],a[1],a[2])}return!o.apply(this,a)}}function jS(o){return Gg(2,o)}var US=$2(function(o,a){a=a.length==1&&Ue(a[0])?At(a[0],Ln(Pe())):At(nn(a,1),Ln(Pe()));var f=a.length;return Ze(function(m){for(var y=-1,k=ln(m.length,f);++y=a}),Wo=qh(function(){return arguments}())?qh:function(o){return Bt(o)&&vt.call(o,"callee")&&!Oh.call(o,"callee")},Ue=W.isArray,r5=ph?Ln(ph):f2;function Sn(o){return o!=null&&ul(o.length)&&!Vr(o)}function Vt(o){return Bt(o)&&Sn(o)}function o5(o){return o===!0||o===!1||Bt(o)&&pn(o)==ye}var lo=yx||Hc,s5=hh?Ln(hh):d2;function i5(o){return Bt(o)&&o.nodeType===1&&!Si(o)}function a5(o){if(o==null)return!0;if(Sn(o)&&(Ue(o)||typeof o=="string"||typeof o.splice=="function"||lo(o)||Ps(o)||Wo(o)))return!o.length;var a=un(o);if(a==O||a==ue)return!o.size;if(xi(o))return!ac(o).length;for(var f in o)if(vt.call(o,f))return!1;return!0}function l5(o,a){return bi(o,a)}function u5(o,a,f){f=typeof f=="function"?f:n;var m=f?f(o,a):n;return m===n?bi(o,a,n,f):!!m}function Pc(o){if(!Bt(o))return!1;var a=pn(o);return a==rt||a==Ce||typeof o.message=="string"&&typeof o.name=="string"&&!Si(o)}function c5(o){return typeof o=="number"&&Lh(o)}function Vr(o){if(!Pt(o))return!1;var a=pn(o);return a==mt||a==T||a==ee||a==me}function em(o){return typeof o=="number"&&o==We(o)}function ul(o){return typeof o=="number"&&o>-1&&o%1==0&&o<=ve}function Pt(o){var a=typeof o;return o!=null&&(a=="object"||a=="function")}function Bt(o){return o!=null&&typeof o=="object"}var tm=gh?Ln(gh):h2;function f5(o,a){return o===a||ic(o,a,kc(a))}function d5(o,a,f){return f=typeof f=="function"?f:n,ic(o,a,kc(a),f)}function p5(o){return nm(o)&&o!=+o}function h5(o){if(Y2(o))throw new Ne(i);return Kh(o)}function g5(o){return o===null}function m5(o){return o==null}function nm(o){return typeof o=="number"||Bt(o)&&pn(o)==U}function Si(o){if(!Bt(o)||pn(o)!=G)return!1;var a=Ba(o);if(a===null)return!0;var f=vt.call(a,"constructor")&&a.constructor;return typeof f=="function"&&f instanceof f&&Oa.call(f)==dx}var Lc=mh?Ln(mh):g2;function v5(o){return em(o)&&o>=-ve&&o<=ve}var rm=vh?Ln(vh):m2;function cl(o){return typeof o=="string"||!Ue(o)&&Bt(o)&&pn(o)==se}function Bn(o){return typeof o=="symbol"||Bt(o)&&pn(o)==_e}var Ps=yh?Ln(yh):v2;function y5(o){return o===n}function b5(o){return Bt(o)&&un(o)==Ee}function _5(o){return Bt(o)&&pn(o)==De}var w5=el(lc),x5=el(function(o,a){return o<=a});function om(o){if(!o)return[];if(Sn(o))return cl(o)?lr(o):kn(o);if(fi&&o[fi])return ex(o[fi]());var a=un(o),f=a==O?Ju:a==ue?Aa:Ls;return f(o)}function Nr(o){if(!o)return o===0?o:0;if(o=Xn(o),o===Se||o===-Se){var a=o<0?-1:1;return a*Lt}return o===o?o:0}function We(o){var a=Nr(o),f=a%1;return a===a?f?a-f:a:0}function sm(o){return o?jo(We(o),0,Re):0}function Xn(o){if(typeof o=="number")return o;if(Bn(o))return Gt;if(Pt(o)){var a=typeof o.valueOf=="function"?o.valueOf():o;o=Pt(a)?a+"":a}if(typeof o!="string")return o===0?o:+o;o=Sh(o);var f=rw.test(o);return f||sw.test(o)?Fw(o.slice(2),f?2:8):nw.test(o)?Gt:+o}function im(o){return _r(o,Cn(o))}function k5(o){return o?jo(We(o),-ve,ve):o===0?o:0}function ht(o){return o==null?"":Mn(o)}var S5=Is(function(o,a){if(xi(a)||Sn(a)){_r(a,Qt(a),o);return}for(var f in a)vt.call(a,f)&&mi(o,f,a[f])}),am=Is(function(o,a){_r(a,Cn(a),o)}),fl=Is(function(o,a,f,m){_r(a,Cn(a),o,m)}),C5=Is(function(o,a,f,m){_r(a,Qt(a),o,m)}),E5=Fr(tc);function T5(o,a){var f=As(o);return a==null?f:Vh(f,a)}var $5=Ze(function(o,a){o=kt(o);var f=-1,m=a.length,y=m>2?a[2]:n;for(y&&hn(a[0],a[1],y)&&(m=1);++f1),k}),_r(o,wc(o),f),m&&(f=Zn(f,g|h|v,V2));for(var y=a.length;y--;)pc(f,a[y]);return f});function q5(o,a){return um(o,ll(Pe(a)))}var K5=Fr(function(o,a){return o==null?{}:_2(o,a)});function um(o,a){if(o==null)return{};var f=At(wc(o),function(m){return[m]});return a=Pe(a),eg(o,f,function(m,y){return a(m,y[0])})}function G5(o,a,f){a=io(a,o);var m=-1,y=a.length;for(y||(y=1,o=n);++ma){var m=o;o=a,a=m}if(f||o%1||a%1){var y=Mh();return ln(o+y*(a-o+Bw("1e-"+((y+"").length-1))),a)}return cc(o,a)}var sC=Rs(function(o,a,f){return a=a.toLowerCase(),o+(f?dm(a):a)});function dm(o){return Fc(ht(o).toLowerCase())}function pm(o){return o=ht(o),o&&o.replace(aw,Jw).replace(Ew,"")}function iC(o,a,f){o=ht(o),a=Mn(a);var m=o.length;f=f===n?m:jo(We(f),0,m);var y=f;return f-=a.length,f>=0&&o.slice(f,y)==a}function aC(o){return o=ht(o),o&&j_.test(o)?o.replace(zp,Zw):o}function lC(o){return o=ht(o),o&&K_.test(o)?o.replace(Ou,"\\$&"):o}var uC=Rs(function(o,a,f){return o+(f?"-":"")+a.toLowerCase()}),cC=Rs(function(o,a,f){return o+(f?" ":"")+a.toLowerCase()}),fC=mg("toLowerCase");function dC(o,a,f){o=ht(o),a=We(a);var m=a?Ss(o):0;if(!a||m>=a)return o;var y=(a-m)/2;return Xa(Na(y),f)+o+Xa(Va(y),f)}function pC(o,a,f){o=ht(o),a=We(a);var m=a?Ss(o):0;return a&&m>>0,f?(o=ht(o),o&&(typeof a=="string"||a!=null&&!Lc(a))&&(a=Mn(a),!a&&ks(o))?ao(lr(o),0,f):o.split(a,f)):[]}var _C=Rs(function(o,a,f){return o+(f?" ":"")+Fc(a)});function wC(o,a,f){return o=ht(o),f=f==null?0:jo(We(f),0,o.length),a=Mn(a),o.slice(f,f+a.length)==a}function xC(o,a,f){var m=w.templateSettings;f&&hn(o,a,f)&&(a=n),o=ht(o),a=fl({},a,m,kg);var y=fl({},a.imports,m.imports,kg),k=Qt(y),$=Gu(y,k),M,N,Q=0,X=a.interpolate||Sa,oe="__p += '",ge=Zu((a.escape||Sa).source+"|"+X.source+"|"+(X===Wp?tw:Sa).source+"|"+(a.evaluate||Sa).source+"|$","g"),Te="//# sourceURL="+(vt.call(a,"sourceURL")?(a.sourceURL+"").replace(/\s/g," "):"lodash.templateSources["+ ++Rw+"]")+` -`;o.replace(ge,function(Me,Qe,st,Fn,gn,Dn){return st||(st=Fn),oe+=o.slice(Q,Dn).replace(lw,Yw),Qe&&(M=!0,oe+=`' + -__e(`+Qe+`) + -'`),gn&&(N=!0,oe+=`'; -`+gn+`; -__p += '`),st&&(oe+=`' + -((__t = (`+st+`)) == null ? '' : __t) + -'`),Q=Dn+Me.length,Me}),oe+=`'; -`;var Le=vt.call(a,"variable")&&a.variable;if(!Le)oe=`with (obj) { -`+oe+` -} -`;else if(X_.test(Le))throw new Ne(u);oe=(N?oe.replace(ka,""):oe).replace(D_,"$1").replace(V_,"$1;"),oe="function("+(Le||"obj")+`) { -`+(Le?"":`obj || (obj = {}); -`)+"var __t, __p = ''"+(M?", __e = _.escape":"")+(N?`, __j = Array.prototype.join; -function print() { __p += __j.call(arguments, '') } -`:`; -`)+oe+`return __p -}`;var Je=gm(function(){return ft(k,Te+"return "+oe).apply(n,$)});if(Je.source=oe,Pc(Je))throw Je;return Je}function kC(o){return ht(o).toLowerCase()}function SC(o){return ht(o).toUpperCase()}function CC(o,a,f){if(o=ht(o),o&&(f||a===n))return Sh(o);if(!o||!(a=Mn(a)))return o;var m=lr(o),y=lr(a),k=Ch(m,y),$=Eh(m,y)+1;return ao(m,k,$).join("")}function EC(o,a,f){if(o=ht(o),o&&(f||a===n))return o.slice(0,$h(o)+1);if(!o||!(a=Mn(a)))return o;var m=lr(o),y=Eh(m,lr(a))+1;return ao(m,0,y).join("")}function TC(o,a,f){if(o=ht(o),o&&(f||a===n))return o.replace(Pu,"");if(!o||!(a=Mn(a)))return o;var m=lr(o),y=Ch(m,lr(a));return ao(m,y).join("")}function $C(o,a){var f=K,m=Y;if(Pt(a)){var y="separator"in a?a.separator:y;f="length"in a?We(a.length):f,m="omission"in a?Mn(a.omission):m}o=ht(o);var k=o.length;if(ks(o)){var $=lr(o);k=$.length}if(f>=k)return o;var M=f-Ss(m);if(M<1)return m;var N=$?ao($,0,M).join(""):o.slice(0,M);if(y===n)return N+m;if($&&(M+=N.length-M),Lc(y)){if(o.slice(M).search(y)){var Q,X=N;for(y.global||(y=Zu(y.source,ht(qp.exec(y))+"g")),y.lastIndex=0;Q=y.exec(X);)var oe=Q.index;N=N.slice(0,oe===n?M:oe)}}else if(o.indexOf(Mn(y),M)!=M){var ge=N.lastIndexOf(y);ge>-1&&(N=N.slice(0,ge))}return N+m}function AC(o){return o=ht(o),o&&N_.test(o)?o.replace(Hp,ox):o}var IC=Rs(function(o,a,f){return o+(f?" ":"")+a.toUpperCase()}),Fc=mg("toUpperCase");function hm(o,a,f){return o=ht(o),a=f?n:a,a===n?Xw(o)?ax(o):zw(o):o.match(a)||[]}var gm=Ze(function(o,a){try{return Pn(o,n,a)}catch(f){return Pc(f)?f:new Ne(f)}}),RC=Fr(function(o,a){return Kn(a,function(f){f=wr(f),Mr(o,f,Rc(o[f],o))}),o});function OC(o){var a=o==null?0:o.length,f=Pe();return o=a?At(o,function(m){if(typeof m[1]!="function")throw new Gn(l);return[f(m[0]),m[1]]}):[],Ze(function(m){for(var y=-1;++yve)return[];var f=Re,m=ln(o,Re);a=Pe(a),o-=Re;for(var y=Ku(m,a);++f0||a<0)?new tt(f):(o<0?f=f.takeRight(-o):o&&(f=f.drop(o)),a!==n&&(a=We(a),f=a<0?f.dropRight(-a):f.take(a-o)),f)},tt.prototype.takeRightWhile=function(o){return this.reverse().takeWhile(o).reverse()},tt.prototype.toArray=function(){return this.take(Re)},br(tt.prototype,function(o,a){var f=/^(?:filter|find|map|reject)|While$/.test(a),m=/^(?:head|last)$/.test(a),y=w[m?"take"+(a=="last"?"Right":""):a],k=m||/^find/.test(a);y&&(w.prototype[a]=function(){var $=this.__wrapped__,M=m?[1]:arguments,N=$ instanceof tt,Q=M[0],X=N||Ue($),oe=function(Qe){var st=y.apply(w,to([Qe],M));return m&&ge?st[0]:st};X&&f&&typeof Q=="function"&&Q.length!=1&&(N=X=!1);var ge=this.__chain__,Te=!!this.__actions__.length,Le=k&&!ge,Je=N&&!Te;if(!k&&X){$=Je?$:new tt(this);var Me=o.apply($,M);return Me.__actions__.push({func:ol,args:[oe],thisArg:n}),new Jn(Me,ge)}return Le&&Je?o.apply(this,M):(Me=this.thru(oe),Le?m?Me.value()[0]:Me.value():Me)})}),Kn(["pop","push","shift","sort","splice","unshift"],function(o){var a=Ia[o],f=/^(?:push|sort|unshift)$/.test(o)?"tap":"thru",m=/^(?:pop|shift)$/.test(o);w.prototype[o]=function(){var y=arguments;if(m&&!this.__chain__){var k=this.value();return a.apply(Ue(k)?k:[],y)}return this[f](function($){return a.apply(Ue($)?$:[],y)})}}),br(tt.prototype,function(o,a){var f=w[a];if(f){var m=f.name+"";vt.call($s,m)||($s[m]=[]),$s[m].push({name:a,func:f})}}),$s[Ya(n,E).name]=[{name:"wrapper",func:n}],tt.prototype.clone=Ax,tt.prototype.reverse=Ix,tt.prototype.value=Rx,w.prototype.at=iS,w.prototype.chain=aS,w.prototype.commit=lS,w.prototype.next=uS,w.prototype.plant=fS,w.prototype.reverse=dS,w.prototype.toJSON=w.prototype.valueOf=w.prototype.value=pS,w.prototype.first=w.prototype.head,fi&&(w.prototype[fi]=cS),w},Cs=lx();Fo?((Fo.exports=Cs)._=Cs,Vu._=Cs):tn._=Cs}).call(Ri)})(iu,iu.exports);var FP=iu.exports;const he=BP(FP);let Tl;const DP=new Uint8Array(16);function VP(){if(!Tl&&(Tl=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Tl))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Tl(DP)}const on=[];for(let e=0;e<256;++e)on.push((e+256).toString(16).slice(1));function NP(e,t=0){return on[e[t+0]]+on[e[t+1]]+on[e[t+2]]+on[e[t+3]]+"-"+on[e[t+4]]+on[e[t+5]]+"-"+on[e[t+6]]+on[e[t+7]]+"-"+on[e[t+8]]+on[e[t+9]]+"-"+on[e[t+10]]+on[e[t+11]]+on[e[t+12]]+on[e[t+13]]+on[e[t+14]]+on[e[t+15]]}const jP=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),hv={randomUUID:jP};function UP(e,t,n){if(hv.randomUUID&&!t&&!e)return hv.randomUUID();e=e||{};const r=e.random||(e.rng||VP)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(let s=0;s<16;++s)t[n+s]=r[s];return t}return NP(r)}const It={timestampToTime(e){const t=new Date(Number(e)),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0"),s=String(t.getUTCDate()).padStart(2,"0");return`${n}-${r}-${s} ${t.toUTCString().slice(17,25)}`},timestampToTimeOnly(e){return`${new Date(Number(e)).toUTCString().slice(17,25)}`},timestampToDate(e){const t=new Date(Number(e)),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0"),s=String(t.getUTCDate()).padStart(2,"0");return`${n}-${r}-${s}`},currentTime(){return new Date().toISOString().slice(11,19)},secondsToHumanReadable(e){const t=Math.floor(e/3600),n=Math.floor((e-t*3600)/60),r=he.round(e-t*3600-n*60,2);return`${t}h ${n}m ${r}s`},remainingTimeText(e){return Math.round(e)===0?"Please wait...":e>60?`${this.secondsToHumanReadable(e)} remaining...`:`${Math.round(e)} seconds remaining...`},roundPrice(e){return e>1?he.round(e,2):e},colorBasedOnSide(e){return e==="buy"?"text-green-600 dark:text-green-400":e==="sell"?"text-red-500 dark:text-red-400":"text-gray-900 dark:text-gray-200"},colorBasedOnType(e){return e==="long"?"text-green-600 dark:text-green-400":e==="short"?"text-red-500 dark:text-red-400":"text-gray-900 dark:text-gray-200"},colorBasedOnNumber(e){return e>0?"text-green-600 dark:text-green-400":e<0?"text-red-500 dark:text-red-400":"text-gray-900 dark:text-gray-200"},uuid(){return UP()}};function gv(){return he.cloneDeep({id:It.uuid(),form:{start_date:"2021-01-01",exchange:"",symbol:""},results:{showResults:!1,executing:!1,progressbar:{current:0,estimated_remaining_seconds:0},metrics:[],infoLogs:"",exception:{error:"",traceback:""},alert:{message:"",type:""}}})}const S1=si("candles",{state:()=>({tabs:{}}),persist:{storage:ms.localStorage},actions:{async init(e){for(const t in this.tabs){const n=this.tabs[t];n.results.executing&&!n.results.exception.error&&(e.has(n.id)||await this.cancel(n.id))}},async addTab(){const e=gv();this.tabs[e.id]=e,await Ao(`/candles/${e.id}`)},closeTab(e){delete this.tabs[e],Ao("/candles")},startInNewTab(e){const t=gv();t.form=he.cloneDeep(this.tabs[e].form),this.tabs[t.id]=t,this.start(t.id)},async start(e){this.tabs[e].results.progressbar.current=0,this.tabs[e].results.executing=!0,this.tabs[e].results.infoLogs="",this.tabs[e].results.exception.traceback="",this.tabs[e].results.exception.error="",this.tabs[e].results.alert.message="";const{data:t,error:n}=await jt("/import-candles",{id:e,exchange:this.tabs[e].form.exchange,symbol:this.tabs[e].form.symbol,start_date:this.tabs[e].form.start_date},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.message);return}},async cancel(e){if(this.tabs[e].results.exception.error){this.tabs[e].results.executing=!1;return}const{data:t,error:n}=await jt("/cancel-import-candles",{id:e},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.message);return}this.tabs[e].results.executing=!1},progressbarEvent(e,t){this.tabs[e].results.progressbar=t,this.tabs[e].results.progressbar.current<100&&this.tabs[e].results.executing===!1&&(this.tabs[e].results.executing=!0)},alertEvent(e,t){this.tabs[e].results.alert=t,this.tabs[e].results.progressbar.current=100,this.tabs[e].results.executing=!1,this.tabs[e].results.exception.traceback="",this.tabs[e].results.exception.error=""},infoLogEvent(e,t){this.tabs[e].results.infoLogs+=`[${It.timestampToTime(t.timestamp)}] ${t.message} -`},exceptionEvent(e,t){this.tabs[e].results.exception.error=t.error,this.tabs[e].results.exception.traceback=t.traceback},terminationEvent(e){this.tabs[e].results.executing&&(this.tabs[e].results.executing=!1,Ve("success","Session terminated successfully"))}}});function mv(){return he.cloneDeep({id:It.uuid(),form:{start_date:"2024-01-01",finish_date:"2024-03-01",debug_mode:!1,export_chart:!1,export_tradingview:!1,export_full_reports:!1,export_csv:!1,export_json:!1,fast_mode:!1,benchmark:!0,exchange:"",routes:[],data_routes:[]},results:{showResults:!1,executing:!1,logsModal:!1,progressbar:{current:0,estimated_remaining_seconds:0},routes_info:[],metrics:[],hyperparameters:[],generalInfo:{},infoLogs:"",exception:{error:"",traceback:""},charts:{equity_curve:[]},info:[]}})}const C1=si("backtest",{state:()=>({tabs:{}}),persist:{storage:ms.localStorage},actions:{async init(e){for(const t in this.tabs){const n=this.tabs[t];n.results.executing&&!n.results.exception.error&&(e.has(n.id)||await this.cancel(n.id))}},async addTab(e){const t=mv();if(this.tabs[t.id]=t,e){const n=this.tabs[e];t.form=JSON.parse(JSON.stringify(n.form))}await Ao(`/backtest/${t.id}`)},closeTab(e){delete this.tabs[e],Ao("/backtest")},async startInNewTab(e){const t=mv();t.form=he.cloneDeep(this.tabs[e].form),this.tabs[t.id]=t,this.start(t.id),await Ao(`/backtest/${t.id}`)},async start(e){if(this.tabs[e].results.progressbar.current=0,this.tabs[e].results.executing=!0,this.tabs[e].results.infoLogs="",this.tabs[e].results.exception.traceback="",this.tabs[e].results.exception.error="",this.tabs[e].form.fast_mode&&this.tabs[e].form.routes.length>1){Ve("error","For the moment, the fast mode can only be used with one trading route"),this.tabs[e].results.executing=!1;return}const{data:t,error:n}=await jt("/backtest",{id:e,exchange:this.tabs[e].form.exchange,routes:this.tabs[e].form.routes,data_routes:this.tabs[e].form.data_routes,config:wt().settings.backtest,start_date:this.tabs[e].form.start_date,finish_date:this.tabs[e].form.finish_date,debug_mode:this.tabs[e].form.debug_mode,export_csv:this.tabs[e].form.export_csv,export_chart:this.tabs[e].form.export_chart,export_tradingview:this.tabs[e].form.export_tradingview,export_full_reports:this.tabs[e].form.export_full_reports,export_json:this.tabs[e].form.export_json,fast_mode:this.tabs[e].form.fast_mode,benchmark:this.tabs[e].form.benchmark},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.data.message),this.tabs[e].results.executing=!1;return}},async cancel(e){if(this.tabs[e].results.exception.error){this.tabs[e].results.executing=!1;return}const{data:t,error:n}=await jt("/cancel-backtest",{id:e},!0);n.value&&n.value.statusCode!==200&&Ve("error",n.value.data.message),this.tabs[e].results.executing=!1},rerun(e){this.tabs[e].results.showResults=!1,this.start(e)},newBacktest(e){this.tabs[e].results.showResults=!1},candlesInfoEvent(e,t){const n=[["Period",t.duration],["Starting Date",It.timestampToDate(t.starting_time)],["Ending Date",It.timestampToDate(t.finishing_time)],["Exchange",t.exchange],["Exchange Type",t.exchange_type]];t.exchange_type==="futures"&&(n.push(["Leverage",t.leverage]),n.push(["Leverage Mode",t.leverage_mode])),this.tabs[e].results.info=n},routesInfoEvent(e,t){const n=[];t.forEach(r=>{n.push([{value:r.symbol,style:""},{value:r.timeframe,style:""},{value:r.strategy_name,style:""}])}),this.tabs[e].results.routes_info=n},progressbarEvent(e,t){this.tabs[e].results.progressbar=t},infoLogEvent(e,t){this.tabs[e].results.infoLogs+=`[${It.timestampToTime(t.timestamp)}] ${t.message} -`},exceptionEvent(e,t){this.tabs[e].results.exception.error=t.error,this.tabs[e].results.exception.traceback=t.traceback},generalInfoEvent(e,t){this.tabs[e].results.generalInfo=t},hyperparametersEvent(e,t){this.tabs[e].results.hyperparameters=t},metricsEvent(e,t){if(t===null){this.tabs[e].results.metrics=[];return}this.tabs[e].results.metrics=[["Total Closed Trades",t.total],["Total Net Profit",`${he.round(t.net_profit,2)} (${he.round(t.net_profit_percentage,2)}%)`],["Starting => Finishing Balance",`${he.round(t.starting_balance,2)} => ${he.round(t.finishing_balance,2)}`],["Open Trades",t.total_open_trades],["Total Paid Fees",he.round(t.fee,2)],["Max Drawdown",`${he.round(t.max_drawdown,2)}%`],["Annual Return",`${he.round(t.annual_return,2)}%`],["Expectancy",`${he.round(t.expectancy,2)} (${he.round(t.expectancy_percentage,2)}%)`],["Avg Win | Avg Loss",`${he.round(t.average_win,2)} | ${he.round(t.average_loss,2)}`],["Ratio Avg Win / Avg Loss",he.round(t.ratio_avg_win_loss,2)],["Win-rate",`${he.round(t.win_rate*100,2)}%`],["Longs | Shorts",`${he.round(t.longs_percentage,2)}% | ${he.round(t.shorts_percentage,2)}%`],["Avg Holding Time",It.secondsToHumanReadable(t.average_holding_period)],["Winning Trades Avg Holding Time",It.secondsToHumanReadable(t.average_winning_holding_period)],["Losing Trades Avg Holding Time",It.secondsToHumanReadable(t.average_losing_holding_period)],["Sharpe Ratio",he.round(t.sharpe_ratio,2)],["Calmar Ratio",he.round(t.calmar_ratio,2)],["Sortino Ratio",he.round(t.sortino_ratio,2)],["Omega Ratio",he.round(t.omega_ratio,2)],["Winning Streak",t.winning_streak],["Losing Streak",t.losing_streak],["Largest Winning Trade",he.round(t.largest_winning_trade,2)],["Largest Losing Trade",he.round(t.largest_losing_trade,2)],["Total Winning Trades",t.total_winning_trades],["Total Losing Trades",t.total_losing_trades]]},equityCurveEvent(e,t){this.tabs[e].results.charts.equity_curve=t,this.tabs[e].results.executing=!1,this.tabs[e].results.showResults=!0},terminationEvent(e,t){this.tabs[e].results.executing&&(this.tabs[e].results.executing=!1,Ve("success","Session terminated successfully"))},alertEvent(e,t){Ve(t.type,t.message)},notificationEvent(e,t){Ve(t.type,t.message)}}}),E1=si("optimization",{state:()=>({form:{start_date:"2024-01-01",finish_date:"2024-03-01",debug_mode:!1,export_csv:!1,export_json:!1,exchange:"",routes:[],data_routes:[],optimal_total:50,fast_mode:!1},results:{showResults:!1,executing:!1,logsModal:!1,progressbar:{current:0,estimated_remaining_seconds:0},routes_info:[],best_candidates:[],metrics:[],generalInfo:[],infoLogs:"",info:[],exception:{error:"",traceback:""},alert:{message:"",type:""}}}),persist:{storage:ms.localStorage},actions:{async init(e){this.results.executing&&!this.results.exception.error&&(e.has("optimization")||await this.cancel())},async start(){this.results.progressbar.current=0,this.results.executing=!0,this.results.infoLogs="",this.results.exception.traceback="",this.results.exception.error="",this.results.alert.message="",this.results.alert.type="",this.results.metrics=[],this.results.generalInfo=[],this.results.best_candidates=[],this.results.routes_info=[],this.results.showResults=!1;const e=wt(),t={id:"optimization",exchange:this.form.exchange,routes:this.form.routes,data_routes:this.form.data_routes,config:e.settings.optimization,start_date:this.form.start_date,finish_date:this.form.finish_date,optimal_total:this.form.optimal_total,debug_mode:this.form.debug_mode,export_csv:this.form.export_csv,export_json:this.form.export_json,fast_mode:this.form.fast_mode},{data:n,error:r}=await jt("/optimization",t,!0);if(r.value&&r.value.statusCode!==200){Ve("error",r.value.data.message);return}},async cancel(){if(this.results.exception.error){this.results.executing=!1;return}this.results.executing=!1;const{data:e,error:t}=await jt("/cancel-optimization",{id:"optimization"},!0);if(t.value&&t.value.statusCode!==200){Ve("error",t.value.data.message);return}},rerun(){this.results.showResults=!1,this.start()},candlesInfoEvent(e,t){this.results.info=[["Period",t.duration],["Starting-Ending Date",`${It.timestampToDate(t.starting_time)} => ${It.timestampToDate(t.finishing_time)}`]]},routesInfoEvent(e,t){const n=[];t.forEach(r=>{n.push([{value:r.symbol,style:""},{value:r.timeframe,style:""},{value:r.strategy_name,style:""}])}),this.results.routes_info=n},progressbarEvent(e,t){this.results.progressbar=t},infoLogEvent(e,t){this.results.infoLogs+=`[${It.timestampToTime(t.timestamp)}] ${t.message} -`},exceptionEvent(e,t){this.results.exception.error=t.error,this.results.exception.traceback=t.traceback},generalInfoEvent(e,t){this.results.executing||(this.results.executing=!0),this.results.generalInfo=[["Started at",t.started_at],["Index",t.index],["Average strategy execution time",`${he.round(t.average_execution_seconds,2)} seconds`],["Trading route",t.trading_route]],"population_size"in t&&this.results.generalInfo.push(["Population size",t.population_size?t.population_size:""]),"iterations"in t&&this.results.generalInfo.push(["Iterations",t.iterations?t.iterations:""]),"solution_length"in t&&this.results.generalInfo.push(["Solution length",t.solution_length?t.solution_length:""])},metricsEvent(e,t){if(t===null){this.results.metrics=[];return}this.results.metrics=[["Total Closed Trades",t.total],["Total Net Profit",`${he.round(t.net_profit,2)} (${he.round(t.net_profit_percentage,2)}%)`],["Starting => Finishing Balance",`${he.round(t.starting_balance,2)} => ${he.round(t.finishing_balance,2)}`],["Open Trades",t.total_open_trades],["Total Paid Fees",he.round(t.fee,2)],["Max Drawdown",he.round(t.max_drawdown,2)],["Annual Return",`${he.round(t.annual_return,2)}%`],["Expectancy",`${he.round(t.expectancy,2)} (${he.round(t.expectancy_percentage,2)}%)`],["Avg Win | Avg Loss",`${he.round(t.average_win,2)} | ${he.round(t.average_loss,2)}`],["Ratio Avg Win / Avg Loss",he.round(t.ratio_avg_win_loss,2)],["Win-rate",`${he.round(t.win_rate*100,2)}%`],["Longs | Shorts",`${he.round(t.longs_percentage,2)}% | ${he.round(t.shorts_percentage,2)}%`],["Avg Holding Time",t.average_holding_period],["Winning Trades Avg Holding Time",t.average_winning_holding_period],["Losing Trades Avg Holding Time",t.average_losing_holding_period],["Sharpe Ratio",he.round(t.sharpe_ratio,2)],["Calmar Ratio",he.round(t.calmar_ratio,2)],["Sortino Ratio",he.round(t.sortino_ratio,2)],["Omega Ratio",he.round(t.omega_ratio,2)],["Winning Streak",t.winning_streak],["Losing Streak",t.losing_streak],["Largest Winning Trade",he.round(t.largest_winning_trade,2)],["Largest Losing Trade",he.round(t.largest_losing_trade,2)],["Total Winning Trades",t.total_winning_trades],["Total Losing Trades",t.total_losing_trades]]},terminationEvent(e){this.results.executing&&(this.results.executing=!1,Ve("success","Session terminated successfully"))},bestCandidatesEvent(e,t){const n=[];t.forEach(r=>{n.push([{value:`#${r.rank}`,style:""},{value:r.dna,style:"",tag:"code"},{value:r.fitness,style:""},{value:`${r.training_win_rate}% | ${r.testing_win_rate}%`,style:""},{value:`${r.training_total_trades} | ${r.testing_total_trades}`,style:""},{value:`${r.training_pnl}% | ${r.testing_pnl}%`,style:""}])}),this.results.best_candidates=n},alertEvent(e,t){this.results.alert=t,this.results.executing=!1,this.results.showResults=!0}}});function rn(e=""){return he.cloneDeep({id:e||It.uuid(),form:{debug_mode:!0,paper_mode:!0,exchange_api_key_id:"",notification_api_key_id:"",exchange:"",routes:[],data_routes:[]},results:{showResults:!1,booting:!1,monitoring:!1,finished:!1,terminating:!1,progressbar:{current:0,estimated_remaining_seconds:0},routes_info:[],routes:[],metrics:[],generalInfo:{},positions:[],orders:[],watchlist:[],candles:[],currentCandles:{},infoLogs:"",errorLogs:"",exception:{error:"",traceback:""},charts:{equity_curve:[]},selectedRoute:{},info:[]}})}const T1=si("Live",{state:()=>({tabs:{}}),persist:{storage:ms.localStorage},actions:{async init(e){for(const t in this.tabs){const n=this.tabs[t];n.results.monitoring&&!n.results.exception.error&&(e.has(n.id)?this.fetchLogs(n.id):this.forceClose(n.id))}},async addTab(){const e=rn();this.tabs[e.id]=e,await Ao(`/live/${e.id}`)},closeTab(e){const t=this.tabs[e];if(t.results.monitoring&&!t.results.exception.error&&!t.results.finished){Ve("error","Cannot close a live session tab that is currently running");return}delete this.tabs[e],Ao("/live")},reset(e){this.tabs[e].results.progressbar.current=0,this.tabs[e].results.booting=!0,this.tabs[e].results.finished=!1,this.tabs[e].results.infoLogs="",this.tabs[e].results.errorLogs="",this.tabs[e].results.exception.traceback="",this.tabs[e].results.exception.error="",this.tabs[e].results.routes_info=[],this.tabs[e].results.metrics=[],this.tabs[e].results.generalInfo={},this.tabs[e].results.positions=[],this.tabs[e].results.orders=[],this.tabs[e].results.candles=[],this.tabs[e].results.currentCandles={},this.tabs[e].results.watchlist=[]},async start(e){this.reset(e);const t=wt(),n=this.tabs[e].form.paper_mode?"":this.tabs[e].form.exchange_api_key_id,r=this.tabs[e].form.exchange,s=this.tabs[e].form.notification_api_key_id?this.tabs[e].form.notification_api_key_id:"";this.tabs[e].results.selectedRoute=this.tabs[e].form.routes[0];const{data:i,error:l}=await jt("/live",{id:e,exchange:r,exchange_api_key_id:n,notification_api_key_id:s,routes:this.tabs[e].form.routes,data_routes:this.tabs[e].form.data_routes,config:t.settings.live,debug_mode:this.tabs[e].form.debug_mode,paper_mode:this.tabs[e].form.paper_mode},!0);if(l.value&&l.value.statusCode!==200){Ve("error",l.value.data.message);return}},async cancel(e){const{data:t,error:n}=await jt("/cancel-live",{id:e,paper_mode:this.tabs[e].form.paper_mode},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.data.message);return}this.tabs[e].results.booting=!1},async stop(e){const{data:t,error:n}=await jt("/cancel-live",{id:e,paper_mode:this.tabs[e].form.paper_mode},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.data.message);return}this.tabs[e].results.terminating=!0},newLive(e){this.tabs[e].results.monitoring=!1,this.tabs[e].results.finished=!1},candlesInfoEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.info=[["Period",t.duration],["Starting-Ending Date",`${It.timestampToDate(t.starting_time)} => ${It.timestampToDate(t.finishing_time)}`]]},routesInfoEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e));const n=[];t.forEach(r=>{n.push([{value:r.symbol,style:""},{value:r.timeframe,style:""},{value:r.strategy_name,style:""}])}),this.tabs[e].results.routes_info=n},progressbarEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.progressbar=t},infoLogEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.infoLogs+=`[${It.timestampToTime(t.timestamp)}] ${t.message} -`},errorLogEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),Ve("error",t.message),this.tabs[e].results.errorLogs+=`[${It.timestampToTime(t.timestamp)}] ${t.message} -`},exceptionEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.exception.error=t.error,this.tabs[e].results.exception.traceback=t.traceback},generalInfoEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.generalInfo=t,this.tabs[e].form.routes=this.tabs[e].results.generalInfo.routes,this.tabs[e].results.routes=[];for(const n of this.tabs[e].form.routes)this.tabs[e].results.routes.push([{value:n.symbol,style:""},{value:n.timeframe,style:""},{value:n.strategy,style:""}]);this.tabs[e].results.monitoring||(this.tabs[e].results.booting=!1,this.tabs[e].results.monitoring=!0,this.fetchLogs(e))},async fetchCandles(e){const{data:t,error:n}=await jt("/get-candles",{id:e,exchange:this.tabs[e].form.exchange,symbol:this.tabs[e].results.selectedRoute.symbol,timeframe:this.tabs[e].results.selectedRoute.timeframe},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.data.message);return}const r=t.value;this.tabs[e].results.candles=r.data},async fetchLogs(e){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.infoLogs="",this.tabs[e].results.errorLogs="";const{data:t,error:n}=await jt("/get-logs",{id:e,type:"info",start_time:this.tabs[e].results.generalInfo.started_at},!0);if(n.value&&n.value.statusCode!==200){Ve("error",n.value.data.message);return}const s=t.value.data;this.tabs[e].results.infoLogs="",s.forEach(p=>{this.tabs[e].results.infoLogs+=`[${It.timestampToTime(p.timestamp)}] ${p.message} -`});const{data:i,error:l}=await jt("/get-logs",{id:e,type:"error",start_time:this.tabs[e].results.generalInfo.started_at},!0);if(l.value&&l.value.statusCode!==200){Ve("error",l.value.data.message);return}const c=i.value.data;this.tabs[e].results.errorLogs="",c.forEach(p=>{this.tabs[e].results.errorLogs+=`[${It.timestampToTime(p.timestamp)}] ${p.message} -`})},currentCandlesEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.currentCandles=t},watchlistEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.watchlist=t},positionsEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.positions=[];for(const n of t){const r=n.type==="close"?"":n.qty;this.tabs[e].results.positions.push([{value:n.symbol,style:""},{value:r,style:It.colorBasedOnType(n.type),tooltip:`${n.value} ${n.currency}`},{value:It.roundPrice(n.entry),style:""},{value:It.roundPrice(n.current_price),style:""},{value:n.liquidation_price?It.roundPrice(n.liquidation_price):"",style:""},{value:`${he.round(n.pnl,2)} (${he.round(n.pnl_perc,2)}%)`,style:It.colorBasedOnNumber(n.pnl)}])}},ordersEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.orders=t},metricsEvent(e,t){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.metrics=[["Total Closed Trades",t.total],["Total Net Profit",`${he.round(t.net_profit,2)} (${he.round(t.net_profit_percentage,2)}%)`],["Starting => Finishing Balance",`${he.round(t.starting_balance,2)} => ${he.round(t.finishing_balance,2)}`],["Open Trades",t.total_open_trades],["Total Paid Fees",he.round(t.fee,2)],["Max Drawdown",he.round(t.max_drawdown,2)],["Annual Return",`${he.round(t.annual_return,2)}%`],["Expectancy",`${he.round(t.expectancy,2)} (${he.round(t.expectancy_percentage,2)}%)`],["Avg Win | Avg Loss",`${he.round(t.average_win,2)} | ${he.round(t.average_loss,2)}`],["Ratio Avg Win / Avg Loss",he.round(t.ratio_avg_win_loss,2)],["Win-rate",`${he.round(t.win_rate*100,2)}%`],["Longs | Shorts",`${he.round(t.longs_percentage,2)}% | ${he.round(t.shorts_percentage,2)}%`],["Avg Holding Time",t.average_holding_period],["Winning Trades Avg Holding Time",t.average_winning_holding_period],["Losing Trades Avg Holding Time",t.average_losing_holding_period],["Sharpe Ratio",he.round(t.sharpe_ratio,2)],["Calmar Ratio",he.round(t.calmar_ratio,2)],["Sortino Ratio",he.round(t.sortino_ratio,2)],["Omega Ratio",he.round(t.omega_ratio,2)],["Winning Streak",t.winning_streak],["Losing Streak",t.losing_streak],["Largest Winning Trade",he.round(t.largest_winning_trade,2)],["Largest Losing Trade",he.round(t.largest_losing_trade,2)],["Total Winning Trades",t.total_winning_trades],["Total Losing Trades",t.total_losing_trades]]},equityCurveEvent(e,t){this.tabs[e].results.charts.equity_curve=t,this.tabs[e].results.showResults=!0},unexpectedTerminationEvent(e){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.finished=!0},terminationEvent(e){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.finished||(this.tabs[e].results.finished=!0,this.tabs[e].results.terminating=!1,Ve("success","Session terminated successfully"))},forceClose(e){this.tabs[e]===void 0&&(this.tabs[e]=rn(e)),this.tabs[e].results.finished=!0,this.tabs[e].results.terminating=!1}}}),wt=si("main",{state:()=>({initiated:!1,loadingVar:!1,authToken:"",hasLivePluginInstalled:!1,systemInfo:{},updateInfo:{},plan:"",planLimits:{},settings:{backtest:{logging:{order_submission:!0,order_cancellation:!0,order_execution:!0,position_opened:!0,position_increased:!0,position_reduced:!0,position_closed:!0,shorter_period_candles:!1,trading_candles:!0,balance_update:!0},warm_up_candles:210,exchanges:{}},live:{persistency:!0,generate_candles_from_1m:!1,logging:{order_submission:!0,order_cancellation:!0,order_execution:!0,position_opened:!0,position_increased:!0,position_reduced:!0,position_closed:!0,shorter_period_candles:!1,trading_candles:!0,balance_update:!0},warm_up_candles:210,exchanges:{},notifications:{enabled:!0,position_report_timeframe:"1h",events:{errors:!0,started_session:!0,terminated_session:!0,submitted_orders:!0,cancelled_orders:!0,executed_orders:!0,opened_position:!0,updated_position:!0}}},optimization:{cpu_cores:2,ratio:"sharpe",warm_up_candles:210,exchange:{balance:1e4,fee:.001,type:"futures",futures_leverage:3,futures_leverage_mode:"cross"}}},strategies:[],exchangeInfo:{},jesseSupportedTimeframes:[],exchangeSupportedSymbols:{},skippedJesseVersions:[],skippedLivePluginVersions:[],activeWorkers:new Set,exchangeApiKeys:[],notificationApiKeys:[]}),persist:{storage:ms.localStorage},getters:{backtestingExchangeNames(){const e=[];for(const t in this.exchangeInfo)this.exchangeInfo[t].modes.backtesting&&e.push(t);return e.sort()},liveTradingExchangeNames(){const e=[];for(const t in this.exchangeInfo)this.exchangeInfo[t].modes.live_trading&&e.push(t);return e.sort()},isAuthenticated(){return this.authToken!==""}},actions:{async initiate(){const{data:e,error:t}=await jt("/general-info",{},!0);if(t&&t.value&&t.value.statusCode!==200){es(t);return}const n=e.value;this.systemInfo=n.system_info,this.updateInfo=n.update_info,this.strategies=n.strategies,this.exchangeInfo=n.exchanges,this.jesseSupportedTimeframes=n.jesse_supported_timeframes,this.hasLivePluginInstalled=n.has_live_plugin_installed,this.plan=n.plan,this.planLimits=n.limits;for(const p in this.exchangeInfo){const d=this.exchangeInfo[p];d.modes.backtesting&&(this.settings.backtest.exchanges[p]={name:p,fee:d.fee,balance:1e4,type:d.type},d.type==="futures"&&(this.settings.backtest.exchanges[p].futures_leverage_mode="cross",this.settings.backtest.exchanges[p].futures_leverage=2)),d.modes.live_trading&&(this.settings.live.exchanges[d.name]={name:p,fee:d.fee,futures_leverage_mode:"cross",futures_leverage:2,balance:1e4})}const{data:r,error:s}=await jt("/get-config",{current_config:this.settings},!0);if(s.value&&s.value.statusCode!==200){es(s);return}const i=r.value;this.settings=i.data.data;const{data:l,error:u}=await jt("/active-workers",{},!0);if(u.value&&u.value.statusCode!==200){es(u);return}const c=l.value;this.activeWorkers=new Set(c.data),await this.syncOpenTabs(),await this.fetchExchangeApiKeys(),await this.fetchNotificationApiKeys(),this.initiated=!0},async syncOpenTabs(){S1().init(this.activeWorkers),C1().init(this.activeWorkers),E1().init(this.activeWorkers),T1().init(this.activeWorkers)},updateConfig:FR(async()=>{if(!wt().settings)return;const{data:e,error:t}=await jt("/update-config",{current_config:wt().settings},!0);t.value&&t.value.statusCode!==200&&es(t)},1e3,!0,!0),async fetchExchangeApiKeys(){const{data:e,error:t}=await pv("/exchange-api-keys",!0);if(t.value&&t.value.statusCode!==200){es(t);return}const n=e.value;this.exchangeApiKeys=n.data},async fetchNotificationApiKeys(){const{data:e,error:t}=await pv("/notification-api-keys",!0);if(t.value&&t.value.statusCode!==200){es(t);return}const n=e.value;this.notificationApiKeys=n.data},setAuthToken(e){this.authToken=e},async updateSupportedSymbols(e){const{data:t,error:n}=await jt("/exchange-supported-symbols",{exchange:e},!0);if(n.value&&n.value.statusCode!==200){Ve("error",`[${n.value.statusCode}]: ${n.value.message}`);return}const r=t.value;this.exchangeSupportedSymbols[e]={data:r.data,updated_at:new Date}},async getExchangeSupportedSymbols(e){if(!this.exchangeSupportedSymbols[e])return await this.updateSupportedSymbols(e),this.exchangeSupportedSymbols[e].data;const t=new Date(this.exchangeSupportedSymbols[e].updated_at),r=new Date().getTime()-t.getTime();return Math.ceil(r/(1e3*3600*24))>1&&await this.updateSupportedSymbols(e),this.exchangeSupportedSymbols[e].data}}}),HP={key:0,class:"relative bg-indigo-600 dark:bg-indigo-400 select-none text-white dark:text-black"},zP={class:"max-w-7xl mx-auto py-3 px-3 sm:px-6 lg:px-8"},WP={class:"pr-16 sm:text-center sm:px-16"},qP={class:"font-medium"},KP={class:"md:inline"},GP=I("span",{class:"block sm:ml-2 sm:inline-block"},[I("a",{href:"https://docs.jesse.trade/docs/getting-started/update.html",target:"_blank",class:"font-bold underline"},[de(" Update Guide "),I("span",{"aria-hidden":"true"},"→")])],-1),JP={class:"absolute inset-y-0 right-0 pt-1 pr-1 flex items-start sm:pt-1 sm:pr-2 sm:items-start"},ZP=we({__name:"UpdateBanner",setup(e){const t=te(!1),n=wt(),r=F(()=>n.updateInfo),s=F(()=>n.systemInfo),i=F(()=>{if(t.value||!r.value||!r.value.is_update_info_available)return{flag:!1,message:"",type:"",version:""};const u=n.skippedJesseVersions,c=n.skippedLivePluginVersions;return r.value.jesse_latest_version>s.value.jesse_version&&!u.includes(r.value.jesse_latest_version)?{flag:!0,message:`Version "${r.value.jesse_latest_version}" of Jesse is available. You are currently running version "${s.value.jesse_version}".`,type:"jesse",version:r.value.jesse_latest_version}:s.value.live_plugin_version&&r.value.jesse_live_latest_version>s.value.live_plugin_version&&!c.includes(r.value.jesse_live_latest_version)?{flag:!0,message:`Version "${r.value.jesse_live_latest_version}" of the live plugin is available. You are running "${s.value.live_plugin_version}".`,type:"live",version:r.value.jesse_live_latest_version}:{flag:!1,message:"",type:"",version:""}}),l=(u,c)=>{if(u==="jesse"){const p=n.skippedJesseVersions||[];p.push(c),n.skippedJesseVersions=p,t.value=!0}if(u==="live"){const p=n.skippedLivePluginVersions||[];p.push(c),n.skippedLivePluginVersions=p,t.value=!0}};return(u,c)=>R(i).flag?(V(),Z("div",HP,[I("div",zP,[I("div",WP,[I("p",qP,[I("span",KP,et(R(i).message),1),GP])]),I("div",JP,[I("button",{type:"button",class:"flex p-2 rounded-md hover:bg-indigo-500 focus:outline-none focus:ring-0",onClick:c[0]||(c[0]=p=>l(R(i).type,R(i).version))},[P(R(mp),{class:"h-6 w-6","aria-hidden":"true"})])])])])):Ie("",!0)}}),zt=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},YP={},QP={class:"text-2xl mb-4"};function XP(e,t){return V(),Z("h3",QP,[it(e.$slots,"default")])}const Cu=zt(YP,[["render",XP]]),On=(e,t,n,r,s=!1)=>{const i=FT(),l=ma(),u=F(()=>{var h;const p=Tr(t),d=Tr(n),g=Tr(r);return wn((p==null?void 0:p.strategy)||((h=l.ui)==null?void 0:h.strategy),g?{wrapper:g}:{},p||{},s?Di(l.ui,e,{}):{},d||{})}),c=F(()=>$O(i,["class"]));return{ui:u,attrs:c}},ba=(e,t)=>{const n=Ke("form-events",void 0),r=Ke("form-group",void 0),s=Ke("form-inputs",void 0);r&&(e!=null&&e.id&&(r.inputId.value=e==null?void 0:e.id),s&&(s.value[r.name.value]=r.inputId.value));const i=te(!1);function l(d,g){n&&n.emit({type:d,path:g})}function u(){l("blur",r==null?void 0:r.name.value),i.value=!0}function c(){l("change",r==null?void 0:r.name.value)}const p=BR(()=>{(i.value||r!=null&&r.eagerValidation.value)&&l("input",r==null?void 0:r.name.value)},300);return{inputId:F(()=>(e==null?void 0:e.id)??(r==null?void 0:r.inputId.value)),name:F(()=>(e==null?void 0:e.name)??(r==null?void 0:r.name.value)),size:F(()=>{var g;const d=t.size[r==null?void 0:r.size.value]?r==null?void 0:r.size.value:null;return(e==null?void 0:e.size)??d??((g=t==null?void 0:t.default)==null?void 0:g.size)}),color:F(()=>{var d;return(d=r==null?void 0:r.error)!=null&&d.value?"red":e==null?void 0:e.color}),emitFormBlur:u,emitFormInput:p,emitFormChange:c}},eL={wrapper:"relative inline-flex items-center justify-center flex-shrink-0",background:"bg-gray-100 dark:bg-gray-800",rounded:"rounded-full",text:"font-medium leading-none text-gray-900 dark:text-white truncate",placeholder:"font-medium leading-none text-gray-500 dark:text-gray-400 truncate",size:{"3xs":"h-4 w-4 text-[8px]","2xs":"h-5 w-5 text-[10px]",xs:"h-6 w-6 text-xs",sm:"h-8 w-8 text-sm",md:"h-10 w-10 text-base",lg:"h-12 w-12 text-lg",xl:"h-14 w-14 text-xl","2xl":"h-16 w-16 text-2xl","3xl":"h-20 w-20 text-3xl"},chip:{base:"absolute rounded-full ring-1 ring-white dark:ring-gray-900 flex items-center justify-center text-white dark:text-gray-900 font-medium",background:"bg-{color}-500 dark:bg-{color}-400",position:{"top-right":"top-0 right-0","bottom-right":"bottom-0 right-0","top-left":"top-0 left-0","bottom-left":"bottom-0 left-0"},size:{"3xs":"h-[4px] min-w-[4px] text-[4px] p-px","2xs":"h-[5px] min-w-[5px] text-[5px] p-px",xs:"h-1.5 min-w-[0.375rem] text-[6px] p-px",sm:"h-2 min-w-[0.5rem] text-[7px] p-0.5",md:"h-2.5 min-w-[0.625rem] text-[8px] p-0.5",lg:"h-3 min-w-[0.75rem] text-[10px] p-0.5",xl:"h-3.5 min-w-[0.875rem] text-[11px] p-1","2xl":"h-4 min-w-[1rem] text-[12px] p-1","3xl":"h-5 min-w-[1.25rem] text-[14px] p-1"}},icon:{base:"text-gray-500 dark:text-gray-400 flex-shrink-0",size:{"3xs":"h-2 w-2","2xs":"h-2.5 w-2.5",xs:"h-3 w-3",sm:"h-4 w-4",md:"h-5 w-5",lg:"h-6 w-6",xl:"h-7 w-7","2xl":"h-8 w-8","3xl":"h-10 w-10"}},default:{size:"sm",icon:null,chipColor:null,chipPosition:"top-right"}},tL={base:"focus:outline-none focus-visible:outline-0 disabled:cursor-not-allowed disabled:opacity-75 flex-shrink-0",font:"font-medium",rounded:"rounded-md",truncate:"text-left break-all line-clamp-1",block:"w-full flex justify-center items-center",inline:"inline-flex items-center",size:{"2xs":"text-xs",xs:"text-xs",sm:"text-sm",md:"text-sm",lg:"text-sm",xl:"text-base"},gap:{"2xs":"gap-x-1",xs:"gap-x-1.5",sm:"gap-x-1.5",md:"gap-x-2",lg:"gap-x-2.5",xl:"gap-x-2.5"},padding:{"2xs":"px-2 py-1",xs:"px-2.5 py-1.5",sm:"px-2.5 py-1.5",md:"px-3 py-2",lg:"px-3.5 py-2.5",xl:"px-3.5 py-2.5"},square:{"2xs":"p-1",xs:"p-1.5",sm:"p-1.5",md:"p-2",lg:"p-2.5",xl:"p-2.5"},color:{white:{solid:"shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-700 text-gray-900 dark:text-white bg-white hover:bg-gray-50 disabled:bg-white dark:bg-gray-900 dark:hover:bg-gray-800/50 dark:disabled:bg-gray-900 focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400",ghost:"text-gray-900 dark:text-white hover:bg-white dark:hover:bg-gray-900 focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400"},gray:{solid:"shadow-sm ring-1 ring-inset ring-gray-300 dark:ring-gray-700 text-gray-700 dark:text-gray-200 bg-gray-50 hover:bg-gray-100 disabled:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700/50 dark:disabled:bg-gray-800 focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400",ghost:"text-gray-700 dark:text-gray-200 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-gray-800 focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400",link:"text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 underline-offset-4 hover:underline focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400"},black:{solid:"shadow-sm text-white dark:text-gray-900 bg-gray-900 hover:bg-gray-800 disabled:bg-gray-900 dark:bg-white dark:hover:bg-gray-100 dark:disabled:bg-white focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400",link:"text-gray-900 dark:text-white underline-offset-4 hover:underline focus-visible:ring-inset focus-visible:ring-2 focus-visible:ring-primary-500 dark:focus-visible:ring-primary-400"}},variant:{solid:"shadow-sm text-white dark:text-gray-900 bg-{color}-500 hover:bg-{color}-600 disabled:bg-{color}-500 dark:bg-{color}-400 dark:hover:bg-{color}-500 dark:disabled:bg-{color}-400 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-{color}-500 dark:focus-visible:outline-{color}-400",outline:"ring-1 ring-inset ring-current text-{color}-500 dark:text-{color}-400 hover:bg-{color}-50 disabled:bg-transparent dark:hover:bg-{color}-950 dark:disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400",soft:"text-{color}-500 dark:text-{color}-400 bg-{color}-50 hover:bg-{color}-100 disabled:bg-{color}-50 dark:bg-{color}-950 dark:hover:bg-{color}-900 dark:disabled:bg-{color}-950 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400",ghost:"text-{color}-500 dark:text-{color}-400 hover:bg-{color}-50 disabled:bg-transparent dark:hover:bg-{color}-950 dark:disabled:bg-transparent focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400",link:"text-{color}-500 hover:text-{color}-600 disabled:text-{color}-500 dark:text-{color}-400 dark:hover:text-{color}-500 dark:disabled:text-{color}-400 underline-offset-4 hover:underline focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400"},icon:{base:"flex-shrink-0",loading:"animate-spin",size:{"2xs":"h-4 w-4",xs:"h-4 w-4",sm:"h-5 w-5",md:"h-5 w-5",lg:"h-5 w-5",xl:"h-6 w-6"}},default:{size:"sm",variant:"solid",color:"primary",loadingIcon:"i-heroicons-arrow-path-20-solid"}},$1={base:"invisible before:visible before:block before:rotate-45 before:z-[-1] before:w-2 before:h-2",ring:"before:ring-1 before:ring-gray-200 dark:before:ring-gray-800",rounded:"before:rounded-sm",background:"before:bg-gray-200 dark:before:bg-gray-800",shadow:"before:shadow",placement:"group-data-[popper-placement*='right']:-left-1 group-data-[popper-placement*='left']:-right-1 group-data-[popper-placement*='top']:-bottom-1 group-data-[popper-placement*='bottom']:-top-1"},vp={wrapper:"relative",base:"relative block w-full disabled:cursor-not-allowed disabled:opacity-75 focus:outline-none border-0",form:"form-input",rounded:"rounded-md",placeholder:"placeholder-gray-400 dark:placeholder-gray-500",file:{base:"file:cursor-pointer file:rounded-l-md file:absolute file:left-0 file:inset-y-0 file:font-medium file:m-0 file:border-0 file:ring-1 file:ring-gray-300 dark:file:ring-gray-700 file:text-gray-900 dark:file:text-white file:bg-gray-50 hover:file:bg-gray-100 dark:file:bg-gray-800 dark:hover:file:bg-gray-700/50",padding:{"2xs":"ps-[85px]",xs:"ps-[87px]",sm:"ps-[96px]",md:"ps-[98px]",lg:"ps-[100px]",xl:"ps-[109px]"}},size:{"2xs":"text-xs",xs:"text-xs",sm:"text-sm",md:"text-sm",lg:"text-sm",xl:"text-base"},gap:{"2xs":"gap-x-1",xs:"gap-x-1.5",sm:"gap-x-1.5",md:"gap-x-2",lg:"gap-x-2.5",xl:"gap-x-2.5"},padding:{"2xs":"px-2 py-1",xs:"px-2.5 py-1.5",sm:"px-2.5 py-1.5",md:"px-3 py-2",lg:"px-3.5 py-2.5",xl:"px-3.5 py-2.5"},leading:{padding:{"2xs":"ps-7",xs:"ps-8",sm:"ps-9",md:"ps-10",lg:"ps-11",xl:"ps-12"}},trailing:{padding:{"2xs":"pe-7",xs:"pe-8",sm:"pe-9",md:"pe-10",lg:"pe-11",xl:"pe-12"}},color:{white:{outline:"shadow-sm bg-white dark:bg-gray-900 text-gray-900 dark:text-white ring-1 ring-inset ring-gray-300 dark:ring-gray-700 focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400"},gray:{outline:"shadow-sm bg-gray-50 dark:bg-gray-800 text-gray-900 dark:text-white ring-1 ring-inset ring-gray-300 dark:ring-gray-700 focus:ring-2 focus:ring-primary-500 dark:focus:ring-primary-400"}},variant:{outline:"shadow-sm bg-transparent text-gray-900 dark:text-white ring-1 ring-inset ring-{color}-500 dark:ring-{color}-400 focus:ring-2 focus:ring-{color}-500 dark:focus:ring-{color}-400",none:"bg-transparent focus:ring-0 focus:shadow-none"},icon:{base:"flex-shrink-0 text-gray-400 dark:text-gray-500",color:"text-{color}-500 dark:text-{color}-400",loading:"animate-spin",size:{"2xs":"h-4 w-4",xs:"h-4 w-4",sm:"h-5 w-5",md:"h-5 w-5",lg:"h-5 w-5",xl:"h-6 w-6"},leading:{wrapper:"absolute inset-y-0 start-0 flex items-center",pointer:"pointer-events-none",padding:{"2xs":"px-2",xs:"px-2.5",sm:"px-2.5",md:"px-3",lg:"px-3.5",xl:"px-3.5"}},trailing:{wrapper:"absolute inset-y-0 end-0 flex items-center",pointer:"pointer-events-none",padding:{"2xs":"px-2",xs:"px-2.5",sm:"px-2.5",md:"px-3",lg:"px-3.5",xl:"px-3.5"}}},default:{size:"sm",color:"white",variant:"outline",loadingIcon:"i-heroicons-arrow-path-20-solid"}},vv={container:"z-20 group",trigger:"flex items-center w-full",width:"w-full",height:"max-h-60",base:"relative focus:outline-none overflow-y-auto scroll-py-1",background:"bg-white dark:bg-gray-800",shadow:"shadow-lg",rounded:"rounded-md",padding:"p-1",ring:"ring-1 ring-gray-200 dark:ring-gray-700",empty:"text-sm text-gray-400 dark:text-gray-500 px-2 py-1.5",option:{base:"cursor-default select-none relative flex items-center justify-between gap-1",rounded:"rounded-md",padding:"px-1.5 py-1.5",size:"text-sm",color:"text-gray-900 dark:text-white",container:"flex items-center gap-1.5 min-w-0",active:"bg-gray-100 dark:bg-gray-900",inactive:"",selected:"pe-7",disabled:"cursor-not-allowed opacity-50",empty:"text-sm text-gray-400 dark:text-gray-500 px-2 py-1.5",icon:{base:"flex-shrink-0 h-5 w-5",active:"text-gray-900 dark:text-white",inactive:"text-gray-400 dark:text-gray-500"},selectedIcon:{wrapper:"absolute inset-y-0 end-0 flex items-center",padding:"pe-2",base:"h-5 w-5 text-gray-900 dark:text-white flex-shrink-0"},avatar:{base:"flex-shrink-0",size:"2xs"},chip:{base:"flex-shrink-0 w-2 h-2 mx-1 rounded-full"}},transition:{leaveActiveClass:"transition ease-in duration-100",leaveFromClass:"opacity-100",leaveToClass:"opacity-0"},popper:{placement:"bottom-end"},default:{selectedIcon:"i-heroicons-check-20-solid",trailingIcon:"i-heroicons-chevron-down-20-solid"},arrow:{...$1,ring:"before:ring-1 before:ring-gray-200 dark:before:ring-gray-700",background:"before:bg-white dark:before:bg-gray-700"}},nL={wrapper:"",inner:"",label:{wrapper:"flex content-center items-center justify-between",base:"block font-medium text-gray-700 dark:text-gray-200",required:"after:content-['*'] after:ms-0.5 after:text-red-500 dark:after:text-red-400"},size:{"2xs":"text-xs",xs:"text-xs",sm:"text-sm",md:"text-sm",lg:"text-sm",xl:"text-base"},container:"mt-1 relative",description:"text-gray-500 dark:text-gray-400",hint:"text-gray-500 dark:text-gray-400",help:"mt-2 text-gray-500 dark:text-gray-400",error:"mt-2 text-red-500 dark:text-red-400",default:{size:"sm"}},rL={...vp,form:"form-textarea",default:{size:"sm",color:"white",variant:"outline"}},oL={...vp,form:"form-select",placeholder:"text-gray-400 dark:text-gray-500",default:{size:"sm",color:"white",variant:"outline",loadingIcon:"i-heroicons-arrow-path-20-solid",trailingIcon:"i-heroicons-chevron-down-20-solid"}},PF={...vv,select:"inline-flex items-center text-left cursor-default",input:"block w-[calc(100%+0.5rem)] focus:ring-transparent text-sm px-3 py-1.5 text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-800 border-0 border-b border-gray-200 dark:border-gray-700 sticky -top-1 -mt-1 mb-1 -mx-1 z-10 placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none",required:"absolute inset-0 w-px opacity-0 cursor-default",label:"block truncate",option:{...vv.option,create:"block truncate"},transition:{leaveActiveClass:"transition ease-in duration-100",leaveFromClass:"opacity-100",leaveToClass:"opacity-0"},popper:{placement:"bottom-end"},default:{selectedIcon:"i-heroicons-check-20-solid",clearSearchOnClose:!1,showCreateOptionWhen:"empty"},arrow:{...$1,ring:"before:ring-1 before:ring-gray-200 dark:before:ring-gray-700",background:"before:bg-white dark:before:bg-gray-700"}},sL={wrapper:"relative flex items-start",container:"flex items-center h-5",base:"h-4 w-4 dark:checked:bg-current dark:checked:border-transparent dark:indeterminate:bg-current dark:indeterminate:border-transparent disabled:opacity-50 disabled:cursor-not-allowed focus:ring-0 focus:ring-transparent focus:ring-offset-transparent",form:"form-checkbox",rounded:"rounded",color:"text-{color}-500 dark:text-{color}-400",background:"bg-white dark:bg-gray-900",border:"border border-gray-300 dark:border-gray-700",ring:"focus-visible:ring-2 focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-900",inner:"ms-3 flex flex-col",label:"text-sm font-medium text-gray-700 dark:text-gray-200",required:"text-sm text-red-500 dark:text-red-400",help:"text-sm text-gray-500 dark:text-gray-400",default:{color:"primary"}},iL={base:"relative inline-flex flex-shrink-0 border-2 border-transparent disabled:cursor-not-allowed disabled:opacity-50 focus:outline-none",rounded:"rounded-full",ring:"focus-visible:ring-2 focus-visible:ring-{color}-500 dark:focus-visible:ring-{color}-400 focus-visible:ring-offset-2 focus-visible:ring-offset-white dark:focus-visible:ring-offset-gray-900",active:"bg-{color}-500 dark:bg-{color}-400",inactive:"bg-gray-200 dark:bg-gray-700",size:{"2xs":"h-3 w-5",xs:"h-3.5 w-6",sm:"h-4 w-7",md:"h-5 w-9",lg:"h-6 w-11",xl:"h-7 w-[3.25rem]","2xl":"h-8 w-[3.75rem]"},container:{base:"pointer-events-none relative inline-block rounded-full bg-white dark:bg-gray-900 shadow transform ring-0 transition ease-in-out duration-200",active:{"2xs":"translate-x-2 rtl:-translate-x-2",xs:"translate-x-2.5 rtl:-translate-x-2.5",sm:"translate-x-3 rtl:-translate-x-3",md:"translate-x-4 rtl:-translate-x-4",lg:"translate-x-5 rtl:-translate-x-5",xl:"translate-x-6 rtl:-translate-x-6","2xl":"translate-x-7 rtl:-translate-x-7"},inactive:"translate-x-0 rtl:-translate-x-0",size:{"2xs":"h-2 w-2",xs:"h-2.5 w-2.5",sm:"h-3 w-3",md:"h-4 w-4",lg:"h-5 w-5",xl:"h-6 w-6","2xl":"h-7 w-7"}},icon:{base:"absolute inset-0 h-full w-full flex items-center justify-center transition-opacity",active:"opacity-100 ease-in duration-200",inactive:"opacity-0 ease-out duration-100",size:{"2xs":"h-2 w-2",xs:"h-2 w-2",sm:"h-2 w-2",md:"h-3 w-3",lg:"h-4 w-4",xl:"h-5 w-5","2xl":"h-6 w-6"},on:"text-{color}-500 dark:text-{color}-400",off:"text-gray-400 dark:text-gray-500",loading:"animate-spin text-{color}-500 dark:text-{color}-400"},default:{onIcon:null,offIcon:null,loadingIcon:"i-heroicons-arrow-path-20-solid",color:"primary",size:"md"}},aL={base:"",background:"bg-white dark:bg-gray-900",divide:"divide-y divide-gray-200 dark:divide-gray-800",ring:"ring-1 ring-gray-200 dark:ring-gray-800",rounded:"rounded-lg",shadow:"shadow",body:{base:"",background:"",padding:"px-4 py-5 sm:p-6"},header:{base:"",background:"",padding:"px-4 py-5 sm:px-6"},footer:{base:"",background:"",padding:"px-4 py-4 sm:px-6"}},lL={base:"mx-auto",padding:"px-4 sm:px-6 lg:px-8",constrained:"max-w-7xl"},uL={wrapper:"relative z-50",inner:"fixed inset-0 overflow-y-auto",container:"flex min-h-full items-end sm:items-center justify-center text-center",padding:"p-4 sm:p-0",margin:"sm:my-8",base:"relative text-left rtl:text-right flex flex-col",overlay:{base:"fixed inset-0 transition-opacity",background:"bg-gray-200/75 dark:bg-gray-800/75",transition:{enter:"ease-out duration-300",enterFrom:"opacity-0",enterTo:"opacity-100",leave:"ease-in duration-200",leaveFrom:"opacity-100",leaveTo:"opacity-0"}},background:"bg-white dark:bg-gray-900",ring:"",rounded:"rounded-lg",shadow:"shadow-xl",width:"w-full sm:max-w-lg",height:"",fullscreen:"w-screen h-screen",transition:{enter:"ease-out duration-300",enterFrom:"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",enterTo:"opacity-100 translate-y-0 sm:scale-100",leave:"ease-in duration-200",leaveFrom:"opacity-100 translate-y-0 sm:scale-100",leaveTo:"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"}},cL={wrapper:"fixed inset-0 flex z-50",overlay:{base:"fixed inset-0 transition-opacity",background:"bg-gray-200/75 dark:bg-gray-800/75",transition:{enter:"ease-in-out duration-500",enterFrom:"opacity-0",enterTo:"opacity-100",leave:"ease-in-out duration-500",leaveFrom:"opacity-100",leaveTo:"opacity-0"}},base:"relative flex-1 flex flex-col w-full focus:outline-none",background:"bg-white dark:bg-gray-900",ring:"",rounded:"",padding:"",shadow:"shadow-xl",width:"w-screen max-w-md",translate:{base:"translate-x-0",left:"-translate-x-full rtl:translate-x-full",right:"translate-x-full rtl:-translate-x-full"},transition:{enter:"transform transition ease-in-out duration-300",leave:"transform transition ease-in-out duration-200"}},fL={wrapper:"w-full pointer-events-auto",container:"relative overflow-hidden",inner:"w-0 flex-1",title:"text-sm font-medium text-gray-900 dark:text-white",description:"mt-1 text-sm leading-4 text-gray-500 dark:text-gray-400",actions:"flex items-center gap-2 mt-3 flex-shrink-0",background:"bg-white dark:bg-gray-900",shadow:"shadow-lg",rounded:"rounded-lg",padding:"p-4",gap:"gap-3",ring:"ring-1 ring-gray-200 dark:ring-gray-800",icon:{base:"flex-shrink-0 w-5 h-5",color:"text-{color}-500 dark:text-{color}-400"},avatar:{base:"flex-shrink-0 self-center",size:"md"},progress:{base:"absolute bottom-0 end-0 start-0 h-1",background:"bg-{color}-500 dark:bg-{color}-400"},transition:{enterActiveClass:"transform ease-out duration-300 transition",enterFromClass:"translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2",enterToClass:"translate-y-0 opacity-100 sm:translate-x-0",leaveActiveClass:"transition ease-in duration-100",leaveFromClass:"opacity-100",leaveToClass:"opacity-0"},default:{color:"primary",icon:null,timeout:5e3,closeButton:{icon:"i-heroicons-x-mark-20-solid",color:"gray",variant:"link",padded:!1},actionButton:{size:"xs",color:"white"}}},dL={wrapper:"fixed flex flex-col justify-end z-[55]",position:"bottom-0 end-0",width:"w-full sm:w-96",container:"px-4 sm:px-6 py-6 space-y-3 overflow-y-auto"},yv=wn(Ge.ui.strategy,Ge.ui.checkbox,sL),pL=we({inheritAttrs:!1,props:{id:{type:String,default:()=>null},value:{type:[String,Number,Boolean,Object],default:null},modelValue:{type:[Boolean,Array],default:null},name:{type:String,default:null},disabled:{type:Boolean,default:!1},indeterminate:{type:Boolean,default:void 0},help:{type:String,default:null},label:{type:String,default:null},required:{type:Boolean,default:!1},color:{type:String,default:()=>yv.default.color,validator(e){return Ge.ui.colors.includes(e)}},inputClass:{type:String,default:""},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})}},emits:["update:modelValue","change"],setup(e,{emit:t}){const{ui:n,attrs:r}=On("checkbox",Ot(e,"ui"),yv,Ot(e,"class")),{emitFormChange:s,color:i,name:l,inputId:u}=ba(e),c=u.value??ii("$YWrWuPJ69t"),p=F({get(){return e.modelValue},set(h){t("update:modelValue",h)}}),d=h=>{t("change",h.target.checked),s()},g=F(()=>Un(pt(n.value.base,n.value.form,n.value.rounded,n.value.background,n.value.border,i.value&&n.value.ring.replaceAll("{color}",i.value),i.value&&n.value.color.replaceAll("{color}",i.value)),e.inputClass));return{ui:n,attrs:r,toggle:p,inputId:c,name:l,inputClass:g,onChange:d}}}),hL=["data-n-ids"],gL=["id","name","required","value","disabled","indeterminate"],mL=["for"];function vL(e,t,n,r,s,i){return V(),Z("div",{class:ae(e.ui.wrapper),"data-n-ids":e.attrs["data-n-ids"]},[I("div",{class:ae(e.ui.container)},[Ty(I("input",lt({id:e.inputId,"onUpdate:modelValue":t[0]||(t[0]=l=>e.toggle=l),name:e.name,required:e.required,value:e.value,disabled:e.disabled,indeterminate:e.indeterminate,type:"checkbox",class:e.inputClass},e.attrs,{onChange:t[1]||(t[1]=(...l)=>e.onChange&&e.onChange(...l))}),null,16,gL),[[j$,e.toggle]])],2),e.label||e.$slots.label?(V(),Z("div",{key:0,class:ae(e.ui.inner)},[I("label",{for:e.inputId,class:ae(e.ui.label)},[it(e.$slots,"label",{},()=>[de(et(e.label),1)]),e.required?(V(),Z("span",{key:0,class:ae(e.ui.required)},"*",2)):Ie("",!0)],10,mL),e.help?(V(),Z("p",{key:0,class:ae(e.ui.help)},et(e.help),3)):Ie("",!0)],2)):Ie("",!0)],10,hL)}const A1=zt(pL,[["render",vL]]),yL={},bL={class:"bg-gray-50 dark:bg-gray-700 dark:border-gray-800 overflow-hidden border sm:rounded-lg"},_L={class:"px-4 py-5 sm:p-6"};function wL(e,t){return V(),Z("div",bL,[I("div",_L,[it(e.$slots,"default")])])}const Eu=zt(yL,[["render",wL]]),I1=Object.freeze({left:0,top:0,width:16,height:16}),R1=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),yp=Object.freeze({...I1,...R1});Object.freeze({...yp,body:"",hidden:!1});({...I1});const O1=Object.freeze({width:null,height:null}),P1=Object.freeze({...O1,...R1});function xL(e,t){const n={...e};for(const r in t){const s=t[r],i=typeof s;r in O1?(s===null||s&&(i==="string"||i==="number"))&&(n[r]=s):i===typeof n[r]&&(n[r]=r==="rotate"?s%4:s)}return n}const kL=/[\s,]+/;function SL(e,t){t.split(kL).forEach(n=>{switch(n.trim()){case"horizontal":e.hFlip=!0;break;case"vertical":e.vFlip=!0;break}})}function CL(e,t=0){const n=e.replace(/^-?[0-9.]*/,"");function r(s){for(;s<0;)s+=4;return s%4}if(n===""){const s=parseInt(e);return isNaN(s)?0:r(s)}else if(n!==e){let s=0;switch(n){case"%":s=25;break;case"deg":s=90}if(s){let i=parseFloat(e.slice(0,e.length-n.length));return isNaN(i)?0:(i=i/s,i%1===0?r(i):0)}}return t}const EL=/(-?[0-9.]*[0-9]+[0-9.]*)/g,TL=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function bv(e,t,n){if(t===1)return e;if(n=n||100,typeof e=="number")return Math.ceil(e*t*n)/n;if(typeof e!="string")return e;const r=e.split(EL);if(r===null||!r.length)return e;const s=[];let i=r.shift(),l=TL.test(i);for(;;){if(l){const u=parseFloat(i);isNaN(u)?s.push(i):s.push(Math.ceil(u*t*n)/n)}else s.push(i);if(i=r.shift(),i===void 0)return s.join("");l=!l}}function $L(e,t="defs"){let n="";const r=e.indexOf("<"+t);for(;r>=0;){const s=e.indexOf(">",r),i=e.indexOf("",i);if(l===-1)break;n+=e.slice(s+1,i).trim(),e=e.slice(0,r).trim()+e.slice(l+1)}return{defs:n,content:e}}function AL(e,t){return e?""+e+""+t:t}function IL(e,t,n){const r=$L(e);return AL(r.defs,t+r.content+n)}const RL=e=>e==="unset"||e==="undefined"||e==="none";function OL(e,t){const n={...yp,...e},r={...P1,...t},s={left:n.left,top:n.top,width:n.width,height:n.height};let i=n.body;[n,r].forEach(x=>{const b=[],E=x.hFlip,C=x.vFlip;let S=x.rotate;E?C?S+=2:(b.push("translate("+(s.width+s.left).toString()+" "+(0-s.top).toString()+")"),b.push("scale(-1 1)"),s.top=s.left=0):C&&(b.push("translate("+(0-s.left).toString()+" "+(s.height+s.top).toString()+")"),b.push("scale(1 -1)"),s.top=s.left=0);let A;switch(S<0&&(S-=Math.floor(S/4)*4),S=S%4,S){case 1:A=s.height/2+s.top,b.unshift("rotate(90 "+A.toString()+" "+A.toString()+")");break;case 2:b.unshift("rotate(180 "+(s.width/2+s.left).toString()+" "+(s.height/2+s.top).toString()+")");break;case 3:A=s.width/2+s.left,b.unshift("rotate(-90 "+A.toString()+" "+A.toString()+")");break}S%2===1&&(s.left!==s.top&&(A=s.left,s.left=s.top,s.top=A),s.width!==s.height&&(A=s.width,s.width=s.height,s.height=A)),b.length&&(i=IL(i,'',""))});const l=r.width,u=r.height,c=s.width,p=s.height;let d,g;l===null?(g=u===null?"1em":u==="auto"?p:u,d=bv(g,c/p)):(d=l==="auto"?c:l,g=u===null?bv(d,p/c):u==="auto"?p:u);const h={},v=(x,b)=>{RL(b)||(h[x]=b.toString())};v("width",d),v("height",g);const _=[s.left,s.top,c,p];return h.viewBox=_.join(" "),{attributes:h,viewBox:_,body:i}}const PL=/\sid="(\S+)"/g,LL="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);let ML=0;function BL(e,t=LL){const n=[];let r;for(;r=PL.exec(e);)n.push(r[1]);if(!n.length)return e;const s="suffix"+(Math.random()*16777216|Date.now()).toString(16);return n.forEach(i=>{const l=typeof t=="function"?t(i):t+(ML++).toString(),u=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");e=e.replace(new RegExp('([#;"])('+u+')([")]|\\.[a-z])',"g"),"$1"+l+s+"$3")}),e=e.replace(new RegExp(s,"g"),""),e}function FL(e,t){let n=e.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const r in t)n+=" "+r+'="'+t[r]+'"';return'"+e+""}function DL(e){return e.replace(/"/g,"'").replace(/%/g,"%25").replace(/#/g,"%23").replace(//g,"%3E").replace(/\s+/g," ")}function VL(e){return"data:image/svg+xml,"+DL(e)}function NL(e){return'url("'+VL(e)+'")'}const _v={...P1,inline:!1},jL={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","aria-hidden":!0,role:"img"},UL={display:"inline-block"},bd={backgroundColor:"currentColor"},L1={backgroundColor:"transparent"},wv={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},xv={webkitMask:bd,mask:bd,background:L1};for(const e in xv){const t=xv[e];for(const n in wv)t[e+n]=wv[n]}const Dl={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";Dl[e+"-flip"]=t,Dl[e.slice(0,1)+"-flip"]=t,Dl[e+"Flip"]=t});function kv(e){return e+(e.match(/^[-0-9.]+$/)?"px":"")}const HL=(e,t)=>{const n=xL(_v,t),r={...jL},s=t.mode||"svg",i={},l=t.style,u=typeof l=="object"&&!(l instanceof Array)?l:{};for(let x in t){const b=t[x];if(b!==void 0)switch(x){case"icon":case"style":case"onLoad":case"mode":break;case"inline":case"hFlip":case"vFlip":n[x]=b===!0||b==="true"||b===1;break;case"flip":typeof b=="string"&&SL(n,b);break;case"color":i.color=b;break;case"rotate":typeof b=="string"?n[x]=CL(b):typeof b=="number"&&(n[x]=b);break;case"ariaHidden":case"aria-hidden":b!==!0&&b!=="true"&&delete r["aria-hidden"];break;default:{const E=Dl[x];E?(b===!0||b==="true"||b===1)&&(n[E]=!0):_v[x]===void 0&&(r[x]=b)}}}const c=OL(e,n),p=c.attributes;if(n.inline&&(i.verticalAlign="-0.125em"),s==="svg"){r.style={...i,...u},Object.assign(r,p);let x=0,b=t.id;return typeof b=="string"&&(b=b.replace(/-/g,"_")),r.innerHTML=BL(c.body,b?()=>b+"ID"+x++:"iconifyVue"),Xe("svg",r)}const{body:d,width:g,height:h}=e,v=s==="mask"||(s==="bg"?!1:d.indexOf("currentColor")!==-1),_=FL(d,{...p,width:g+"",height:h+""});return r.style={...i,"--svg":NL(_),width:kv(p.width),height:kv(p.height),...UL,...v?bd:L1,...u},Xe("span",r)},zL=Object.create(null),WL=we({inheritAttrs:!1,render(){const e=this.$attrs,t=e.icon,n=typeof t=="string"?zL[t]:typeof t=="object"?t:null;return n===null||typeof n!="object"||typeof n.body!="string"?this.$slots.default?this.$slots.default():null:HL({...yp,...n},e)}}),Gi=/^[a-z0-9]+(-[a-z0-9]+)*$/,Tu=(e,t,n,r="")=>{const s=e.split(":");if(e.slice(0,1)==="@"){if(s.length<2||s.length>3)return null;r=s.shift().slice(1)}if(s.length>3||!s.length)return null;if(s.length>1){const u=s.pop(),c=s.pop(),p={provider:s.length>0?s[0]:r,prefix:c,name:u};return t&&!Vl(p)?null:p}const i=s[0],l=i.split("-");if(l.length>1){const u={provider:r,prefix:l.shift(),name:l.join("-")};return t&&!Vl(u)?null:u}if(n&&r===""){const u={provider:r,prefix:"",name:i};return t&&!Vl(u,n)?null:u}return null},Vl=(e,t)=>e?!!((e.provider===""||e.provider.match(Gi))&&(t&&e.prefix===""||e.prefix.match(Gi))&&e.name.match(Gi)):!1,M1=Object.freeze({left:0,top:0,width:16,height:16}),au=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),bp=Object.freeze({...M1,...au}),_d=Object.freeze({...bp,body:"",hidden:!1});function qL(e,t){const n={};!e.hFlip!=!t.hFlip&&(n.hFlip=!0),!e.vFlip!=!t.vFlip&&(n.vFlip=!0);const r=((e.rotate||0)+(t.rotate||0))%4;return r&&(n.rotate=r),n}function Sv(e,t){const n=qL(e,t);for(const r in _d)r in au?r in e&&!(r in n)&&(n[r]=au[r]):r in t?n[r]=t[r]:r in e&&(n[r]=e[r]);return n}function KL(e,t){const n=e.icons,r=e.aliases||Object.create(null),s=Object.create(null);function i(l){if(n[l])return s[l]=[];if(!(l in s)){s[l]=null;const u=r[l]&&r[l].parent,c=u&&i(u);c&&(s[l]=[u].concat(c))}return s[l]}return(t||Object.keys(n).concat(Object.keys(r))).forEach(i),s}function GL(e,t,n){const r=e.icons,s=e.aliases||Object.create(null);let i={};function l(u){i=Sv(r[u]||s[u],i)}return l(t),n.forEach(l),Sv(e,i)}function B1(e,t){const n=[];if(typeof e!="object"||typeof e.icons!="object")return n;e.not_found instanceof Array&&e.not_found.forEach(s=>{t(s,null),n.push(s)});const r=KL(e);for(const s in r){const i=r[s];i&&(t(s,GL(e,s,i)),n.push(s))}return n}const JL={provider:"",aliases:{},not_found:{},...M1};function _f(e,t){for(const n in t)if(n in e&&typeof e[n]!=typeof t[n])return!1;return!0}function F1(e){if(typeof e!="object"||e===null)return null;const t=e;if(typeof t.prefix!="string"||!e.icons||typeof e.icons!="object"||!_f(e,JL))return null;const n=t.icons;for(const s in n){const i=n[s];if(!s.match(Gi)||typeof i.body!="string"||!_f(i,_d))return null}const r=t.aliases||Object.create(null);for(const s in r){const i=r[s],l=i.parent;if(!s.match(Gi)||typeof l!="string"||!n[l]&&!r[l]||!_f(i,_d))return null}return t}const Cv=Object.create(null);function ZL(e,t){return{provider:e,prefix:t,icons:Object.create(null),missing:new Set}}function vs(e,t){const n=Cv[e]||(Cv[e]=Object.create(null));return n[t]||(n[t]=ZL(e,t))}function _p(e,t){return F1(t)?B1(t,(n,r)=>{r?e.icons[n]=r:e.missing.add(n)}):[]}function YL(e,t,n){try{if(typeof n.body=="string")return e.icons[t]={...n},!0}catch{}return!1}let oa=!1;function D1(e){return typeof e=="boolean"&&(oa=e),oa}function QL(e){const t=typeof e=="string"?Tu(e,!0,oa):e;if(t){const n=vs(t.provider,t.prefix),r=t.name;return n.icons[r]||(n.missing.has(r)?null:void 0)}}function XL(e,t){const n=Tu(e,!0,oa);if(!n)return!1;const r=vs(n.provider,n.prefix);return YL(r,n.name,t)}function e6(e,t){if(typeof e!="object")return!1;if(typeof t!="string"&&(t=e.provider||""),oa&&!t&&!e.prefix){let s=!1;return F1(e)&&(e.prefix="",B1(e,(i,l)=>{l&&XL(i,l)&&(s=!0)})),s}const n=e.prefix;if(!Vl({provider:t,prefix:n,name:"a"}))return!1;const r=vs(t,n);return!!_p(r,e)}const t6=Object.freeze({width:null,height:null}),n6=Object.freeze({...t6,...au});""+Date.now().toString(16)+(Math.random()*16777216|0).toString(16);const wd=Object.create(null);function r6(e,t){wd[e]=t}function xd(e){return wd[e]||wd[""]}function wp(e){let t;if(typeof e.resources=="string")t=[e.resources];else if(t=e.resources,!(t instanceof Array)||!t.length)return null;return{resources:t,path:e.path||"/",maxURL:e.maxURL||500,rotate:e.rotate||750,timeout:e.timeout||5e3,random:e.random===!0,index:e.index||0,dataAfterTimeout:e.dataAfterTimeout!==!1}}const xp=Object.create(null),Oi=["https://api.simplesvg.com","https://api.unisvg.com"],Nl=[];for(;Oi.length>0;)Oi.length===1||Math.random()>.5?Nl.push(Oi.shift()):Nl.push(Oi.pop());xp[""]=wp({resources:["https://api.iconify.design"].concat(Nl)});function kd(e,t){const n=wp(t);return n===null?!1:(xp[e]=n,!0)}function kp(e){return xp[e]}const o6=()=>{let e;try{if(e=fetch,typeof e=="function")return e}catch{}};let Ev=o6();function s6(e,t){const n=kp(e);if(!n)return 0;let r;if(!n.maxURL)r=0;else{let s=0;n.resources.forEach(l=>{s=Math.max(s,l.length)});const i=t+".json?icons=";r=n.maxURL-s-n.path.length-i.length}return r}function i6(e){return e===404}const a6=(e,t,n)=>{const r=[],s=s6(e,t),i="icons";let l={type:i,provider:e,prefix:t,icons:[]},u=0;return n.forEach((c,p)=>{u+=c.length+1,u>=s&&p>0&&(r.push(l),l={type:i,provider:e,prefix:t,icons:[]},u=c.length),l.icons.push(c)}),r.push(l),r};function l6(e){if(typeof e=="string"){const t=kp(e);if(t)return t.path}return"/"}const u6=(e,t,n)=>{if(!Ev){n("abort",424);return}let r=l6(t.provider);switch(t.type){case"icons":{const i=t.prefix,u=t.icons.join(","),c=new URLSearchParams({icons:u});r+=i+".json?"+c.toString();break}case"custom":{const i=t.uri;r+=i.slice(0,1)==="/"?i.slice(1):i;break}default:n("abort",400);return}let s=503;Ev(e+r).then(i=>{const l=i.status;if(l!==200){setTimeout(()=>{n(i6(l)?"abort":"next",l)});return}return s=501,i.json()}).then(i=>{if(typeof i!="object"||i===null){setTimeout(()=>{i===404?n("abort",i):n("next",s)});return}setTimeout(()=>{n("success",i)})}).catch(()=>{n("next",s)})},c6={prepare:a6,send:u6};function f6(e){const t={loaded:[],missing:[],pending:[]},n=Object.create(null);e.sort((s,i)=>s.provider!==i.provider?s.provider.localeCompare(i.provider):s.prefix!==i.prefix?s.prefix.localeCompare(i.prefix):s.name.localeCompare(i.name));let r={provider:"",prefix:"",name:""};return e.forEach(s=>{if(r.name===s.name&&r.prefix===s.prefix&&r.provider===s.provider)return;r=s;const i=s.provider,l=s.prefix,u=s.name,c=n[i]||(n[i]=Object.create(null)),p=c[l]||(c[l]=vs(i,l));let d;u in p.icons?d=t.loaded:l===""||p.missing.has(u)?d=t.missing:d=t.pending;const g={provider:i,prefix:l,name:u};d.push(g)}),t}function V1(e,t){e.forEach(n=>{const r=n.loaderCallbacks;r&&(n.loaderCallbacks=r.filter(s=>s.id!==t))})}function d6(e){e.pendingCallbacksFlag||(e.pendingCallbacksFlag=!0,setTimeout(()=>{e.pendingCallbacksFlag=!1;const t=e.loaderCallbacks?e.loaderCallbacks.slice(0):[];if(!t.length)return;let n=!1;const r=e.provider,s=e.prefix;t.forEach(i=>{const l=i.icons,u=l.pending.length;l.pending=l.pending.filter(c=>{if(c.prefix!==s)return!0;const p=c.name;if(e.icons[p])l.loaded.push({provider:r,prefix:s,name:p});else if(e.missing.has(p))l.missing.push({provider:r,prefix:s,name:p});else return n=!0,!0;return!1}),l.pending.length!==u&&(n||V1([e],i.id),i.callback(l.loaded.slice(0),l.missing.slice(0),l.pending.slice(0),i.abort))})}))}let p6=0;function h6(e,t,n){const r=p6++,s=V1.bind(null,n,r);if(!t.pending.length)return s;const i={id:r,icons:t,callback:e,abort:s};return n.forEach(l=>{(l.loaderCallbacks||(l.loaderCallbacks=[])).push(i)}),s}function g6(e,t=!0,n=!1){const r=[];return e.forEach(s=>{const i=typeof s=="string"?Tu(s,t,n):s;i&&r.push(i)}),r}var m6={resources:[],index:0,timeout:2e3,rotate:750,random:!1,dataAfterTimeout:!1};function v6(e,t,n,r){const s=e.resources.length,i=e.random?Math.floor(Math.random()*s):e.index;let l;if(e.random){let L=e.resources.slice(0);for(l=[];L.length>1;){const H=Math.floor(Math.random()*L.length);l.push(L[H]),L=L.slice(0,H).concat(L.slice(H+1))}l=l.concat(L)}else l=e.resources.slice(i).concat(e.resources.slice(0,i));const u=Date.now();let c="pending",p=0,d,g=null,h=[],v=[];typeof r=="function"&&v.push(r);function _(){g&&(clearTimeout(g),g=null)}function x(){c==="pending"&&(c="aborted"),_(),h.forEach(L=>{L.status==="pending"&&(L.status="aborted")}),h=[]}function b(L,H){H&&(v=[]),typeof L=="function"&&v.push(L)}function E(){return{startTime:u,payload:t,status:c,queriesSent:p,queriesPending:h.length,subscribe:b,abort:x}}function C(){c="failed",v.forEach(L=>{L(void 0,d)})}function S(){h.forEach(L=>{L.status==="pending"&&(L.status="aborted")}),h=[]}function A(L,H,j){const q=H!=="success";switch(h=h.filter(K=>K!==L),c){case"pending":break;case"failed":if(q||!e.dataAfterTimeout)return;break;default:return}if(H==="abort"){d=j,C();return}if(q){d=j,h.length||(l.length?B():C());return}if(_(),S(),!e.random){const K=e.resources.indexOf(L.resource);K!==-1&&K!==e.index&&(e.index=K)}c="completed",v.forEach(K=>{K(j)})}function B(){if(c!=="pending")return;_();const L=l.shift();if(L===void 0){if(h.length){g=setTimeout(()=>{_(),c==="pending"&&(S(),C())},e.timeout);return}C();return}const H={status:"pending",resource:L,callback:(j,q)=>{A(H,j,q)}};h.push(H),p++,g=setTimeout(B,e.rotate),n(L,t,H.callback)}return setTimeout(B),E}function N1(e){const t={...m6,...e};let n=[];function r(){n=n.filter(u=>u().status==="pending")}function s(u,c,p){const d=v6(t,u,c,(g,h)=>{r(),p&&p(g,h)});return n.push(d),d}function i(u){return n.find(c=>u(c))||null}return{query:s,find:i,setIndex:u=>{t.index=u},getIndex:()=>t.index,cleanup:r}}function Tv(){}const wf=Object.create(null);function y6(e){if(!wf[e]){const t=kp(e);if(!t)return;const n=N1(t),r={config:t,redundancy:n};wf[e]=r}return wf[e]}function b6(e,t,n){let r,s;if(typeof e=="string"){const i=xd(e);if(!i)return n(void 0,424),Tv;s=i.send;const l=y6(e);l&&(r=l.redundancy)}else{const i=wp(e);if(i){r=N1(i);const l=e.resources?e.resources[0]:"",u=xd(l);u&&(s=u.send)}}return!r||!s?(n(void 0,424),Tv):r.query(t,s,n)().abort}const $v="iconify2",sa="iconify",j1=sa+"-count",Av=sa+"-version",U1=36e5,_6=168,w6=50;function Sd(e,t){try{return e.getItem(t)}catch{}}function Sp(e,t,n){try{return e.setItem(t,n),!0}catch{}}function Iv(e,t){try{e.removeItem(t)}catch{}}function Cd(e,t){return Sp(e,j1,t.toString())}function Ed(e){return parseInt(Sd(e,j1))||0}const $u={local:!0,session:!0},H1={local:new Set,session:new Set};let Cp=!1;function x6(e){Cp=e}let $l=typeof window>"u"?{}:window;function z1(e){const t=e+"Storage";try{if($l&&$l[t]&&typeof $l[t].length=="number")return $l[t]}catch{}$u[e]=!1}function W1(e,t){const n=z1(e);if(!n)return;const r=Sd(n,Av);if(r!==$v){if(r){const u=Ed(n);for(let c=0;c{const c=sa+u.toString(),p=Sd(n,c);if(typeof p=="string"){try{const d=JSON.parse(p);if(typeof d=="object"&&typeof d.cached=="number"&&d.cached>s&&typeof d.provider=="string"&&typeof d.data=="object"&&typeof d.data.prefix=="string"&&t(d,u))return!0}catch{}Iv(n,c)}};let l=Ed(n);for(let u=l-1;u>=0;u--)i(u)||(u===l-1?(l--,Cd(n,l)):H1[e].add(u))}function q1(){if(!Cp){x6(!0);for(const e in $u)W1(e,t=>{const n=t.data,r=t.provider,s=n.prefix,i=vs(r,s);if(!_p(i,n).length)return!1;const l=n.lastModified||-1;return i.lastModifiedCached=i.lastModifiedCached?Math.min(i.lastModifiedCached,l):l,!0})}}function k6(e,t){const n=e.lastModifiedCached;if(n&&n>=t)return n===t;if(e.lastModifiedCached=t,n)for(const r in $u)W1(r,s=>{const i=s.data;return s.provider!==e.provider||i.prefix!==e.prefix||i.lastModified===t});return!0}function S6(e,t){Cp||q1();function n(r){let s;if(!$u[r]||!(s=z1(r)))return;const i=H1[r];let l;if(i.size)i.delete(l=Array.from(i).shift());else if(l=Ed(s),l>=w6||!Cd(s,l+1))return;const u={cached:Math.floor(Date.now()/U1),provider:e.provider,data:t};return Sp(s,sa+l.toString(),JSON.stringify(u))}t.lastModified&&!k6(e,t.lastModified)||Object.keys(t.icons).length&&(t.not_found&&(t=Object.assign({},t),delete t.not_found),n("local")||n("session"))}function Rv(){}function C6(e){e.iconsLoaderFlag||(e.iconsLoaderFlag=!0,setTimeout(()=>{e.iconsLoaderFlag=!1,d6(e)}))}function E6(e,t){e.iconsToLoad?e.iconsToLoad=e.iconsToLoad.concat(t).sort():e.iconsToLoad=t,e.iconsQueueFlag||(e.iconsQueueFlag=!0,setTimeout(()=>{e.iconsQueueFlag=!1;const{provider:n,prefix:r}=e,s=e.iconsToLoad;delete e.iconsToLoad;let i;if(!s||!(i=xd(n)))return;i.prepare(n,r,s).forEach(u=>{b6(n,u,c=>{if(typeof c!="object")u.icons.forEach(p=>{e.missing.add(p)});else try{const p=_p(e,c);if(!p.length)return;const d=e.pendingIcons;d&&p.forEach(g=>{d.delete(g)}),S6(e,c)}catch(p){console.error(p)}C6(e)})})}))}const T6=(e,t)=>{const n=g6(e,!0,D1()),r=f6(n);if(!r.pending.length){let c=!0;return t&&setTimeout(()=>{c&&t(r.loaded,r.missing,r.pending,Rv)}),()=>{c=!1}}const s=Object.create(null),i=[];let l,u;return r.pending.forEach(c=>{const{provider:p,prefix:d}=c;if(d===u&&p===l)return;l=p,u=d,i.push(vs(p,d));const g=s[p]||(s[p]=Object.create(null));g[d]||(g[d]=[])}),r.pending.forEach(c=>{const{provider:p,prefix:d,name:g}=c,h=vs(p,d),v=h.pendingIcons||(h.pendingIcons=new Set);v.has(g)||(v.add(g),s[p][d].push(g))}),i.forEach(c=>{const{provider:p,prefix:d}=c;s[p][d].length&&E6(c,s[p][d])}),t?h6(t,r,i):Rv},$6=e=>new Promise((t,n)=>{const r=typeof e=="string"?Tu(e,!0):e;if(!r){n(e);return}T6([r||e],s=>{if(s.length&&r){const i=QL(r);if(i){t({...bp,...i});return}}n(e)})});({...n6});const Ov={backgroundColor:"currentColor"},A6={backgroundColor:"transparent"},Pv={Image:"var(--svg)",Repeat:"no-repeat",Size:"100% 100%"},Lv={webkitMask:Ov,mask:Ov,background:A6};for(const e in Lv){const t=Lv[e];for(const n in Pv)t[e+n]=Pv[n]}const xf={};["horizontal","vertical"].forEach(e=>{const t=e.slice(0,1)+"Flip";xf[e+"-flip"]=t,xf[e.slice(0,1)+"-flip"]=t,xf[e+"Flip"]=t});D1(!0);r6("",c6);if(typeof document<"u"&&typeof window<"u"){q1();const e=window;if(e.IconifyPreload!==void 0){const t=e.IconifyPreload,n="Invalid IconifyPreload syntax.";typeof t=="object"&&t!==null&&(t instanceof Array?t:[t]).forEach(r=>{try{(typeof r!="object"||r===null||r instanceof Array||typeof r.icons!="object"||typeof r.prefix!="string"||!e6(r))&&console.error(n)}catch{console.error(n)}})}if(e.IconifyProviders!==void 0){const t=e.IconifyProviders;if(typeof t=="object"&&t!==null)for(let n in t){const r="IconifyProviders["+n+"] is invalid.";try{const s=t[n];if(typeof s!="object"||!s||s.resources===void 0)continue;kd(n,s)||console.error(r)}catch{console.error(r)}}}}({...bp});const I6=["fluent-emoji-high-contrast","material-symbols-light","cryptocurrency-color","icon-park-outline","icon-park-twotone","fluent-emoji-flat","emojione-monotone","streamline-emojis","heroicons-outline","simple-line-icons","material-symbols","flat-color-icons","icon-park-solid","pepicons-pencil","heroicons-solid","pepicons-print","cryptocurrency","pixelarticons","system-uicons","bitcoin-icons","devicon-plain","entypo-social","token-branded","grommet-icons","vscode-icons","pepicons-pop","svg-spinners","fluent-emoji","simple-icons","circle-flags","medical-icon","icomoon-free","majesticons","radix-icons","humbleicons","fa6-regular","emojione-v1","skill-icons","academicons","healthicons","fluent-mdl2","teenyicons","ant-design","gravity-ui","akar-icons","lets-icons","streamline","fa6-brands","file-icons","game-icons","foundation","fa-regular","mono-icons","iconamoon","zondicons","mdi-light","eos-icons","gridicons","icon-park","heroicons","fa6-solid","meteocons","arcticons","dashicons","fa-brands","websymbol","fontelico","mingcute","flowbite","marketeq","bytesize","guidance","openmoji","emojione","nonicons","brandico","flagpack","fa-solid","fontisto","si-glyph","pepicons","iconoir","tdesign","clarity","octicon","codicon","pajamas","formkit","line-md","twemoji","noto-v1","fxemoji","devicon","raphael","flat-ui","topcoat","feather","tabler","carbon","lucide","memory","mynaui","circum","fluent","nimbus","entypo","icons8","subway","vaadin","solar","basil","typcn","charm","prime","quill","logos","token","covid","maki","gala","mage","ooui","noto","unjs","flag","iwwa","zmdi","bpmn","mdi","ion","uil","bxs","cil","uiw","uim","uit","uis","jam","oui","bxl","cib","cbi","cif","gis","map","geo","fad","eva","wpf","whh","ic","ph","ri","bi","bx","gg","ci","ep","fe","mi","f7","ei","wi","la","fa","oi","et","el","ls","vs","il","ps"];function R6(e=""){let t,n="";if(e[0]==="@"&&e.includes(":")&&(n=e.split(":")[0].slice(1),e=e.split(":").slice(1).join(":")),e.startsWith("i-")){e=e.replace(/^i-/,"");for(const r of I6)if(e.startsWith(r)){t=r,e=e.slice(r.length+1);break}}else if(e.includes(":")){const[r,s]=e.split(":");t=r,e=s}return{provider:n,prefix:t||"",name:e||""}}const O6=we({__name:"Icon",props:{name:{type:String,required:!0},size:{type:String,default:""}},async setup(e){let t,n;const r=nt(),s=ma(),i=e;gt(()=>{var b;return(b=s.nuxtIcon)==null?void 0:b.iconifyApiOptions},()=>{var b,E,C,S,A,B;if((E=(b=s.nuxtIcon)==null?void 0:b.iconifyApiOptions)!=null&&E.url){try{new URL(s.nuxtIcon.iconifyApiOptions.url)}catch{console.warn("Nuxt Icon: Invalid custom Iconify API URL");return}if((S=(C=s.nuxtIcon)==null?void 0:C.iconifyApiOptions)!=null&&S.publicApiFallback){kd("custom",{resources:[(A=s.nuxtIcon)==null?void 0:A.iconifyApiOptions.url],index:0});return}kd("",{resources:[(B=s.nuxtIcon)==null?void 0:B.iconifyApiOptions.url]})}},{immediate:!0});const l=ya("icons",()=>({})),u=te(!1),c=F(()=>{var b,E;return(E=(b=s.nuxtIcon)==null?void 0:b.aliases)!=null&&E[i.name]?s.nuxtIcon.aliases[i.name]:i.name}),p=F(()=>R6(c.value)),d=F(()=>[p.value.provider,p.value.prefix,p.value.name].filter(Boolean).join(":")),g=F(()=>{var b;return(b=l.value)==null?void 0:b[d.value]}),h=F(()=>{var b;return(b=r.vueApp)==null?void 0:b.component(c.value)}),v=F(()=>{var E,C,S;if(!i.size&&typeof((E=s.nuxtIcon)==null?void 0:E.size)=="boolean"&&!((C=s.nuxtIcon)!=null&&C.size))return;const b=i.size||((S=s.nuxtIcon)==null?void 0:S.size)||"1em";return String(Number(b))===b?`${b}px`:b}),_=F(()=>{var b;return((b=s==null?void 0:s.nuxtIcon)==null?void 0:b.class)??"icon"});async function x(){var b;h.value||(b=l.value)!=null&&b[d.value]||(u.value=!0,l.value[d.value]=await $6(p.value).catch(()=>{}),u.value=!1)}return gt(c,x),!h.value&&([t,n]=VT(()=>x()),t=await t,n()),(b,E)=>u.value?(V(),Z("span",{key:0,class:ae(_.value),style:ds({width:v.value,height:v.value})},null,6)):g.value?(V(),Ae(R(WL),{key:1,icon:g.value,class:ae(_.value),width:v.value,height:v.value},null,8,["icon","class","width","height"])):h.value?(V(),Ae(Zr(h.value),{key:2,class:ae(_.value),width:v.value,height:v.value},null,8,["class","width","height"])):(V(),Z("span",{key:3,class:ae(_.value),style:ds({fontSize:v.value,lineHeight:v.value,width:v.value,height:v.value})},[it(b.$slots,"default",{},()=>[de(et(e.name),1)],!0)],6))}}),K1=zt(O6,[["__scopeId","data-v-e8d572f6"]]),P6=Object.freeze(Object.defineProperty({__proto__:null,default:K1},Symbol.toStringTag,{value:"Module"})),L6=we({props:{name:{type:String,required:!0},dynamic:{type:Boolean,default:!1}},setup(e){const t=ma();return{dynamic:F(()=>{var r,s;return e.dynamic||((s=(r=t.ui)==null?void 0:r.icons)==null?void 0:s.dynamic)})}}});function M6(e,t,n,r,s,i){const l=K1;return e.dynamic?(V(),Ae(l,{key:0,name:e.name},null,8,["name"])):(V(),Z("span",{key:1,class:ae(e.name)},null,2))}const ar=zt(L6,[["render",M6]]);function Ep({ui:e,props:t}){const n=ir();if(bt("ButtonGroupContextConsumer",!0),Ke("ButtonGroupContextConsumer",!1))return{size:F(()=>t.size),rounded:F(()=>e.value.rounded)};let s=n.parent,i;for(;s&&!i;){if(s.type.name==="ButtonGroup"){i=Ke(`group-${s.uid}`);break}s=s.parent}const l=F(()=>i==null?void 0:i.value.children.indexOf(n));return ct(()=>{i==null||i.value.register(n)}),Ht(()=>{i==null||i.value.unregister(n)}),{size:F(()=>(i==null?void 0:i.value.size)||t.size),rounded:F(()=>!i||l.value===-1?e.value.rounded:i.value.children.length===1?i.value.ui.rounded:l.value===0?i.value.rounded.start:l.value===i.value.children.length-1?i.value.rounded.end:"rounded-none")}}const Wr=wn(Ge.ui.strategy,Ge.ui.input,vp),B6=we({components:{UIcon:ar},inheritAttrs:!1,props:{modelValue:{type:[String,Number],default:""},type:{type:String,default:"text"},id:{type:String,default:null},name:{type:String,default:null},placeholder:{type:String,default:null},required:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},autofocusDelay:{type:Number,default:100},icon:{type:String,default:null},loadingIcon:{type:String,default:()=>Wr.default.loadingIcon},leadingIcon:{type:String,default:null},trailingIcon:{type:String,default:null},trailing:{type:Boolean,default:!1},leading:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},padded:{type:Boolean,default:!0},size:{type:String,default:null,validator(e){return Object.keys(Wr.size).includes(e)}},color:{type:String,default:()=>Wr.default.color,validator(e){return[...Ge.ui.colors,...Object.keys(Wr.color)].includes(e)}},variant:{type:String,default:()=>Wr.default.variant,validator(e){return[...Object.keys(Wr.variant),...Object.values(Wr.color).flatMap(t=>Object.keys(t))].includes(e)}},inputClass:{type:String,default:null},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})},modelModifiers:{type:Object,default:()=>({})}},emits:["update:modelValue","blur","change"],setup(e,{emit:t,slots:n}){const{ui:r,attrs:s}=On("input",Ot(e,"ui"),Wr,Ot(e,"class")),{size:i,rounded:l}=Ep({ui:r,props:e}),{emitFormBlur:u,emitFormInput:c,size:p,color:d,inputId:g,name:h}=ba(e,Wr),v=F(()=>i.value||p.value),_=te(wu({},e.modelModifiers,{trim:!1,lazy:!1,number:!1})),x=te(null),b=()=>{var ce;e.autofocus&&((ce=x.value)==null||ce.focus())},E=ce=>{_.value.trim&&(ce=ce.trim()),(_.value.number||e.type==="number")&&(ce=y1(ce)),t("update:modelValue",ce),c()},C=ce=>{_.value.lazy||E(ce.target.value)},S=ce=>{if(e.type==="file"){const ke=ce.target.files;t("change",ke)}else{const ke=ce.target.value;t("change",ke),_.value.lazy&&E(ke),_.value.trim&&(ce.target.value=ke.trim())}},A=ce=>{u(),t("blur",ce)};ct(()=>{setTimeout(()=>{b()},e.autofocusDelay)});const B=F(()=>{var ke,ie;const ce=((ie=(ke=r.value.color)==null?void 0:ke[d.value])==null?void 0:ie[e.variant])||r.value.variant[e.variant];return Un(pt(r.value.base,r.value.form,l.value,r.value.placeholder,e.type==="file"&&[r.value.file.base,r.value.file.padding[v.value]],r.value.size[v.value],e.padded?r.value.padding[v.value]:"p-0",ce==null?void 0:ce.replaceAll("{color}",d.value),(L.value||n.leading)&&r.value.leading.padding[v.value],(H.value||n.trailing)&&r.value.trailing.padding[v.value]),e.inputClass)}),L=F(()=>e.icon&&e.leading||e.icon&&!e.trailing||e.loading&&!e.trailing||e.leadingIcon),H=F(()=>e.icon&&e.trailing||e.loading&&e.trailing||e.trailingIcon),j=F(()=>e.loading?e.loadingIcon:e.leadingIcon||e.icon),q=F(()=>e.loading&&!L.value?e.loadingIcon:e.trailingIcon||e.icon),K=F(()=>pt(r.value.icon.leading.wrapper,r.value.icon.leading.pointer,r.value.icon.leading.padding[v.value])),Y=F(()=>pt(r.value.icon.base,d.value&&Ge.ui.colors.includes(d.value)&&r.value.icon.color.replaceAll("{color}",d.value),r.value.icon.size[v.value],e.loading&&r.value.icon.loading)),z=F(()=>pt(r.value.icon.trailing.wrapper,r.value.icon.trailing.pointer,r.value.icon.trailing.padding[v.value])),be=F(()=>pt(r.value.icon.base,d.value&&Ge.ui.colors.includes(d.value)&&r.value.icon.color.replaceAll("{color}",d.value),r.value.icon.size[v.value],e.loading&&!L.value&&r.value.icon.loading));return{ui:r,attrs:s,name:h,inputId:g,input:x,isLeading:L,isTrailing:H,inputClass:B,leadingIconName:j,leadingIconClass:Y,leadingWrapperIconClass:K,trailingIconName:q,trailingIconClass:be,trailingWrapperIconClass:z,onInput:C,onChange:S,onBlur:A}}}),F6=["id","name","value","type","required","placeholder","disabled"];function D6(e,t,n,r,s,i){const l=ar;return V(),Z("div",{class:ae(e.ui.wrapper)},[I("input",lt({id:e.inputId,ref:"input",name:e.name,value:e.modelValue,type:e.type,required:e.required,placeholder:e.placeholder,disabled:e.disabled,class:e.inputClass},e.attrs,{onInput:t[0]||(t[0]=(...u)=>e.onInput&&e.onInput(...u)),onBlur:t[1]||(t[1]=(...u)=>e.onBlur&&e.onBlur(...u)),onChange:t[2]||(t[2]=(...u)=>e.onChange&&e.onChange(...u))}),null,16,F6),it(e.$slots,"default"),e.isLeading&&e.leadingIconName||e.$slots.leading?(V(),Z("span",{key:0,class:ae(e.leadingWrapperIconClass)},[it(e.$slots,"leading",{disabled:e.disabled,loading:e.loading},()=>[P(l,{name:e.leadingIconName,class:ae(e.leadingIconClass)},null,8,["name","class"])])],2)):Ie("",!0),e.isTrailing&&e.trailingIconName||e.$slots.trailing?(V(),Z("span",{key:1,class:ae(e.trailingWrapperIconClass)},[it(e.$slots,"trailing",{disabled:e.disabled,loading:e.loading},()=>[P(l,{name:e.trailingIconName,class:ae(e.trailingIconClass)},null,8,["name","class"])])],2)):Ie("",!0)],2)}const li=zt(B6,[["render",D6]]),kf=wn(Ge.ui.strategy,Ge.ui.formGroup,nL),V6=we({inheritAttrs:!1,props:{name:{type:String,default:null},size:{type:String,default:null,validator(e){return Object.keys(kf.size).includes(e)}},label:{type:String,default:null},description:{type:String,default:null},required:{type:Boolean,default:!1},help:{type:String,default:null},error:{type:[String,Boolean],default:null},hint:{type:String,default:null},class:{type:[String,Object,Array],default:()=>""},ui:{type:Object,default:()=>({})},eagerValidation:{type:Boolean,default:!1}},setup(e){const{ui:t,attrs:n}=On("formGroup",Ot(e,"ui"),kf,Ot(e,"class")),r=Ke("form-errors",null),s=F(()=>{var u,c;return e.error&&typeof e.error=="string"||typeof e.error=="boolean"?e.error:(c=(u=r==null?void 0:r.value)==null?void 0:u.find(p=>p.path===e.name))==null?void 0:c.message}),i=F(()=>t.value.size[e.size??kf.default.size]),l=te(ii("$K7dDJpdOWE"));return bt("form-group",{error:s,inputId:l,name:F(()=>e.name),size:F(()=>e.size),eagerValidation:F(()=>e.eagerValidation)}),{ui:t,attrs:n,inputId:l,size:i,error:s}}}),N6=["for"];function j6(e,t,n,r,s,i){return V(),Z("div",lt({class:e.ui.wrapper},e.attrs),[I("div",{class:ae(e.ui.inner)},[e.label||e.$slots.label?(V(),Z("div",{key:0,class:ae([e.ui.label.wrapper,e.size])},[I("label",{for:e.inputId,class:ae([e.ui.label.base,e.required?e.ui.label.required:""])},[e.$slots.label?it(e.$slots,"label",Er(lt({key:0},{error:e.error,label:e.label,name:e.name,hint:e.hint,description:e.description,help:e.help}))):(V(),Z(Ye,{key:1},[de(et(e.label),1)],64))],10,N6),e.hint||e.$slots.hint?(V(),Z("span",{key:0,class:ae([e.ui.hint])},[e.$slots.hint?it(e.$slots,"hint",Er(lt({key:0},{error:e.error,label:e.label,name:e.name,hint:e.hint,description:e.description,help:e.help}))):(V(),Z(Ye,{key:1},[de(et(e.hint),1)],64))],2)):Ie("",!0)],2)):Ie("",!0),e.description||e.$slots.description?(V(),Z("p",{key:1,class:ae([e.ui.description,e.size])},[e.$slots.description?it(e.$slots,"description",Er(lt({key:0},{error:e.error,label:e.label,name:e.name,hint:e.hint,description:e.description,help:e.help}))):(V(),Z(Ye,{key:1},[de(et(e.description),1)],64))],2)):Ie("",!0)],2),I("div",{class:ae([e.label?e.ui.container:""])},[it(e.$slots,"default",Er(Qs({error:e.error}))),typeof e.error=="string"&&e.error||e.$slots.error?(V(),Z("p",{key:0,class:ae([e.ui.error,e.size])},[e.$slots.error?it(e.$slots,"error",Er(lt({key:0},{error:e.error,label:e.label,name:e.name,hint:e.hint,description:e.description,help:e.help}))):(V(),Z(Ye,{key:1},[de(et(e.error),1)],64))],2)):e.help||e.$slots.help?(V(),Z("p",{key:1,class:ae([e.ui.help,e.size])},[e.$slots.help?it(e.$slots,"help",Er(lt({key:0},{error:e.error,label:e.label,name:e.name,hint:e.hint,description:e.description,help:e.help}))):(V(),Z(Ye,{key:1},[de(et(e.help),1)],64))],2)):Ie("",!0)],2)],16)}const ui=zt(V6,[["render",j6]]),U6={class:"w-full flex justify-between items-center"},H6={class:"relative flex justify-start bg-inherit z-10"},z6=["textContent"],W6=I("div",{class:"w-full border-t-2 border-dashed border-gray-300 dark:border-gray-600"},null,-1),G1=we({__name:"Divider",props:{title:{type:String,required:!0}},setup(e){return(t,n)=>(V(),Z("div",U6,[I("div",H6,[I("span",{class:"pr-3 text-lg font-bold text-gray-900 dark:text-gray-100 whitespace-nowrap",textContent:et(e.title)},null,8,z6)]),W6]))}});function J1(e,t,n){let r=te(n==null?void 0:n.value),s=F(()=>e.value!==void 0);return[F(()=>s.value?e.value:r.value),function(i){return s.value||(r.value=i),t==null?void 0:t(i)}]}let Z1=Symbol("headlessui.useid"),q6=0;function sr(){return Ke(Z1,()=>`${++q6}`)()}function Tp(e){bt(Z1,e)}function Be(e){var t;if(e==null||e.value==null)return null;let n=(t=e.value.$el)!=null?t:e.value;return n instanceof Node?n:null}function Hn(e,t,...n){if(e in t){let s=t[e];return typeof s=="function"?s(...n):s}let r=new Error(`Tried to handle "${e}" but there is no handler defined. Only defined handlers are: ${Object.keys(t).map(s=>`"${s}"`).join(", ")}.`);throw Error.captureStackTrace&&Error.captureStackTrace(r,Hn),r}var K6=Object.defineProperty,G6=(e,t,n)=>t in e?K6(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mv=(e,t,n)=>(G6(e,typeof t!="symbol"?t+"":t,n),n);let J6=class{constructor(){Mv(this,"current",this.detect()),Mv(this,"currentId",0)}set(t){this.current!==t&&(this.currentId=0,this.current=t)}reset(){this.set(this.detect())}nextId(){return++this.currentId}get isServer(){return this.current==="server"}get isClient(){return this.current==="client"}detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}},_a=new J6;function gr(e){if(_a.isServer)return null;if(e instanceof Node)return e.ownerDocument;if(e!=null&&e.hasOwnProperty("value")){let t=Be(e);if(t)return t.ownerDocument}return document}let Td=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","textarea:not([disabled])"].map(e=>`${e}:not([tabindex='-1'])`).join(",");var An=(e=>(e[e.First=1]="First",e[e.Previous=2]="Previous",e[e.Next=4]="Next",e[e.Last=8]="Last",e[e.WrapAround=16]="WrapAround",e[e.NoScroll=32]="NoScroll",e))(An||{}),lu=(e=>(e[e.Error=0]="Error",e[e.Overflow=1]="Overflow",e[e.Success=2]="Success",e[e.Underflow=3]="Underflow",e))(lu||{}),Z6=(e=>(e[e.Previous=-1]="Previous",e[e.Next=1]="Next",e))(Z6||{});function Y1(e=document.body){return e==null?[]:Array.from(e.querySelectorAll(Td)).sort((t,n)=>Math.sign((t.tabIndex||Number.MAX_SAFE_INTEGER)-(n.tabIndex||Number.MAX_SAFE_INTEGER)))}var $p=(e=>(e[e.Strict=0]="Strict",e[e.Loose=1]="Loose",e))($p||{});function Ap(e,t=0){var n;return e===((n=gr(e))==null?void 0:n.body)?!1:Hn(t,{0(){return e.matches(Td)},1(){let r=e;for(;r!==null;){if(r.matches(Td))return!0;r=r.parentElement}return!1}})}function Q1(e){let t=gr(e);an(()=>{t&&!Ap(t.activeElement,0)&&Io(e)})}var Y6=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e))(Y6||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",e=>{e.metaKey||e.altKey||e.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",e=>{e.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:e.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));function Io(e){e==null||e.focus({preventScroll:!0})}let Q6=["textarea","input"].join(",");function X6(e){var t,n;return(n=(t=e==null?void 0:e.matches)==null?void 0:t.call(e,Q6))!=null?n:!1}function Ip(e,t=n=>n){return e.slice().sort((n,r)=>{let s=t(n),i=t(r);if(s===null||i===null)return 0;let l=s.compareDocumentPosition(i);return l&Node.DOCUMENT_POSITION_FOLLOWING?-1:l&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function e8(e,t){return fs(Y1(),t,{relativeTo:e})}function fs(e,t,{sorted:n=!0,relativeTo:r=null,skipElements:s=[]}={}){var i;let l=(i=Array.isArray(e)?e.length>0?e[0].ownerDocument:document:e==null?void 0:e.ownerDocument)!=null?i:document,u=Array.isArray(e)?n?Ip(e):e:Y1(e);s.length>0&&u.length>1&&(u=u.filter(_=>!s.includes(_))),r=r??l.activeElement;let c=(()=>{if(t&5)return 1;if(t&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),p=(()=>{if(t&1)return 0;if(t&2)return Math.max(0,u.indexOf(r))-1;if(t&4)return Math.max(0,u.indexOf(r))+1;if(t&8)return u.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),d=t&32?{preventScroll:!0}:{},g=0,h=u.length,v;do{if(g>=h||g+h<=0)return 0;let _=p+g;if(t&16)_=(_+h)%h;else{if(_<0)return 3;if(_>=h)return 1}v=u[_],v==null||v.focus(d),g+=c}while(v!==l.activeElement);return t&6&&X6(v)&&v.select(),2}function X1(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function t8(){return/Android/gi.test(window.navigator.userAgent)}function n8(){return X1()||t8()}function Al(e,t,n){_a.isServer||Xt(r=>{document.addEventListener(e,t,n),r(()=>document.removeEventListener(e,t,n))})}function e_(e,t,n){_a.isServer||Xt(r=>{window.addEventListener(e,t,n),r(()=>window.removeEventListener(e,t,n))})}function t_(e,t,n=F(()=>!0)){function r(i,l){if(!n.value||i.defaultPrevented)return;let u=l(i);if(u===null||!u.getRootNode().contains(u))return;let c=function p(d){return typeof d=="function"?p(d()):Array.isArray(d)||d instanceof Set?d:[d]}(e);for(let p of c){if(p===null)continue;let d=p instanceof HTMLElement?p:Be(p);if(d!=null&&d.contains(u)||i.composed&&i.composedPath().includes(d))return}return!Ap(u,$p.Loose)&&u.tabIndex!==-1&&i.preventDefault(),t(i,u)}let s=te(null);Al("pointerdown",i=>{var l,u;n.value&&(s.value=((u=(l=i.composedPath)==null?void 0:l.call(i))==null?void 0:u[0])||i.target)},!0),Al("mousedown",i=>{var l,u;n.value&&(s.value=((u=(l=i.composedPath)==null?void 0:l.call(i))==null?void 0:u[0])||i.target)},!0),Al("click",i=>{n8()||s.value&&(r(i,()=>s.value),s.value=null)},!0),Al("touchend",i=>r(i,()=>i.target instanceof HTMLElement?i.target:null),!0),e_("blur",i=>r(i,()=>window.document.activeElement instanceof HTMLIFrameElement?window.document.activeElement:null),!0)}function Bv(e,t){if(e)return e;let n=t??"button";if(typeof n=="string"&&n.toLowerCase()==="button")return"button"}function Rp(e,t){let n=te(Bv(e.value.type,e.value.as));return ct(()=>{n.value=Bv(e.value.type,e.value.as)}),Xt(()=>{var r;n.value||Be(t)&&Be(t)instanceof HTMLButtonElement&&!((r=Be(t))!=null&&r.hasAttribute("type"))&&(n.value="button")}),n}function Fv(e){return[e.screenX,e.screenY]}function r8(){let e=te([-1,-1]);return{wasMoved(t){let n=Fv(t);return e.value[0]===n[0]&&e.value[1]===n[1]?!1:(e.value=n,!0)},update(t){e.value=Fv(t)}}}function n_({container:e,accept:t,walk:n,enabled:r}){Xt(()=>{let s=e.value;if(!s||r!==void 0&&!r.value)return;let i=gr(e);if(!i)return;let l=Object.assign(c=>t(c),{acceptNode:t}),u=i.createTreeWalker(s,NodeFilter.SHOW_ELEMENT,l,!1);for(;u.nextNode();)n(u.currentNode)})}var Ro=(e=>(e[e.None=0]="None",e[e.RenderStrategy=1]="RenderStrategy",e[e.Static=2]="Static",e))(Ro||{}),Co=(e=>(e[e.Unmount=0]="Unmount",e[e.Hidden=1]="Hidden",e))(Co||{});function Kt({visible:e=!0,features:t=0,ourProps:n,theirProps:r,...s}){var i;let l=o_(r,n),u=Object.assign(s,{props:l});if(e||t&2&&l.static)return Sf(u);if(t&1){let c=(i=l.unmount)==null||i?0:1;return Hn(c,{0(){return null},1(){return Sf({...s,props:{...l,hidden:!0,style:{display:"none"}}})}})}return Sf(u)}function Sf({props:e,attrs:t,slots:n,slot:r,name:s}){var i,l;let{as:u,...c}=Au(e,["unmount","static"]),p=(i=n.default)==null?void 0:i.call(n,r),d={};if(r){let g=!1,h=[];for(let[v,_]of Object.entries(r))typeof _=="boolean"&&(g=!0),_===!0&&h.push(v);g&&(d["data-headlessui-state"]=h.join(" "))}if(u==="template"){if(p=r_(p??[]),Object.keys(c).length>0||Object.keys(t).length>0){let[g,...h]=p??[];if(!o8(g)||h.length>0)throw new Error(['Passing props on "template"!',"",`The current component <${s} /> is rendering a "template".`,"However we need to passthrough the following props:",Object.keys(c).concat(Object.keys(t)).map(x=>x.trim()).filter((x,b,E)=>E.indexOf(x)===b).sort((x,b)=>x.localeCompare(b)).map(x=>` - ${x}`).join(` -`),"","You can apply a few solutions:",['Add an `as="..."` prop, to ensure that we render an actual element instead of a "template".',"Render a single element as the child so that we can forward the props onto that element."].map(x=>` - ${x}`).join(` -`)].join(` -`));let v=o_((l=g.props)!=null?l:{},c,d),_=Rr(g,v,!0);for(let x in v)x.startsWith("on")&&(_.props||(_.props={}),_.props[x]=v[x]);return _}return Array.isArray(p)&&p.length===1?p[0]:p}return Xe(u,Object.assign({},c,d),{default:()=>p})}function r_(e){return e.flatMap(t=>t.type===Ye?r_(t.children):[t])}function o_(...e){if(e.length===0)return{};if(e.length===1)return e[0];let t={},n={};for(let r of e)for(let s in r)s.startsWith("on")&&typeof r[s]=="function"?(n[s]!=null||(n[s]=[]),n[s].push(r[s])):t[s]=r[s];if(t.disabled||t["aria-disabled"])return Object.assign(t,Object.fromEntries(Object.keys(n).map(r=>[r,void 0])));for(let r in n)Object.assign(t,{[r](s,...i){let l=n[r];for(let u of l){if(s instanceof Event&&s.defaultPrevented)return;u(s,...i)}}});return t}function s_(e){let t=Object.assign({},e);for(let n in t)t[n]===void 0&&delete t[n];return t}function Au(e,t=[]){let n=Object.assign({},e);for(let r of t)r in n&&delete n[r];return n}function o8(e){return e==null?!1:typeof e.type=="string"||typeof e.type=="object"||typeof e.type=="function"}var ti=(e=>(e[e.None=1]="None",e[e.Focusable=2]="Focusable",e[e.Hidden=4]="Hidden",e))(ti||{});let ia=we({name:"Hidden",props:{as:{type:[Object,String],default:"div"},features:{type:Number,default:1}},setup(e,{slots:t,attrs:n}){return()=>{var r;let{features:s,...i}=e,l={"aria-hidden":(s&2)===2?!0:(r=i["aria-hidden"])!=null?r:void 0,hidden:(s&4)===4?!0:void 0,style:{position:"fixed",top:1,left:1,width:1,height:0,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",borderWidth:"0",...(s&4)===4&&(s&2)!==2&&{display:"none"}}};return Kt({ourProps:l,theirProps:i,slot:{},attrs:n,slots:t,name:"Hidden"})}}}),i_=Symbol("Context");var Ut=(e=>(e[e.Open=1]="Open",e[e.Closed=2]="Closed",e[e.Closing=4]="Closing",e[e.Opening=8]="Opening",e))(Ut||{});function s8(){return wa()!==null}function wa(){return Ke(i_,null)}function Op(e){bt(i_,e)}var dt=(e=>(e.Space=" ",e.Enter="Enter",e.Escape="Escape",e.Backspace="Backspace",e.Delete="Delete",e.ArrowLeft="ArrowLeft",e.ArrowUp="ArrowUp",e.ArrowRight="ArrowRight",e.ArrowDown="ArrowDown",e.Home="Home",e.End="End",e.PageUp="PageUp",e.PageDown="PageDown",e.Tab="Tab",e))(dt||{});function i8(e){function t(){document.readyState!=="loading"&&(e(),document.removeEventListener("DOMContentLoaded",t))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",t),t())}let rs=[];i8(()=>{function e(t){t.target instanceof HTMLElement&&t.target!==document.body&&rs[0]!==t.target&&(rs.unshift(t.target),rs=rs.filter(n=>n!=null&&n.isConnected),rs.splice(10))}window.addEventListener("click",e,{capture:!0}),window.addEventListener("mousedown",e,{capture:!0}),window.addEventListener("focus",e,{capture:!0}),document.body.addEventListener("click",e,{capture:!0}),document.body.addEventListener("mousedown",e,{capture:!0}),document.body.addEventListener("focus",e,{capture:!0})});function a8(e){throw new Error("Unexpected object: "+e)}var jn=(e=>(e[e.First=0]="First",e[e.Previous=1]="Previous",e[e.Next=2]="Next",e[e.Last=3]="Last",e[e.Specific=4]="Specific",e[e.Nothing=5]="Nothing",e))(jn||{});function l8(e,t){let n=t.resolveItems();if(n.length<=0)return null;let r=t.resolveActiveIndex(),s=r??-1;switch(e.focus){case 0:{for(let i=0;i=0;--i)if(!t.resolveDisabled(n[i],i,n))return i;return r}case 2:{for(let i=s+1;i=0;--i)if(!t.resolveDisabled(n[i],i,n))return i;return r}case 4:{for(let i=0;isetTimeout(()=>{throw t}))}function xa(){let e=[],t={addEventListener(n,r,s,i){return n.addEventListener(r,s,i),t.add(()=>n.removeEventListener(r,s,i))},requestAnimationFrame(...n){let r=requestAnimationFrame(...n);t.add(()=>cancelAnimationFrame(r))},nextFrame(...n){t.requestAnimationFrame(()=>{t.requestAnimationFrame(...n)})},setTimeout(...n){let r=setTimeout(...n);t.add(()=>clearTimeout(r))},microTask(...n){let r={current:!0};return Pp(()=>{r.current&&n[0]()}),t.add(()=>{r.current=!1})},style(n,r,s){let i=n.style.getPropertyValue(r);return Object.assign(n.style,{[r]:s}),this.add(()=>{Object.assign(n.style,{[r]:i})})},group(n){let r=xa();return n(r),this.add(()=>r.dispose())},add(n){return e.push(n),()=>{let r=e.indexOf(n);if(r>=0)for(let s of e.splice(r,1))s()}},dispose(){for(let n of e.splice(0))n()}};return t}function a_(e={},t=null,n=[]){for(let[r,s]of Object.entries(e))u_(n,l_(t,r),s);return n}function l_(e,t){return e?e+"["+t+"]":t}function u_(e,t,n){if(Array.isArray(n))for(let[r,s]of n.entries())u_(e,l_(t,r.toString()),s);else n instanceof Date?e.push([t,n.toISOString()]):typeof n=="boolean"?e.push([t,n?"1":"0"]):typeof n=="string"?e.push([t,n]):typeof n=="number"?e.push([t,`${n}`]):n==null?e.push([t,""]):a_(n,t,e)}function c_(e){var t,n;let r=(t=e==null?void 0:e.form)!=null?t:e.closest("form");if(r){for(let s of r.elements)if(s!==e&&(s.tagName==="INPUT"&&s.type==="submit"||s.tagName==="BUTTON"&&s.type==="submit"||s.nodeName==="INPUT"&&s.type==="image")){s.click();return}(n=r.requestSubmit)==null||n.call(r)}}function f_(e,t,n,r){_a.isServer||Xt(s=>{e=e??window,e.addEventListener(t,n,r),s(()=>e.removeEventListener(t,n,r))})}var Vi=(e=>(e[e.Forwards=0]="Forwards",e[e.Backwards=1]="Backwards",e))(Vi||{});function u8(){let e=te(0);return e_("keydown",t=>{t.key==="Tab"&&(e.value=t.shiftKey?1:0)}),e}function d_(e){if(!e)return new Set;if(typeof e=="function")return new Set(e());let t=new Set;for(let n of e.value){let r=Be(n);r instanceof HTMLElement&&t.add(r)}return t}var p_=(e=>(e[e.None=1]="None",e[e.InitialFocus=2]="InitialFocus",e[e.TabLock=4]="TabLock",e[e.FocusLock=8]="FocusLock",e[e.RestoreFocus=16]="RestoreFocus",e[e.All=30]="All",e))(p_||{});let Pi=Object.assign(we({name:"FocusTrap",props:{as:{type:[Object,String],default:"div"},initialFocus:{type:Object,default:null},features:{type:Number,default:30},containers:{type:[Object,Function],default:te(new Set)}},inheritAttrs:!1,setup(e,{attrs:t,slots:n,expose:r}){let s=te(null);r({el:s,$el:s});let i=F(()=>gr(s)),l=te(!1);ct(()=>l.value=!0),Ht(()=>l.value=!1),f8({ownerDocument:i},F(()=>l.value&&!!(e.features&16)));let u=d8({ownerDocument:i,container:s,initialFocus:F(()=>e.initialFocus)},F(()=>l.value&&!!(e.features&2)));p8({ownerDocument:i,container:s,containers:e.containers,previousActiveElement:u},F(()=>l.value&&!!(e.features&8)));let c=u8();function p(v){let _=Be(s);_&&(x=>x())(()=>{Hn(c.value,{[Vi.Forwards]:()=>{fs(_,An.First,{skipElements:[v.relatedTarget]})},[Vi.Backwards]:()=>{fs(_,An.Last,{skipElements:[v.relatedTarget]})}})})}let d=te(!1);function g(v){v.key==="Tab"&&(d.value=!0,requestAnimationFrame(()=>{d.value=!1}))}function h(v){if(!l.value)return;let _=d_(e.containers);Be(s)instanceof HTMLElement&&_.add(Be(s));let x=v.relatedTarget;x instanceof HTMLElement&&x.dataset.headlessuiFocusGuard!=="true"&&(h_(_,x)||(d.value?fs(Be(s),Hn(c.value,{[Vi.Forwards]:()=>An.Next,[Vi.Backwards]:()=>An.Previous})|An.WrapAround,{relativeTo:v.target}):v.target instanceof HTMLElement&&Io(v.target)))}return()=>{let v={},_={ref:s,onKeydown:g,onFocusout:h},{features:x,initialFocus:b,containers:E,...C}=e;return Xe(Ye,[!!(x&4)&&Xe(ia,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:p,features:ti.Focusable}),Kt({ourProps:_,theirProps:{...t,...C},slot:v,attrs:t,slots:n,name:"FocusTrap"}),!!(x&4)&&Xe(ia,{as:"button",type:"button","data-headlessui-focus-guard":!0,onFocus:p,features:ti.Focusable})])}}}),{features:p_});function c8(e){let t=te(rs.slice());return gt([e],([n],[r])=>{r===!0&&n===!1?Pp(()=>{t.value.splice(0)}):r===!1&&n===!0&&(t.value=rs.slice())},{flush:"post"}),()=>{var n;return(n=t.value.find(r=>r!=null&&r.isConnected))!=null?n:null}}function f8({ownerDocument:e},t){let n=c8(t);ct(()=>{Xt(()=>{var r,s;t.value||((r=e.value)==null?void 0:r.activeElement)===((s=e.value)==null?void 0:s.body)&&Io(n())},{flush:"post"})}),Ht(()=>{t.value&&Io(n())})}function d8({ownerDocument:e,container:t,initialFocus:n},r){let s=te(null),i=te(!1);return ct(()=>i.value=!0),Ht(()=>i.value=!1),ct(()=>{gt([t,n,r],(l,u)=>{if(l.every((p,d)=>(u==null?void 0:u[d])===p)||!r.value)return;let c=Be(t);c&&Pp(()=>{var p,d;if(!i.value)return;let g=Be(n),h=(p=e.value)==null?void 0:p.activeElement;if(g){if(g===h){s.value=h;return}}else if(c.contains(h)){s.value=h;return}g?Io(g):fs(c,An.First|An.NoScroll)===lu.Error&&console.warn("There are no focusable elements inside the "),s.value=(d=e.value)==null?void 0:d.activeElement})},{immediate:!0,flush:"post"})}),s}function p8({ownerDocument:e,container:t,containers:n,previousActiveElement:r},s){var i;f_((i=e.value)==null?void 0:i.defaultView,"focus",l=>{if(!s.value)return;let u=d_(n);Be(t)instanceof HTMLElement&&u.add(Be(t));let c=r.value;if(!c)return;let p=l.target;p&&p instanceof HTMLElement?h_(u,p)?(r.value=p,Io(p)):(l.preventDefault(),l.stopPropagation(),Io(c)):Io(r.value)},!0)}function h_(e,t){for(let n of e)if(n.contains(t))return!0;return!1}function h8(e){let t=Ir(e.getSnapshot());return Ht(e.subscribe(()=>{t.value=e.getSnapshot()})),t}function g8(e,t){let n=e(),r=new Set;return{getSnapshot(){return n},subscribe(s){return r.add(s),()=>r.delete(s)},dispatch(s,...i){let l=t[s].call(n,...i);l&&(n=l,r.forEach(u=>u()))}}}function m8(){let e;return{before({doc:t}){var n;let r=t.documentElement;e=((n=t.defaultView)!=null?n:window).innerWidth-r.clientWidth},after({doc:t,d:n}){let r=t.documentElement,s=r.clientWidth-r.offsetWidth,i=e-s;n.style(r,"paddingRight",`${i}px`)}}}function v8(){return X1()?{before({doc:e,d:t,meta:n}){function r(s){return n.containers.flatMap(i=>i()).some(i=>i.contains(s))}t.microTask(()=>{var s;if(window.getComputedStyle(e.documentElement).scrollBehavior!=="auto"){let u=xa();u.style(e.documentElement,"scrollBehavior","auto"),t.add(()=>t.microTask(()=>u.dispose()))}let i=(s=window.scrollY)!=null?s:window.pageYOffset,l=null;t.addEventListener(e,"click",u=>{if(u.target instanceof HTMLElement)try{let c=u.target.closest("a");if(!c)return;let{hash:p}=new URL(c.href),d=e.querySelector(p);d&&!r(d)&&(l=d)}catch{}},!0),t.addEventListener(e,"touchstart",u=>{if(u.target instanceof HTMLElement)if(r(u.target)){let c=u.target;for(;c.parentElement&&r(c.parentElement);)c=c.parentElement;t.style(c,"overscrollBehavior","contain")}else t.style(u.target,"touchAction","none")}),t.addEventListener(e,"touchmove",u=>{if(u.target instanceof HTMLElement)if(r(u.target)){let c=u.target;for(;c.parentElement&&c.dataset.headlessuiPortal!==""&&!(c.scrollHeight>c.clientHeight||c.scrollWidth>c.clientWidth);)c=c.parentElement;c.dataset.headlessuiPortal===""&&u.preventDefault()}else u.preventDefault()},{passive:!1}),t.add(()=>{var u;let c=(u=window.scrollY)!=null?u:window.pageYOffset;i!==c&&window.scrollTo(0,i),l&&l.isConnected&&(l.scrollIntoView({block:"nearest"}),l=null)})})}}:{}}function y8(){return{before({doc:e,d:t}){t.style(e.documentElement,"overflow","hidden")}}}function b8(e){let t={};for(let n of e)Object.assign(t,n(t));return t}let is=g8(()=>new Map,{PUSH(e,t){var n;let r=(n=this.get(e))!=null?n:{doc:e,count:0,d:xa(),meta:new Set};return r.count++,r.meta.add(t),this.set(e,r),this},POP(e,t){let n=this.get(e);return n&&(n.count--,n.meta.delete(t)),this},SCROLL_PREVENT({doc:e,d:t,meta:n}){let r={doc:e,d:t,meta:b8(n)},s=[v8(),m8(),y8()];s.forEach(({before:i})=>i==null?void 0:i(r)),s.forEach(({after:i})=>i==null?void 0:i(r))},SCROLL_ALLOW({d:e}){e.dispose()},TEARDOWN({doc:e}){this.delete(e)}});is.subscribe(()=>{let e=is.getSnapshot(),t=new Map;for(let[n]of e)t.set(n,n.documentElement.style.overflow);for(let n of e.values()){let r=t.get(n.doc)==="hidden",s=n.count!==0;(s&&!r||!s&&r)&&is.dispatch(n.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",n),n.count===0&&is.dispatch("TEARDOWN",n)}});function _8(e,t,n){let r=h8(is),s=F(()=>{let i=e.value?r.value.get(e.value):void 0;return i?i.count>0:!1});return gt([e,t],([i,l],[u],c)=>{if(!i||!l)return;is.dispatch("PUSH",i,n);let p=!1;c(()=>{p||(is.dispatch("POP",u??i,n),p=!0)})},{immediate:!0}),s}let Cf=new Map,Li=new Map;function Dv(e,t=te(!0)){Xt(n=>{var r;if(!t.value)return;let s=Be(e);if(!s)return;n(function(){var l;if(!s)return;let u=(l=Li.get(s))!=null?l:1;if(u===1?Li.delete(s):Li.set(s,u-1),u!==1)return;let c=Cf.get(s);c&&(c["aria-hidden"]===null?s.removeAttribute("aria-hidden"):s.setAttribute("aria-hidden",c["aria-hidden"]),s.inert=c.inert,Cf.delete(s))});let i=(r=Li.get(s))!=null?r:0;Li.set(s,i+1),i===0&&(Cf.set(s,{"aria-hidden":s.getAttribute("aria-hidden"),inert:s.inert}),s.setAttribute("aria-hidden","true"),s.inert=!0)})}function w8({defaultContainers:e=[],portals:t,mainTreeNodeRef:n}={}){let r=te(null),s=gr(r);function i(){var l,u,c;let p=[];for(let d of e)d!==null&&(d instanceof HTMLElement?p.push(d):"value"in d&&d.value instanceof HTMLElement&&p.push(d.value));if(t!=null&&t.value)for(let d of t.value)p.push(d);for(let d of(l=s==null?void 0:s.querySelectorAll("html > *, body > *"))!=null?l:[])d!==document.body&&d!==document.head&&d instanceof HTMLElement&&d.id!=="headlessui-portal-root"&&(d.contains(Be(r))||d.contains((c=(u=Be(r))==null?void 0:u.getRootNode())==null?void 0:c.host)||p.some(g=>d.contains(g))||p.push(d));return p}return{resolveContainers:i,contains(l){return i().some(u=>u.contains(l))},mainTreeNodeRef:r,MainTreeNode(){return n!=null?null:Xe(ia,{features:ti.Hidden,ref:r})}}}let g_=Symbol("ForcePortalRootContext");function x8(){return Ke(g_,!1)}let Vv=we({name:"ForcePortalRoot",props:{as:{type:[Object,String],default:"template"},force:{type:Boolean,default:!1}},setup(e,{slots:t,attrs:n}){return bt(g_,e.force),()=>{let{force:r,...s}=e;return Kt({theirProps:s,ourProps:{},slot:{},slots:t,attrs:n,name:"ForcePortalRoot"})}}}),m_=Symbol("StackContext");var $d=(e=>(e[e.Add=0]="Add",e[e.Remove=1]="Remove",e))($d||{});function k8(){return Ke(m_,()=>{})}function S8({type:e,enabled:t,element:n,onUpdate:r}){let s=k8();function i(...l){r==null||r(...l),s(...l)}ct(()=>{gt(t,(l,u)=>{l?i(0,e,n):u===!0&&i(1,e,n)},{immediate:!0,flush:"sync"})}),Ht(()=>{t.value&&i(1,e,n)}),bt(m_,i)}let C8=Symbol("DescriptionContext");function Lp({slot:e=te({}),name:t="Description",props:n={}}={}){let r=te([]);function s(i){return r.value.push(i),()=>{let l=r.value.indexOf(i);l!==-1&&r.value.splice(l,1)}}return bt(C8,{register:s,slot:e,name:t,props:n}),F(()=>r.value.length>0?r.value.join(" "):void 0)}function E8(e){let t=gr(e);if(!t){if(e===null)return null;throw new Error(`[Headless UI]: Cannot find ownerDocument for contextElement: ${e}`)}let n=t.getElementById("headlessui-portal-root");if(n)return n;let r=t.createElement("div");return r.setAttribute("id","headlessui-portal-root"),t.body.appendChild(r)}let T8=we({name:"Portal",props:{as:{type:[Object,String],default:"div"}},setup(e,{slots:t,attrs:n}){let r=te(null),s=F(()=>gr(r)),i=x8(),l=Ke(v_,null),u=te(i===!0||l==null?E8(r.value):l.resolveTarget()),c=te(!1);ct(()=>{c.value=!0}),Xt(()=>{i||l!=null&&(u.value=l.resolveTarget())});let p=Ke(Ad,null),d=!1,g=ir();return gt(r,()=>{if(d||!p)return;let h=Be(r);h&&(Ht(p.register(h),g),d=!0)}),Ht(()=>{var h,v;let _=(h=s.value)==null?void 0:h.getElementById("headlessui-portal-root");_&&u.value===_&&u.value.children.length<=0&&((v=u.value.parentElement)==null||v.removeChild(u.value))}),()=>{if(!c.value||u.value===null)return null;let h={ref:r,"data-headlessui-portal":""};return Xe(Zy,{to:u.value},Kt({ourProps:h,theirProps:e,slot:{},attrs:n,slots:t,name:"Portal"}))}}}),Ad=Symbol("PortalParentContext");function $8(){let e=Ke(Ad,null),t=te([]);function n(i){return t.value.push(i),e&&e.register(i),()=>r(i)}function r(i){let l=t.value.indexOf(i);l!==-1&&t.value.splice(l,1),e&&e.unregister(i)}let s={register:n,unregister:r,portals:t};return[t,we({name:"PortalWrapper",setup(i,{slots:l}){return bt(Ad,s),()=>{var u;return(u=l.default)==null?void 0:u.call(l)}}})]}let v_=Symbol("PortalGroupContext"),A8=we({name:"PortalGroup",props:{as:{type:[Object,String],default:"template"},target:{type:Object,default:null}},setup(e,{attrs:t,slots:n}){let r=_n({resolveTarget(){return e.target}});return bt(v_,r),()=>{let{target:s,...i}=e;return Kt({theirProps:i,ourProps:{},slot:{},attrs:t,slots:n,name:"PortalGroup"})}}});var I8=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(I8||{});let Id=Symbol("DialogContext");function y_(e){let t=Ke(Id,null);if(t===null){let n=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,y_),n}return t}let Il="DC8F892D-2EBD-447C-A4C8-A03058436FF4",b_=we({name:"Dialog",inheritAttrs:!1,props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},open:{type:[Boolean,String],default:Il},initialFocus:{type:Object,default:null},id:{type:String,default:null},role:{type:String,default:"dialog"}},emits:{close:e=>!0},setup(e,{emit:t,attrs:n,slots:r,expose:s}){var i,l;let u=(i=e.id)!=null?i:`headlessui-dialog-${sr()}`,c=te(!1);ct(()=>{c.value=!0});let p=!1,d=F(()=>e.role==="dialog"||e.role==="alertdialog"?e.role:(p||(p=!0,console.warn(`Invalid role [${d}] passed to . Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")),g=te(0),h=wa(),v=F(()=>e.open===Il&&h!==null?(h.value&Ut.Open)===Ut.Open:e.open),_=te(null),x=F(()=>gr(_));if(s({el:_,$el:_}),!(e.open!==Il||h!==null))throw new Error("You forgot to provide an `open` prop to the `Dialog`.");if(typeof v.value!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${v.value===Il?void 0:e.open}`);let b=F(()=>c.value&&v.value?0:1),E=F(()=>b.value===0),C=F(()=>g.value>1),S=Ke(Id,null)!==null,[A,B]=$8(),{resolveContainers:L,mainTreeNodeRef:H,MainTreeNode:j}=w8({portals:A,defaultContainers:[F(()=>{var Re;return(Re=Se.panelRef.value)!=null?Re:_.value})]}),q=F(()=>C.value?"parent":"leaf"),K=F(()=>h!==null?(h.value&Ut.Closing)===Ut.Closing:!1),Y=F(()=>S||K.value?!1:E.value),z=F(()=>{var Re,je,Ft;return(Ft=Array.from((je=(Re=x.value)==null?void 0:Re.querySelectorAll("body > *"))!=null?je:[]).find(Dt=>Dt.id==="headlessui-portal-root"?!1:Dt.contains(Be(H))&&Dt instanceof HTMLElement))!=null?Ft:null});Dv(z,Y);let be=F(()=>C.value?!0:E.value),ce=F(()=>{var Re,je,Ft;return(Ft=Array.from((je=(Re=x.value)==null?void 0:Re.querySelectorAll("[data-headlessui-portal]"))!=null?je:[]).find(Dt=>Dt.contains(Be(H))&&Dt instanceof HTMLElement))!=null?Ft:null});Dv(ce,be),S8({type:"Dialog",enabled:F(()=>b.value===0),element:_,onUpdate:(Re,je)=>{if(je==="Dialog")return Hn(Re,{[$d.Add]:()=>g.value+=1,[$d.Remove]:()=>g.value-=1})}});let ke=Lp({name:"DialogDescription",slot:F(()=>({open:v.value}))}),ie=te(null),Se={titleId:ie,panelRef:te(null),dialogState:b,setTitleId(Re){ie.value!==Re&&(ie.value=Re)},close(){t("close",!1)}};bt(Id,Se);let ve=F(()=>!(!E.value||C.value));t_(L,(Re,je)=>{Re.preventDefault(),Se.close(),an(()=>je==null?void 0:je.focus())},ve);let Lt=F(()=>!(C.value||b.value!==0));f_((l=x.value)==null?void 0:l.defaultView,"keydown",Re=>{Lt.value&&(Re.defaultPrevented||Re.key===dt.Escape&&(Re.preventDefault(),Re.stopPropagation(),Se.close()))});let Gt=F(()=>!(K.value||b.value!==0||S));return _8(x,Gt,Re=>{var je;return{containers:[...(je=Re.containers)!=null?je:[],L]}}),Xt(Re=>{if(b.value!==0)return;let je=Be(_);if(!je)return;let Ft=new ResizeObserver(Dt=>{for(let fn of Dt){let St=fn.target.getBoundingClientRect();St.x===0&&St.y===0&&St.width===0&&St.height===0&&Se.close()}});Ft.observe(je),Re(()=>Ft.disconnect())}),()=>{let{open:Re,initialFocus:je,...Ft}=e,Dt={...n,ref:_,id:u,role:d.value,"aria-modal":b.value===0?!0:void 0,"aria-labelledby":ie.value,"aria-describedby":ke.value},fn={open:b.value===0};return Xe(Vv,{force:!0},()=>[Xe(T8,()=>Xe(A8,{target:_.value},()=>Xe(Vv,{force:!1},()=>Xe(Pi,{initialFocus:je,containers:L,features:E.value?Hn(q.value,{parent:Pi.features.RestoreFocus,leaf:Pi.features.All&~Pi.features.FocusLock}):Pi.features.None},()=>Xe(B,{},()=>Kt({ourProps:Dt,theirProps:{...Ft,...n},slot:fn,attrs:n,slots:r,visible:b.value===0,features:Ro.RenderStrategy|Ro.Static,name:"Dialog"})))))),Xe(j)])}}}),__=we({name:"DialogPanel",props:{as:{type:[Object,String],default:"div"},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var s;let i=(s=e.id)!=null?s:`headlessui-dialog-panel-${sr()}`,l=y_("DialogPanel");r({el:l.panelRef,$el:l.panelRef});function u(c){c.stopPropagation()}return()=>{let{...c}=e,p={id:i,ref:l.panelRef,onClick:u};return Kt({ourProps:p,theirProps:c,slot:{open:l.dialogState.value===0},attrs:t,slots:n,name:"DialogPanel"})}}});var R8=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(R8||{});let w_=Symbol("DisclosureContext");function Mp(e){let t=Ke(w_,null);if(t===null){let n=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,Mp),n}return t}let x_=Symbol("DisclosurePanelContext");function O8(){return Ke(x_,null)}let P8=we({name:"Disclosure",props:{as:{type:[Object,String],default:"template"},defaultOpen:{type:[Boolean],default:!1}},setup(e,{slots:t,attrs:n}){let r=te(e.defaultOpen?0:1),s=te(null),i=te(null),l={buttonId:te(`headlessui-disclosure-button-${sr()}`),panelId:te(`headlessui-disclosure-panel-${sr()}`),disclosureState:r,panel:s,button:i,toggleDisclosure(){r.value=Hn(r.value,{0:1,1:0})},closeDisclosure(){r.value!==1&&(r.value=1)},close(u){l.closeDisclosure();let c=u?u instanceof HTMLElement?u:u.value instanceof HTMLElement?Be(u):Be(l.button):Be(l.button);c==null||c.focus()}};return bt(w_,l),Op(F(()=>Hn(r.value,{0:Ut.Open,1:Ut.Closed}))),()=>{let{defaultOpen:u,...c}=e,p={open:r.value===0,close:l.close};return Kt({theirProps:c,ourProps:{},slot:p,slots:t,attrs:n,name:"Disclosure"})}}}),L8=we({name:"DisclosureButton",props:{as:{type:[Object,String],default:"button"},disabled:{type:[Boolean],default:!1},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){let s=Mp("DisclosureButton"),i=O8(),l=F(()=>i===null?!1:i.value===s.panelId.value);ct(()=>{l.value||e.id!==null&&(s.buttonId.value=e.id)}),Ht(()=>{l.value||(s.buttonId.value=null)});let u=te(null);r({el:u,$el:u}),l.value||Xt(()=>{s.button.value=u.value});let c=Rp(F(()=>({as:e.as,type:t.type})),u);function p(){var h;e.disabled||(l.value?(s.toggleDisclosure(),(h=Be(s.button))==null||h.focus()):s.toggleDisclosure())}function d(h){var v;if(!e.disabled)if(l.value)switch(h.key){case dt.Space:case dt.Enter:h.preventDefault(),h.stopPropagation(),s.toggleDisclosure(),(v=Be(s.button))==null||v.focus();break}else switch(h.key){case dt.Space:case dt.Enter:h.preventDefault(),h.stopPropagation(),s.toggleDisclosure();break}}function g(h){switch(h.key){case dt.Space:h.preventDefault();break}}return()=>{var h;let v={open:s.disclosureState.value===0},{id:_,...x}=e,b=l.value?{ref:u,type:c.value,onClick:p,onKeydown:d}:{id:(h=s.buttonId.value)!=null?h:_,ref:u,type:c.value,"aria-expanded":s.disclosureState.value===0,"aria-controls":s.disclosureState.value===0||Be(s.panel)?s.panelId.value:void 0,disabled:e.disabled?!0:void 0,onClick:p,onKeydown:d,onKeyup:g};return Kt({ourProps:b,theirProps:x,slot:v,attrs:t,slots:n,name:"DisclosureButton"})}}}),M8=we({name:"DisclosurePanel",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){let s=Mp("DisclosurePanel");ct(()=>{e.id!==null&&(s.panelId.value=e.id)}),Ht(()=>{s.panelId.value=null}),r({el:s.panel,$el:s.panel}),bt(x_,s.panelId);let i=wa(),l=F(()=>i!==null?(i.value&Ut.Open)===Ut.Open:s.disclosureState.value===0);return()=>{var u;let c={open:s.disclosureState.value===0,close:s.close},{id:p,...d}=e,g={id:(u=s.panelId.value)!=null?u:p,ref:s.panel};return Kt({ourProps:g,theirProps:d,slot:c,attrs:t,slots:n,features:Ro.RenderStrategy|Ro.Static,visible:l.value,name:"DisclosurePanel"})}}}),Nv=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function jv(e){var t,n;let r=(t=e.innerText)!=null?t:"",s=e.cloneNode(!0);if(!(s instanceof HTMLElement))return r;let i=!1;for(let u of s.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))u.remove(),i=!0;let l=i?(n=s.innerText)!=null?n:"":r;return Nv.test(l)&&(l=l.replace(Nv,"")),l}function B8(e){let t=e.getAttribute("aria-label");if(typeof t=="string")return t.trim();let n=e.getAttribute("aria-labelledby");if(n){let r=n.split(" ").map(s=>{let i=document.getElementById(s);if(i){let l=i.getAttribute("aria-label");return typeof l=="string"?l.trim():jv(i).trim()}return null}).filter(Boolean);if(r.length>0)return r.join(", ")}return jv(e).trim()}function F8(e){let t=te(""),n=te("");return()=>{let r=Be(e);if(!r)return"";let s=r.innerText;if(t.value===s)return n.value;let i=B8(r).trim().toLowerCase();return t.value=s,n.value=i,i}}var D8=(e=>(e[e.Open=0]="Open",e[e.Closed=1]="Closed",e))(D8||{}),V8=(e=>(e[e.Pointer=0]="Pointer",e[e.Other=1]="Other",e))(V8||{});function N8(e){requestAnimationFrame(()=>requestAnimationFrame(e))}let k_=Symbol("MenuContext");function Iu(e){let t=Ke(k_,null);if(t===null){let n=new Error(`<${e} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(n,Iu),n}return t}let j8=we({name:"Menu",props:{as:{type:[Object,String],default:"template"}},setup(e,{slots:t,attrs:n}){let r=te(1),s=te(null),i=te(null),l=te([]),u=te(""),c=te(null),p=te(1);function d(h=v=>v){let v=c.value!==null?l.value[c.value]:null,_=Ip(h(l.value.slice()),b=>Be(b.dataRef.domRef)),x=v?_.indexOf(v):null;return x===-1&&(x=null),{items:_,activeItemIndex:x}}let g={menuState:r,buttonRef:s,itemsRef:i,items:l,searchQuery:u,activeItemIndex:c,activationTrigger:p,closeMenu:()=>{r.value=1,c.value=null},openMenu:()=>r.value=0,goToItem(h,v,_){let x=d(),b=l8(h===jn.Specific?{focus:jn.Specific,id:v}:{focus:h},{resolveItems:()=>x.items,resolveActiveIndex:()=>x.activeItemIndex,resolveId:E=>E.id,resolveDisabled:E=>E.dataRef.disabled});u.value="",c.value=b,p.value=_??1,l.value=x.items},search(h){let v=u.value!==""?0:1;u.value+=h.toLowerCase();let _=(c.value!==null?l.value.slice(c.value+v).concat(l.value.slice(0,c.value+v)):l.value).find(b=>b.dataRef.textValue.startsWith(u.value)&&!b.dataRef.disabled),x=_?l.value.indexOf(_):-1;x===-1||x===c.value||(c.value=x,p.value=1)},clearSearch(){u.value=""},registerItem(h,v){let _=d(x=>[...x,{id:h,dataRef:v}]);l.value=_.items,c.value=_.activeItemIndex,p.value=1},unregisterItem(h){let v=d(_=>{let x=_.findIndex(b=>b.id===h);return x!==-1&&_.splice(x,1),_});l.value=v.items,c.value=v.activeItemIndex,p.value=1}};return t_([s,i],(h,v)=>{var _;g.closeMenu(),Ap(v,$p.Loose)||(h.preventDefault(),(_=Be(s))==null||_.focus())},F(()=>r.value===0)),bt(k_,g),Op(F(()=>Hn(r.value,{0:Ut.Open,1:Ut.Closed}))),()=>{let h={open:r.value===0,close:g.closeMenu};return Kt({ourProps:{},theirProps:e,slot:h,slots:t,attrs:n,name:"Menu"})}}}),U8=we({name:"MenuButton",props:{disabled:{type:Boolean,default:!1},as:{type:[Object,String],default:"button"},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var s;let i=(s=e.id)!=null?s:`headlessui-menu-button-${sr()}`,l=Iu("MenuButton");r({el:l.buttonRef,$el:l.buttonRef});function u(g){switch(g.key){case dt.Space:case dt.Enter:case dt.ArrowDown:g.preventDefault(),g.stopPropagation(),l.openMenu(),an(()=>{var h;(h=Be(l.itemsRef))==null||h.focus({preventScroll:!0}),l.goToItem(jn.First)});break;case dt.ArrowUp:g.preventDefault(),g.stopPropagation(),l.openMenu(),an(()=>{var h;(h=Be(l.itemsRef))==null||h.focus({preventScroll:!0}),l.goToItem(jn.Last)});break}}function c(g){switch(g.key){case dt.Space:g.preventDefault();break}}function p(g){e.disabled||(l.menuState.value===0?(l.closeMenu(),an(()=>{var h;return(h=Be(l.buttonRef))==null?void 0:h.focus({preventScroll:!0})})):(g.preventDefault(),l.openMenu(),N8(()=>{var h;return(h=Be(l.itemsRef))==null?void 0:h.focus({preventScroll:!0})})))}let d=Rp(F(()=>({as:e.as,type:t.type})),l.buttonRef);return()=>{var g;let h={open:l.menuState.value===0},{...v}=e,_={ref:l.buttonRef,id:i,type:d.value,"aria-haspopup":"menu","aria-controls":(g=Be(l.itemsRef))==null?void 0:g.id,"aria-expanded":l.menuState.value===0,onKeydown:u,onKeyup:c,onClick:p};return Kt({ourProps:_,theirProps:v,slot:h,attrs:t,slots:n,name:"MenuButton"})}}}),H8=we({name:"MenuItems",props:{as:{type:[Object,String],default:"div"},static:{type:Boolean,default:!1},unmount:{type:Boolean,default:!0},id:{type:String,default:null}},setup(e,{attrs:t,slots:n,expose:r}){var s;let i=(s=e.id)!=null?s:`headlessui-menu-items-${sr()}`,l=Iu("MenuItems"),u=te(null);r({el:l.itemsRef,$el:l.itemsRef}),n_({container:F(()=>Be(l.itemsRef)),enabled:F(()=>l.menuState.value===0),accept(h){return h.getAttribute("role")==="menuitem"?NodeFilter.FILTER_REJECT:h.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(h){h.setAttribute("role","none")}});function c(h){var v;switch(u.value&&clearTimeout(u.value),h.key){case dt.Space:if(l.searchQuery.value!=="")return h.preventDefault(),h.stopPropagation(),l.search(h.key);case dt.Enter:if(h.preventDefault(),h.stopPropagation(),l.activeItemIndex.value!==null){let _=l.items.value[l.activeItemIndex.value];(v=Be(_.dataRef.domRef))==null||v.click()}l.closeMenu(),Q1(Be(l.buttonRef));break;case dt.ArrowDown:return h.preventDefault(),h.stopPropagation(),l.goToItem(jn.Next);case dt.ArrowUp:return h.preventDefault(),h.stopPropagation(),l.goToItem(jn.Previous);case dt.Home:case dt.PageUp:return h.preventDefault(),h.stopPropagation(),l.goToItem(jn.First);case dt.End:case dt.PageDown:return h.preventDefault(),h.stopPropagation(),l.goToItem(jn.Last);case dt.Escape:h.preventDefault(),h.stopPropagation(),l.closeMenu(),an(()=>{var _;return(_=Be(l.buttonRef))==null?void 0:_.focus({preventScroll:!0})});break;case dt.Tab:h.preventDefault(),h.stopPropagation(),l.closeMenu(),an(()=>e8(Be(l.buttonRef),h.shiftKey?An.Previous:An.Next));break;default:h.key.length===1&&(l.search(h.key),u.value=setTimeout(()=>l.clearSearch(),350));break}}function p(h){switch(h.key){case dt.Space:h.preventDefault();break}}let d=wa(),g=F(()=>d!==null?(d.value&Ut.Open)===Ut.Open:l.menuState.value===0);return()=>{var h,v;let _={open:l.menuState.value===0},{...x}=e,b={"aria-activedescendant":l.activeItemIndex.value===null||(h=l.items.value[l.activeItemIndex.value])==null?void 0:h.id,"aria-labelledby":(v=Be(l.buttonRef))==null?void 0:v.id,id:i,onKeydown:c,onKeyup:p,role:"menu",tabIndex:0,ref:l.itemsRef};return Kt({ourProps:b,theirProps:x,slot:_,attrs:t,slots:n,features:Ro.RenderStrategy|Ro.Static,visible:g.value,name:"MenuItems"})}}}),xr=we({name:"MenuItem",inheritAttrs:!1,props:{as:{type:[Object,String],default:"template"},disabled:{type:Boolean,default:!1},id:{type:String,default:null}},setup(e,{slots:t,attrs:n,expose:r}){var s;let i=(s=e.id)!=null?s:`headlessui-menu-item-${sr()}`,l=Iu("MenuItem"),u=te(null);r({el:u,$el:u});let c=F(()=>l.activeItemIndex.value!==null?l.items.value[l.activeItemIndex.value].id===i:!1),p=F8(u),d=F(()=>({disabled:e.disabled,get textValue(){return p()},domRef:u}));ct(()=>l.registerItem(i,d)),Ht(()=>l.unregisterItem(i)),Xt(()=>{l.menuState.value===0&&c.value&&l.activationTrigger.value!==0&&an(()=>{var E,C;return(C=(E=Be(u))==null?void 0:E.scrollIntoView)==null?void 0:C.call(E,{block:"nearest"})})});function g(E){if(e.disabled)return E.preventDefault();l.closeMenu(),Q1(Be(l.buttonRef))}function h(){if(e.disabled)return l.goToItem(jn.Nothing);l.goToItem(jn.Specific,i)}let v=r8();function _(E){v.update(E)}function x(E){v.wasMoved(E)&&(e.disabled||c.value||l.goToItem(jn.Specific,i,0))}function b(E){v.wasMoved(E)&&(e.disabled||c.value&&l.goToItem(jn.Nothing))}return()=>{let{disabled:E,...C}=e,S={active:c.value,disabled:E,close:l.closeMenu};return Kt({ourProps:{id:i,ref:u,role:"menuitem",tabIndex:E===!0?void 0:-1,"aria-disabled":E===!0?!0:void 0,onClick:g,onFocus:h,onPointerenter:_,onMouseenter:_,onPointermove:x,onMousemove:x,onPointerleave:b,onMouseleave:b},theirProps:{...n,...C},slot:S,attrs:n,slots:t,name:"MenuItem"})}}}),S_=Symbol("LabelContext");function C_(){let e=Ke(S_,null);if(e===null){let t=new Error("You used a